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

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

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


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

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: Пред. 1 2 3 След.
RSS
Использование QINPUT() при выборе нескольких значений из справочника
 
Здравствуйте! После 4 Урока работающий плагин выглядет так:

#include "inkey.ch"
Function Main()
LOCAL aSet,aSetKey,nTop,nBot,cColHead,aBlockCols,cCurproc,bDel,_aHeads,aWhen,aPic,nUniMode,nApp,aRef,cFindMacro
LOCAL aHotKey,aType,aGetBlock,bPreGet
aSet:=SAVESET()
aSetKey:=SAVESETKEY()
SayAndWait("OK")
NETUSE("WORK",LOADPATH()+"\real\work.dbf",,.F.)
NETUSE("_Partner",LoadPath()+"partner.dbf",,.F.)
DISPBOX(2,0,23,79,( CHR( 201 ) + CHR( 205 ) + CHR( 187 ) + CHR( 186 ) + CHR( 188 ) + CHR( 205 ) + CHR( 200 ) + CHR( 186 )+' ' ),"W+/B")
nTop:=3
nBot:=22
cColHead:={" Дата Номер НАИМЕНОВАНИЕ Кол-во Цена Сумма "}
cCurProc:={||"2"}
aBlockCols:={{{||FIELD->tek_data},0},{{||FIELD->tek_nomer},9},{{||IF(!EMPTY(FIELD->TYPE),aType[VAL(FIELD->TYPE),2],SPACE(25))},16},{{||STR(FIELD->kol,5)},33},{{||STR(FIELD->cena,12,2)},39},{{||STR(FIELD->summa,12,2)},52}}
bDel:={||.F.}
ALTD()

aType:={{'1','Услуги системного инженера'}, ;
{'2','Услуги по программированию'},;
{'3','Услуги консультанта '}, ;
{'4','Услуги по терминальной св.'}}

_aHeads:={{"Введите дату работ.................:","TEK_DATA"},;
{"Введите номер документа............:","TEK_NOMER"},;
{"Наименование работ.................:","TYPE"},;
{"Количество.........................:","KOL","1","1","0"},;
{"Цена...............................:","CENA","1","1","0"},;
{"Сумма (руб.).......................:","SUMMA"},;
{"Наименование контрагента...........:","Name_p"}}


// Для автоматического расчета суммы
aWhen:={,,,,,{||aIn[6]:=aIn[4]*aIn[5]},,.T.}
// формат ввода данных
aPic:={,,,,,"999999999.99",}
// Для решения Вопрос а уникальности по индексу служит переменная
nUniMode=2
//
aRef:={,,{|x|ROTATEANDREADER(x,aType)},,,,"partners"}
cFindMacro:='cFind$UPPER(Name)'
bPreGet:={,,{|x,y,z|aIn[x]:=FIELD->Type},,,,}
//bPreGet:={|x,y,z|aIn[x]:=FIELD->VID}

altd()
_PARTNER->( MAKEREFER("PARTNERS","Справочник поставщиков",2 ,;
{" Код ","Наименование поставщика"," И Н Н "},;
{3,5,16}, "n/w,w+/n",{"SHORTNAME"},{"aIn[7]"},,;
{{||FIELD->CODE},{||FIELD->SHORTNAME},;
{||FIELD->CODE_PR}},,,,,,,,,,,,,,,,,'cFind$UPPER(ShortName)';
,,,,,,,,,,,,,,,,,,,,'NAME') )

aHotKey:={{},{{'F5 - моя функция',K_SH_F5,{||myfunction()},1}},{}}

aGetBlock:={,,{|x|RotateBlock(x,aType,"aIn[3]")},,,,}

work->(INITLIST(nTop,nBot,cColHead,aBlockCols,cCurProc,;
_aHeads,aRef,aPic,aWhen,,;
nUniMode,bDel,,,,;
,,aGetBlock,,,;
,,cFindMacro,,, ;
bPreGet,,,,aHotKey))

WORK->( DBCLOSEAREA() )
_PARTNER->( DBCLOSEAREA() )
RESTSETKEY(aSetKey)
RESTSET(aSet)
RETURN NIL
SayAndWait("OK")
return NIL

FUNCTION myfunction()
SAYANDWAIT("OK")
RETURN 2

Обнаружил такую проблему ,на примере Демобазы.

