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

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

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


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

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Ввод параметров с помощью QInput, Ошибка при вызове QInput
 
Добрый день.

Помогите, пожалуйста, разобраться с QInput. При вызове QInput программа выдает ошибку.

Фрагмент текста программы:

private cColHead,aBlock,aInputHeads,aValid,cCurProc,aKeys,aKeyDB
private i,tmpfile,cStr
private dDate,cScladP,cPrizn,cNum,cPart, anPar, aSet,bPost,bPreDisp,bPostGet,aWhen
private cFILEPP,aStru,cPartCode,cena_GP

// --------------------- begin_main -----------------------------------
#include "Inkey.ch"
#include "S_Refer.ch"

altd()
aSet:=SAVESET()
CLEAR SCREEN
DBPUSH()
// Ввод параметров с экрана


// Создать справочник складов
NETUSE("u_sclad",LoadPath()+'sclad\msclad.dbf')
u_sclad->(OrdSetFocus("CODE"))
//определить справочник складов
u_sclad->( MAKEREFER("u_s","Склады",1,{" Код ","Название"},{3,24,16},;
"n/w,w+/n",{"CODE"},{"aIn[2]"},"UPPER(aIn[2])",{{||fIELD->CODE},{||FIELD->SHORTNAME}},;
,,,,,;
,,,,,;
,,,,,;
,'cFind$UPPER(SHORTNAME)'))

// Создать справочник "Признак акта"
NETUSE("u_dim",LoadPath()+'dim_anl.dbf')
DBPUSH("u_dim","CODE_GROUP","",{"UPPER(CODE)",'ПРИЗНАК АКТА'})
NETUSE("u_analit",LoadPath()+'analit_seg.dbf')
DBPUSH("u_analit","TAG_DIM","",{"DIM_ID",u_dim->dim_id})
//определить справочник аналитик
u_analit->( MAKEREFER("u_pr","Признак акта",1,{" Код ","Название"},{3,24,16},;
"n/w,w+/n",{"CODE"},{"aIn[3]"},"UPPER(aIn[3])",{{||left(FIELD->CODE,6)},{||left(FIELD->NAME,30)}},;
,,,,,;
,,,,,;
,,,,,;
,'cFind$UPPER(NAME)'))

// Создать справочник партнеров
NETUSE("u_type",LoadPath()+'type_a.dbf')
DBPUSH("u_type","TAG_NAME","",{"UPPER(NAME)",'ЛПУ'})

NETUSE("u_part",LoadPath()+'partner.dbf')
DBPUSH("u_part","_NAME","",{"TYPE_A",u_type->nnoper})
u_part->( MAKEREFER("u_lpu","От кого",1,{" Код ","Название"},{3,24,16},;
"n/w,w+/n",{"CODE"},{"aIn[5]"},"UPPER(aIn[5])",{{||left(FIELD->CODE,6)},{||left(FIELD->SHORTNAME,50)}},;
,,,,,;
,,,,,;
,,,,,;
,'cFind$UPPER(SHORTNAME)'))

cScladP :=REPLICATE(" ",6)
cPrizn :=REPLICATE(" ",6)
cPart :=REPLICATE(" ",6)
dDate :=Date()
cNum :=REPLICATE(" ",6)


QINPUT(10,15,16,50, ;
{{'Дата ','dDate'}, ;
{'Склад ','cScladP'}, ;
{'Признак акта ','cPrizn'}, ;
{'Номер ','cNum'}, ;
{'От кого ','cPart'} ;
}, ;
1,{,"u_s","u_pr",,"u_lpu"},,;
,,,,,, ;
'RESTOFF')


Ошибка в прикрепленном файле.

Подскажите, что не так. Все переменные PRIVATE и инициализированы. Ошибка выходит даже если убрать справочники, даже если оставить один какой-нибудь параметр. Ошибка появляется в самом конце, ввод параметров происходт, все справочники вызываются, результат выбора из справочника появляется на экране.
 
Ваша программа сваливается в стандартный контекст initlist() того реестра, откуда Вы запускаете свой плагин.
Если ошибка появляется после нажатия enter, то решением, возможно, будет переопределение Enter перед вызовом qinput и последующее восстановление.
bResreturn:=setkey(K_RETURN, nil)
...
qinput...
...
setkey(K_RETURN, bResreturn)

И да, я не вижу как Вы вызываете dbpop(). Связка dbpush() - dbpop() реализована как стек, поэтому без dbpop() никак не обойтись.
Изменено: Алексей Новиков - 13.01.2012 08:26:12
С уважением, Новиков Алексей.
 
