Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Oracle

Как выбрать размер упаковки если контрактов несколько : Oracle

28.03.2024 23:55


16.09.2013 18:23
PavelGS
 
Подскажите есть задача выбрать размер упаковки товара.
Возникла проблема когда контрактов 2 или больше.

Пробовал выбрать так:
Код:
SELECT TO_CHAR(P.PACKSIZE) AS PACKSIZE, 
                   TO_CHAR(D.CREATEDAT, 'DD.MM.YY') AS DOC_D, 
                   L.LOCATIONID 
                  FROM SUPERMAG.SMSPECCO P, 
                   SUPERMAG.SMDOCUMENTS D, 
                   SUPERMAG.SMCONTRACTLOCATIONS L 
                 WHERE P.DOCID = D.ID 
                   AND P.DOCTYPE = D.DOCTYPE 
                   AND D.ID = L.ID 
                   AND 'CQ' = L.DOCTYPE 
                   AND '1000115' = P.ARTICLE 
                   AND 1 = L.LOCATIONID
                   AND 3 = D.DOCSTATE 
                   AND L.ID = P.DOCID
                   ORDER BY D.CREATEDAT DESC
Но Т.К. строк несколько как его подключить к основному запросу ?

основной запрос:

Код:
SELECT
    D.ID AS DOCID,
    D.CREATEDAT AS CREATEDAT,
    DT.DATEDAT AS DARTDAT,
    DT.DATEDAT2 AS DATEDAT2,
    P.PARAMVALUE AS COM,
    CL.NAME AS POSTAVSHIK,
    C.ARTICLE AS ARTICLE,
    SP.SUPPLIERARTICLE AS SUPPLIERARTICLE,
    SUPERMAG.barToStrcreate(S.ARTICLE) BARCODE,
    C.NAME AS NAME,
    S.QUANTITY AS QUANTITY
    
    
FROM SUPERMAG.SMDOCUMENTS D
    LEFT JOIN SUPERMAG.SMDATEDOCS DT ON DT.ID=D.ID AND DT.DOCTYPE=D.DOCTYPE 
    LEFT JOIN SUPERMAG.SMDOCPROPS P ON P.DOCID=D.ID AND P.DOCTYPE = D.DOCTYPE AND P.PARAMNAME='CustomLabels.DOPCOMMENT'
    LEFT JOIN SUPERMAG.SMSPEC S ON S.DOCID = D.ID AND D.DOCTYPE = S.DOCTYPE
    LEFT JOIN SUPERMAG.SMCARD C ON C.ARTICLE = S.ARTICLE
    LEFT JOIN SUPERMAG.SMCLIENTINFO CL ON CL.ID = D.CLIENTINDEX
    LEFT JOIN SUPERMAG.SMSUPPLYCASE SP ON SP.ARTICLE = S.ARTICLE AND SP.IDSUPPLIER = D.CLIENTINDEX
     

WHERE
    D.ID = 'ЗП1488798'
    AND D.DOCTYPE IN ('OR','SO')
16.09.2013 18:30
OlegON
 
отдыхать не пробовал? |-) написал так, как будто мы тут все следили за ходом твоей разработки, не отрываясь... т.е. не написал по сути задачи ничего... почему контрактов два? поставщики разные? а как тогда выбрать размер упаковки, если у одного 2, у другого - 20, то какого брать?
16.09.2013 18:33
PavelGS
 
Цитата:
OlegON отдыхать не пробовал? |-) написал так, как будто мы тут все следили за ходом твоей разработки, не отрываясь... т.е. не написал по сути задачи ничего... почему контрактов два? поставщики разные? а как тогда выбрать размер упаковки, если у одного 2, у другого - 20, то какого брать?
любого с максимально поздней датой :)
16.09.2013 18:42
OlegON
 
И что мешает добавить это условие? Хотя, мне кажется, что оно логически неверное. Если два действующих контракта на разных поставщиков, то выборка будет по тому, с кем заключен последний, в то время, как действуют-то оба... Могут и по первому привезти...
16.09.2013 18:44
PavelGS
 
Цитата:
OlegON И что мешает добавить это условие?
Олег, подскажи если через JOIN ROWNUM=1 то не выбирает :(
17.09.2013 17:55
OlegON
 
не понял, что за джойн с номером строки в свете их сортировки... ковырять твой запрос некогда, но вот пример по выбору ID документа с максимальной датой, если ID несколько.
Код:
select id,max(createdat) from supermag.smdocuments where id='НОМЕР' group by id;
17.09.2013 18:11
PavelGS
 
Цитата:
OlegON не понял, что за джойн с номером строки в свете их сортировки... ковырять твой запрос некогда, но вот пример по выбору ID документа с максимальной датой, если ID несколько.
Код:
select id,max(createdat) from supermag.smdocuments where id='НОМЕР' group by id;
Только из таблицы SMSPECCO
17.09.2013 18:28
OlegON
 
ну табличку-то сменить не трудно, наверное...
19.09.2013 12:23
PavelGS
 
Сделал функцией
Код:
CREATE OR REPLACE function SUPERMAG.pavpacksize  ( p_a in varchar2,p_mx in number )
    return varchar2
    is
        l_str  varchar2(2000) default null;
        
    begin
        for x in ( SELECT PACKSIZE FROM (
SELECT TO_CHAR(P.PACKSIZE) AS PACKSIZE, 
                   TO_CHAR(D.CREATEDAT, 'DD.MM.YY') AS DOC_D, 
                   L.LOCATIONID 
                  FROM SUPERMAG.SMSPECCQ P, 
                   SUPERMAG.SMDOCUMENTS D, 
                   SUPERMAG.SMCONTRACTLOCATIONS L 
                 WHERE P.DOCID = D.ID 
                   AND P.DOCTYPE = D.DOCTYPE 
                   AND D.ID = L.ID 
                   AND 'CQ' = L.DOCTYPE 
                   AND p_a = P.ARTICLE 
                   AND p_mx = L.LOCATIONID 
                   AND  D.DOCSTATE =2  
                   AND L.ID = P.DOCID
                   AND L.DOCTYPE = P.DOCTYPE
                   ORDER BY D.CREATEDAT DESC
                   ) WHERE ROWNUM = 1 ) loop
            l_str :=  x.PACKSIZE;
           
       end loop;
       return l_str;
   end;
/
Часовой пояс GMT +3, время: 23:55.

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