Печать ценников

© 2009 Андрей Савельев

Наверное, у многих при разработке программ, связанных с товарооборотом возникает такая необходимость, что бы напечатать ценники по количеству товара. В этой статье, я покажу, как это можно сделать, используя FastReport.

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

Создадим таблицу следующей структуры

CREATE TABLE CENNIK (
   ID_CENNIK INTEGER NOT NULL,
   NAME_TOVAR VARCHAR(100),
   PROIZVOD VARCHAR(30),
   DATA_CENNIK DATE,
   KOLVO_TOV INTEGER,
   ARTIKUL VARCHAR(7),
   CENA_TOV NUMERIC(15,2)
);
Добавим к полю ID_CENNIK генератор и триггер
CREATE GENERATOR GEN_CENNIK_ID;
SET TERM ^ ;

CREATE OR ALTER TRIGGER CENNIK_BI FOR CENNIK
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
   IF (NEW.ID_CENNIK IS NULL) THEN
     NEW.ID_CENNIK = GEN_ID(GEN_CENNIK_ID,1);
END
^
SET TERM ; ^
Заполним нашу таблицу следующими позициями
INSERT INTO CENNIK (ID_CENNIK, NAME_TOVAR, PROIZVOD, DATA_CENNIK, KOLVO_TOV, ARTIKUL, CENA_TOV)
VALUES (1, 'Юбка ', 'Москва', '2009-01-25', 5, '0000001', 1500);
INSERT INTO CENNIK (ID_CENNIK, NAME_TOVAR, PROIZVOD, DATA_CENNIK, KOLVO_TOV, ARTIKUL, CENA_TOV)
VALUES (2, 'Шорты', 'Турция', '2009-01-06', 10, '0000002', 100);
INSERT INTO CENNIK (ID_CENNIK, NAME_TOVAR, PROIZVOD, DATA_CENNIK, KOLVO_TOV, ARTIKUL, CENA_TOV)
VALUES (3, 'Топ', 'Германия', '2008-12-15', 2, '0000003', 230);

Для того, что бы напечатать ценники по количеству товара, необходим некий алгоритм. Его и опишем ниже.

Необходимо создать столько позиций на выходе, сколько есть количество товара. На первый взгляд вроде бы и не понятно, что за алгоритм, смотрим далее...

Я реализовал этот алгоритм на хранимой процедуре и назвал её EOF_KOLVO. Выглядит она следующим образом

CREATE PROCEDURE EOF_KOLVO ( in_kolvo integer)
returns (res integer)
as
begin
   res = 0;
   while (in_kolvo > 0) do
     begin
       res = res + 1;
       in_kolvo = in_kolvo - 1;
       suspend;
     end
end^

Что делает эта процедура? Процедура получает входной параметр, который равен количеству товара. Внутри процедуры выполняется цикл на уменьшение количества товара для каждого прохода. На выходе получаем количество позиций равным количеству товара одной позиции. Всё очень просто, как оказалось

В принципе, задача уже решена на 70%. Далее необходимо построить сам отчёт.

Для этого, запустим Delphi, бросим на форму frxReport, frxIBXComponents, IBDatabase, IBTransaction. Подключим БД к IBDatabase, у IBTransaction выберим DefaultDatabase равным IBDatabase. Откроем дизайнер отчетов, кликнув дважды по frxReport. На вкладке Data дизайнера отчётов расположим frxIBXQuery и назовём его Tovar, дважды кликним по нему и в редакторе SQL добавим следующий SQL запрос

select
   c.name_tovar, c.proizvod, c.data_cennik, c.kolvo_tov, c.artikul, c.cena_tov
from
   cennik c
left outer join
   eof_kolvo(c.kolvo_tov) on (0=0)
этот запрос и сделает всё, что для нас необходимо используя хранимую процедуру EOF_KOLVO.

Далее перейдём к моделированию отчёта. Для этого перейдём на вкладку Page1 дизайнера отчёта, положим на него бэнд MasterData1, подключим его к источнику данных Tovar. У ценников, есть определенный формат (размер). В моём случае размер ценников равен 5x4. Что бы в одной строке было несколько ценников, разделим MasterData1 на колонки, для этого выставим свойство Column равным 4. Общий вид отчёта получился, как показано ниже

Для того чтобы просмотреть конечный результат, нажмём Предварительный просмотр на панели управления или функциональные клавиши Ctrl+P.

У меня он выглядит следующим образом

Если мы посмотри заполненную таблицу CENNIK, то увидим, что у позиции Юбка количество товара равно 5 и цена её составляет 1500р, а на рисунке выше, мы видим, что ценников для этой позиции именно 5. Поставленная задача выполнена.

Желающие млогут скачать:

p.s. для работы БД необходим SQL сервер FireBird 1.5.4

Copyright© 2009 Андрей Савельев

2011123456789101112
2010123456789101112
2009123456789101112
2008123456789101112
2007123456789101112
2006123456789101112
2005123456789101112
2004123456789101112
2003123456789101112
2002123456789101112
2001123456789101112
2000123456789101112
1999123456789101112

Последние статьи
Литература