Joined: 19 Jul 2005 Posts: 18 Location: Ли Иван Occupation: вынужденный админ БЭСТа Interests: Люберцы
Posted: 01 Dec 2005 18:09 Post subject: Подцепить значение поля в шаблоне печатной формы из таблицы
Доброго здоровья!
Возникла следующая задача.
1. Есть самопальная таблица udo.dbf в dbase\sclad:
data D 8
udo C 4
В таблице создан индекс data_tag: dtos(data),
условие: !deleted().
В эту таблицу в начале каждого рабочего дня предполагается заносить
номер удостоверения. Т.е. на каждый день уникальный номер.
2. В "Товары. Готовая продукция" создан шаблон печатной формы "Удостоверение качества".
Нужно сделать так, чтобы при вызове fileeval, программа находила в таблице udo.dbf
номер удостоверения по дате выписки этого удостоверения (дата есть в шапке).
Механизм видится примерно таким: оператор утром вызвал спецфункцию, вбил сегодняшнюю
дату и номер. Затем втечение дня при выписке удостоверения, номер автоматом цепляется
из этой таблицы.
Если кому не в лом, подскажите как сделать. Может кто делал подобное.
За пример кода буду признателен. Спасибо.
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
Posted: 01 Dec 2005 19:07 Post subject:
Перед вызовом FileEval в качестве параметра необходимо передавать дату документа которая в шапке как Вы пишете.
Тогда в массиве aPars[] она будет находится и дальше вам в свое таблице останется сделать что-то типа DBSEEK(aPars[1]) и возвращать
udo->номер
И делайте через HFileEval плз
Joined: 19 Jul 2005 Posts: 18 Location: Ли Иван Occupation: вынужденный админ БЭСТа Interests: Люберцы
Posted: 02 Dec 2005 15:37 Post subject:
Спасибо за совет.
Однако придется начать с простого...
Допустим, хочу из шаблона передать в hfileeval эту самую дату.
В шаблоне пишу: hfileeval ('udo.hrb',{DDat})
Параметр DDat взял из окна "Параметры формулы".
В udo.hrb хочу отобразить то, что передал:
function main()
sayandwait('Дата = ' aPars[1])
return nil
После запуска отчета пишет: ошибка выполнения udo.hrb. Неверный аргумент. В следующем окне:
ERROR BASE/1122 Неверный аргумент: TRANSFORM arguments: ([1]=Type: U [2] = type C Val: 9999)
Подскажите, как правильно отобразить передаваемый параме
Joined: 19 Jul 2005 Posts: 18 Location: Ли Иван Occupation: вынужденный админ БЭСТа Interests: Люберцы
Posted: 06 Dec 2005 17:21 Post subject:
Теперь немного другая проблема. Но решил постить тут же. Благодаря "урокам харбора" (resperct to nordk) создана таблица udo.dbf и операторы бьют туда дату и номера. Очень хотелось бы сделать такие улучшения: при вводе новой записи по F4 дата должна стоять сегодняшняя, номер на 1 больше чем последний номер в таблице.
Пробовал прикрутить параметры aWhen или aVAlid, не получается.
Подскажите в каком направлении рыть...
Текущее состояние кода:
Code:
FUNCTION MAIN()
Local aSet, aSetKey,nTop,nBot,cColHead,aBlockCols,cCurproc,_aHeads,;
bDel,nUniMode, aWhen, cDate, aValid
aSet:=SaveSet()
aSetKey:=SaveSetKey()
// включаем отладчик
altd()
// подключаем таблицу (.F. - не монопольно)
NETUSE ("UDO", LoadPath()+"\sclad\udo.dbf",,.F.)
dbpush()
go bottom
// Рисуем рамку для отображения таблицы
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
// Заголовки столбцов (ширина не более 78, но и не менее)
cColHead:={" Дата Номер удостоверения качества Номер ветсвидетельства "}
// Параметр - сопроцедура для QBrowse - обновить все записи
cCurproc:={||"2"}
// форматируем размеры и координаты вывода столбцов
aBlockCols:={{{||field->tekdata},0},{{||field->nomer},33},;
{{||field->nomervet},52}}
// переменная для ввода записи (отображается как окно)
_aHeads:={{"Дата.........................:","TEKDATA"},;
{"Номер удостоверения качества.:","NOMER"},;
{"Номер ветсвидетельства.......:","NOMERVET"}}
// переменная для разрешения/запрета удаления
bDel = {||.F.}
// определяем уникальность по индексу (=2)
nUniMode:=2
cDate:=date()
//aWhen:={,,,,,{||aIn[1]=cDate,.t.}}
aValid:={,,,,,{||aIn[1]=cDate,.t.}}
udo->(Initlist(nTop,nBot,cColHead,aBlockCols,cCurProc,;
_aHeads,,,aWhen,aValid,nUniMode,bDel,,,,))
udo->(DBCLOSEAREA())
dbpop()
RestSetKey(aSetKey)
RestSet(aSet)
//sayandwait ("Hello")
RETURN NIL
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
Posted: 06 Dec 2005 17:32 Post subject:
Ну тут в первую очередь
aValid:={,,,,,{||aIn[1]=cDate,.t.}}
надо как минимум
aValid:={,,,,,{||aIn[1]:=cDate,.t.}}
А вообще для инициализации aIn[] лучше применять
26.bPreGet – блок кода, выполняемый пеpед каждым выполнением READ до пpоpисовки GetList (при необходимости заранее проинициализировать aIn, а также для навески SetKey'ев и формирования связанных таблиц до непосредственного редактирования). В блок кода передается флаг выхода по сслыке, если его сбросить в .T., то будет произведен выход из qInput, без выполннения bPostGet. В блок кода вторым параметром передается текущий aHeads
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
Posted: 07 Dec 2005 18:06 Post subject:
Давайте включать полет мысли
Нам нужно aIn[1]:=cDate - так ?
Тогда зачем забивать голову параметрами
bPreget:={|x,y|aIn[1]:=cDate}
Кол-во параметров обозначили и ладушки - цель то у нас другая, а
именно проинициализировать aIn[] - будут нужны параметры - тогда
над ними и подумаем - правильно ?
Joined: 19 Jul 2005 Posts: 18 Location: Ли Иван Occupation: вынужденный админ БЭСТа Interests: Люберцы
Posted: 07 Dec 2005 19:10 Post subject:
Есть, работает.
Полет мысли - это хорошо. Но аэродром то должен быть какой то...
Что такое |x,y|?
А как мне в bPreGet вписать в aIn[2], что nomer = nomer+1.
Пробовал что типа: bPreGet:={|x,y|aIn[1]:=cDate, aIn[2]:= udo-> nomer +1}...
В общем это метод тыка какой то получается, так как насчет синтаксиса?
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
Posted: 07 Dec 2005 21:07 Post subject:
Это не метод тыка - это стандартные правила блоков кода в клиппере.
Вы абсолютно правильно написали - через запятую, так и надо
В функции при вызове мы передаем ей параметры при вызове
myfunction(x,y) - просто объявляем что есть переменные куда положить
В блоке кода {|x,y|}
Вам сказали что должно быть два параметра - вот мы и определяем две переменные в которые значение этих параметров внутри
блока кода разместить программа пусть пытается.
А проблема ваша вероятно в том что вы уверены что стоите на строке с последним номером (курсором в базе udo) и прибавляете 1 - если это будет так то aIn[2] будет правильным, если нет - то значит надо
думать как курсор в udo поставить на правильную запись перед
инициализацией aIn[2]
Если что непонятно пишу - Вы уж извиняйте, спрашивайте плз
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum