Re: Передача параметров в процедуры в FIRST.RPT



Posted by Анатолий Анимица on June 25, 1999 at 12:53:15:

In Reply to: Передача параметров в процедуры в FIRST.RPT posted by Анатолий, Херсон on June 25, 1999 at 03:36:28:

Хочется аплодировать. Если Анатолий, Херсон, не против - может, прямо с этого и начнем? Мне сейчас приходит много писем с предложениями, просьбами, поздравлениями и проч. Лично каждому я успеваю ответить, поблагодарить, послать, спросить и так далее, а вот с чего бы начать общее изложение того, что будет?
FIRST.RPT FIRST!

То есть - целиком поддерживаю.

Требование к first первым запишем от Анатолия - не занимать имен переменных, только массивы.

Вторым тогда мое - first не зависит от владельца базы! Никаких C1..CN! Все хранится в extrd.dat абсолютно одинаково для всех однородных контрагентов - наименования, ИНН, банки, адреса и проч. Для себя самого существует место - [sa 51,1]! Т.е. [sa 51,1]+'+name' - это имя, и так далее. В последних версиях своих настроек я отказался от группировки нескольких полей реквизитов, например, в одном слове extrd.dat - но это не так строго, если будет общая доказательная воля, объединим ОКОНХ ОКУД И ОКПО, хотя толку от них..


Вот один из моих first.rpt - они все одинаковые, поэтому давайте с него и начнем. Путем уменьшения и ускорения входящих подпрограмм и выбрасывания констант.


* общие определения и подпрограммы
* детерминант месяцев
mg='нвеварпрайюнюлвгенктояек'
C1=[strip [ged [sa 51,1]+'+name']]
ys=[intsn yc]
* константы управления EscP принтерами
f0=[ch 27]+'x'+[ch 1]+[ch 27]+'P' lq pica
e0=[ch 27]+'x'+[ch 0] draft
e1=[ch 15]+[ch 27]+'M' condensed elit
e2=[ch 18]+[ch 27]+'P' 10 cpi
e3=[ch 15]+[ch 27]+'P' 12 cpi
ff=[ch 12] form feed
goto firststart переход к выполнению формы
* Подпрограммы
:dmy Подпрограмма из ad=199801.01 -> 01.01.1998.
t1=[ce ad] выход tt
t2=[tr ad]
t3=[tr [ce ad/100]]
t4=[tr ad/100]
t5=[intsn t1]
! t1<9.99
t5='0'+t5
!
t6=[intsn t3]
! t3<9.99
t6='0'+t6
!
t7=[intsn t4]
tt=t5+'.'+t6+'.'+t7
return
:wn подпрограмма сумма прописью из входа S выход wn
kp=[ro [ce S]] копейки
rb=[tr S] рубли
ss=[wn rb] рубли прописью
! rb<0.001
ss='Ноль '
!
kc='00'
! kp in 9.999..99.999
kc=[sn kp,2,0]
! kp in 1..9
kc='0'+[sn kp,1,0] копейки символьно
!
ru='рублей '
cs=[tr [ce rb/100]+0.5]
! cs in 0.9999..1.0001
ru='рубль '
goto rok
! cs in 1.999..4.0001
ru='рубля '
goto rok
! cs in 4.9999..20.0001
ru='рублей '
goto rok
! [ce cs/10]/10 in 0.9999..1.0001
ru='рубль '
goto rok
! [ce cs/10]/10 in 1.9999..4.0001
ru='рубля '
goto rok
!
:rok
ko='копеек'
! kp in 0.999..1.001
ko='копейка'
goto kopok
! kp in 1.999..4.001
ko='копейки'
goto kopok
! kp in 4.999..20.001
ko='копеек'
goto kopok
! [ce kp/10]/10 in 0.999..1.001
ko='копейка'
goto kopok
! [ce kp/10]/10 in 1.999..4.001
ko='копейки'
!
:kopok
wn=ss+ru +kc +' '+ko сумма прописью
return
*
:fain подпрограмма-функция формирования инициалов вход fa выход fa
io=0 io=0 идет фамилия io=1 первый символ имени io=2 далее имя io=3 первый
сивол отчества
fi=[strip fa] без пробелов ФИО входящая
fa='' исходящая пока пустая
lw=[length fi] длина входящей
lz=1 первый символ
:nxtfs следующий символ
fc=[cp fi,lz,1] один lz-й символ, сначала первый
! fc+'.'=' .' если пробел
io=io+1 инициализация отбора инициала
goto pluslz на следующий символ
! io=0 иначе если пока идет фамилия
fa=fa+fc символ + к фамилии
goto pluslz плюс к номеру символа
! io=1 имя пошло
fa=fa+' '+fc+'.' инициал имени c точкой +
io=2
goto pluslz
! io=2 последующие символы имени
goto pluslz
! io=3 отчество
fa=fa+fc+'.' инициал отчества с точкой
goto faout все
:pluslz
lz=lz+1
! lz>lw
goto faout больше ничего
!
goto nxtfs
! io>2
goto faout
! lz>lw
goto faout
!
goto nxtfs
:faout
fa=[strip fa]
return
* подпрограмма поиска первого пробела в строке
* вход st выход sp(space position)=позиция пробела,
* если нет, sp=0
:spasrch
! [type st]=0 вдруг число
st=[intsn st] в строку (целое)
!
ls=[length st] длина строки
sp=0 как будто пробела нет
ns=1 позиция символа st
:nxtspsrch
! [ps ' .',[cp st,ns,1]+'.']>0.01
sp=ns это результат
return
!
ns=ns+1 следующий
! nsgoto nxtspsrch на проверку
!
return выход
* подпрограмма поиска пробела внутри отрезка строки
* вход st g1 начало отрезка g2 конец отрезка выход sp
:spsrchn нужно, чтобы g1<=g2. Если пробела нет, 0
! [type st]=0
st=[intsn st] число в строку (целое)
!
sp=0 по входу пробела нет
ls=[length st]
! [type g1]+[type g2]>0.001
return пробела не будет!
! g2return то же
!
! lsreturn строка короче
!
ra=g2-g1 длина отрезка
ns=g1 позиция в начале отрезка
:newspsrch
! [ps ' .',[cp st,ns,1]+'.']>0.001
sp=ns
return
!
ns=ns+1
! nsgoto newspsrch
!
return
: fdtdc подпрограмма преобразования "1 декабря 1999 г." в "01.12.1999 г."
* вход D выход D, зависит от u+'viddat' в extrd.dat - 0 слово мес.1 цифры
мес.
rf=[ged u+'+viddat']
! rf=0
return fdtdc
!
st=D
call spasrch
! sp=0
error нет месяца
!
i1=[strip [cp st,1,sp-1]] день
! [length i1]<2
i1='0'+i1
!
st=[strip [cp st,sp,[length st]-sp+1]] месяцгод
call spasrch
! sp=0
error нет года
!
yg=[strip [cp st,sp,10]] год
mp=0
:nxtmp
mp=mp+1
! mp>12
*error ошибка месяц
mp=mc
goto mtt
!
ps=[ps [cp mg,mp*2-1,2],st]
! ps=0
goto nxtmp
!
:mtt
mt=[intsn mp]
! mp<10
mt='0'+mt
!
D=' '+i1+'.'+mt+'.'+yg
return fdtdc
:firststart
* то, что здесь окажется, будет выполняться на старте каждой формы
* или первичного документа
:firstend
*



Прошу!

ААА
P.S. Если что не так - скажите, тогда так не будем, а будем как лучше. Я планирую чуть позже более структурированную базу текстов - это временная мера.
Жду критики .





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