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

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

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


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

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1 2 3 След.
RSS
Использование QINPUT() при выборе нескольких значений из справочника
 
Нужно из справочника выбрать несколько значений через отметку клавишей Insert.
Возможно ли это сделать при помощи функций MakeRefer() и QINPUT() или для этого нужно использовать Initlist() ?
 
а справочник сильно большой по кол-ву строк?. ВОзможно БЭСТовский аналог achoice подойдет - там есть множественный выбор
 
Справочников будет 3 : справочник партнеров, и еще два справочника - в одном строк 15, во втором строк 30.
Нужно отметить какое-то кол-во записей в каждом из них . Ну а далее сохранить в массив и т.д. и т.п.
Цитата
nordk пишет:
ВОзможно БЭСТовский аналог achoice подойдет - там есть множественный выбор
"achoice" в Бэсте - это что такое ?
Нужно все это для Бэст4 и Бэст5.
 
Код
/*
acTitle - строка либо массив строк для заголовка
aItem - массив строка для выбора
aLogic - массив условий доступности строк: доступна/недоступна для выбора
anItem - либо начальная строка либо массив,
    если массив - тогда возможен множесственный выбор
cColor - если потребуется цвет, отличный от стандартного
*/
// lF9 - обрабатывать ли нажатие F9
FUNCTION GraBoxMenu(acTitle, aItem, aLogic, anItem, lF9, lFixedFont)
 
Либо сами пишете новое окно на Инитлист, обработку меток по Ins и запись отмеченных строк в массив.
При завершении (закрытии окна) функция должна вернуть этот массив отмеченных строк
 
Функция FUNCTION GraBoxMenu применяется только в Бэст 5 ?
 
Да, разумеется.
В БЭСТ-4 ищите описание стандартной ACHOICE
 
Здравствуйте!
"Нарисовал" окно :
FUNCTION MyDate
Local _top:=4,_left:=13,_bot:=15,_right:=72
LOCAL aDataItems:={}, alSelect:={}
LOCAL _dataN:=ctod("01/01/2015"),_dataE:=ctod("31/01/2015"),_data:=ctod(''),i

i:=0
_data:=DTOC(_dataN)
aadd(aDataItems,_data)
While i<_dataE-_dataN
_data:=dtoc(ctod(_data)+1)
aadd(aDataItems,_data)
i++
enddo
_bot:=max(4,min(i,15))
alSelect:=afill(array(len(aDataItems)),.t.)
ALTD()
DISPBOX(_top-1,_left-1,_bot+1,_right+1,'╔═╗║══╚║ ',"N/BG")
SAYSCREEN(" ВЫБИРЕТЕ ОДНУ ИЛИ НЕСКОЛЬКО ДАТ ОПРИХОДОВАНИЯ ПРОДУКЦИИ",_top-1,_left+2)
RETURN ACHOICE(_top, _left, _bot,_right , aDataItems,alSelect)


А как получить множественность выбора значений из массива aDataItems ,. т..е отметку клавишей ins нескольких значений ?
 
aRezult:=achoice() - в масив вообще то должен возвратить номера выбранных позиций
а потом по номерам из массива берете эти значения
 
Цитата
nordk пишет:
aRezult:=achoice() - в масив вообще то должен возвратить номера выбранных позиций
а потом по номерам из массива берете эти значения
Вопрос не в том как выбрать значения из aRezult.
Не понятно: что нужно написать в коде ,чтобы программа при нажатии на Insert отмечала нужные позиции ?
 
Почему Insert - там пробелом отметка идет
 
[QUOTE]nordk пишет:
Почему Insert - там пробелом отметка идет
[/QUOTE]Нажимаю "пробел". Ожидаю увидеть какую-то подсветку(метку) на отмеченной записи.
Но ничего не происходит.
Изменено: gabov - 20.05.2015 12:51:18
 
