03.04.2007 17:13
dmware
 
Цитата:
inna условия одинаковые - или мне кажется? Просто наоборот написано.
Я собственно и предлагала тебе путь выяснения почему селект неправильный. Сначала пишется простой селект, а потом начинаешь накручивать сверху связи. Сначала надо проверить таблицу smgoods - там должен быть такой же остаток как в СМ. Потом начинаешь ее фильтровать по группе и т.д.
Запрос отрабатывает правильно. Только что проверил. Остатки совпадают. Действительно супермаговский отчет я вывел ДО того, как приходная накладная была проведена)
Ну, а возвращаясь к моему первому сообщению... Очень похоже на то, что Супермаг в данном отчете начинает разбор документов, только тогда, когда выставляешь конкретную дату, что логично, конечно, ведь простой запрос на выборку данных из SMGOODS отработает намного быстрее.
Попробую произвести выборку по документам. Спасибо за ответы!
12.04.2007 12:49
dmware
 
Помогите, пожалуйста, с запросом. Следующий - считает остатки по документам на конкретную дату и выводит их количество.

Код:
 SELECT
 SACARDCLASS.TREE, 
 SACARDCLASS.NAME,
 SMCARD.NAME,
 SMSPEC_ARTICLE,
 SMSPEC_QUANT, 
 --NVL(SMDOCUMENTS.locationfrom, SMDOCUMENTS.locationto) LOCATION, 
 to_date('09.04.2007', 'DD.MM.YYYY') DATE_G
 
 FROM
 (
 SELECT SMSPEC_ARTICLE, SUM(QUANT) SMSPEC_QUANT FROM(
       SELECT 
       SMSPEC.ARTICLE SMSPEC_ARTICLE, 
       SUM(DECODE(SMSPEC.DOCTYPE, 'IW', -SMSPEC.QUANTITY)) QUANT

       FROM
       SMSPEC, 
       SMDOCUMENTS,
       SMCARD
       
       WHERE
       SMSPEC.doctype = SMDOCUMENTS.doctype 
       AND SMSPEC.docid = SMDOCUMENTS.id 
       AND SMSPEC.article = SMCARD.article 

       AND nvl(SMDOCUMENTS.locationfrom, SMDOCUMENTS.locationto) IN(6)
       AND SMCARD.ACCEPTED=1  
       AND SMDOCUMENTS.createdat <= to_date('09.04.2007', 'DD.MM.YYYY')  
       AND SMDOCUMENTS.docstate >= 2
       AND SMDOCUMENTS.doctype IN('WI', 'WO', 'CS', 'CR', 'IW', 'OR', 'IL')

       Group by SMSPEC.ARTICLE

       UNION ALL
       SELECT SMSPEC.ARTICLE SMSPEC_ARTICLE,
       SUM(DECODE(SMSPEC.DOCTYPE, 'IW', SMSPEC.QUANTITY)) QUANT

       FROM
       SMSPEC, 
       SMDOCUMENTS,
       SMCARD
       
       WHERE
       SMSPEC.doctype = SMDOCUMENTS.doctype 
       AND SMSPEC.docid = SMDOCUMENTS.id 
       AND SMSPEC.article = SMCARD.article 

       AND nvl(SMDOCUMENTS.locationto, SMDOCUMENTS.locationfrom) IN(6)  
       AND SMCARD.ACCEPTED=1  
       AND SMDOCUMENTS.createdat <= to_date('09.04.2007', 'DD.MM.YYYY')  
       AND SMDOCUMENTS.docstate >= 2
       AND SMDOCUMENTS.doctype IN('WI', 'WO', 'CS', 'CR', 'IW', 'OR', 'IL')
 
      Group by SMSPEC.ARTICLE

      UNION ALL
      SELECT SMSPEC.ARTICLE SMSPEC_ARTICLE, 
      SUM(DECODE(SMSPEC.DOCTYPE, 
      'WI', SMSPEC.QUANTITY, 
      'WO', -SMSPEC.QUANTITY, 
      'CR', SMSPEC.QUANTITY, 
      'CS', -SMSPEC.QUANTITY, 
      'OR', SMSPEC.QUANTITY,
      'IL', SMSPEC.QUANTITY
      )) QUANT

      FROM
      SMSPEC, 
      SMDOCUMENTS,
      SMCARD

      WHERE
      SMSPEC.doctype = SMDOCUMENTS.doctype 
      AND SMSPEC.docid = SMDOCUMENTS.id 
      AND SMSPEC.article = SMCARD.article 

      AND nvl(SMDOCUMENTS.locationfrom, SMDOCUMENTS.locationto) IN(6)  
      AND SMCARD.ACCEPTED=1  
      AND SMDOCUMENTS.createdat <= to_date('09.04.2007', 'DD.MM.YYYY')  
      AND SMDOCUMENTS.docstate >= 2
      AND SMDOCUMENTS.doctype IN('WI', 'WO', 'CS', 'CR', 'IW', 'OR', 'IL')

     Group by SMSPEC.ARTICLE    
 ) 
 Group by SMSPEC_ARTICLE
 ),
 SACARDCLASS,
 SMSPEC, 
 SMDOCUMENTS,
 SMCARD
 
 WHERE
 SACARDCLASS.ID = SMCARD.IDCLASS
 AND SMSPEC_ARTICLE = SMSPEC.ARTICLE
 AND SMSPEC.doctype = SMDOCUMENTS.doctype 
 AND SMSPEC.docid = SMDOCUMENTS.id 
 AND SMSPEC.article = SMCARD.article 
 
 --AND nvl(SMDOCUMENTS.locationfrom, SMDOCUMENTS.locationto) IN(6)
 
 AND SMCARD.ACCEPTED=1
  
 AND SMDOCUMENTS.createdat <= to_date('09.04.2007', 'DD.MM.YYYY')  
 AND SMDOCUMENTS.docstate >= 2
 AND SMDOCUMENTS.doctype IN('WI', 'WO', 'CS', 'CR', 'IW', 'OR', 'IL')
 
 Group BY SACARDCLASS.TREE, SACARDCLASS.NAME, SMCARD.NAME, SMSPEC_ARTICLE, SMSPEC_QUANT 
 ORDER BY SACARDCLASS.TREE
Отрабатывает нормально. Но...
Нужно отображать также информацию о том, где находится данный товар. Для тех случаев, например, когда производится выборка из нескольких мест хранения. Просто добавить эти данные я не могу (закомментированная строчка) потому, что товар может быть списан на склад брака, а также возвращен оттуда, следовательно должны быть учтены движения:
1. NVL(SMDOCUMENTS.locationfrom, SMDOCUMENTS.locationto)
2. NVL(SMDOCUMENTS.locationto, SMDOCUMENTS.locationfrom)
где для некоторых перемещений locationfrom может быть местом хранения, а также может быть местом хранения locationto (для тех случаев когда товар идет на скалад брака)
С этой целью был организован подзапрос, возвращающий нужное количество остатков. Он возвращает правильные значения, но есть еще и внешний запрос, который то и покажет данные в необходимой форме.
Вопрос: а как, не ограничивая полученных в подзапросе данных, отобразить эти места хранения для каждого из полученных значений?
Ведь если просто вывести, например NVL(SMDOCUMENTS.locationfrom, SMDOCUMENTS.locationto) (закоментированное в шапке запроса) и наложить условие:
nvl(SMDOCUMENTS.locationfrom, SMDOCUMENTS.locationto) IN(2) результат внутреннего запроса будет ограничен данными только для одного типа перемещений и, следовательно отобразятся не все остатки.
Часовой пояс GMT +3, время: 08:57.

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