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

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

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


Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Не могу дать ума Makerefer БЭСТ4+
 
Здравствуйте!
Создаю справочник на основе mlabel.
Проблема собственно вот в чем. В режиме редактирования своих данных, не получается сделать так чтобы при вызове справочника сразу выбиралась позиция которая уже была введена. Выбирается самая последняя запись в справочнике.

Подскажите пожалуйста, что не так. Заодно может кто нибудь знает как в моем случае сделать поиск в справочнике по первым буквам Наименования ?

_MLABEL->( MAKEREFER("MLABEL","Номенклатурный справочник",3,;
{"Группа","Номенклатурный №"," Наименование "},{4,6,12},"n/w,w+/n",;
{"NNUM","NAME"},{"aIn[5]","aIn[6]"},"UPPER('1'+aIn[4]+aIn[6])",;
{{||FIELD->GRUP},{||FIELD->NNUM},{||LEFT(FIELD->NAME,40)}};
,,,,,,,;
{||_mlabel->(setscope("MLAB_ST",""+aIn[4]))},{||_mlabel->(setscope())};
,,,,,,,,,'cFind$UPPER(NAME)';
,'MLAB_ST',,,,,,,,,,,,,,,,,,,) )
Изменено: Данила Кошевой - 02.12.2009 10:59:37
 
PROCEDURE MakeRefer;
(cRefer, cHead, nTypRefer, cKeyaHeads, aYXN,; // 5
cColor, aSource, aDest, cKeyVal, abFields,; // 10
aSortSeek, aInputHeads, aPict, aWhen, aValid,; // 15
bPost, bPreDisp, bPostDisp, bColor, cKeyValDisp,; // 20
aRef, cHelp0, bCoProc, nRowHelp, nColHelp,; // 25
aGetBlock, cFindMacro, nTag, bScrInit, bScrPost,; // 30
bDispSpr, bYesArray, nTagSeek, aHotKey, aOtherKey,; // 35
bPreGet, bPostGet, bPostRead, bYesReplArray, bYesNoRepl,; // 40
bSayPtica, cHeadPtica, bSayHead, bKeyHead, lEditRefer,; // 45
bYesValue, nOrdSeek, cLeftKey, nPosKey ;
)
 
Цитата
"UPPER('1'+aIn[4]+aIn[6])"

Это строка поиска в справочнике.
Я правильно понял - Вы пытаетесь искать в закрытых номенклатурных номерах ?
Тогда Ваше желание противоречит накладываемому скобу
{||_mlabel->(setscope("MLAB_ST",""+aIn[4]))}
Очень надеюсь что в скобе между кавычками стоит пробел.
Если нет, то поиск должен уходить на LASTREC()+1.

За поиск по первым буквам отвечает 47 параметр
 
Ой. Конечно же "UPPER(''+aIn[4]+aIn[6])" у меня на самом деле. Просто перед тем как написать на форум перепробовал все варианты и комбинации.
Пробывал {||_mlabel->(setscope("MLAB_ST"," "+aIn[4]))} при таком варианте (с пробелом) у меня всегда пишет, что справочник пуст.

На счет 47 и 48 параметра. У меня они присутствовали и поиск работал. Но когда я начал использовать scope, искать по первым буквам он отказался напрочь.

Если честно это мой первый плагин. До этого для БЭСТа писать не приходилось. В общих чертах в языке разобрался. Задача была написать программу для регистрации заказов во время выписки накладных. т.е. Оператор на телефоне выписывает товар, если чего то нет в наличии вызывает мою программу. Плагин цепляю в Картотеке с текущими остатками, Позиционирование Shift-F7. Как бы и плагин готов, только осталось доработать работу со справочником.

function Main()

Local aSet,aSetKey,nTop,nBot,cColHead,aBlockCols,cCurproc,bPreGet,udate
/*
Local adbf
adbf:={}
aDbf:={ {"NNUM","C",6,0},;
{"TEK_DATE","D",8,0},;
{"KOD_TPS","C",6,0},;
{"NAME_TPS","C",25,0},;
{"GRUPPA","C",5,0},;
{"NNOMER","C",13,0},;
{"KOL","N",12,4},;
{"PRIM","C",255,0}}

DBCREATE(LoadPath()+"\SCLAD\UZAKAZ.dbf",ADBF)
*/

aSet:=SaveSet()
aSetKey:=SaveSetKey()
udate:=date()

NETUSE("UZAKAZ",LoadPath()+"sclad\uzakaz.dbf",,.F.)
NETUSE("_MLABEL",LoadPath()+"sclad\mlabel.dbf",,.F.)

UZAKAZ->(ORDSETFOCUS("DATA"))
UZAKAZ->(SETSCOPE())
UZAKAZ->(SETSCOPE("DATA",dtos(udate)+pagentcode))
UZAKAZ->(DBGOTOP())


//DISPBOX(6,3,19,76,( Chr( 201 ) + Chr( 205 ) + Chr( 187 ) + Chr( 186 ) + Chr( 188 ) + Chr( 205 ) + Chr( 200 ) + Chr( 186 )+' ' ),"W+/B")
ShadowBox("[ Заказы ]",6,3,19,76,"W+/B")

nTop:=7
nBot:=18
bDel:={||.T.}
cColHead:={" Наименование Кол-во "}
cCurProc:={||"2"}

aBlockCols:={{{||LEFT(field->NAME,34)},2},;
{{||STR(field->KOL,12,3)},37}}

_MLABEL->( MAKEREFER("MLABEL","Номенклатурный справочник",3,;
{"Группа","Номенклатурный №"," Наименование "},{4,6,12},"n/w,w+/n",;
{"NNUM","NAME"},{"aIn[5]","aIn[6]"},"UPPER(''+aIn[4]+aIn[6])",;
{{||FIELD->GRUP},{||FIELD->NNUM},{||LEFT(FIELD->NAME,40)}};
,,,,,,,;
{||_mlabel->(setscope("MLAB_ST",""+aIn[4]))},{||_mlabel->(setscope())};
,,,,,,,,,'cFind$UPPER(NAME)';
,'MLAB_ST',,,,,,,,,,,,,,,,,,,'MLAB_ST') )


_aHeads:={{"Дата...............:","TEK_DATE"},;
{"Код ТПС............:","KOD_TPS"},;
{"ТПС................:","NAME_TPS","1"},;
{"Группа.............:","GRUPPA"},;
{"Номенклатурный №...:","NNOMER","1","1","0"},;
{"Наименование.......:","NAME","1","1","0"},;
{"Количество.........:","KOL"},;
{"Примечание.........:","PRIM"}}

bPreGet:={||IF(nApp=2,{aIn[1]:=udate,aIn[2]:=pagentcode,aIn[3]:=pagentname,aIn[5]:=''},'')}

aWhen:={{||.F.},{||.F.},{||.F.},,{||.F.}}
//aValid:={,,,,{||aIn[6]:=aIn[4]*aIn[5],.T.}}
aPic:={,,,,,"@KS35",,"@KS35"}
cFindMacro:='cFind$UPPER(Name)'


aRef:={,,,,,"mlabel"}

nUniMode=0

UZAKAZ-> (initlist(nTop,nBot,cColHead,aBlockCols,cCurProc,;
_aHeads,aRef,aPic,aWhen,,nUniMode,bDel,,,,,,,,,,,,,,bPreGet,,,,cFindMacro))


UZAKAZ->( DBCLOSEAREA() )
_MLABEL->( DBCLOSEAREA() )

RestSetKey(aSetKey)
RestSet(aSet)

RETURN NIL
 
В Вашем примере я не вижу применение 48 параметра, только 47.