Прошу прощения похоже с БЭСТ4 не выйдет.
Забывать стал, а ноутбук с наработками тоже устарел и не под рукой.
ACHOICE() не дает так просто множественный выбор. Быстро привыкаешь к хорошему и начинает казаться что так и было
Там надо мудрить с нажатиями кнопок в списке и как то самому запоминать.
Проше Initlist получается сделать и там все решить, если мы говорим про БЭСТ-4
В очередной раз убедился в серъезном разрыве между программами в плане возможностей
Еще раз изивините пожалуйста, что ввел в заблуждение
 
А из связки MakeRefer() и QINPUT() все таки нельзя получить множественный выбор.
Кажется ,в описаниях MakeRefer() что-то "промелькивало краем уха" про эту возможность.
 
Нет. Есть такакя функция DOREFER на основании которой MakeRefer все делает.
Лично мне написать Инитлист 1-2 часа, а с ней возиться 1-2 дня минимум.
Проблема в том, что она не предназначена для пользовательских плагинов и может ругаться что ей нужны
какие нибудь дополнительные функции и переменные (а может ти не будет ругаться)
Когда то я выкладывал ее исходники на форуме (на старом форуме, если он жив можно поискать)
Все подобные окна делались в БЭСТ-4 на ней программистами БЭСТ. Эти окна единичные, поэтому все может быть в плане
отсутствия универсальности для плагинов
 
Здравствуйте!
Чтобы изучить работу с INITLIST() сел за Ваши Уроки .
Дошел до Урока № 5 ( по INITLIST()).
Споткнулся ,и дальше ни в какую.
Вот код :
#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,x,y,z
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,m->aType)},,,,"partners"}
cFindMacro:='cFind$UPPER(Name)'
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




Программа ругается на строку :
work->(INITLIST(nTop,nBot,cColHead,aBlockCols,cCurProc,;
_aHeads,aRef,aPic,aWhen,,;
nUniMode,bDel,,,,;
,,aGetBlock,,,;
,,cFindMacro,,, ;
bPreGet,,,,aHotKey))

"Переменная не существует".

При этом на экране отображаются только значения по колонке "ДАТА" и "НОМЕР"
Видимо , я из Урока не понял как нужно правильно было задать из массива aBlockCols
третий подмассив {{||IF(!EMPTY(FIELD->TYPE),aType[VAL(FIELD->TYPE),2],SPACE(25))},16}

Как исправить?
 
Столько воды утекло :)
Я давно уже пользуюсь классом, который сами себе сделали
Тем не менее по коду
У Вас не рисуется третий столбец, раз первые 2 вы видите
Вижу описание его ,
Код
aType[VAL(FIELD->TYPE),2]


Вижу что переменная объявлена.
Значениями заполнена.
Но вот что у вас в базе work/
Либо там нет поля type либо она пустая, без единой строчки

Как я обычно поступаю, когда не могу разобраться в блоке кода
Вместо всего в блок кода переписываю в виде
Код
{||test(aType),16}

Затем создаю эту функцию с точкой останова для отладчика


Код
   
Код
static FUNCTION test(aType)
Код
Local cRezult
ALTD()
  cRezult:= |IF(!EMPTY(FIELD->TYPE),aType[VAL(FIELD->TYPE),2],SPACE(25))  
return cRezult


И уже тут в отладчике смотрю на переменные, текущую рабочую область и поля
И как правило нахожу причину проблемы
Изменено: nordk - 22.05.2015 14:28:00
 
Заменил третий подмассив в массиве aBlockCols
на {{||test(aType)},16}.
В конец плагина добавил

static FUNCTION test(aType)
Local cRezult
ALTD()
cRezult:= IF(!EMPTY(FIELD->TYPE),aType[VAL(FIELD->TYPE),2],SPACE(25))
return cRezult

Отладчик не дает остановиться перед cRezult:= IF(!EMPTY(FIELD->TYPE),aType[VAL(FIELD->TYPE),2],SPACE(25))

При пошаговом прохождении (нажатии на F8 ) он вообще не заходит в функцию static FUNCTION test(aType)

Я что-то не так сделал?
Изменено: gabov - 25.05.2015 07:05:27
 
Значит на шаг раньше ругается
{{||FIELD->tek_nomer},9} - вот сюда попробуйте его поставить просто {||test()}
 
