результат моей переписки с Анатолием Таланиным о реализации одной идеи



Posted by Анатолий Анимица on June 09, 1999 at 08:48:25:



AAA



_______ новые возможности ФБП - теперь известно, на какой операции стоит курсор в клиенте ______

В результате моей переписки с Анатолием Таланиным (АТ) talanin@nsu.ru о реализации одной идеи, которому за нее большое спасибо, предлагаю всем пользователям ФБП новое решение, которое может упростить интерфейс с данными операций ФБП.

Изложу идею. Неплохо, говорит АТ, иметь возможность передавать отчетным формам место указателя операции в клиенте. Клиент знает это место, чем и пользуется, например, при генерации запроса вида: 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


Вот и все пока. Спасибо за внимание. Вопросы и пожелания принимаются по адресу
aaahd@mail.compnet.ru 24 часа 7 дней в неделю.

ААА



Пpишедшие ответы: