Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Складской учет: просмотр остатков, Как это реализовать? 
:(
    Опции темы
magnatua
Дата 4.2.2007, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 4.2.2007

Репутация: нет
Всего: нет



Добрый день. Я облазил все, что можно и промучался два дня. Я стараюсь всегда решать самому свои проблему, но я уже не могу. Вот в чем проблема:

как можно реализовать таблицу и связать так(в мое случае Складской учет), чтобы я мог просмотреть остатки товара на определенную дату, а не на текущий момент...Например как в 1С это сделано. smile((

Знаю, для кого-то может показаться тупой темой или даже очень простым вопросом, но, я, прощу прощения и прошу помочь.


Заранее всем блогадарен!
PM MAIL   Вверх
Rodman
Дата 4.2.2007, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



а мак подойдет???


*********************
Товар
---------------------------------
ID
name
SomeText
*********************


*********************
Товар
---------------------------------
ID
IDname - связь с ID товаром
Наличие
*********************
PM MAIL WWW Skype GTalk YIM MSN   Вверх
magnatua
Дата 4.2.2007, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 4.2.2007

Репутация: нет
Всего: нет



Простите меня, может я что-то не понимаю.
А как мне, допустим, просмотреть остаток этого товара на другую дутау? Например, месяц назад..
PM MAIL   Вверх
Rodman
Дата 5.2.2007, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



magnatua, ты прав... эти таблицы позволяют просмотреть остаток на текущий день...

тогда в твоем случае можно во вторую таблицу добавить поле с датой и вуаля...
PM MAIL WWW Skype GTalk YIM MSN   Вверх
magnatua
Дата 5.2.2007, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 4.2.2007

Репутация: нет
Всего: нет



Всмысле? ....А на примере можно, как приводили выше...Я че-то не понимаю
PM MAIL   Вверх
Akella
Дата 5.2.2007, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



есть 4 таблицы, 2 основные и 2 дочерние

1я основная
Код

CREATE TABLE ARRIVAL (
    ID               "INT" NOT NULL /* "INT" = INTEGER */,
    SUPPLIER_ID      "INT" /* "INT" = INTEGER */,
    INVOICE_NUM      STRING100 COLLATE PXW_CYRL /* STRING100 = VARCHAR(100) */,
    DATE_INPUT       "DATE" /* "DATE" = DATE */,
    COEFF            FLOAT1 /* FLOAT1 = DOUBLE PRECISION */,
    SUMM_WO_NDS      COMPUTED BY ((select SUMM_WO_NDS from SP_SUMM_ARRIVAL(ARRIVAL.ID))),
    SUMM_RETAIL      COMPUTED BY ((select SUMM_RETAIL from SP_SUMM_ARRIVAL(ARRIVAL.ID))),
    SUM_VAT          COMPUTED BY (((select SUMM_VAT from SP_SUMM_ARRIVAL(ARRIVAL.ID)))),
    SUMM_W_VAT       COMPUTED BY (((select SUMM_W_VAT from SP_SUMM_ARRIVAL(ARRIVAL.ID)))),
    EXPENSE_NUMBERS  STRING1000 COLLATE PXW_CYRL /* STRING1000 = VARCHAR(1000) */
);

1я дочерня
Код

CREATE TABLE ARRIVAL_DET (
    ID            "INT" NOT NULL /* "INT" = INTEGER */,
    ARRIVAL_ID    "INT" NOT NULL /* "INT" = INTEGER */,
    PREPARAT_ID   "INT" /* "INT" = INTEGER */,
    AMOUNT        FLOAT1 /* FLOAT1 = DOUBLE PRECISION */,
    PRICE_WO_NDS  FLOAT1 /* FLOAT1 = DOUBLE PRECISION */,
    VAT           FLOAT1 /* FLOAT1 = DOUBLE PRECISION */,
    PRICE_W_VAT   FLOAT1 /* FLOAT1 = DOUBLE PRECISION */,
    PRICE_RETAIL  FLOAT1 /* FLOAT1 = DOUBLE PRECISION */,
    UNIT_ID       "INT" /* "INT" = INTEGER */,
    SUMM_WO_NDS   COMPUTED BY ((PRICE_WO_NDS * AMOUNT)),
    SUMM_RETAIL   COMPUTED BY ((AMOUNT * PRICE_RETAIL)),
    W_VAT         BOOLEAN /* BOOLEAN = SMALLINT */,
    EXP_AMOUNT    FLOAT1 /* FLOAT1 = DOUBLE PRECISION */,
    FILIALS       STRING100 COLLATE PXW_CYRL /* STRING100 = VARCHAR(100) */,
    SERIES        STRING100 COLLATE PXW_CYRL /* STRING100 = VARCHAR(100) */
);

тебя должны интересовать поля ID, ARRIVAL_ID, AMOUNT, DATE_INPUT
это был приход


2я основная
Код

CREATE TABLE EXPENSE (
    ID               "INT" NOT NULL /* "INT" = INTEGER */,
    ID_FILIAL        "INT" /* "INT" = INTEGER */,
    DATE_OUT         "DATE" /* "DATE" = DATE */,
    SUMM_RETAIL      COMPUTED BY ((select SUMM_RETAIL from SP_SUMM_EXPENSE(EXPENSE.ID))),
    REMARK           STRING100 COLLATE PXW_CYRL /* STRING100 = VARCHAR(100) */,
    INVOICE_NUM      STRING25 COLLATE PXW_CYRL /* STRING25 = VARCHAR(25) */,
    ARRIVAL_NUMBERS  STRING1000 COLLATE PXW_CYRL /* STRING1000 = VARCHAR(1000) */
);

2я дочерняя
Код

CREATE TABLE EXPENSE_DET (
    ID            "INT" NOT NULL /* "INT" = INTEGER */,
    EXPENSE_ID    "INT" /* "INT" = INTEGER */,
    PREPARAT_ID   "INT" /* "INT" = INTEGER */,
    AMOUNT        FLOAT1 /* FLOAT1 = DOUBLE PRECISION */,
    PRICE_RETAIL  FLOAT1 /* FLOAT1 = DOUBLE PRECISION */,
    UNIT_ID       "INT" /* "INT" = INTEGER */,
    SUMM_RETAIL   COMPUTED BY (((AMOUNT * PRICE_RETAIL))),
    SERIES        STRING100 COLLATE PXW_CYRL /* STRING100 = VARCHAR(100) */
);

это был расход

теперь делаем вьюху
Код

CREATE VIEW VW_OBOROTKA(
    PREPARAT_ID,
    A_DATE,
    AD_AMOUNT,
    SUMM_RETAIL)
AS
SELECT
  AD.PREPARAT_ID,
  A.DATE_INPUT,
  AD.AMOUNT,
  AD.PRICE_RETAIL * AD.AMOUNT
FROM ARRIVAL_DET AD
LEFT JOIN ARRIVAL A ON (AD.arrival_ID = A.ID)

UNION ALL

SELECT
  ED.PREPARAT_ID,
  E.DATE_OUT,
  -ED.AMOUNT,
  -ED.PRICE_RETAIL * ED.AMOUNT
FROM EXPENSE_DET ED
LEFT JOIN EXPENSE E ON (ED.EXPENSE_ID = E.ID)
;

она всё выгребает из прихода и расхода


вот тебе остатки:
Код

SELECT 
     P.ID,
     P.Name,
     P.PRODUCER,
     P.SERIES,
     P."TERM",
     P.PRICE_W_VAT,
     P.PRICE_RETAIL,
     U.NAME as Unit_Name,
     U.ID as UNIT_ID,
     (SELECT SUM(O.AD_AMOUNT) FROM VW_OBOROTKA O
      where (O.PREPARAT_ID = P.id) and (O.A_DATE <= :date)
      GROUP BY O.PREPARAT_ID) AS OstatokAmount,

     (SELECT SUM(O.SUMM_RETAIL) FROM VW_OBOROTKA O
      where (O.PREPARAT_ID = P.id) and (O.A_DATE <= :date)
      GROUP BY O.PREPARAT_ID) AS OstatokSumm

FROM PREPARATS P
left join UNITS U ON (U.ID = P.UNIT_ID)




теперь в оборотку выгребаем из этой вьюхи
Код

CREATE VIEW VW_OBOROTKA2(
    PREPARAT_ID,
    A_DATE,
    AD_AMOUNT,
    SUMM_RETAIL,
    SUPPLIER_ID,
    ID_FILIAL)
AS
SELECT
  AD.PREPARAT_ID,
  A.DATE_INPUT,
  AD.AMOUNT,
  AD.PRICE_RETAIL * AD.AMOUNT,
  A.SUPPLIER_ID,
  null
FROM ARRIVAL_DET AD
LEFT JOIN ARRIVAL A ON (AD.arrival_ID = A.ID)

UNION ALL

SELECT
  ED.PREPARAT_ID,
  E.DATE_OUT,
  -ED.AMOUNT,
  -ED.PRICE_RETAIL * ED.AMOUNT,
  null,
  e.ID_FILIAL
FROM EXPENSE_DET ED
LEFT JOIN EXPENSE E ON (ED.EXPENSE_ID = E.ID)
;

--------
SELECT 
     P.ID,
     P.Name,
--Сальдо на начало
     (SELECT SUM(O.AD_AMOUNT) FROM VW_OBOROTKA2 O
      where (O.PREPARAT_ID = P.id) and (O.A_DATE < :DateBegin) and (o.SUPPLIER_ID = :s_id) and (O.AD_AMOUNT > 0)
      GROUP BY O.PREPARAT_ID) AS AmountOnBegin,

     (SELECT SUM(O.SUMM_RETAIL) FROM VW_OBOROTKA2 O
      where (O.PREPARAT_ID = P.id) and (O.A_DATE < :DateBegin) and (o.SUPPLIER_ID = :s_id) and (O.AD_AMOUNT > 0)
      GROUP BY O.PREPARAT_ID) AS PriceOnBegin,

--Обороты по приходу
     (SELECT SUM(O.AD_AMOUNT) FROM VW_OBOROTKA2 O
      where (O.PREPARAT_ID = P.id) and (O.AD_AMOUNT > 0)and (O.A_DATE >= :DateBegin) and (O.A_DATE <= :DateEnd) and (o.SUPPLIER_ID = :s_id)
      GROUP BY O.PREPARAT_ID) AS ArrivalAmount,

     (SELECT SUM(O.SUMM_RETAIL) FROM VW_OBOROTKA2 O
      where (O.PREPARAT_ID = P.id) and (O.SUMM_RETAIL > 0)and (O.A_DATE >= :DateBegin) and (O.A_DATE <= :DateEnd) and (o.SUPPLIER_ID = :s_id)
      GROUP BY O.PREPARAT_ID) AS ArrivalPrice,

--Обороты по расходу
     (SELECT -SUM(O.AD_AMOUNT) FROM VW_OBOROTKA2 O
      where (O.PREPARAT_ID = P.id) and (O.AD_AMOUNT < 0) and (O.A_DATE >= :DateBegin) and (O.A_DATE <= :DateEnd) and (o.ID_FILIAL = :f_id)
      GROUP BY O.PREPARAT_ID) AS ExpenseAmount,

     (SELECT -SUM(O.SUMM_RETAIL) FROM VW_OBOROTKA2 O
      where (O.PREPARAT_ID = P.id) and (O.SUMM_RETAIL < 0) and (O.A_DATE >= :DateBegin) and (O.A_DATE <= :DateEnd) and (o.ID_FILIAL = :f_id)
      GROUP BY O.PREPARAT_ID) AS ExpensePrice
FROM PREPARATS P
WHERE
((SELECT SUM(O.AD_AMOUNT) FROM VW_OBOROTKA2 O
      where (O.PREPARAT_ID = P.id) and (O.A_DATE < :DateBegin) and (o.SUPPLIER_ID = :s_id) and (O.AD_AMOUNT > 0)
      GROUP BY O.PREPARAT_ID) is not null)
or
((SELECT SUM(O.SUMM_RETAIL) FROM VW_OBOROTKA2 O
      where (O.PREPARAT_ID = P.id) and (O.A_DATE < :DateBegin) and (o.SUPPLIER_ID = :s_id) and (O.AD_AMOUNT > 0)
      GROUP BY O.PREPARAT_ID) is not null)

or
((SELECT SUM(O.AD_AMOUNT) FROM VW_OBOROTKA2 O
      where (O.PREPARAT_ID = P.id) and (O.AD_AMOUNT > 0)and (O.A_DATE >= :DateBegin) and (O.A_DATE <= :DateEnd) and (o.SUPPLIER_ID = :s_id)
      GROUP BY O.PREPARAT_ID) is not null)

or
((SELECT -SUM(O.AD_AMOUNT) FROM VW_OBOROTKA2 O
      where (O.PREPARAT_ID = P.id) and (O.AD_AMOUNT < 0) and (O.A_DATE >= :DateBegin) and (O.A_DATE <= :DateEnd) and (o.ID_FILIAL = :f_id)
      GROUP BY O.PREPARAT_ID) is not null)

or
((SELECT -SUM(O.AD_AMOUNT) FROM VW_OBOROTKA2 O
      where (O.PREPARAT_ID = P.id) and (O.AD_AMOUNT < 0) and (O.A_DATE >= :DateBegin) and (O.A_DATE <= :DateEnd) and (o.ID_FILIAL = :f_id)
      GROUP BY O.PREPARAT_ID) is not null)

or
((SELECT -SUM(O.SUMM_RETAIL) FROM VW_OBOROTKA2 O
      where (O.PREPARAT_ID = P.id) and (O.SUMM_RETAIL < 0) and (O.A_DATE >= :DateBegin) and (O.A_DATE <= :DateEnd) and (o.ID_FILIAL = :f_id)
      GROUP BY O.PREPARAT_ID) is not null)

вот такая канитель

Это сообщение отредактировал(а) Akella - 5.2.2007, 11:24
PM MAIL   Вверх
magnatua
Дата 5.2.2007, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 4.2.2007

Репутация: нет
Всего: нет



Спасибо огромное
Akella, спасибо огромное, но мне тяжело разобратсья в полях и в таблицах smile...А чуток по-подробней нельзя. Извини, что напрягаю, но от меня толку буде мало, что буду тупо смотреть...
PM MAIL   Вверх
Akella
Дата 5.2.2007, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



а как же ещё поподробнее?

сначала в общую таблицу вытягиваем приход и расход - это вьюха (см. выше)
потом из этой вьюхи выбираем данные 



вот тебе количество
Код

(SELECT SUM(O.AD_AMOUNT) FROM VW_OBOROTKA O
      where (O.PREPARAT_ID = P.id) and (O.A_DATE <= :date)
      GROUP BY O.PREPARAT_ID) AS OstatokAmount,


вот тебе сумма
Код

(SELECT SUM(O.SUMM_RETAIL) FROM VW_OBOROTKA O
      where (O.PREPARAT_ID = P.id) and (O.A_DATE <= :date)
      GROUP BY O.PREPARAT_ID) AS OstatokSumm

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1205 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.