[ОТВЕТИТЬ]
03.04.2007 12:30
dmware
 
Подскажите пожалуйста, с какими таблицами работает этот отчет и вообще по какому принципу определяются остатки. Мне нужно написать такой же вот запрос...
Написал вот нечто вроде этого:

Код:
select SACARDCLASS.TREE,
        SACARDCLASS.NAME,
        SMCARD.NAME,
        SMCARD.ARTICLE,
        SMGOODS.QUANTITY,
        SMGOODS.STORELOC
   from SACARDCLASS,
        SMCARD,
        SMGOODS,
        SMSTORELOCATIONS

  where SMSTORELOCATIONS.ID = SMGOODS.STORELOC
        AND SMGOODS.ARTICLE = SMCARD.ARTICLE
        AND SMCARD.IDCLASS = SACARDCLASS.ID
        AND SACARDCLASS.ID = SMCARD.IDCLASS
        AND SMCARD.RECEIPTOK='1'
        AND SMGOODS.STORELOC IN(6, 7)
        AND SMCARD.Article IN(
        SELECT
        SMCARD.ARTICLE
        FROM
        SMCARD,
        SACARDCLASS
        WHERE SMCARD.IDCLASS = SACARDCLASS.ID
        AND SACARDCLASS.TREE LIKE '5.3.%')
        AND SMCARD.ACCEPTED=1
 order by SMGOODS.STORELOC ASC
Таким образом получаю те данные, что можно увидеть в Супермаге в разделе Карточки->Остатки.

Из описания стандартного отчета:
...В отчете "Остатки" анализируются полностью оприходованные документы и документы со статусом "принят на складе"...

Следовательно, SMGOODS, SMCARD (для отображения наименования), SMSTORELOCATIONS (для получения мест хранения) и... привязать еще SMSPEC и SMDOCUMENTS? А в последней уже анализировать поле DOCSTATE? Или я не там смотрю?
03.04.2007 16:09
dmware
 
Выбрал конкретный артикул по конкретному месту хранения, просматриваю документы в разделе Карточки->Документы. Все документы, которые там отображены в статусе "двух зеленых галочек". Теперь здесь же в разделе остатки: 21 единица, а по отчету: 6.
Почему?? Где копать? Какие еще документы могут быть не учтены и как их найти?
03.04.2007 16:23
inna
 
сделай для начала как то пороще, может
select sum(QUANTITY) from smgoods where article=... and STORELOC=.... для проверки
и AND SMCARD.IDCLASS = SACARDCLASS.ID
AND SACARDCLASS.ID = SMCARD.IDCLASS напрягает. Может конечно и можно так -но зачем?
03.04.2007 16:28
OlegON
 
Ты бы полистал форум. Была такая тема уже. И не видно, что у тебя разделение по документам идет. Не забывай, что там и перемещение и инвентаризации в куче лежат..
03.04.2007 16:47
dmware
 
Цитата:
olegon Ты бы полистал форум. Была такая тема уже.
Да, конечно, писали в целом уже об этом:) Извините, если в чем-то повторяюсь. В следующий раз продолжу одну из существующих тем, если она будет открыта. У меня вопросы не столько по самой программе, сколько по таблицам и принципам размещения/извлечения/оображения данных Супермагом, потому и сделал новый топик.

Цитата:
olegon И не видно, что у тебя разделение по документам идет. Не забывай, что там и перемещение и инвентаризации в куче лежат..
По документам действительно в этом запросе разделения не делаю. Супермаг выполняет запрос Товарные->Остатки очень быстро если установить текущую дату. Вероятно в этом случае программа просто выбирает данные из SMGOODS.
03.04.2007 16:50
dmware
 
Цитата:
inna сделай для начала как то пороще, может
select sum(QUANTITY) from smgoods where article=... and STORELOC=.... для проверки
и AND SMCARD.IDCLASS = SACARDCLASS.ID
AND SACARDCLASS.ID = SMCARD.IDCLASS напрягает. Может конечно и можно так -но зачем?
Для того, чтобы отобразить всю группу. Так проще искать расхождения со стандартным отчетом, поскольку можно просто рассчитать в EXCEL сумму остатков и сверить с тем, что в отчете. А вот если уже найдутся расхождения - копать по конкретному артикулу.
03.04.2007 16:55
dmware
 
Цитата:
dmware Выбрал конкретный артикул по конкретному месту хранения, просматриваю документы в разделе Карточки->Документы. Все документы, которые там отображены в статусе "двух зеленых галочек". Теперь здесь же в разделе остатки: 21 единица, а по отчету: 6.
Почему?? Где копать? Какие еще документы могут быть не учтены и как их найти?
Определил, что супермаговский отчет почему-то не учитывает сегодняшний приход (03.04.) в магазин в количестве 15 единиц товара. Вот и 21 получается. Документ в статусе двух зеленых галочек. Однако в разделе Карточки->Остатки - та же 21 единица...
03.04.2007 17:00
inna
 
условия одинаковые - или мне кажется? Просто наоборот написано.
Я собственно и предлагала тебе путь выяснения почему селект неправильный. Сначала пишется простой селект, а потом начинаешь накручивать сверху связи. Сначала надо проверить таблицу smgoods - там должен быть такой же остаток как в СМ. Потом начинаешь ее фильтровать по группе и т.д.
03.04.2007 17:01
inna
 
Если смотреть отчетом, то остаток берется на утро.
03.04.2007 17:05
dmware
 
Цитата:
inna Если смотреть отчетом, то остаток берется на утро.
Ясно, спасибо. Наверное этот самый приход был принят позже. Утром уже наверное проверю.
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, время: 22:51.

 

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