Ошибка возникает, действительно, по клавише Enter в последнем поле ввода. Переопределение клавиши Enter, по Вашему совету не помогло. DBPOP() вызывается после QInput, это фрагмент(начало) программы.
 
Попробуйте последним параметром в qinput указать 'ONLY1INPUT' вместо 'RESTOFF'

Или попробуйте перед вызовом qinput() сохранить контекст и после вызова восстановить его:
qInitPush(.F.)
qinput...
qInitPop()
С уважением, Новиков Алексей.
 
Не помогло, к сожалению
 
У меня пока других предложений нет...

Кроме предложения переписать плагин с qinput() под dialog() или воспользоваться стандартным клипперовским "@ SAY GET".
С уважением, Новиков Алексей.
 
Dialog() не поддерживает выбор из справочников. Ладно, спасибо, будем искать другие варианты
 
Вот рабочий код переделанной функции dialog

Код
Function MyDialog( cMess, cPict, cVar, cZag, cWhen, cValid, cColBox, cRef )
   Local Ret_ := NIL, i,j, lOne:=VALTYPE(cVar)#'A'
   Local nTop, nLeft, nBottom, nRight, nLen
   Local aSet := {SaveSet()}
   Local S
   LOCAL aMess, aPict, aVar, aWhen, aValid, aRef
   Private xVar
   Private GetList := {}
