Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > Супермаг Плюс (Супермаг 2000)

Помогите найти ошибки в PL/SQL функции расчёта остатков на дату : Супермаг Плюс (Супермаг 2000)

23.11.2024 1:10


06.10.2010 11:04
Накидал вот тут две функции:
Код:
CREATE OR REPLACE FUNCTION RemainsAtDate (
  s_article IN SMCard.article%TYPE,
  s_date IN SMDocuments.createdat%TYPE,
  s_storeloc IN SMStoreLocations.id%TYPE
) RETURN SMSpec.quantity%TYPE
IS
  o_quantity SMSpec.quantity%TYPE;
BEGIN
SELECT SUM(q)
  INTO o_quantity
  FROM (
    (SELECT SMSpec.quantity AS q FROM SMSpec, SMDocuments
      WHERE
       SMSpec.doctype = SMDocuments.doctype AND
       SMSpec.docid = SMDocuments.id AND
       SMDocuments.locationto = s_storeloc AND
       SMSpec.article = s_article AND
       SMDocuments.docstate = 3 AND
       SMDocuments.createdat <= s_date
    )
    UNION ALL
    (SELECT (0 - SMSpec.quantity) AS q FROM SMSpec, SMDocuments
      WHERE
       SMSpec.doctype = SMDocuments.doctype AND
       SMSpec.docid = SMDocuments.id AND
       SMDocuments.locationfrom = s_storeloc AND
       SMSpec.article = s_article AND
       SMDocuments.docstate = 3 AND
       SMDocuments.createdat <= s_date));
  return o_quantity;
END;
/

Код:
CREATE OR REPLACE FUNCTION RemainsAtDate2 (
  s_article IN SMCard.article%TYPE,
  s_date IN SMDocuments.createdat%TYPE,
  s_storeloc IN SMStoreLocations.id%TYPE
) RETURN SMSpec.quantity%TYPE
IS
  o_quantity SMSpec.quantity%TYPE;
BEGIN
  SELECT
    (SELECT SUM(SMSpec.quantity) FROM SMSpec, SMDocuments
      WHERE
       SMSpec.doctype = SMDocuments.doctype AND
       SMSpec.docid = SMDocuments.id AND
       SMDocuments.locationto = s_storeloc AND
       SMSpec.article = s_article AND
       SMDocuments.docstate = 3 AND
       SMDocuments.createdat <= s_date
    )
    -
    (SELECT SUM(SMSpec.quantity) FROM SMSpec, SMDocuments
      WHERE
       SMSpec.doctype = SMDocuments.doctype AND
       SMSpec.docid = SMDocuments.id AND
       SMDocuments.locationfrom = s_storeloc AND
       SMSpec.article = s_article AND
       SMDocuments.docstate = 3 AND
       SMDocuments.createdat <= s_date)
  INTO o_quantity FROM DUAL;
  return o_quantity;
END;
/

Считаю сумму остатков в месте хранения на какую-нибудь дату: вторая функция выдаёт количество больше чем первая. Не вижу ошибки, помогите найти?
06.10.2010 11:08
Навскидку, не смотрела я твои функции, smspec может быть как цена поставки, так и цена продажи. Как ты их складывать собираешься?
06.10.2010 11:15
> Навскидку, не смотрела я твои функции, smspec может быть как цена поставки, так и цена продажи. Как ты из складывать собираешься?
Там не цены, количества.

Вобщем то нашёл затык: если к примеру не было ни одного расхода, только приходы, то во второй функции SUM() во второй даже нуля не вернёт, результат работы вычитания будет неопределён.
06.10.2010 13:56
Скорее всего есть акты потерь/обнаружений, влияющие на остатки.
В них не заполняются locationto и locationfrom, поэтому они в ваших функциях не учитываются
06.10.2010 13:59
извиняюсь фигню написал, не дочитал первый пост
06.10.2010 13:59
А как акты потерь и обнаружений влияют на остатки?
Это какое-то новое слово в учете...
Часовой пояс GMT +3, время: 01:10.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.