Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 26.11.2010, 02:41
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от deltas
Спасибо большое, просмотрю... Только я забыл уточнить что работаю с базой Access .mdb

С какой базой работать - не принципиально. Хоть dBase.
Тут вопрос в правильном дизайне БД.

Основная идея - у тебя нет таблицы, которая содержит состояние склада. У тебя есть документы прихода/расхода, по которм все и вычисляется.

Фактически, тебе нужны следующие таблицы:
1. Справочник товаров (их описание). Обычно деревообразный (таблица ссылается сама на себя).
2. Документы. Для общности вводится либо тип документа, либо признак того, что документ приходно/расходный по тому или другому признаку.
3. Позиции документа. Собственно описание товаров, отпущенных/принятых по документу.
Ответить с цитированием
  #17  
Старый 26.11.2010, 21:39
Аватар для deltas
deltas deltas вне форума
Новичок
 
Регистрация: 22.11.2010
Сообщения: 99
Репутация: 47
По умолчанию

Спасибо. Но в данном случае у меня проблемма только с составными товарами. Как поместить товар в
Цитата:
3. Позиции документа. Собственно описание товаров, отпущенных/принятых по документу.
чтобы туда добавились и составляющие?
Ответить с цитированием
  #18  
Старый 26.11.2010, 22:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от deltas
Спасибо. Но в данном случае у меня проблемма только с составными товарами. Как поместить товар в чтобы туда добавились и составляющие?

У тебя должно быть 2 разных документа.
Один - заказ сборного товара, Второй - отпуск комплектующих для сборки. Второй можно создавать автоматически по спец. справочнику (если есть желание это сделать. в принципе, это не сложно). Лучше всего будет эти документы связать между собой, что бы в дальнейшем при необходимости их легко можно было найти один по дургому.
Ответить с цитированием
  #19  
Старый 30.11.2010, 01:41
Аватар для deltas
deltas deltas вне форума
Новичок
 
Регистрация: 22.11.2010
Сообщения: 99
Репутация: 47
По умолчанию

Вот еще одни грабли - есть таблица "ТипыДокументов" (id, typ), "Документ" (Id, idtypa, nomer, data, summa), "ДокументСостав" (id, iddoc, tovar,kolvo,cena,summa).
Есть типы: -1 Расход, 0 Списание, 1 Приход. Как подсчитать остаток по приходным и расходным? Как я понимаю надо ДокументСостав.kolvo умножать на Документ.idtypa... Но никак не получается создать правильный запрос Может кто подскажет?

Последний раз редактировалось deltas, 30.11.2010 в 22:05.
Ответить с цитированием
  #20  
Старый 30.11.2010, 22:09
Аватар для deltas
deltas deltas вне форума
Новичок
 
Регистрация: 22.11.2010
Сообщения: 99
Репутация: 47
По умолчанию

И вообще, стоит ли работать с mdb? Может лучше перейти на Firebird, SQL server...
Ответить с цитированием
  #21  
Старый 30.11.2010, 22:42
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Надо, надо. Давно бы перешел. Если не хочется все переделывать, то переходи на MS SQL Server (тот же ADO) или есть такая штука как MSDE (SQL Server с некоторыми ограничениями). только они все довольно тяжелые. так что я бы все-таки подумал в сторону FireBird.

Теперь по предыдущему вопросу.
Нам надо в итог вывести с плюсом все приходы (кстати, кроме списания у и отпуска/отгрузки у тебя еще должен быть обратный документ - возврат) и с минусов все расходы. я бы в тип документы добавил бы доп. поле, например, WH_MUL, куда бы для приходных на склад документов поставил бы 1, а для расходных -1. Для всех остальных 0.

Тогда:
Код:
SELECT 
  G.Name, SUM(T.WH_MUL * I.Quantity)
FROM 
  DocItems I LEFT JOIN 
  Docs D ON I.DocID = D.ID LEFT JOIN 
  DocTypes T ON D.TypeID = T.ID LEFT JOIN 
  Goods D ON I.GoodID = G.ID
GROUP BY
  G.NAME

DocTypes - таблица типов документов;
Docs - таблица документов;
DocItems - таблица позиций документов;
Goods - справочник товаров.

Да, если ты сдела инвентаризационный документ, то тогда можно суммировать не все, а только те документы, которые идут после этого документа. Тогда надо будет еще дописать условие, а в типах документов поставить для этого документа множитель 1 (приходный).

ЗЫ. И что за манера называть таблицы русскими буквами. Хочешь потом иметь кучу проблем?
Ответить с цитированием
  #22  
Старый 30.11.2010, 22:46
Аватар для deltas
deltas deltas вне форума
Новичок
 
Регистрация: 22.11.2010
Сообщения: 99
Репутация: 47
По умолчанию

