ПРОГРАММНАЯ РЕАЛИЗАЦИЯ ПАРТИОННОГО УЧЕТА FIFO В КЛИЕНТ-СЕРВЕРНОЙ АРХИТЕКТУРЕ
Грибанова-Подкина Мария Юрьевна
канд. физ.-мат. наук, доцент кафедры прикладной информатики Балашовского института Саратовского государственного университета им.
Н.Г. Чернышевского, РФ, г. Балашов E-mail: m.gribanova-podkina@.rambler. ru
SOFTWARE DEVELOPMENT OF BATCH ACCOUNTING FIFO IN CLIENT-SERVER ARCHITECTURE
Maria Gribanova-Podkina
candidate of physical and mathematical sciences, Assistant professor of Applied informatics department, Balashov Institute of Saratov State University, Russia
Balashov
АННОТАЦИЯ
Рассматривается модель партионного учета по схеме FIFO. Реализация в клиент-серверной архитектуре представлена моделью базы данных и клиентскими компонентами, осуществляющими регистрацию поставок и расхода товара.
ABSTRACT
The article describes the model of batch accounting FIFO. Implementation in a client-server architecture model is presented database and client components that register supplies and flow of goods.
Ключевые слова: FIFO; информационная система; программное обеспечение.
Keywords: FIFO; information model; software.
При разработке информационной системы, автоматизирующей учет движений товара на складе предприятия, была поставлена задача партионного учета по технологии FIFO (first-in-first-out). Эта технология подразумевает последовательное списание (или расход) товара, начиная с самых ранних поставок [1, c. 163]. Схема востребована во многих организациях при ведении учета товаров, так как всегда известно, какой товар, в каком количестве и по
какой цене присутствует на складе. Это позволяет, например, в любой момент времени рассчитать реальную себестоимость продукции. Большинство программных продуктов, существующих на рынке, реализуют самые распространенные схема партионного учета, в том числе и FIFO. Однако информационная система, разработанная по индивидуальному проекту, является лучшим выбором, так как учитывает все обозначенные заказчиком особенности. В этом случае необходимо разрабатывать и индивидуальную модель реализации партионного учета.
Для программной реализации рассматриваемой схемы моделируется база данных с информацией обо всех необходимых сущностях (см. рисунок 1).
Рисунок 1. Логическая модель базы данных
Для поступления товара потребуются две таблицы:
• invoice — накладная, будет содержать сведения о номере накладной, дате поставки и поставщике;
• invoice_item — табличная часть накладной, содержит номер позиции, собственно приходуемый ресурс (товар), его цену и количество.
Аналогично расход оформляется двумя таблицами:
• outgo — документ на расход, содержит номер, дату и код клиента;
• outgo_item — табличная часть расходного документа, содержит номер позиции, расходуемый ресурс (товар) и количество товара в расходе.
Еще одна дополнительная сущность будет регистрировать приход и расход товара. Это таблица register, содержащая сведения о дате операции, номере накладной и ее позиции, регистрируемом ресурсе, приходуемом и расходуемом количестве ресурса, а также о расходном документе и его позиции.
Допустим, имеются две поставки товара с кодом 5, каждая поставка в количестве 10 единиц. В таблице invoice_item они будут зафиксированы, соответственно, двумя записями (см. таблица 1).
Далее, товар с кодом 5, расходуется дважды, и каждый раз в количестве 7 единиц. В таблице outgo_item фиксируем также две записи (см. таблица 2).
Таблица 1.
Записи таблицы invoice item
ID ID invoice source price count
1 1 5 300 10
2 2 5 320 10
Таблица 2.
Записи таблицы outgo_item
ID ID outgo source count
1 1 5 7
2 2 5 7
Таблица 3.
Записи таблицы register
ID date invoice Invoice item source debet credit
1 1 1 5 10
2 2 2 5 10
3 1 1 5 7
4 1 1 5 3
5 2 2 5 4
Теперь необходимо зарегистрировать соответствие между поставками товара и его расходом. Для этого, согласно технологии FIFO, в таблице register будет пять записей: две на приход товара, одна на первый расход (7 единиц) и две на второй расход (3 единицы и 4 единицы). Каждый расход привязывается к соответствующему приходу (см. таблица 3).
Для вычисления остатков по каждой партии на серверной стороне имеется представление view_saldo_source, SQL-код которого приведен ниже:
select invoiceitem.idinvoice as invoice, register.invoiceitem,
register.source, sum(debet)-sum(credit) as saldo
from register, invoice_item
where register. invoiceitem =invoice_item. id
group by invoice item.id invoice, register.invoice item, register.source order by register.invoice item;
Теперь в клиентской части информационной системы (реализована в Delphi 7) для списания товара необходима реализация двух задач:
• сформировать остатки по данному товару;
• в цикле, пока не наберем нужное количество единиц товара для списания, формируем записи на расход товара из первой по порядку партии, полученной в обновленном представлении view_saldo_source.
Первая из этих задач обеспечивается выборкой из представления view_saldo_source по заданному параметру source. В среде Delphi это компонент ADOQSaldoSource класса TADOTable со следующим текстом: select invoice, invoice item, source, saldo from view_saldo_source where source=:source
Вторая задача подразумевает наличие компонента ADOCreditRegister класса TADOCommand с командой
insert into register
(invoice, invoice item, source, outgoitemtype, outgoitem, debet, credit) values
(: invoice,: invoiceitem,: source,: outgoitemtype,: outgoitem,: debet,: credit) Формирование записей на расход товара по партиям приведен фрагментом процедуры клиентской части, являющейся частью транзакции: while credit>0 do begin ADOQSaldoSource.Active:=false;
ADOQSaldoSource.Parameters.ParamByName('source'). Value: =source_; ADOQSaldoSource.Active: =true; //обновление представления с остатками ...//общие параметры для списания
ADOQSaldoSource.First; //первая запись = первая партия товара saldo: =ADOQSaldoSource.FieldByName('saldo').AsFloat; //количество ...//считываем из ADOQSaldoSource общие данные по накладной if saldo<=credit then begin
//если количество в партии недостаточное, то запись на расход //с количеством в партии
ADOCreditRegister.Parameters.ParamByName('credit'). Value:=saldo; credit: =credit-saldo; //уменьшаем следующий расход end else begin
//иначе запись на расход с оставшимся несписанным количеством ADOCreditRegister.Parameters.ParamByName('credit'). Value:=credit; credit: =0; //следующего расхода не будет, цикл закончится end;
ADOCreditRegister.Execute; // формируем запись в таблице register end; //конец цикла
Приведенная реализация на данный момент успешно функционирует в составе разработанной по заказу информационной системы. Кроме того, она может рассматриваться как общая модель функционирования партионного учета FIFO и быть руководством для программной разработки.
Список литературы:
1. Кондраков Н.П. Бухгалтерский учет: Учебник. М.:ИНФРА-М, 2007. — 592 с.