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

Наверное у многих при разработке программ, связанных с товарооборотом, возникает такая необходимость, чтобы напечатать ценники по количеству товара. В этой статье, я покажу как это можно сделать, используя 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. У ценников, есть определенный формат (размер). В моём случае размер ценников равен 5×4. Чтобы в одной строке было несколько ценников разделим MasterData1 на колонки, для этого выставим свойство Column равным 4. Общий вид отчёта получился, как показано ниже

Модель

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

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

p.s. для работы БД необходим SQL сервер FireBird 1.5.4
готовый проект с базой: Cennik
отдельно отчёт: Cennik_kol
отдельно база: data

Copyright© 2009 Савельев Андрей Специально для reportingfor.info

Comments are closed.