ALTD()
   IF cZag == NIL
      cZag := ''
   ENDIF
   nLen := LEN(cZag)+2
   iIF(VALTYPE(cMess)#'A',cMess:={cMess},NIL)
   iIF(VALTYPE(cPict)#'A',cPict:={cPict},NIL)
   iIF(VALTYPE(cVar)#'A',cVar:={cVar},NIL)
   iIF(VALTYPE(cWhen)#'A',cWhen:={cWhen},NIL)
   iIF(VALTYPE(cValid)#'A',cValid:={cValid},NIL)
   iIF(VALTYPE(cRef)#'A',cRef:={cRef},NIL)
   IF cMess=NIL
      cMess:=ARRAY(LEN(cVar))
      AFILL(cMess,'Введите значение ')
   ENDIF
   IF cColBox = NIL
      cColBox = "N/W"
   ENDIF
   MemVar->xVar:=ARRAY(LEN(cVar))

   IF LEN(cVar)>LEN(cMess)
      aSIZE(cMess,LEN(cVar))
   ENDIF
   IF LEN(cVar)>LEN(cPict)
      aSIZE(cPict,LEN(cVar))
   ENDIF
   IF LEN(cVar)>LEN(cWhen)
      aSIZE(cWhen,LEN(cVar))
   ENDIF
   IF LEN(cVar)>LEN(cValid)
      aSIZE(cValid,LEN(cVar))
   ENDIF
   IF LEN(cVar)>LEN(cRef)
      aSIZE(cValid,LEN(cRef))
   ENDIF
   IF LEN(cVar) >20
      FOR i:=1 TO LEN(cVar) STEP 20
         aMess:={}
         aPict:={}
         aVar:={}
         aWhen:={}
         aValid:={}
         aRef:={}
         FOR j=i TO MIN(LEN(cVar),i+19)
            AADD(aMess,cMess[j])
            AADD(aPict,cPict[j])
            AADD(aVar,cVar[j])
            AADD(aWhen,cWhen[j])
            AADD(aValid,cValid[j])
            AADD(aRef,cRef[j])
         NEXT
         aVar:=MYDIALOG(aMess, aPict, aVar, cZag+' стр.'+STR(i/20+1,2,0), aWhen, aValid, cColBox, aRef )
         IF LASTKEY() = K_ESC
            EXIT
         ELSE
            FOR j=i TO MIN(LEN(cVar),i+19)
               cVar [j]:=   aVar  [j-i+1]
            NEXT
         ENDIF
      NEXT
      Ret_ := ARRAY(LEN(cVar))
      aEVAL(cVar,{|x,i|x:=x,Ret_[i]:=if(LastKey()<>K_ESC,cVar[i],BLANK(cVar[i],.T.))})
   ELSE
      Begin Sequence //ANDKOR
         nTop    := INT((MaxRow()-LEN(cVar))/2) - 1
         nBottom := nTop+LEN(cVar) + 1
         FOR i:=1 to LEN(cVar)
            Do Case
               Case ValType(cVar[i])=="C"
                    nLen := MAX(nLen,;
 X Len( cMess[i] ) + if( Empty(cPict[i]),;
 X IF(LEN(cVar[i])+Len( cMess[i] )>75,;
 X (cPict[i]:='@KS'+TRIM(STR(75-Len( cMess[i] ),2,0)),;
 X 75-Len( cMess[i] )),;
 X LEN(cVar[i])),;
 X Len( TransForm(SPACE(200),cPict[i]))) + 3)
               Case ValType(cVar[i])=="D"
                    nLen := MAX(nLen,Len( cMess[i] ) + 11)
               Case ValType(cVar[i])=="N"
                    nLen := MAX(nLen,Len( cMess[i] ) + if( Empty(cPict[i]),(cPict[i]:='9999999999999.99999',19),Len( TransForm(SPACE(200),cPict[i]))) + 3)
               Case ValType(cVar[i])=="L"
                    nLen := MAX(nLen,Len( cMess[i] ) + 4)
            EndCase
         NEXT
         nLeft   := INT((MaxCol() - nLen)/2)
         nRight  := nLeft + nLen
         SetColor(cColBox)
         ShadowBox(IF(EMPTY(cZag),"",cZag),nTop, nLeft, nBottom, nRight)
         FOR i:=1 to LEN(cVar)
            if( ValType( cMess[i] ) != "C", cMess[i] := "Введите значение", NIL )
            @ nTop+i, nLeft + 2  SAY cMess[i]
            SetCursor(SC_NORMAL)
            MemVar->xVar[i] := cVar[i]
            IF Empty (cRef[i])
             IF EMPTY(cPict[i])
                @nTop+i,nLeft+Len(cMess[i])+3 GET MemVar->xVar[i]
             ELSE
                @nTop+i,nLeft+Len(cMess[i])+3 GET MemVar->xVar[i] PICTURE cPict[i]
             ENDIF
            ELSE
             IF EMPTY(cPict[i])
                @nTop+i,nLeft+Len(cMess[i])+3 REFER cRef[i] GET MemVar->xVar[i]
             ELSE
                @nTop+i,nLeft+Len(cMess[i])+3 REFER cRef[i] GET MemVar->xVar[i] PICTURE cPict[i]
             ENDIF
            ENDIF
            if( !Empty( cWhen[i] ), ATAIL(MemVar->GetList):preblock := &('{||'+cWhen[i]+'}'), NIL )
            if( !Empty( cValid[i] ), ATAIL(MemVar->GetList):postblock := &('{||'+cValid[i]+'}'), NIL )
            ATAIL(MemVar->GetList):display()
         NEXT
         READ
         IF lOne
            Ret_:=if(LastKey()<>K_ESC,MemVar->xVar[1],BLANK(MemVar->xVar[1],.T.))
         ELSE
            Ret_ := ARRAY(LEN(cVar))
            aEVAL(cVar,{|x,i|x,Ret_[i]:=if(LastKey()<>K_ESC,MemVar->xVar[i],BLANK(MemVar->xVar[i],.T.))})
         ENDIF
      Recover USING S  //ANDKOR
      SayError('Ошибка при вводе данных')
      End Sequence //ANDKOR
   ENDIF

   RestSet( aSet[1] )

Return Ret_


Собственно тут виден пример также,как в стандарте в GET применять использование справочников

По самой теме считаю консультации Алексея Новикова абсолютно правильными.
Не увидел в начале оборота SaveSetKey() - RestSetKey()
Уверен что ошибка не связана с QINPUT
Без отладчика и более подробного кода дать ответ именно по Вашему исх. коду можно было только так, как это сделал Алексей
 
Спасибо за ответ и поддержку, но мы уже разобрались сами.
Проблема была в следующем :

Код
QINPUT(10,15,16,50, ;
{{'Дата ','dDate'}, ;
{'Склад ','cScladP'}, ;
{'Признак акта ','cPrizn'}, ;
{'Номер ','cNum'}, ;
{'От кого ','cPart'} ;
}, ;
1,{,"u_s","u_pr",,"u_lpu"},,;
,,,,,, ;
'RESTOFF')

переписали следующим образом:

QINPUT(10,15,16,50, ;
{{{8,21},'dDate'}, ;
{{9,23},'cScladP'}, ;
{{10,23},'cPrizn'}, ;
{{11,23},'cNum'}, ;
{{12,23},'cPart'} ;
}, ;
1,{,"u_s","u_pr",,"u_lpu"},,;
,,,,,, ;
'RESTOFF')

И все заработало. Экран ввода нарисовали сами.

Описание очень скудное, к сожалению. Методом проб и ошибок получается очень долго.
 
Цитата
Сергей Джулай пишет:
переписали следующим образом

ТОЧНО !
Я на эти грабли сам уже 3 раза наступал, забываю опять потом долго ищу.
И вот опять не вспомнил - чую только, что что-то жутко знакомое....
В итоге ушел пользоваться @Say @Get
Страницы: 1
Читают тему (гостей: 1)