Печатная форма счета-фактуры состоит из трех частей. Первая часть пред-
ставляет собой заголовок формы, количество записей и размеры которой
постоянны. Вторая часть представляет собой таблицу, состоящую из заго-
Рис. 7.13. Устанавливаем направление шрифта для текста ячейки
ловка, табличной части и оконечной части, которая содержит итоговые
суммы. Третья часть формы счета-фактуры представляет собой записи, ко-
личество которых является константой, а расположение определяется раз-
мерами табличной части документа.
Для формирования документа будем использовать его шаблон, который
создадим и сохраним в формате шаблона документа Word. Данный шаблон,
как и шаблон простого (без таблиц) документа, должен содержать постоян-
ный текст, который не будет меняться при формировании новых докумен-
тов, и текстовые константы, служащие для подстановки реального текста
при формировании документа. Кроме этого в шаблоне счета-фактуры
должна присутствовать табличная часть, ячейки которой содержат как по-
стоянные записи, так и текстовые константы для заполнения из программы.
Дополнительно табличная часть должна иметь строки, по подобию которых
будут добавляться новые строки в таблицу.
Внешний вид возможного шаблона документа бланка счета-фактуры пред-
ставлен на рис. 7.14.
Для формирования выходного документа будем использовать методы поиска
фрагмента текста в документе, поиска и замены фрагмента текста на задан-
Рис. 7.14. Шаблон документа бланка счета-фактуры
ный текст. Для работы с табличной частью документа нам придется исполь-
зовать свойства и методы для обеспечения перехода к заданной ячейке,
определения текущей таблицы и положения в ней ячейки, записи текста в
ячейку. Рассмотрим фрагменты исходного текста:
Формирование табличного документа с использованием шаблона документа
// Функция FindAndlnsert находит текстовую константу и подставляет
// на ее место текст
function FindAndlnsert(FindText,ReplacementText:string):boolean;
const wdReplaceAll=2;
begin
Form!.W.Selection.Find.Text:=FindText;
Forml.W.Selection.Find.Replacement.Text:=ReplacementText;
FindAndlnsert:=Forml.W.Selection.Find.Execute(Replace:=wdReplaceAll);
end;
// Функция FindRowColumnlnTable находит текстовую константу и возвращает
// таблицу, а также номер строки и столбца, где находится эта константа
Function FindRowColumnlnTable(FindText:string;var tab:variant; var
Row,Column:integer):boolean;
begin
FindRowColumnlnTable:=false;
try
Forml.W.Selection.Find.Text:=FindText;
if Forml.W.Selection.Find.Execute then begin
Column:=Forml.W.Selection.Cells.Item(l).Columnlndex;
Row:=Forml.W.Selection.Cells.Item(l).Rowlndex;
tab:=Forml.W.Selection.Tables.Item(1);
FindRowColumnlnTable:=true;
end;
except
FindRowColumnlnTable:=false;
end;
end;
// Данная процедура формирует документ счет-фактуру
procedure TForml.ButtonllCllck(Sender: TObject);
var table_:variant;
Row_,Column_:integer;
begin
// Создаем новый документ по шаблону
W.documents.Add(ExtractFileDir(Application.ExeName)+
'\Шаблон счета-фактуры.dot');
// Подставляем текст в заголовок документа
FindAndlnsert('###НОМЕР&',Ч');
FindAndlnsert(•###Дата&',datetostr(date));
FindAndlnsert('###ПРОДАВЕЦ&','ЗАО Сокол');
FindAndlnsert('###АДРЕС_ПРОДАВЦА&',
'г. Санкт-Петербург, ул. Кузнечная 5');
FindAndlnsert('###ИНН_ПРОДАВЦА&', 4234567890') ;
FindAndlnsert('###ГРУ300ТПРАВИТЕЛЬ&','ЗАО Сокол');
FindAndlnsert('###ГРУ30П0ЛУЧАТЕЛЬ&','ЗАО Селена');
FindAndlnsert('###ДОКУМЕНТ&','1');
FindAndlnsert('###ДАТА_ДОКУМЕНТА&',datetostr(date));
FindAndlnsert('###ПОКУПАТЕЛЬ&','ЗАО Селена');
FindAndlnsert('###АДРЕС_ПОКУПАТЕЛЯ&','г. Москва, ул. Комаровского 41');
FindAndlnsert('###ИНН_ПОКУПАТЕЛЯ&','0987654321');
// Если нашли текстовую константу, то переходим к формированию табличной
// части.
if FindRowColumnlnTable('###ТАЕЛИЦА&',table_,Row_,Column_)then begin
// Перед началом формирования курсор находится в таблице table_
// в ячейке Cell(Row_,Column_). Добавляем в таблицу необходимое
// количество строк, уменьшенное на 1 (поскольку одна строка
/ / в шаблоне уже есть).
W.Selection.InsertRows(2-1);
// Формируем первую строку табличной части документа.
table_.Cell(Row_,Column_+0).Range.Text:='KOVRIC TRIVEL RUG';
table_.Cell(Row_,Column_+1).Range.Text:='шт';
table_.Cell(Row_,Column_+2).Range.Text:='l';
table_.Cell(Row_,Column_+3).Range.Text:='342,00';
table_.Cell(Row_,Column_+4).Range.Text: = '342, 00' ;
table_.Cell(Row_,Column_+ 6).Range.Text: =' 2 0, 0 0 ';
table_. Cell (Row_, Coluntn_+7) .Range.Text: =' 68, 40 ' ;
table .Cell(Row_,Column +8).Range.Text:='41O,40';
// Формируем вторую строку табличной части документа.
Inc(Row_);
table_.Cell(Row_,Column_+0).Range.Text:=
'НИТЬ Climax Braided 100m 0,16mm';
table_.Cell(Row_,Column_+1).Range.Text:='шт';
table_.Cell(Row_,Column_+2).Range.Text: ='2' ;
table_.Cell(Row_,Column_+3).Range.Text: = '3O9, 08' ;
table_.Cell(Row_,Column_+4).Range.Text: ='618,16' ;
table_.Cell(Row_,Column_+6).Range.Text:='2O,00';
table_.Cell(Row_,Column_+7).Range.Text:='123,63';
table_.Cell(Row_,Column_+8).Range.Text: = '741, 79' ;
// Формируем подпись табличной части документа.
if FindRowColumnInTable('###MTOr&',table_,Row_,Column_)then begin
table_.Cell(Row_,Column_+0).Range.Text:='960,16';
table_.Cell(Row_,Column_+1).Range.Text: ='192, 03';
table_.Cell(Row_,Column_+2).Range.Text:='1152,19';
end;
end; // Заполняем текст в окончании документа.
FindAndlnsert('###ВСЕГО_К_ОПЛАТЕ&',
'Одна тысяча сто пятьдесят два рубля 19 копеек');
end;
Результат выполнения процедуры представлен на рис. 7.15.
Если доработать представленный фрагмент программы так, чтобы вносить
данные из таблицы базы данных, то разработчики Delphi смогут с успехом
использовать его в своих проектах не только для формирования счетов-
фактур.
РИС. 7.15. Сформированный бланк счета-фактуры
Как известно, документы Word наряду с текстом и таблицами могут содер-
жать рисунки, надписи, линии, геометрические фигуры и другие графиче-
ские объекты. Возможно, вы захотите украсить документ логотипом своей
фирмы. О том, как использовать эти возможности Word в программах
Delphi, читайте в следующей главе. Там же вы найдете информацию о том,
как подготовить документ для печати и выполнить печать.
|