Редактирую запись .в поле " наименование контрагента " стоит Торговый дом "ГУМ".
Нажимаю F2 выбираю из справ партнеров Фирма "Квант".
Теперь если из другой любой записи попытаться вызвать справочник партнеров, то при нажатии на F2
курсор в справочнике партнеров будет стоять на Фирма "Квант", а хотелось бы ,чтобы он стоял на партнере редактируемой записи.
Как исправить?
 
у Makerefer есть параметр seek, он отвечает за поиск записи в справочнике при его открытии
Мог немного ошибиться в названии параметра - посмотрите в описании
 
Посмотрел описание MakeRefer.
1.Параметр, отвечающий за поиск записи в справочнике при его открытии , больше всего подходит следующий :
Цитата
cKeyValDisp – выражение в виде символьной строки для вычисления (путем макроподстановки) ключа при поиске первой записи для отображения справочника (если не указано,то исп–ся cKeyVal);


Если это так,то как правильно написать это выражение?

2.Но вот обнаружил в описании :

Цитата
Выполняется после ключевого поиска !
· bYesArray – Блок кода доступа к массиву, куда вернем значения, если помечены несколько записей.
{|x| IF(ValType(x)=='A', aArray:=x, aArray ) }
Т.е. речь идет о том ,что может быть помечено несколько значений в справочнике.

Воспользоваться этой возможностью можно только через Initlist или еще каким-то способом?
 
Ну давайте разбирать на примере.
Допустим я в Инитлисте настроил некий реестр, в котором отображается группа и номенклатура и их я туда собираюсь заводить через справочник
Справочник собираюсь заводить на поле ввода номенклатуры.

Тогда в окне ввода у меня будут 2 поля:
1) группа
2) номенклатура
Соответственно в момент ввода данных БЭСТом будет создан внутренний массив aIn[]

группа это aIn[1]
номенклатура это aIn[2]

значит при открытии номенклатурного справочника я должен найти запись
ключ поиска определяется указанным в makerefer именем индексного ключа или если имя не указано текущим индексом в алиасе
допустим я выбрал ключ "mlabel" - он мне подходит больше всего
Значит искать я должен по выражению UPPER(GRUP+NNUM) - (группа + номенклатура) Смотрим вверх.
для справочника введенные значения лежат еще не в базе а в массиве
Значит я должен писать UPPER(ain[1]+aIn[2])
ну и раз выражение должно быть символьным то заключаем его в кавычки "UPPER(ain[1]+aIn[2])"
Изменено: nordk - 03.06.2015 16:46:16
 
· bYesArray - очень Хорошо что Вы про него вычитали
Я когда вычитываю - думаю надо попробовать, а под рукой ничего нет полезного\
А когда надо - никогда не вспоминаю
Попробуйте вот что
создайте справочник на какое-нибудь поле ввода
и пропишите в нем вот так
bYesArray:={|x| IF(ValType(x)=='A',m->MyRecs:=x,m->myRecs)},
где myRecs - объявите такую переменную
И после возвращения из справочника посмотрите в отладчике что в ней лежит
Если у вас все получится - я обещаю порыть в исходниках как такой справочник вызвать просто по нажатию кнопки а не через режим
ввода/корректировки.
Главное даст он в справочнике по Ins отмечать или нет - если никакие больше параметры объявлять для
этого не надо -по идее все должно получиться
 
Здравствуйте!
По описанию MAKEREFER() определил ,что cKeyValDisp - это 20 параметр.
тогда на его место вставляем выражение 'UPPER(aIn[7])'.
Переписал для удобства чтения по пять параметров в строке:
Цитата
_PARTNER->( MAKEREFER("PARTNERS","Справочник поставщиков",2 ,{" Код ","Наименование поставщика"," И Н Н "},{3,5,16}, ;
"n/w,w+/n",{"SHORTNAME"},{"aIn[7]"},,{{||FIELD->CODE},{||FIELD->SHORTNAME},{||FIELD->CODE_PR}},;
,,,,, ;
,,,,'UPPER(aIn[7])', ;
,,,,, ;
,'cFind$UPPER(ShortName)',,,,;
,,,,, ;
,,,,, ;
,,,,, ;
,'NAME') )
Но проблема не ушла!
Надо еще что-то менять или дополнять?
 
Нееее вы значит не то нашли

k_stol->( MAKEREFER("SCLADS","Справочник столовых",2,{"Код столовой","Наименование столовой"},{3,5,15},,{"KSTOL","zsclad->shortname"},{"aIn[2]","aIn[3]"},"UPPER(aIn[2])",{{||field->KSTOL},{||zsclad->(DBSEEK(UPPER(k_stol->KSTOL))),zsclad->SHORTNAME}}) )
 
Здравствуйте!
Вставил девятый параметр "UPPER(aIn[7])"

_PARTNER->( MAKEREFER("PARTNERS","Справочник поставщиков",2 ,{" Код ","Наименование поставщика"," И Н Н "},{3,5,16}, ;
"n/w,w+/n",{"SHORTNAME"},{"aIn[7]"},"UPPER(aIn[7])",{{||FIELD->CODE},{||FIELD->SHORTNAME},{||FIELD->CODE_PR}},;
,,,,, ;
,,,,, ;
,,,,, ;
,'cFind$UPPER(ShortName)',,,,;
,,,,, ;
,,,,, ;
,,,,, ;
,'NAME') ) Не помогло.Теперь при редактировании записи и нажатие F2 курсор встает на любую запись по не понятному алгоритму.
 
[QUOTE]nordk пишет:
· bYesArray - очень что Вы про него вычитали
Я когда вычитываю - думаю надо попробовать, а под рукой ничего нет полезного\
А когда надо - никогда не вспоминаю
Попробуйте вот что
создайте справочник на какое-нибудь поле ввода
и пропишите в нем вот так
bYesArray:={|x| IF(ValType(x)=='A',m->MyRecs:=x,m->myRecs)},
где myRecs - объявите такую переменную
И после возвращения из справочника посмотрите в отладчике что в ней лежит
Если у вас все получится - я обещаю порыть в исходниках как такой справочник вызвать просто по нажатию кнопки а не через режим
ввода/корректировки.
Главное даст он в справочнике по Ins отмечать или нет - если никакие больше параметры объявлять для
этого не надо -по идее все должно получиться[/QUOTE]
Здравствуйте!
Переписал плагин в таком виде :
[QUOTE]#include "inkey.ch"
Function Main()
LOCAL aSet,aSetKey,nTop,nBot,cColHead,aBlockCols,cCurproc,bDel,_aHeads,aWhen,aPic,nUniMode,nApp,aRef,cFindMacro
LOCAL aType,bYesArray,myRecs
aSet:=SAVESET()
aSetKey:=SAVESETKEY()
SayAndWait("OK")
NETUSE("work_1",LOADPATH()+"\real\work_1.dbf",,.F.)
work_1->(dbcreateindex(GlobalTmpPath+"DATE","dtos(TEK_DATA)"))
work_1->(ordsetfocus("DATE"))
NETUSE("_Partner",LoadPath()+"partner.dbf",,.F.)
DISPBOX(2,0,23,79,( CHR( 201 ) + CHR( 205 ) + CHR( 187 ) + CHR( 186 ) + CHR( 188 ) + CHR( 205 ) + CHR( 200 ) + CHR( 186 )+' ' ),"W+/B")
nTop:=3
nBot:=22
cColHead:={" Дата Номер НАИМЕНОВАНИЕ Кол-во Цена Сумма "}
cCurProc:={||"2"}
aBlockCols:={{{||FIELD->tek_data},0},{{||FIELD->tek_nomer},9},{{||FIELD->name},16},{{||STR(FIELD->kol,5)},33},{{||STR(FIELD->cena,12,2)},39},{{||STR(FIELD->summa,12,2)},52}}
bDel:={||.F.}
ALTD()

aType:={{'1','Услуги системного инженера'}, ;
{'2','Услуги по программированию'},;
{'3','Услуги консультанта '}, ;
{'4','Услуги по терминальной св.'}}

_aHeads:={{"Введите дату работ.................:","TEK_DATA"},;
{"Введите номер документа............:","TEK_NOMER"},;
{"Наименование работ.................:","NAME"},;
{"Количество.........................:","KOL","1","1","0"},;
{"Цена...............................:","CENA","1","1","0"},;
{"Сумма (руб.).......................:","SUMMA"},;
{"Наименование контрагента...........:","Name_p"}}


// Для автоматического расчета суммы при вводе добавим
aWhen:={,,,,,{||aIn[6]:=aIn[4]*aIn[5]},,.T.}
// формат ввода данных
aPic:={,,,,,"999999999.99",}
// Для решения Вопрос а уникальности по индексу служит переменная
nUniMode=2
//
aRef:={,,,,,,"partners"}

cFindMacro:='cFind$UPPER(Name)'
//bYesArray:={|x| IF(ValType(x)=='A',m->MyRecs:=x,m->myRecs)}
bYesArray:={|x| IF(ValType(x)=='A',MyRecs:=x,myRecs)}
altd()

_PARTNER->( MAKEREFER("PARTNERS","Справочник поставщиков",2 ,{" Код ","Наименование поставщика"," И Н Н "},{3,5,16}, ;
"n/w,w+/n",{"SHORTNAME"},{"aIn[7]"},,{{||FIELD->CODE},{||FIELD->SHORTNAME},{||FIELD->CODE_PR}},;
,,,,, ;
,,,,, ;
,,,,, ;
,'cFind$UPPER(ShortName)',,,,;
,bYesArray,,,, ;
,,,,, ;
,,,,, ;
,'NAME') )
altd()

work_1->(INITLIST(nTop,nBot,cColHead,aBlockCols,cCurProc,;
_aHeads,aRef,aPic,aWhen,,;
nUniMode,bDel,,,,;
,,,,,;
,,cFindMacro,,, ;
,,,,))
altd()

work_1->( DBCLOSEAREA() )
_PARTNER->( DBCLOSEAREA() )
RESTSETKEY(aSetKey)
RESTSET(aSet)
RETURN NIL
SayAndWait("OK")
return NIL[/QUOTE]


Архив с подготовленной БД прикрепил.( на примере демобазы)
В файл в файл dbase\real\bases_05.dbf добавлять ничего не нужно.

1.Если переменной bYesArray присвоить значение bYesArray:={|x| IF(ValType(x)=='A',m->MyRecs:=x,m->myRecs)}
то программа при нажатии F2 в поле"Наименование контрагента" ругается ,что переменная не определена.
Если убрать m->.то ругани нет. Почему ????????

2.Теперь в окне справочника партнеров появилась пустая крайняя слева колонка.
при выборе партнера с помощью enter проблем нет,но если нажать insert ,то пишет "неверный аргумент".

Видимо,надо что-то еше дописывать!

3.
[QUOTE]где myRecs - объявите такую переменную
И после возвращения из справочника посмотрите в отладчике что в ней лежит[/QUOTE]

При любом телодвижении myRecs имеет значение Nil
Изменено: gabov - 08.06.2015 11:43:33
 
myRecs объявите privat - справочник внутри у себя не может видеть Ваши локальные переменные.
А блоки кода при компиляции не проверяются на "видимость"
 
[QUOTE]nordk пишет:
myRecs объявите privat - справочник внутри у себя не может видеть Ваши локальные переменные.
А блоки кода при компиляции не проверяются на "видимость"
[/QUOTE]Объявил Private myRecs.
Все равно myRecs имеет значение Nil.

Правда теперь перестало ругаться на m->MyRecs.
Изменено: gabov - 08.06.2015 12:58:16
 
Нуу - значит еще чего-то не объявили - надо искать....
По INS стали отмечаться ?
 
При нажатиии на Insert вылетает ошибка "Неверный аргумент"
 
ВОт вы начали читать - читайте до конца пожалуйста.
Сейчас ОЧЕНЬ загружен другим серъезным проектом.
Тем не менее что то подсказать могу


1.Мы определили сам массив, но не определили какие значения в него складывать собственно - из какого поля

Код
   bYesReplArray - блок кода для заполнения массива значений, если вернет
                   NIL, то заполнения не присходит
Пример:
Код
bYesReplArray:={|| FIELD->CODE }
2.Выход из справочника наверно надо делать по клавише ТАB
Код
  bCoProc     - блок кода или имя сопроцедуры для Browse
Пример:
Код
{|| IIF(LastKey()==K_TAB, Keyb(K_ENTER), Nil) }
Вот как минимум сразу бросается в глаза
 
Здравствуйте!
Вот что получилось после того как я добавил Ваши поправки :
Цитата
#include "inkey.ch"
Function Main()

LOCAL aSet,aSetKey,nTop,nBot,cColHead,aBlockCols,cCurproc,bDel,_aHeads,aWhen,aPic,nUniMode,nApp,aRef,cFindMacro
LOCAL aType,bYesArray,bYesReplArray,bCoProc ,bYesNoRepl
Private myRecs
aSet:=SAVESET()
aSetKey:=SAVESETKEY()
SayAndWait("OK")
NETUSE("work_1",LOADPATH()+"\real\work_1.dbf",,.F.)
work_1->(dbcreateindex(GlobalTmpPath+"DATE","dtos(TEK_DATA)"))
work_1->(ordsetfocus("DATE"))
NETUSE("_Partner",LoadPath()+"partner.dbf",,.F.)
DISPBOX(2,0,23,79,( CHR( 201 ) + CHR( 205 ) + CHR( 187 ) + CHR( 186 ) + CHR( 188 ) + CHR( 205 ) + CHR( 200 ) + CHR( 186 )+' ' ),"W+/B")
nTop:=3
nBot:=22
cColHead:={" Дата Номер НАИМЕНОВАНИЕ Кол-во Цена Сумма "}
cCurProc:={||"2"}
aBlockCols:={{{||FIELD->tek_data},0},{{||FIELD->tek_nomer},9},{{||FIELD->name},16},{{||STR(FIELD->kol,5)},33},{{||STR(FIELD->cena,12,2)},39},{{||STR(FIELD->summa,12,2)},52}}
bDel:={||.F.}
ALTD()

aType:={{'1','Услуги системного инженера'}, ;
{'2','Услуги по программированию'},;
{'3','Услуги консультанта '}, ;
{'4','Услуги по терминальной св.'}}

_aHeads:={{"Введите дату работ.................:","TEK_DATA"},;
{"Введите номер документа............:","TEK_NOMER"},;
{"Наименование работ.................:","NAME"},;
{"Количество.........................:","KOL","1","1","0"},;
{"Цена...............................:","CENA","1","1","0"},;
{"Сумма (руб.).......................:","SUMMA"},;
{"Наименование контрагента...........:","Name_p"}}


// Для автоматического расчета суммы при вводе добавим
aWhen:={,,,,,{||aIn[6]:=aIn[4]*aIn[5]},,.T.}
// формат ввода данных
aPic:={,,,,,"999999999.99",}
// Для решения Вопрос а уникальности по индексу служит переменная
nUniMode=2
//
aRef:={,,,,,,"partners"}

cFindMacro:='cFind$UPPER(Name)'

//Переменные для возможности отметки нескольких записей
//MyRecs -массив в котором будут хранится отмеченные записи
bYesArray:={|x| IF(ValType(x)=='A',m->MyRecs:=x,m->myRecs)}
bYesReplArray:={|| FIELD->CODE }
bCoProc:={|| IIF(LastKey()==K_TAB, Keyb(K_ENTER), Nil) }
bYesNoRepl:={|x| .t.}

_PARTNER->( MAKEREFER("PARTNERS","Справочник поставщиков",2 ,{" Код ","Наименование поставщика"," И Н Н "},{3,5,16}, ;
"n/w,w+/n",{"SHORTNAME"},{"aIn[7]"},,{{||FIELD->CODE},{||FIELD->SHORTNAME},{||FIELD->CODE_PR}},;
,,,,, ;
,,,,, ;
,,bCoProc,,, ;
,'cFind$UPPER(ShortName)',,,,;
,bYesArray,,,, ;
,,,bYesReplArray,bYesNoRepl, ;
,,,,, ;
,'NAME') )
altd()

work_1->(INITLIST(nTop,nBot,cColHead,aBlockCols,cCurProc,;
_aHeads,aRef,aPic,aWhen,,;
nUniMode,bDel,,,,;
,,,,,;
,,cFindMacro,,, ;
,,,,))
altd()

work_1->( DBCLOSEAREA() )
_PARTNER->( DBCLOSEAREA() )
RESTSETKEY(aSetKey)
RESTSET(aSet)
RETURN NIL
SayAndWait("OK")
return NIL


1.Без параметра bCoProc:={|| IIF(LastKey()==K_TAB, Keyb(K_ENTER), Nil) } также все работает .
Просто этот параметр в данном случае необходим ,для того чтобы можно было переносить выбранные записи еще и при помощи клавиши TAB
Т.е. даже при отсутствущем bCoProc при пометки INS несколько записей и последующем нажатии на ENTER массив myRecs заполняется выбранными значениями.

Дополнительно добавил bYesNoRepl:={|x| .t.}.
Но не совсем понятно - как можно воспользовать этим параметром.
Если записать bYesNoRepl:={|x| .f.}.то INS просто для отметки текущей записи не работает.
Может быть он нужен для проверки ,текущего значения (значений) отмечаемой записи или контроля за уже отмеченными записями.
Но как тогда в блоке кода ее проверить?

2.Из описания MAKEREFER : "#DEFINE P_REPL 43 // Блок кода выполняемый при добавлении элемента в массив выбора (bYesArray)"
Как я его не "крутил" так и не понял для чего он нужен, и как заставить его работать? И нужен ли он вообще для данного случая?

3 Если запустить плагин ,вызвать справочник партнеров и отметить в справочнике партнеров одну или несколько записей и сохранить результат( нажав или Enter или Tab) , то если снова вызвать справочник партнеров при вводе новой записи или
при редактировании любой другой записи ,то прежние отметки INS сохраняются.
А надо бы чтобы при вызове справочника партнеров в другой записи этих отметок не было.
Возможно ли такое?
 
Цитата
gabov пишет:
Дополнительно добавил bYesNoRepl:={|x| .t.}.
Но не совсем понятно - как можно воспользовать этим параметром.
Если записатьbYesNoRepl:={|x| .f.}.то INS просто для отметки текущей записи не работает.
Может быть он нужен для проверки ,текущего значения (значений) отмечаемой записи или контроля за уже отмеченными записями.
Но как тогда в блоке кода ее проверить?
Думаю что вероятно этот блок кода управляет тем, какие записи отмечать нельзя.
Т.е. здесь должен быть не прямое логическое значение, а условия
 
Цитата
gabov пишет:
2.Из описания MAKEREFER : "#DEFINE P_REPL 43 // Блок кода выполняемый при добавлении элемента в массив выбора (bYesArray)"
Как я его не "крутил" так и не понял для чего он нужен, и как заставить его работать? И нужен ли он вообще для данного случая?
Возможно бывает, что не "плоская" таблица и надо выбирать еще откуда то данные, предварительно их обработав
 
Цитата
gabov пишет:
3 Если запустить плагин ,вызвать справочник партнеров и отметить в справочнике партнеров одну или несколько записей и сохранить результат( нажав или Enter или Tab) , то если снова вызвать справочник партнеров при вводе новой записи или
при редактировании любой другой записи ,то прежние отметки INSсохраняются.
А надо бы чтобы при вызове справочника партнеровв другой записи этих отметок не было.
Возможно ли такое?
Есть блок кода, который выполняется перед построением справочника.
В этом блоке кода вам просто надо обнулить ваш массив
 
Цитата
nordk пишет:
Цитата
gabov пишет:
3 Если запустить плагин ,вызвать справочник партнеров и отметить в справочнике партнеров одну или несколько записей и сохранить результат( нажав или Enter или Tab) , то если снова вызвать справочник партнеров при вводе новой записи или
при редактировании любой другой записи ,то прежние отметки INSсохраняются.
А надо бы чтобы при вызове справочника партнеровв другой записи этих отметок не было.
Возможно ли такое?
Есть блок кода, который выполняется перед построением справочника.
В этом блоке кода вам просто надо обнулить ваш массив
Определил семнадцатый параметр как bPreDisp:={|x| m->MyRecs:={},nil}.
Проблема ушла!
Цитата
nordk пишет:
Нееее вы значит не то нашли

k_stol->( MAKEREFER("SCLADS","Справочник столовых",2,{"Код столовой","Наименование столовой"},{3,5,15},,{"KSTOL","zsclad->shortname"},{"aIn[2]","aIn[3]"} ,"UPPER(aIn[2])", {{||field->KSTOL},{||zsclad->(DBSEEK(UPPER(k_stol->KSTOL))),zsclad->SHORTNAME}}) )
Определил девятый параметр как "UPPER(aIn[7])"
При открытии справочника в процессе редактирования записи курсор все равно встает на первую запись в справочнике.
Дополнительно определил 28-й параметр " nTag - номер тега, по которому производится Seek по cKeyVal"
как 2 ( значение взял из поля TAG_NOMER файла bases_00.dbf ).
Проблема не ушла .Где копать?
 
Цитата
gabov пишет:
как 2 ( значение взял из поля TAG_NOMER файла bases_00.dbf ).
Проблема не ушла .Где копать?
Не совсем точно изложил.
Значение поля TAG_NOMER файла bases_00.dbf для Partner.dbf, ключевое значение которого равно UPPER(shortname) ,т.е соответствует значению для поиска по ключу в нашем случае , равно "02".
Из описания MAKEREFER не понятно как его надо указывать :
то ли как номер по порядку ,т.е. в данном случае 2,
то ли - просто значение "02"
 
Напишите тег именно так как он называется
например для номенклатурника я бы написал "mlabel"
не надо никакие номера искать- я честно так и не понял какой тег вы хотели :)
для Partner.dbf, ключевое значение которого равно UPPER(shortname) надо писать "name"
 
Цитата
nordk пишет:
не надо никакие номера искать- я честно так и не понял какой тег вы хотели :)
для Partner.dbf, ключевое значение которого равно UPPER(shortname) надо писать "name"
В описании MAKEREFER по поводу 28 параметра :
" nTag - номер тега, по которому производится Seek по cKeyVal" .
Вот я и пытался к нему обратиться по номеру. А оказывается надо обращаться по имени.
1. Тем не менее указав 28-й параметр как 'NAME' проблему все равно не решил!

2.Дополнительно добавил сортировку (11-й параметр) :
aSortSeek:={;
{"- по коду ",{"Шифр "}, {'CODE'},'UPPER(aIn[7])',,,,'FULLCODE'},;
{"- по наименованию",{"Наименование "}, {'SHORTNAME'},'UPPER(aIn[7])',,,,'FULLNAME'};
}
После чего при нажатии в справ.партнеров на F7 появляется диалоговое окно выбора поиска и при выборе или вводе любого значения и нажатии на enter вываливается ошибка : "Переполнение массива", а затем еще error base/1003 Переменная не существует : Name
Как с этим бороться? Может быть у этих двух проблем одна причина?
Текст плагина с дополнениями:


Цитата
#include "inkey.ch"
Function Main()

LOCAL aSet,aSetKey,nTop,nBot,cColHead,aBlockCols,cCurproc,bDel,_aHeads,aWhen,aPic,nUniMode,nApp,aRef,cFindMacro
LOCAL aType,bYesArray,bYesReplArray,bCoProc ,bYesNoRepl,bPreDisp,aSortSeek
Private myRecs
aSet:=SAVESET()
aSetKey:=SAVESETKEY()
SayAndWait("OK")
NETUSE("work_1",LOADPATH()+"\real\work_1.dbf",,.F.)
work_1->(dbcreateindex(GlobalTmpPath+"DATE","dtos(TEK_DATA)"))
work_1->(ordsetfocus("DATE"))
NETUSE("_Partner",LoadPath()+"partner.dbf",,.F.)
DISPBOX(2,0,23,79,( CHR( 201 ) + CHR( 205 ) + CHR( 187 ) + CHR( 186 ) + CHR( 188 ) + CHR( 205 ) + CHR( 200 ) + CHR( 186 )+' ' ),"W+/B")
nTop:=3
nBot:=22
cColHead:={" Дата Номер НАИМЕНОВАНИЕ Кол-во Цена Сумма "}
cCurProc:={||"2"}
aBlockCols:={{{||FIELD->tek_data},0},{{||FIELD->tek_nomer},9},{{||FIELD->name},16},{{||STR(FIELD->kol,5)},33},{{||STR(FIELD->cena,12,2)},39},{{||STR(FIELD->summa,12,2)},52}}
bDel:={||.F.}

aType:={{'1','Услуги системного инженера'}, ;
{'2','Услуги по программированию'},;
{'3','Услуги консультанта '}, ;
{'4','Услуги по терминальной св.'}}

_aHeads:={{"Введите дату работ.................:","TEK_DATA"},;
{"Введите номер документа............:","TEK_NOMER"},;
{"Наименование работ.................:","NAME"},;
{"Количество.........................:","KOL","1","1","0"},;
{"Цена...............................:","CENA","1","1","0"},;
{"Сумма (руб.).......................:","SUMMA"},;
{"Наименование контрагента...........:","Name_p"}}


// Для автоматического расчета суммы при вводе добавим
aWhen:={,,,,,{||aIn[6]:=aIn[4]*aIn[5]},,.T.}
// формат ввода данных
aPic:={,,,,,"999999999.99",}
// Для решения Вопрос а уникальности по индексу служит переменная
nUniMode=2
//
aRef:={,,,,,,"partners"}
aSortSeek:={;
{"- по коду ",{"Шифр "}, {'CODE'},'UPPER(aIn[7])',,,,'FULLCODE'},;
{"- по наименованию",{"Наименование "}, {'SHORTNAME'},'UPPER(aIn[7])',,,,'FULLNAME'};
}
cFindMacro:='cFind$UPPER(Name)'

//Переменные для возможности отметки нескольких записей
//MyRecs -массив в котором будут хранится отмеченные записи
bYesArray:={|x| IF(ValType(x)=='A',m->MyRecs:=x,m->myRecs)}
bYesReplArray:={|| FIELD->CODE }
bCoProc:={|| IIF(LastKey()==K_TAB, Keyb(K_ENTER), Nil) }
bYesNoRepl:={|x| .t.}
bPreDisp:={|x| m->MyRecs:={},nil}

_PARTNER->( MAKEREFER("PARTNERS","Справочник поставщиков",2 ,{" Код ","Наименование поставщика"," И Н Н "},{3,5,16}, ;
"n/w,w+/n",{"SHORTNAME"},{"aIn[7]"},"UPPER(aIn[7])",{{||FIELD->CODE},{||FIELD->SHORTNAME},{||FIELD->CODE_PR}},;
aSortSeek,,,,, ;
,bPreDisp,,,, ;
,,bCoProc,,, ;
,'cFind$UPPER(ShortName)','NAME',,,;
,bYesArray,,,, ;
,,,bYesReplArray,bYesNoRepl, ;
,,,,, ;
,'NAME',"UPPER(aIn[7])") )

work_1->(INITLIST(nTop,nBot,cColHead,aBlockCols,cCurProc,;
_aHeads,aRef,aPic,aWhen,,;
nUniMode,bDel,,,,;
,,,,,;
,,cFindMacro,,, ;
,,,,))
altd()

work_1->( DBCLOSEAREA() )
_PARTNER->( DBCLOSEAREA() )
RESTSETKEY(aSetKey)
RESTSET(aSet)
RETURN NIL
SayAndWait("OK")
return NIL
 
Цитата
gabov пишет:
Переменная не существует : Name

Запятые проверяйте. У меня работает в простом тестовом примере.
Единственно я уже давно запятые не считаю :) Работаю через класс makerfer (сами себе написали).
Попозже посмотрю


Код
aSortSeek:={; 
 {"- по коду ",{"Шифр "}, {'CODE'},'UPPER(aIn[7])',,,,'FULLCODE'},; 
 {"- по наименованию",{"Наименование "}, {'SHORTNAME'},'UPPER(aIn[7])',,,,'FULLNAME'}; 
 }
А вот это у вас не прокатит
asortseek создает собственный массив aIn и разумеется раз 2 строки там 2 элемента
в первой строке надо писать UPPER(aIn[1]), во второй UPPER(aIn[2])
 
Сделайте проще
перед созданием справочника _partner->(ordsetfocus("name"))
И не надо указывать тег
 
Цитата
nordk пишет: это у вас не прокатит
asortseek создает собственный массив aIn и разумеется раз 2 строки там 2 элемента
в первой строке надо писать UPPER(aIn[1]), во второй UPPER(aIn[2])
1.Уже запутался.
Если я указываю как Вы рекомендовали ,т.е.
Цитата
Цитата
aSortSeek:={;
{"- по коду ",{"Шифр "}, {'CODE'},'UPPER(aIn[1])',,,,'FULLCODE'},;
{"- по наименованию",{"Наименование "}, {'SHORTNAME'},'UPPER(aIn[2])',,,,'FULLNAME'};
}
то при нажатии на F7 (поиск по коду) - проблем нет!!,
но если нажать на F7 (поиск по наименованию) то опять появляется ошибка :
"error base/1003 Переменная не существует : Name "

Если указать :
Цитата
aSortSeek:={;
{"- по коду ",{"Шифр "}, {'CODE'},'UPPER(aIn[1])',,,,'FULLCODE'},;
{"- по наименованию",{"Наименование "}, {'SHORTNAME'},'UPPER(aIn[1])',,,,'FULLNAME'};
}
то поиск работает как по коду ,так и по наименованию.Ошибок нет!!

Вопрос : Я Вас не правильно понял??

2.Указал перед MAKEREFER _partner->(ordsetfocus("name"))
Теперь при редактировании записи при открытии справочника партнеров курсор встает на первую запись в которой не заполнено краткое наименование партнера.
Проблема не ушла!
Страницы: Пред. 1 2 3 След.
Читают тему (гостей: 1)