Спасибо большое за совет... Буду пробовать...

Цитата:
Сообщение от lmikle
ЗЫ. И что за манера называть таблицы русскими буквами. Хочешь потом иметь кучу проблем?
Я в курсе насчет русских букв, просто перевел для вопроса, чтоб понятнее
Ответить с цитированием
  #23  
Старый 30.11.2010, 23:37
Аватар для deltas
deltas deltas вне форума
Новичок
 
Регистрация: 22.11.2010
Сообщения: 99
Репутация: 47
По умолчанию

Блин, запрос никак не проходит, "ошибка синтаксиса (пропущен оператор) в выражении запроса '(I.DocID = D.ID LEFT JOIN
DocTypes T ON D.TypeID = T.ID LEFT JOIN
Goods D ON I.GoodID = G.ID)' "

Последний раз редактировалось deltas, 30.11.2010 в 23:51.
Ответить с цитированием
  #24  
Старый 30.11.2010, 23:51
Аватар для deltas
deltas deltas вне форума
Новичок
 
Регистрация: 22.11.2010
Сообщения: 99
Репутация: 47
По умолчанию

Все, разобрался... Во всех базах синтаксис разный... Для Access -
Код:
SELECT 
  G.Name, SUM(T.WH_MUL * I.Quantity)
FROM 
  ((DocItems I LEFT JOIN 
  Docs D ON I.DocID = D.ID) LEFT JOIN 
  DocTypes T ON D.TypeID = T.ID) LEFT JOIN 
  Goods D ON I.GoodID = G.ID
GROUP BY
  G.NAME
Ответить с цитированием
  #25  
Старый 01.12.2010, 19:47
Аватар для deltas
deltas deltas вне форума
Новичок
 
Регистрация: 22.11.2010
Сообщения: 99
Репутация: 47
По умолчанию

И опять возник вопрос Готовую продукцию и составляющие хранить в одной таблице? Если нет то как в приходе/расходе связывать по tovar_id две таблицы?
Ответить с цитированием
  #26  
Старый 02.12.2010, 18:16
Аватар для deltas
deltas deltas вне форума
Новичок
 
Регистрация: 22.11.2010
Сообщения: 99
Репутация: 47
По умолчанию

Надеюсь на Вашу помощь...
Ответить с цитированием
  #27  
Старый 02.12.2010, 19:49
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, лучше всего в одной. Точнее, у тебя есть всего 2 таблицы, по которым и идет все вычисление:
- DocItems (собственно указание кол-ва товара в приходе/расходе)
- Goods (справочник товаров, не важно каких).

просто для того, что бы их различать можешь ввести флажок в таблице Goods, где и лежит описание товаров.
Ответить с цитированием
  #28  
Старый 02.12.2010, 23:30
Аватар для deltas
deltas deltas вне форума
Новичок
 
Регистрация: 22.11.2010
Сообщения: 99
Репутация: 47
По умолчанию

В данный момент у меня все так и реализовано, но никак не могу понять - как добавлять в составные товары запчасти из той же таблицы?
Ответить с цитированием
  #29  
Старый 03.12.2010, 00:32
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

??? Зачем их добавлять??? Куда???
Если как организовать справочник, то тебе нужна доп. таблица, например:

Код:
-- таблица справочник товаров
create table Goods
(
  ID INTEGER PRIMARY KEY,
  PARENT_ID INTEGER REFERENCES Goods(ID),
  IS_ASSEMBLY INTEGER DEFAULT 0 CHECK IS_ASSEMBLY IN (0,1),
  ...
);

-- таблица "сборок" - из каких частей состоит тот или иной товар
create table GoodItems
(
  ID INTEGER PRIMARY KEY,
  GOODS_ID INTEGER REFERENCES Goods(ID),
  ITEM_ID INTEGER REFERENCES Goods(ID)
);

Т.е. в табл. GoodItems тебе надо просто забить ссылки на нужные запчасти. При этом запчасть тоже может быть сборной.
Ответить с цитированием
  #30  
Старый 03.12.2010, 03:19
Аватар для deltas
deltas deltas вне форума
Новичок
 
Регистрация: 22.11.2010
Сообщения: 99
Репутация: 47
По умолчанию

Код:
(
  ID INTEGER PRIMARY KEY,
  PARENT_ID INTEGER REFERENCES Goods(ID),

Извините, не совсем понял... Здесь таблица ссылается сама на себя? и
Код:
(
  ID INTEGER PRIMARY KEY,
  GOODS_ID INTEGER REFERENCES Goods(ID),
  ITEM_ID INTEGER REFERENCES Goods(ID)
);
Как установить связь GOODS_ID и ITEM_ID с Goods(ID) одновременно? Или я торможу?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:22.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter