[ОТВЕТИТЬ]
07.10.2008 14:01
anderson
 
Помогите пожалуйста кто чем...*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
Pyatak
 
можешь дополнить свой запрос в секции 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
anderson
 
Спасибо, сейчас попробую:)
08.10.2008 09:19
anderson
 
В общем так побыстрее получается:
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
anderson
 
Еще перед group by можно добавить:
'AND card.ACCEPTED = 1 '+
08.10.2008 10:17
Mtirt
 
А ещё в SMDOCUMENTS надо учитывать тип и статус документа....
Зачем тебе анализировать накладные в черновике?
12.09.2014 07:46
Evelyn
 
Подниму темку. Сильно тапками не закидывайте - я только учусь писать более сложные запросы.

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

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
OlegON
 
А если supermag.smopergoods на supermag.smgoods поменять?
12.09.2014 08:46
Evelyn
 
OlegON, где именно?
оперативный остаток - это же остаток с учетом продаж (опер.чеков), а SMGoods хранит доступные остатки, SMOpergoods -уже проданное кол-во по кассе.
12.09.2014 09:03
konst
 
что будет на выходе если:
1. у артикула несколько ШК
2. у артикула вообще нет ШК ?
12.09.2014 09:32
Evelyn
 
konst, отсутствие ш/к может быть у неактивных карточек, т.к. в случае отсутствия ш/к при создании карточки должны создаваться внутренний. А вот с несколькими ш/к - это вторая проблема, которая оставлена на потом. Я не подумала, выложила сюда полную версию запроса - без баркода все также.. Пока волнуют остатки
12.09.2014 11:01
OlegON
 
Цитата:
Evelyn OlegON, где именно?
оперативный остаток - это же остаток с учетом продаж (опер.чеков), а SMGoods хранит доступные остатки, SMOpergoods -уже проданное кол-во по кассе.
Везде. Подразумевалась просто проверка скрипта, раз он ничего не выводит. Сейчас негде проверить. Можно вообще просто прогнать с выводом первых 10 карточек из smcard без других условий. Как вариант - накосячили с выводом. Кстати, МХ игнорится специально?
12.09.2014 11:24
Evelyn
 
МХ игнорится, потому что скрипт будет работать на самом МХ (у каждого МХ своя БД и чеки только в ней)

выборка по smcard - то же самое.. выводит строки c запятой и пробелами, т.е. прописанное разделение в output без значений v_name И v_article (
12.09.2014 11:55
Evelyn
 
если на магазине N касс - смены разные, соответственно будет N разных позиций с SALEQUANTITY на один артикул. блин..
12.09.2014 15:22
Occul
 
Цитата:
Evelyn компилируется без ошибок, но ничего не выводит (((
Цитата:
Evelyn то же самое.. выводит строки c запятой и пробелами, т.е. прописанное разделение в output без значений v_name И v_article (
вы уж определитесь, что происходит...
12.09.2014 15:37
Evelyn
 
Dr.Hyde, ничего не выводит - это и имелось ввиду никаких значений.
Если dbms_output.put_line(v_operquan)
Просто выводит PL/SQL procedure successfully completed.
Или если прописаны разделители между переменными для вывода, то только их выводит и в конце PL/SQL procedure successfully completed.
12.09.2014 16:38
svtl
 
По ш/кодам - можно выбирать один ш/код - в порядке приоритета, можно все через запятую в одном поле как стринговую переменную
по самому скрипту - попробуйте в for убрать блок into переменные.
т.е. в курсоре просто выборка, можете поля обозвать как хотите.
а в строку вывода - значения r.<имя столбца> соответствующие.
15.09.2014 12:23
Evelyn
 
Поняла свои ошибки, спасибо!

Рабочий вариант:

set serveroutput on
DECLARE
v_operquan real;
v_count integer:=1;

BEGIN
for r in ( select supermag.smcard.name,
supermag.smcard.article,
supermag.smopergoods.salequantity,
supermag.smopergoods.returnquantity,
supermag.smgoods.quantity,
Listagg(supermag.smstoreunits.barcode, ', ')WITHIN GROUP (ORDER BY supermag.smstoreunits.barcode) as barcode
from supermag.smcard,
supermag.smopergoods,
supermag.smgoods,
supermag.smstoreunits
where supermag.smcard.accepted='1'
and supermag.smcard.article=supermag.smgoods.article
and supermag.smcard.article=supermag.smopergoods.article
and supermag.smstoreunits.article=supermag.smcard.article
group by supermag.smcard.name,
supermag.smcard.article,
supermag.smopergoods.returnquantity,
supermag.smopergoods.salequantity,
supermag.smgoods.quantity)
loop
V_count:=V_count+1;
v_operquan:=r.quantity-NVL((r.salequantity),0)+NVL((r.returnquantity),0);
dbms_output.put_line (r.name||', '||r.article||', '||r.barcode||', '||v_operquan);
exit when SQL%NOTFOUND;
end loop;
END;
/
27.11.2015 20:34
Neutron
 
Народ, а как можно получить реальные остатки всех товаров на время запуска скрипта?
Процедура выше выводит только оперативные остатки, если я правильно понял. Если запрашивать только из smgoods, то получаем остатки без оперативной продажи. А вот как получить остатки всех товаров учитывая оперативные продажи и возвраты?
27.11.2015 22:18
OlegON
 
открой для себя smopergoods
28.11.2015 11:13
Neutron
 
Цитата:
OlegON открой для себя smopergoods
Олег да и в скрипте выше он открыт.
Только я как ни мучаюсь никак не могу получить список всех товаров.
Получаю остаток из smgoods, получаю оперативный остаток из smgoods и smopergoods а вот как обьединить/наложить результаты оперативного на основной никак не могу найти(знаний не хватает).
28.11.2015 12:52
BotMan
 
можно дернуть запрос из супермага, из карточки - остатки. по вычитать опер продажи и по складывать опер возвраты, нет?
28.11.2015 12:57
BotMan
 
в СМ что-то такое варится, нету базы под рукой, проверить.

SQL код:
select A.*,price,
decode(A.PackSize,-1,nvl(G.SaleQ,0),null)as operRealiz
,decode(A.PackSize,-1,A.Quantity-nvl(G.SaleQ,0),nullOperQuantity
,decode(A.PackSize,-1,A.FreeQuantity-nvl(G.SaleQ,0),nullOperFree
from 
(select pr.pricecrd.name,
L.ID StoreLoc,L.Name StoreLocTitleg.Article,-1 PackSize
,nvl(G.Quantity,0Quantity
,nvl(G.ReservedQuantity,0ReservedQuantity
,nvl(G.IncomingQuantity,0IncomingQuantity
,nvl(G.AwaitedQuantity,0AwaitedQuantity
,nvl(G.FoundQuantity,0FoundQuantity
,nvl(G.Quantity+G.FoundQuantity-(G.ReservedQuantity+G.IncomingQuantity),0FreeQuantity
from Supermag
.SMGoods GSupermag.SVGrantedLocs LSupermag.SMcard crdSuperMag.SMPrices pr
where L
.ID=G.StoreLoc(+)
and 
g.storeloc and pr.storeloc and g.article pr.article 
and g.article crd.article
and G.Article in (  пихаем запрос откуда берем карточки )) A, (select G.LocID,sum(G.SaleQuantity-G.ReturnQuantitySaleQ
from Supermag
.SMOperGoods G
Where G
.Article in (  пихаем запрос откуда берем карточки )
group by G.LocIDG
where A
.StoreLoc=G.LocID(+)
order by A.StoreLocTitle,A.PackSize 
Опции темы


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

 

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