Еще в Б4 после перекомпиляции иногда надо либо запускать с перезагрузкой отладчика либо с перезапуском БЭСТа
Иначе он из памяти может старый плагин брать
 
1.Проблема была ,как Вы и писали, в структуре dbf файла.
Просто пересоздал файл и проблема ушла.

Но осталась не ясность.
Когда я по Вашему совету третий подмассив массива aBlockCols заменил на {{||test(aType)},16} и добавил

static FUNCTION test(aType)
Local cRezult
ALTD()
cRezult:= IF(!EMPTY(FIELD->TYPE),aType[VAL(FIELD->TYPE),2],SPACE(25))
return cRezult

я ожидал ,что отладчик при пошаговом прохождении "войдет" в функцию static FUNCTION test(aType).

Но если оставить эту функцию без изменений,то тогда при пошаговом прохождении,когда курсор при встанет на
строку bPreGet,,,,aHotKey)), нажатие на F8 не приводит к изменению экрана (.т.е не отображается выполняемая текущая строка
в листинге плагина).Отладчик не позволяет увидеть ни переменных, ни строк кода .... .
Точка останова ALTD() в этой функции тоже ничего не дает. То есть не понятно зашел в эту функцию или нет.

Если переписать эту функцию :

static FUNCTION test(aType)
Local cRezult
SAYANDWAIT("TEST")
ALTD()
cRezult:= IF(!EMPTY(FIELD->TYPE),aType[VAL(FIELD->TYPE),2],SPACE(25))
SAYANDWAIT("TEST1")
return cRezult

То тогда можно хоть понять ,что после первого SAYANDWAIT("TEST")
возникают проблемы(после него выходит сообщение об ошибке ) , а SAYANDWAIT("TEST1") уже не отображается.
Т.е. получается тот же принцип отладки как и при использовании Fileeval() -только через SAYANDWAIT().

2.Для чего FUNCTION test(aType) объявляется как static ?
 
Теперь плагин запускается ,но при корректировки любой существующей записи
появляется сообщение " переменная не существует".
У Вас в "Пятом Уроке" написано :
"2. Для того чтобы подставляло нужное надо использовать параметр 26
Туда надо прописать
bPreGet:={|x,y,z|aIn[x]:=FIELD->VID}

Проблема обнаружилась в переменной bPreGet:

Если ее переписать так :
bPreGet:={,,{|x,y,z|aIn[x]:=FIELD->VID},,,,}

То это сообщение об ошибке не возникает.

Но при продолжении редактирования записи ( проходим все поля enter)
-когда курсор находится в поле "Введите номер документа" нажимаем enter,
то появляется сообщение " переменная не существует".
Проблема оказалась в переменной aRef:={,,{|x|ROTATEANDREADER(x,m->aType)},,,,"partners"}
Если убрать m->,то сообщение об ошибке не появляется.

Из урока я так и не понял : надо ли указывать m->aType или параметр m-> вообще не нужен?


Сейчас только что обратил внимание ,что поля VID нет. Есть поле TYPE, поэтому надо писать :
bPreGet:={,,{|x,y,z|aIn[x]:=FIELD->TYPE},,,,}
Изменено: gabov - 29.05.2015 11:33:14
 
Б4 не помню и тестировать нет времени.....
В Б5 обязательно заходит и останавливается

static означает что эта функция "видна" только внутри плагина
и исключает ошибку "пересечения" имен с функциями разработчика
Т.е. когда плагин завершит работу эта функция перестанет существовать для БЭСТа
 
Цитата
nordk пишет:
static означает что эта функция "видна" только внутри плагина
и исключает ошибку "пересечения" имен с функциями разработчика
Т.е. когда плагин завершит работу эта функция перестанет существовать для БЭСТа
Из вашего ответа следует, что желательно все свои функции внутри плагина начинать с static ?!
 
тут путаница в подходах работы
В БЭСТ-5 я собираю библиотеку и подгружаю.
И разумеется мои функции становятся видны если они не static
В случае с Б4 они скорее всего и так и так будут не видны и слово static можно не писать перед именем функции
Страницы: 1 2 3 След.
Читают тему (гостей: 1)