общий подход такой.
Если у Вас просто индексный ключ, то по первым буквам поиск работает.
вы применили индексный ключ со скопом.
Значит поиск начнет работать после того как Вы правильно наберете сначала старшую часть скопа - а именно пробел и код группы.
Чтобы этого не делать, существует параметр который за Вас как бы заранее подставляет эти символы и нажимая первые буквы вы на самом деле продолжаете после уже введенной компьютером части строки. И тогда поиск начиначет работать.
Значит нам надо в 48 параметр передать старшую часть скопа (поскольку ее так или иначе надо набирать по условиям указанного в 47 параметре индексного ключа, только
это будет делать программа за Вас.
 
Так еще раз проверил все параметры.. Убедился, что все на своих местах и все равно ничего не работает. НЕ поиск по первым введенным буквам (параметр 47 48). Не работает как оказалось даже по Alt-F7 . Жму Alt-F7. Набираю текст. Жму ENTER – вылетает красная ошибка «Ошибка выполнения uzakaz.hrb Переменная не существует» Далее жму ESC ESC ESC появляется еще 1 ошибка(во вложении скрин) :mecry:

Вот последний вариант:
_MLAB->( MAKEREFER("MLAB","Номенклатурный справочник",3,;
{"Группа","Номенклатурный №"," Наименование "},{4,6,12},"n/w,w+/n",;
{"NNUM","NAME"},{"aIn[5]","aIn[6]"},"UPPER(' '+aIn[4]+aIn[6])",;
{{||FIELD->GRUP},{||FIELD->NNUM},{||LEFT(FIELD->NAME,40)}};
,,,,,,,;
{||_mlab->(setscope("MLAB_ST",""+aIn[4]))},{||_mlab->(setscope())};
,,,,,,,,,'cFind$UPPER(NAME)';
,'MLAB_ST',,,,,,,,,,,,,,,,,,,'MLAB_ST','" "+aIn[4]') )
Изменено: Данила Кошевой - 03.12.2009 13:56:52
 
Значит так.. На последок попробовал убрал этот {||_mlab->(setscope("MLAB_ST",""+aIn[4]))},{||_mlab->(setscope())} .
кусок из кода

О чудо. Все виды поиска заработали и по Альт-Ф7 ошибка пропала, и подстановка при вызове справочника заработала . Только вот 48ой параметр не могу подобрать. Ставлю ‘ +an[4]‘ – не работает, ‘ 01 01’ т.е. явное указания статуса и группы – работает.

Так вот … помогите пожалуйста разобраться почему с {||_mlab- >(setscope("MLAB_ST",""+aIn[4]))},{||_mlab->(setscope())} ЛЮБОЙ вид поиска не работает…. Мозги закипели уже..
Изменено: Данила Кошевой - 03.12.2009 14:14:40
 
Давайте разбираться со скопом.
Он SetScope([текстовое значение ключа],[начальное значение для скопа],[конечное значение для скопа],[массив индексов])

Вы не указываете четвертый параметр, поэтому скоп накладывается на все индексы таблицы !!! А Вам надо только на определенные.
48 параметр действительно надо явно указывать.
47 параметр индекс должен быть не тот же самый, а другой на который скоп не будет наложен, а если будет наложен то значение скопа надо не переменными определять а
явно.
ALT-F7 к индексам отношения не имеет и должен работать в принципе, скоп не должен влиять
В поисках надо не забывать указывать старшую часть скопа - но там тоже массив aIn - он переопределяется.
ЗНАЧИТ !!! при открытиии справочника в блоке кода перед наложением скопа полезно некую переменную сGrup:=aIn[4] и разумеется она должна быть объявлена чуть выше и видна makerefer ом.
Тогда в 48 параметре " "+cGrup будет явным значением и тоже должно заработать.
Вероятно имеет место передопределение массива aIn и его значений при построении справочника, а уж при настройке массива aSortSeek - это 100%
Страницы: 1
Читают тему (гостей: 1)