Поток документов сбыта (выбрать СФ и ее сумму)

Автор Паганель, Квітень 21, 2011, 08:28:35 ПП

Попередня тема - Наступна тема

0 Користувачі і 1 Гість дивляться цю тему.

Паганель

Нет ни у кого примерчика (туговато что то получается что то выбрать), + поставка ...

Получается ситуация такая: есть заказ, по нему поставка, по поставке СФ, в большинстве случаев ошибочная, сторнирована, снова СФ уже по заказу, снова сторно, потом нормальная СФ но не проведенная ... ну в общем вариантов много, уже запарился, для каждого случившегося вылавливать и переделывать код...

Одним словом, ни у кого нету готовенького алгоритма, или бапишки (если работает быстренько)...

Мой пример кода, могу выложить, когда подключусь к системе...

Uukrul

Ну и для кого создан раздел SE37? Не я понимаю если бы там было 100 и одна страница, но там их всего ТРИ... ага и на второй странице: http://sapforum.biz/index.php/topic,203.0.html

Паганель

Цитата: Uukrul  від Квітень 21, 2011, 09:52:41 ПП
Ну и для кого создан раздел SE37? Не я понимаю если бы там было 100 и одна страница, но там их всего ТРИ... ага и на второй странице: http://sapforum.biz/index.php/topic,203.0.html
О спасибо, поиск не работает, что-то, не находит... может у админов больше прав.... :)

Uukrul

Цитата: Паганель від Квітень 22, 2011, 11:29:27 ПП
О спасибо, поиск не работает, что-то, не находит... может у админов больше прав.... :)
Да нет просто страницы три, а поиск тут действительно плохо работает, может во второй версии форума исправили уже. Скоро обещают релиз.

Паганель

Небольшой примерчик, того, что мне надо было (обратите внимание, в моем случае в заказе только одна поизциия):

     DATA: vbelv TYPE vbfa-vbelv,
           vbeln TYPE vbfa-vbeln, " СФ
           posnn TYPE vbfa-posnn, " поз.
           posnv TYPE vbfa-posnv.

     DATA: l_vbeln type vbak-vbeln,
     bill_num TYPE vbfa-vbeln, " СФ
     rfwrt type vbfa-rfwrt.

     l_vbeln  = '28450'. " Для теста
 
    " В моем случае, в заказе только 1 позиция
     SELECT SINGLE posnr INTO posnv
       FROM vbap
       WHERE vbeln = l_vbeln.

     SELECT SINGLE vbeln posnn INTO (vbeln,  posnn)
      FROM vbfa
      WHERE vbelv = l_vbeln AND
            posnv = posnv         AND
            vbtyp_n = 'M'         AND
            vbeln IN (
              SELECT vbeln FROM vbrk
              WHERE vbeln = vbfa~vbeln AND
                    rfbsk = 'C' AND sfakn = space AND fksto = space
            ).

     IF sy-subrc EQ 0.
        bill_num  = vbeln.
       SELECT SINGLE kzwi1 FROM vbrp
         INTO rfwrt
         WHERE vbeln = vbeln AND
               posnr = posnn.

     ENDIF.

Dmitriy

#5
Процедуру нужно разгрузить.
1) Выбираем ссылку на позицию фактуры (VBFA~VBTYP_N = 'M') из потока VBFA по номеру заказа клиента VBAK-VBELN, который является входным параметром процедуры, как я понял. Если число позиций > 1, то SELECT SINGLE меняем на SELECT INTO TABLE.
2) По номеру фактуры/позиции выбираем данные из VBRK/VBRP, проверяя VBRK~FKSTO <> 'X'. А условие VBRK~SFAKN <> space имеет смысл лишь для сторнирующих фактур (VBFA~VBTYP_N = 'N'), там как раз стоит номер прямой фактуры, у которой SFAKN уже пустое, зато FKSNO = 'X', это обычное SAP-овское дело. А поскольку тип N ты не выбираешь, то и лишняя обработка не нужна.
Если процедура будет использоваться для обработки >= 1000 сбытовых заказов в каком-либо онлайн-отчёте (бывает в сбыте :D), то лучше внимательно прочесть вот этот документ. ;)
Ясно, что серия из SELECT SINGLE вкупе с совершенно лишним и даже вредным в данном случае подзапросом существенно замедлит процесс получения конечного результата при больших объёмах данных.

Dmitriy

Если вдруг понадобится дебиторка FI, то найти документы можно в таблице BKPF по ключу из константы и номера сбытовой фактуры:
BKPF~AWTYP = 'VBRK' - константа
BKPF~AWKEY = VBRK-VBELN - номер сбытовой с-ф

Паганель

Цитата: Dmitriy від Квітень 24, 2011, 03:49:59 ПП
Процедуру нужно разгрузить.
1) Выбираем ссылку на позицию фактуры (VBFA~VBTYP_N = 'M') из потока VBFA по номеру заказа клиента VBAK-VBELN, который является входным параметром процедуры, как я понял. Если число позиций > 1, то SELECT SINGLE меняем на SELECT INTO TABLE.
2) По номеру фактуры/позиции выбираем данные из VBRK/VBRP, проверяя VBRK~FKSTO <> 'X'. А условие VBRK~SFAKN <> space имеет смысл лишь для сторнирующих фактур (VBFA~VBTYP_N = 'N'), там как раз стоит номер прямой фактуры, у которой SFAKN уже пустое, зато FKSNO = 'X', это обычное SAP-овское дело. А поскольку тип N ты не выбираешь, то и лишняя обработка не нужна.
Если процедура будет использоваться для обработки >= 1000 сбытовых заказов в каком-либо онлайн-отчёте (бывает в сбыте :D), то лучше внимательно прочесть вот этот документ. ;)
Ясно, что серия из SELECT SINGLE вкупе с совершенно лишним и даже вредным в данном случае подзапросом существенно замедлит процесс получения конечного результата при больших объёмах данных.
Спасибо за критику, жаль что ты раньше не написал ....

Dmitriy

Цитата: Паганель від Квітень 25, 2011, 03:39:14 ПП
Спасибо за критику, жаль что ты раньше не написал ....
Это не критика, это рекомендации. Подправишь код, если что, там не так его много...