ник: Stanislav
Склад + торговля. Пример реализации.
По просьбе товарищей излагаю структуру своей базы данных.
База разделенная. Приспособлена для учета кол-ва продуктов на складе и торговли, но может быть приспособлена для похожих целей и по ходу работы дополняться новыми видами документов без необходимости реструктуризации базы.
Структура базы.
Таблицы построены по принципу ядра, модулей и справочных таблиц.
Есть две основные таблицы-регистры (ядро базы): RegisterStorage (Складские остатки), RegisterTraffic (Регистр движения товаров). И куча таблиц-документов (модулей). Таблица-документ - это таблица соответствующая типу операции. Например: Приход, Расход, Перемещение, Инспекция, Продажа, Растаможка и т.д. до бесконечности. В этом главный плюс такой структуры: таблицы-документы можно добавлять сколько угодно и когда угодно - структуру базы переделывать не придется. Например, вздумалось руководству добавить новый тип товарооборота: Перепаковка - да запросто: добавляете в базу новую таблицу-документ Перепаковка, и пишете форму для нее.
В справочных таблицах хранятся описания товаров: типы, размеры, сорта.
Теперь подробнее о структуре таблиц.
Таблица RegisterStorage (текущие складские остатки)
Поля:
RegisterStorageID - автономер записи
Created - дата записи
ArrivalDetailID - уникальный номер продукта
StorageID - номер склада, где находится продукт
Qty - кол-во продукта
Weight - вес продукта
Lot - номер ячейки, где лежит продукт
RegisterStorageStatusID - статус продукта (нормальный, зарезервирован, в обработке и т.д.)
ProcessingDocumentTypeID - тип документа, по которому сейчас обрабатывается продукт
ProcessingDocumentID - номер документа, по которому сейчас обрабатывается продукт
Таблица RegisterTraffic (движение продуктов).
Поля:
RegisterTrafficID
Created
UserID
TrafficTypeID (приход, расход, внутренние складские операции)
ContactID - клиент - от кого получено или кому отпущено
DocumentTypeID - тип документа операции
DocumentStatusID - статус документа
StorageID - номер склада
DocumentID - номер документа
Qty - кол-во
Weight - вес
Price - цена
ArrivalDetailID - уникальный номер продукта
Теперь таблицы-документы:
Таблица-документ Arrival (поступление товара на склад)
ArrivalID
Created
UserID
StorageID
ShipperID (поставщик)
Таблица детализации поступления ArrivalDetail:
ArrivalID
ArrivalDetailID
ProductID
ProductPackageID (упаковка продукта)
ProductSizeID (размер)
ProductSortID (сорт)
Lot (№ ячейки на складе)
Qty
Weight
Notes (заметки)
Таблица-документ Sale (продажа)
SaleID
UserID
Created
DocumentStatusID (статус документа: в обработке, закрыт, отменен)
ContactID (покупатель)
RecipientName (имя компании-получателя)
RecipientCEOName (имя ответственного лица получателя)
RecipientPhone
RecipientFax
DeliveryServiceID
дальше идут адресные текстовые поля: индекс, страна, улица и т.д.
ProductCost (общая стоимость продуктов)
DeliveryCost (стоимость доставки)
OtherCosts (другие расходы)
OtherCostsDesc (пояснение других расходов)
Tax (налог - в денежном исчислении, а не в процентах!)
Таблица SaleDetail (детализация продажи)
SaleDetailID
SaleID
ArrivalDetailID (уникальный номер продукта - по нему можно определить св-ва продукта и номер партии поступления)
Qty
Weight
SalePrice (цена продукта)
ShipperPrice (цена поставщика)
StorageID
Lot
Остальные таблицы-документы (перемещение, растаможка и т.д.) строятся по аналогии таблиц Sale, SaleDetail. Общее во всех таблицах-документах одно: поле ArrivalDetailID (уникальный номер продукта), по которому всегда можно проследить продукт.
Все эти таблицы хранятся в серверной части.
В клиентской части есть аналогичные таблицы-документы, которые используются как черновики. Когда юзер хочет, например, продать товар, он сначала добавляет эти товары в таблицу-черновик, там выполняются все нужные проверки и т.д., и когда все готово, юзер жмет "Создать документ" и тогда по списку продуктов в таблице-черновике выполняются движения в серверной части: с таблицы RegisterStorage списываются продукты, в таблицу RegisterTraffic добавляются записи о движении продуктов (в данном случае о том, что они были проданы), в таблице Sale создаются записи о совершенной продаже. После чего таблица-черновик очищается.
Справочные таблицы: Pricelist, Product, User, Group и т.д.
Складские остатки на каждый день сделать легко - достаточно написать процедуру, которая будет копировать содержимое таблицы RegisterStorage в другую таблицу (назовем ее RegisterStorageDaily), добавляя к записям текущую дату.
Основы изложил. На вопросы отвечу.