Posted by Анатолий Анимица on June 09, 1999 at 08:48:25:
Изложу идею. Неплохо, говорит АТ, иметь возможность передавать отчетным формам место указателя операции в клиенте. Клиент знает это место, чем и пользуется, например, при генерации запроса вида: L __SYS000·aaaa-0000 (форма проводки по операции).
В результате нашей с А.Г. Водяником проработки удалось получить решение, которое я и предлагаю всем. Пока в виде исходных текстов прямо здесь. Возьмите тексты программ в clipboard и перенесите их в соответствующие *.rpt файлы. Все это очень удобно сделать в clw.exe, для чего достаточно выполнить следующие действия:
1) запустите браузер и войдите на wwwboard (раз вы это читаете, это уже сделано),
2) запустите себе сервер над базой, в которой Вы это будете делать,
3) запустите clw.exe, указав его рабочим каталогом каталог базы данных по п.2),
совет: мои личные клиенты (сисадмина, так скажем) в базах моих клиентов (пользователей) имеют стандартное имя S, чтобы меньше букв набирать, и только они имеют рабочим каталогом каталог базы данных.
4) забрав в clipboard одну программу из показанных ниже, выполните в clw редактор-новый-paste и запомните результат в виде файла *.rpt
5) поступайте согласно п. 4), пока не останется что clip'ать.
Скомпилируйте формы. Enjoy!
Только не забывайте про кодовые таблицы. 1251 -> 866.
Итак, приступим.
1. В системную форму __sys000 внесено изменение. При каждом вызове ворма записывает в extrd.dat по индексу [user]+'+stamp3' значение [stamp 3], выхваченное клиентом из курсора операции по своим каналам, которые он нам не раскрывает.
Вот текст. Форма называется ___SYS00.
системная форма "проводки операции"
* Список пpоводок по опеpации
? O опеpация
OO=[strip O]
u=[user];[sed u+'+stamp3',OO]
====== ^^^^^^OO ======
Дебет Кpедит Сумма
rewind facts
X=0
:LOOP
search ta ?A, ?S, 0, ?K, ??, O
if [success]=0 goto QUIT;endif
AS=0
if [pa *A]='План' AS=[as *A];endif
if AS = 0
X=X+1
S=[sn S,13,2]
^^^^^^^^A ^^^^^^^^K ^^^^^^^^^^^^S
endif
goto LOOP
:QUIT
if X = 0
Нет ta-фактов для этой опеpации
endif
С этим все.
2. В системную форму users.rpt внесено изменение. добавлено переопределение __sys000 = ___sys00. Заодно предложу в этом файле то, что сделано у меня: первая же users.rpt, выполненная любым клиентом в новом году, запишет в extrd.dat даты последних дней месяцев года, чтобы больше в данном году не делать этих глупостей - просто [ged..] и все.
новая форма users.rpt
* переопределение форм
call yearset
call sysset
stop
:yearset подпрограмма вычисления количества дней в месяцах года. Один раз в году
* последовательно перебирает дни от 1 января до 31 декабря и записывает в
* extrd.dat по индексам YYYYMM число дней месяца MM в году YYYY.
ys=[intsn yc];ge=[ged ys+'+set'];if ~ge call storeday;endif
return yearset
:storeday подпрограмма записи в extrd.dat
t0=[da 1,1,yc];t1=[da 31,12,yc];fl=1 первый день-последний день-январь=1
for t=t0 to t1 цикл 365..366 дней максимум согласно * папе Григорию и Юлию Caezar'ю
ld=[tr [ce [antida t]]+0.5] день месяца
fn=[tr [ce [tr [antida t+1]]/100]+0.5] месяц дня
fo=[intsn fn-1]+'/';if fo='0/' fo='12/';endif индекс для записи
if ~(fn=fl) [sed ys+fo,ld]
fl=fn
*fo ^^^^^^^^^^^fo ^^ld ld
endif запись
endfor
[sed ys+'+set',yc] запись индекса года
return storeday
:sysset
__sys000 = ___sys00
return sysset
3. Ну и надо в мирных целях это все как-то использовать. Как пример - эта же форма, толко с другим именем, не спрашивает про операцию, а берет ее значение из extrd.dat, заодно уж по [jf..] выбирает текст операции и все можно печатать. Если многоуважаемый All поделится идеями, запросами, потребностями и пивом, может, еще чего напишу. Например, как отсюда с помощью аргументов управлять всем миром. Или хотя бы кучкой других форм.
Итак, форма ____sys0.rpt
проводки операции - обеспечьте обновление после перебора F6
* folios of operation as example
u=[user];O=[strip [ged u+'+stamp3']]
oo=[jf 'o key='+o]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^oo
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
====== ^^^^^^^O ======
Dt. Kt. Sum.
rewind facts
X=0
:LOOP
search ta ?A, ?S, 0, ?K, ??, O
if [success]=0 goto QUIT;endif
AS=0
if [pa *A]='PLAN' replace it with legal russian value
AS=[as *A]
endif
if AS = 0
X=X+1
S=[sn S,13,2]
^^^^^^^^A ^^^^^^^^K ^^^^^^^^^^^^S
endif
goto LOOP
:QUIT
if X = 0
None nozerosum folios in this operation
endif
ААА