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

Скрипт, показывающий оперативные остатки : Супермаг Плюс (Супермаг 2000)

25.11.2024 14:55


07.10.2008 14:01
Помогите пожалуйста кто чем...*22
Есть следующий запрос (делался в sm2000utils):
'SELECT oper.ARTICLE AS "Артикул", crd.NAME AS "Наименование", ost.QUANTITY AS "Остаток на утро", SUM(oper.SALEQUANTITY) AS "Оперативная продажа", SUM(oper.RETURNQUANTITY) AS "Оперативный возврат", ost.QUANTITY-SUM(oper.SALEQUANTITY)+SUM(oper.RETURNQUANTITY) AS "Оперативный остаток" ' + #13 +
'FROM SUPERMAG.SMCARD crd, SUPERMAG.SMOPERGOODS oper, SUPERMAG.SMGOODS ost ' + #13 +
'WHERE oper.ARTICLE = crd.ARTICLE AND ost.ARTICLE = crd.ARTICLE ' + #13 +
'GROUP BY oper.ARTICLE, crd.NAME, ost.QUANTITY ';

В итоге получаю последний столбец, в котором товаровед (или кто там еще) может посмотреть оперативный остаток нужного ей товара не копаясь в карточках.
Проблема в том, что все это нужно привязывать к конкретному поставщику (оперативные остатки по поставщику), а вот как это сделать я уже голову сломал.
07.10.2008 14:47
можешь дополнить свой запрос в секции WHERE
следующими строками:
Код:
oper.ARTICLE IN
(
SELECT dc.article
  FROM supermag.smdocuments d,
       supermag.smspec dc,
       supermag.smcard c
 WHERE d.doctype=dc.doctype
   AND d.id=dc.docid
   AND c.article=dc.article
   AND c.accepted = 1
   AND d.opcode=0
   AND d.docstate>=2
   AND TO_DATE(d.createdat) >= ('01.01.2008')
   AND d.clientindex = (595)
GROUP BY dc.article
)
вместо 595 только ставь нужный тебе код поставщика и дату можешь изменить как тебе нужно
08.10.2008 06:03
Спасибо, сейчас попробую:)
08.10.2008 09:19
В общем так побыстрее получается:
var
Q: TOracleQueryViewer;

begin
Q := TOracleQueryViewer.Create(Session);
try
Q.DeclareVariable(':Поставщик', 3);
Q.SQL.Text :=
'SELECT card.ARTICLE AS "АРТИКУЛ", card.NAME AS "Название", ' + #13 +
'edizm.ABBREV AS "Ед.изм.", '+
'ostat.QUANTITY AS "Остатки", '+
'SUM(oper.SALEQUANTITY) AS "Оп. продажи", '+
'SUM(oper.RETURNQUANTITY) AS "Возвраты", ' + #13 +
'ostat.QUANTITY-SUM(oper.SALEQUANTITY)+SUM(oper.RETURNQUANTITY) as "Факт" ' + #13 +
'FROM SUPERMAG.SMCARD card '+
' LEFT JOIN SUPERMAG.SMGOODS ostat ON card.ARTICLE = ostat.ARTICLE ' + // Остатки
' LEFT JOIN SUPERMAG.SMOPERGOODS oper ON card.ARTICLE = oper.ARTICLE ' + // Оперативные продажи
' LEFT JOIN SUPERMAG.SAMEASUREMENT edizm ON edizm.ID = card.IDMEASUREMENT ' + // Ед. измерения
// == Отбор по поставщику ==
'WHERE card.ARTICLE IN ' + #13 +
'(SELECT spec.ARTICLE FROM SUPERMAG.SMSpec spec WHERE spec.DOCID IN ' +#13+
'(SELECT doc.ID AS dID FROM SUPERMAG.SMDOCUMENTS doc WHERE doc.CLIENTINDEX = :Поставщик )) '+
// =========================
'GROUP BY card.ARTICLE, card.NAME, edizm.ABBREV, ostat.QUANTITY';


Q.Execute;
finally
Q.Free;
end;
end.
08.10.2008 10:05
Еще перед group by можно добавить:
'AND card.ACCEPTED = 1 '+
08.10.2008 10:17
А ещё в SMDOCUMENTS надо учитывать тип и статус документа....
Зачем тебе анализировать накладные в черновике?
12.09.2014 07:46
Подниму темку. Сильно тапками не закидывайте - я только учусь писать более сложные запросы.

Необходимо получать оперативные остатки в любое время дня - артикул, наименование, ш/к, остаток.

set serveroutput on
DECLARE
v_name supermag.smcard.name%type;
v_article supermag.smcard.article%type;
v_salequan supermag.smopergoods.salequantity%type DEFAULT 0;
v_quan supermag.smgoods.quantity%type;
v_returnquan supermag.smopergoods.returnquantity%type DEFAULT 0;
v_barcode supermag.smstoreunits.barcode%type;
v_operquan real;
v_count integer:=1;

BEGIN
for r in ( select supermag.smcard.name,
supermag.smcard.article,
supermag.smstoreunits.barcode,
supermag.smopergoods.salequantity,
supermag.smopergoods.returnquantity,
supermag.smgoods.quantity
into v_name,
v_article,
v_barcode,
v_salequan,
v_returnquan,
v_quan
from supermag.smcard,
supermag.smstoreunits,
supermag.smopergoods,
supermag.smgoods
where supermag.smcard.accepted='1'
and supermag.smcard.article=supermag.smgoods.article
and supermag.smcard.article=supermag.smopergoods.article
and supermag.smcard.article=supermag.smstoreunits.article)
loop
V_count:=V_count+1;
v_operquan:=v_quan-v_salequan+v_returnquan;
dbms_output.put_line (v_name||', '||v_article||', '||v_barcode||', '||v_operquan);
exit when SQL%NOTFOUND;
end loop;
END;
/

компилируется без ошибок, но ничего не выводит ((( не могу проверить - верно ли считает...
помогите, пжлста...
12.09.2014 08:13
А если supermag.smopergoods на supermag.smgoods поменять?
12.09.2014 08:46
OlegON, где именно?
оперативный остаток - это же остаток с учетом продаж (опер.чеков), а SMGoods хранит доступные остатки, SMOpergoods -уже проданное кол-во по кассе.
12.09.2014 09:03
что будет на выходе если:
1. у артикула несколько ШК
2. у артикула вообще нет ШК ?
Часовой пояс GMT +3, время: 14:55.

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