BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Главная  / Поддержка  / Форум  / Публичные форумы  / Программирование приложений  / Проверка на контрольное значение при использовании QINPUT

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Проверка на контрольное значение при использовании QINPUT
 
Здравствуйте!
Немного переделанный блок кода из предыдущей темы :
FUNCTION Main()
Private aMas:={}
Private aParam
dbpush()
aParam:={{"01/01/2014","аааааааа",50,400},{"02/01/2014","бббббббббббб",80,400},{"03/01/2014","ввввввв",300,400}}
//altd()
_DialogSay(aParam)
dbpop()
return

FUNCTION _DialogSay(x)
Local _top,_bot,_left,_right,_heads,_pic:={},_ref:={},_app,_spec,_getbl:={}
Local j:=0,aHeads:={},_value:=0
Private _head:='',cVar
For nPos:=1 to len(x)
cVar:='head_'+alltrim(str(nPos))
private &cVar
&cVar:=0
next
altd()
_top:=3
_bot:=len(x)+2
_left:=3
_right:=76
j:=1
//altd()
Do While j<=len(x)
_head:="head_"+alltrim(str(j))
aadd(aHeads,{{_top+j-1,_left+63},&('_head')})
&_head:=x[j,3]
j:=j+1
enddo

aeval(x,{|| aadd(_pic,'999999')})
_ref:={}
_app:=1
_spec:='RESTOFF'
aeval(x,{|| aadd(_getbl,NIL)})
DISPBOX(_top-1,_left-1,_bot+1,_right+1,'╔═╗║══╚║ ',"N/BG")
SAYSCREEN(" ЗАПОЛНЕНИЕ ОБЪЕМОМ ПРОИЗВЕДЕННОЙ ПРОДУКЦИИ ",_top-1,_left+2)
j:=0
aeval(x,{|x| SAYSCREEN(x[1]+' '+x[2],_top+j,_left+2),j++})
QINPUT(_top,_left,_bot,_right,aheads,_app,_ref,_pic,,,,,,,_spec,_getbl,,,,,,,,,"Сформировать отчет ?")
IF LASTKEY()!=27
j:=1
Do While j<=len(x)
_value:=&_head
aadd(aMas,_value)
j++
enddo
else
aMas:={}
endif
return aMas

Какой параметр в функции QINPUT отвечает за проверку вводимых значений? И как это сделать?
Надо чтобы общая сумма всех значений (&_head:=x[j,3]) , которое введет пользователь должна быть равна некоторому контрольному значению .В данном случае это четверый элемент массива aParam x[j,4].
При этом нужно не давать пользователю выйти из диалогового окна до тех пор ,пока не введет значения ,
которые в сумме будут равны общей контрольной сумме .Желательно чтобы в "подвале" диалогового окна отражалась запись с содержанием " неверная контрольная сумма".
В Help по этому Вопросу ни чего не нашел.
Заранее спасибо
 
В случае, если введённые значения корректны каждое само по себе, но не соблюдается некое общее условие, можно воспользоваться параметром № 20

bPostGet - блок кода выполняемый после каждого завеpшения READ,
ему пеpедается флаг сохpанения данных .T. - данные были записаны в базу
.F. - данные не были записаны в базу (выполняется после возможного
выполнения bPost ),флаг изменения данных и флаг циклического
ввода по ссылке, если его сбросить в -1 то циклического ввода не будет
Если bPostGet вернет .F., то произойдет повторный вход в редактирование
тем самым дается возможность не выпускать пользователя из режима редактирования
пока он не исправит ошибки или вообще не будет сохранять данные
Можно использовать для каких либо завершающих действий, в независимости
от того, захотел ли пользователь сохранить данные или нет (например удаления
проводок сформированных при добавлении документа и т.п.).
С уважением, Новиков Алексей.
 
Здравствуйте!
А в каких переменных ( массивах) будут храниться введенные пользователем значения?
Т.е к чему обращаться в кодовом блоке?
 
Переменные будут в массиве m->aIn, длина которого соответствует длине aHeads
С уважением, Новиков Алексей.
 
Здравствуйте!
Переменные _s, kSum, _bPostGet объявил как Private
Сосчитал контрольную сумму kSum.
Такой кодовый блок работает без проблем :
_bPostGet:={||aeval(aIn,{|x| _s:=_s+x}),if(_s<>kSum,_s:=0,),if(_s<>kSum,SayAndWait('Контрольная сумма не верна'),),if(_s<>kSum, .f. ,.T.)}

Но информацию для пользователя пришлось выводить через SayAndWait('Контрольная сумма не верна').
А можно ее отразить в нижней строке диалогового окна?
 
Конечно, можно.

Воспользуйтесь dispoutat(nTop, nLeft, cText, cColor), указав координаты вывода, строку и цвет
С уважением, Новиков Алексей.
 
Заменил SayAndWait на dispoutat() ,получилось то ,что нужно.
_bPostGet:={||aeval(aIn,{|x| _s:=_s+x}),if(_s<>kSum,_s:=0,),if(_s<>kSum,dispoutat(_top+len(aParam),_left+23,'Контрольная сумма не верна',"R+/B"),),if(_s<>kSum, .f. ,.T.)}

Но теперь возник Вопрос по dispoutat(). Эта функции работает только после функций (операций) прорисовки экрана? В справочнике пользователя о ней ничего не сказано.Когда ее целесообразно применять?
 
Это функция xHarbour, она работает когда угодно и где угодно. Можете использовать её всякий раз, когда нужно что-то отобразить.
С уважением, Новиков Алексей.
 
Цитата
Алексей Новиков пишет:
Это функция xHarbour, она работает когда угодно и где угодно. Можете использовать её всякий раз, когда нужно что-то отобразить.
Пробую :
FUNCTION Main()
Private _top:=2,_left:=2,bl
altd()
dispoutat(_top,_left,'TEST',"N/BG") // или так

//bl:={||sayandwait('TEST')}
bl:={|| dispoutat(_top,_left,'TEST',"N/BG")}
eval(bl) // или так
return

Ничего не происходит.
Я, видимо, неправильно ее вызываю?
 
Не надо забывать о контексте. Ваш плагин не единственый, кто работает с экраном.
Вы вызываете плагин из реестра. После завершения работы плагина InitList обновляет экран, затирая результат работы.
Вставьте sayandwait() после dispoutat и посмотрите на результат до его исчезновения.
С уважением, Новиков Алексей.
Страницы: 1
Читают тему (гостей: 1)