Российский рынок экономических информационных систем. "ХАКЕРС ДИЗАЙН": сетевая система &qu...

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

.

Программа получает от функции [ru ] в качестве параметра строку, заключенную в двойные кавычки (таковы правила СУБД Clipper), которая содержит код субсчета и его наименование, разделенные точкой с запятой.

Суть работы программы состоит в том, что она ищет в списке записей файла BANK.DBF запись, соответствующую субсчету, выбранному при регистрации операции в "Финансах без проблем". Если такой записи нет, то программа предлагает ввести банковские реквизиты контрагента.

Далее, в любом случае пользователю предлагается на выбор список сведений о контрагентах. Он может откорректировать любую запись, пометить запись к удалению или добавить новую. После нажатия на Enter, реквизиты выбранной записи объединяются в одну строку без всяких разделителей и записываются в файл RU.TXT, откуда их и "подбирает" функция [ru ].

Приведенная программа может использоваться во многих формах, требующих отражения банковских реквизитов. Мы приведем пример ее использования в форме печати платежного поручения. Скопируйте файл PLATEZKA.RPT из директории варианта стандартной поставки в директорию PROBA, переименуйте этот файл в PLAT_POR.RPT и внесите следующие изменения:

Теперь, измените листья ветви "Расчетный счет расход" дерева операций следующим образом:

Зарегистрируем операцию:

Выберите "Создать документ". В ответ на запрос файла-формы введите номер документа, например, 145. Стартовал BANK.EXE и не найдя записи, соответствующей субсчету 60-001 "ТОО Вега" предлагает нам ввести банковские реквизиты поставщика:

 

 

После ввода недостающей записи переходим к выбору. Здесь можно завести несколько записей, соответствующих одному контрагенту, изменить реквизиты того или иного контрагента, пометить ненужные записи к удалению:

 

 

После нажатия на Enter происходит возврат в "Финансы без проблем" и завершение формирования документа:

 

 

Использование функции [ru ] может оказаться достаточно полезным. "Финансы без проблем" написать тяжело, а небольшой "прибамбас" к ним на Клиппере или Бэйсике - не составляет особого труда.

Однако, не всегда функция [ru ] дает эффективное решение из-за потери времени на загрузку внешней программы и считывание файла RU.TXT. Особенно это касается случаев ее вызова из файлов-коэффициентов. Для преодоления этого затруднения в языке форм "Финансов без проблем" имеется функция [DLLcall ], позволяющая вызывать программы из DLL-библиотеки. Она имеет следующий формат:

 

[DLLcall library, index, data]

 

library - наименование библиотеки DLL,

index - номеp вызываемой пpоцедуpы в библиотеке,

data - стpока данных, пеpедаваемая в пpоцедуpу.

 

Вызываемая процедура должна поместить результат своей работы в передаваемую строку и DLLcall вернет ее в качестве своего значения.

С точки зрения вызываемой процедуры передаваемый параметр data является указателем на строку, завершающуюся нулевым байтом. Процедура должна вернуть результат в ту же строку, рассматривая ее как буфер из 128 байт. Возвращаемый результат также должен завершаться нулевым байтом. При этом значение строки data не изменяется, поскольку вызываемой процедуре передается адрес промежуточного буфера с копией значения строки data.

Рассмотрим пример, демонстрирующий возможности использования функции DLLcall для адаптации "Финансов без проблем" к национальным языкам.

Ниже приводятся исходные тексты PASCAL-программ библиотеки MOLDOVA, содержащей две экспортируемые процедуры. Первая осуществляет перевод числа в словесное представление, а вторая выдает название месяца по его номеру на молдавском языке:

 

{$A+,B-,D+,E+,F-,G-,I-,L+,N-,O-,P-,Q-,R-,S+,T-,V+,X+}

{$M 16384,0,0}

 

library MOLDOVA;

uses strings;

 

type Sex = (male,female);

Var Number : longint;

ER : integer;

Frase : string;

F : text;

Level : integer;

 

 

function StrNumS(R :longint; f :Sex) :string;

var N,L :longint; s :string;

 

const D0 :array [0..19] of string[20]

= (,unu,doi,trei,patru,cinci,sase,sapte,opt,

noua,zece,unsprezece,doisprezece,treisprezece,

paisprezece,cincisprezece,sasesprezece,saptesprezece,

optsprezece,nouasprezece);

 

D1 :array [1..9] of string[20]

= (zece,douazeci,treizeci,patruzeci,cincizeci,saizeci,

saptezeci,optzeci,nouazeci);

 

D2 :array [1..9] of string[20]

= (o suta,doua sute,trei sute,patru sute,cinci sute,

sase sute,sapte sute,opt sute,noua sute);

 

begin

 

inc(Level,1);

 

if R < 0 then StrNumS:=Minus + StrNumS(-R,f)

 

else if R = 0 then StrNumS:=

 

else if R = 1 then

if Level=1 then

StrNumS:=un

else

StrNumS:=unu

 

 

else if R <= 19 then begin

StrNumS:=D0[R]+ ;

if f=female

then if R = 1 then StrNumS:=о

else if R = 2 then StrNumS:=doua ;

end

 

else if R <= 99 then begin

if (R mod 10)<>0 then

StrNumS:=D1[R div 10] + si + StrNumS(R mod 10,f)

else

StrNumS:=D1[R div 10] + + StrNumS(R mod 10,f)

end

 

else if R <= 999 then StrNumS:=D2[R div 100] + + StrNumS(R mod 100,f)

 

else if R <= 1999 then begin

StrNumS:=o mie + StrNumS(R mod 1000,f);

end

 

else if R <= 2999 then begin

StrNumS:=doua mii + StrNumS(R mod 1000,f);

end

 

else if R <= 99999 then begin

L: