SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

по номеру заказа на поставку найти idoc



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
Ruax
Участник
Участник



Joined: 17 Dec 2012
Posts: 11

PostPosted: Mon Mar 04, 2013 5:24 pm    Post subject: по номеру заказа на поставку найти idoc Reply with quote

поставили вот такую задачку. сделал Join ekko и ekbe по ebeln. и теперь по ТЗ надо из bkpf выбрать belnr, bldat и cputm. всвязи с этим вопрос: как можно разложить awkey (в нем хранится belnr документа материала+год) до выборки из Bkpf или во время ее, чтобы поставить условие: awkey (без последних 4х символов) = ekbe-belnr.

это начало:

Code:
SELECT ek~ebeln ek~bukrs ek~bstyp ek~bsart ek~aedat ek~lifnr
         eb~ebelp eb~gjahr eb~belnr
           INTO CORRESPONDING FIELDS OF TABLE lt_ekbe
         FROM ekko AS ek
         JOIN ekbe AS eb
         ON ek~ebeln = eb~ebeln
  where ek~ebeln IN so_ebeln.


При следующем шаге:

Code:
loop at lt_ekbe ASSIGNING <fs_ekbe>.
  SELECT bukrs belnr gjahr cputm bldat awkey
    INTO CORRESPONDING FIELDS OF TABLE lt_bkpf
    FROM bkpf
    WHERE  bukrs = <fs_ekbe>-bukrs
    AND   gjahr = <fs_ekbe>-gjahr.
endloop.


уже в aed выбирается слишком много значений (около 10к), поэтому было принято решение ограничить по awkey (без последних 4х символов) = ekbe-belnr. как сделать - пока не знаю(
Back to top
View user's profile Send private message
John Doe
Модератор
Модератор


Age: 45
Joined: 05 Nov 2007
Posts: 725
Location: КраснАдар

PostPosted: Mon Mar 04, 2013 5:58 pm    Post subject: Reply with quote

Очень сумбурно... Причем здесь поиск Idoc?

По задаче:
1. Join EKKO и EKBE следует ограничить минимум по операциям, имеющим отражение в FI. Это поле VGABE (1 - поступление материала, 2 - поступление счета, 3 -допдебетование - для начала).
2. Кроме того затраты на доставку не содержатся в EKBE. Я бы посоветовал добавить еще и такой же Join по EKKO и EKBZ.
3. По полученному массиву нужно подготовить RANGE для выборки из BKPF по AWKEY. Диапазон лучше собирать по 1000 записей.
4. AWKEY должен быть полный. Кроме этого нужно обязательно заполнить AWTYP и AWSYS для того, чтобы полноценно отработал индекс BKPF~4

_________________
FunCoding.ru
KicksCollector.ru
Back to top
View user's profile Send private message Blog
Удав
Гуру
Гуру


Age: 48
Joined: 25 Jan 2008
Posts: 580
Location: Москва

PostPosted: Mon Mar 04, 2013 10:25 pm    Post subject: Re: по номеру заказа на поставку найти idoc Reply with quote

Ruax wrote:
теперь по ТЗ надо из bkpf выбрать belnr, bldat и cputm

Для этой цели BKPF не нужен - в EKBE есть точно такие же BLDAT (почему BLDAT а не CPUDT?) и CPUTM.
Для выборки номера бух.документа воспользуйтесь алгоритмом John Doe, можно вместо RANGE использовать FOR ALL ENTRIES по таблице с ключом AWTYP, AWKEY. Номер логической системы обычно не используется, поэтому можно обойтись без него Wink

_________________
С уважением,
Удав.
Back to top
View user's profile Send private message
Dmitriy
Аналитик
Аналитик


Age: 46
Joined: 14 Nov 2008
Posts: 300
Location: Russia

PostPosted: Tue Mar 05, 2013 12:13 am    Post subject: Reply with quote

+ ко всему, на будущее, оборачивайте ABAP-код тегом "Code", сообщение становится более структурированным и понятным
Удав wrote:
почему BLDAT а не CPUDT?

Консультанты, наверное, попросили. Wink

_________________
ABAP/4 You
Back to top
View user's profile Send private message
Ruax
Участник
Участник



Joined: 17 Dec 2012
Posts: 11

PostPosted: Tue Mar 05, 2013 11:32 am    Post subject: Reply with quote

спасибо за советы. как закончу разработку - выложу получившееся, мало ли кому попадется такая же бредовая ТЗшка по поиску IDOC
Back to top
View user's profile Send private message
Dmitriy
Аналитик
Аналитик


Age: 46
Joined: 14 Nov 2008
Posts: 300
Location: Russia

PostPosted: Tue Mar 05, 2013 12:58 pm    Post subject: Reply with quote

а где здесь у вас Idoc?
_________________
ABAP/4 You
Back to top
View user's profile Send private message
Ruax
Участник
Участник



Joined: 17 Dec 2012
Posts: 11

PostPosted: Wed Mar 06, 2013 10:54 am    Post subject: Reply with quote

по номеру заказа на поставку в соответствии с типом IDOC необходимо найти номер IDOC, дату создания и время. идем через таблицы ekko-ekbe-bkpf-edidc.
Back to top
View user's profile Send private message
John Doe
Модератор
Модератор


Age: 45
Joined: 05 Nov 2007
Posts: 725
Location: КраснАдар

PostPosted: Wed Mar 06, 2013 11:54 am    Post subject: Reply with quote

Тогда BKPF совсем не нужен.
Code:
REPORT  zedi_idoc_for_po.

DATA: lsrrelroles TYPE srrelroles,
      lroleid     TYPE srrelroles-roleid,
      lrole_a     TYPE idocrel-role_b.
DATA: t_ekbe TYPE TABLE OF ekbe WITH HEADER LINE,
      l_objkey LIKE srrelroles-objkey,
      l_objtype LIKE srrelroles-objtype.

PARAMETERS: pebeln TYPE ekko-ebeln OBLIGATORY DEFAULT '4500055154'.

START-OF-SELECTION.
  SELECT * FROM ekbe INTO TABLE t_ekbe
    WHERE ebeln EQ pebeln
    AND   vgabe IN ('1','2','3').
  IF sy-subrc <> 0.
    MESSAGE 'Nothing found...' TYPE 'S'.
    EXIT.
  ELSE.
    WRITE:/ 'Purchase Order:', pebeln.
  ENDIF.
  SORT t_ekbe BY belnr.
  DELETE ADJACENT DUPLICATES FROM t_ekbe COMPARING belnr.

  LOOP AT t_ekbe.
    CLEAR: l_objkey, lroleid, lrole_a, lsrrelroles.
    CONCATENATE t_ekbe-belnr t_ekbe-gjahr INTO l_objkey.
    CASE t_ekbe-vgabe.
      WHEN '1'.           " GR
        WRITE:/ 'Goods Receipt:', l_objkey.
        l_objtype = 'BUS2017'.

      WHEN '2' OR '3'.    " Invoice & Subsequent Debit
        WRITE:/ 'Invoice      :', l_objkey.
        l_objtype = 'BUS2081'.

    ENDCASE.

    SELECT SINGLE roleid FROM srrelroles INTO lroleid
      WHERE  objkey    = l_objkey
      AND    objtype   = l_objtype
      AND    roletype  = 'INBELEG'.
    IF sy-subrc <> 0.
      CONTINUE.
    ENDIF.

    SELECT SINGLE role_a  FROM idocrel INTO lrole_a
      WHERE  role_b  = lroleid.
    IF sy-subrc <> 0.
      WRITE: 'Idoc:', 'Manual entered'.
      CONTINUE.
    ENDIF.
    SELECT SINGLE * FROM  srrelroles INTO lsrrelroles
          WHERE  roleid  = lrole_a.
    WRITE: 'Inbound Idoc :', lsrrelroles-objkey.

  ENDLOOP.

_________________
FunCoding.ru
KicksCollector.ru
Back to top
View user's profile Send private message Blog
Ruax
Участник
Участник



Joined: 17 Dec 2012
Posts: 11

PostPosted: Wed Mar 13, 2013 2:23 pm    Post subject: Reply with quote

появился вопрос. какой awtyp соответствует awkey, состоящему из belnr+gjhar? пока нашел 2 awtyp - RMRP и MKPF.

Code:
 SELECT ek~ebeln ek~bukrs ek~bstyp ek~bsart ek~aedat ek~lifnr
          eb~ebelp eb~gjahr eb~belnr
            INTO CORRESPONDING FIELDS OF TABLE lt_ekbe
          FROM ekko AS ek
          JOIN ekbe AS eb
          ON ek~ebeln = eb~ebeln
   WHERE ek~ebeln IN so_ebeln.

  LOOP AT lt_ekbe ASSIGNING <fs_ekbe>.
    CONCATENATE <fs_ekbe>-belnr <fs_ekbe>-gjahr INTO l_awkey.
    ls_awkey-awkey = l_awkey.
    COLLECT ls_awkey INTO lt_awkey_list.
  ENDLOOP.

  SELECT bukrs belnr gjahr cputm cpudt awtyp awkey
    INTO CORRESPONDING FIELDS OF TABLE lt_bkpf
    FROM bkpf
    FOR ALL ENTRIES IN lt_awkey_list
    WHERE awtyp = 'RMRP' AND
          awkey = lt_awkey_list-awkey.

  LOOP AT lt_bkpf INTO ls_bkpf.

    CLEAR: l_tlow
         , l_thigh
         .

    l_tlow = ls_bkpf-cputm - p_intrv.
    l_thigh = ls_bkpf-cputm + p_intrv.

    READ TABLE lt_dtime INTO ls_dtime WITH KEY cpudt = ls_bkpf-cpudt
                                               tlow  = l_tlow
                                               thigh = l_thigh.
    IF sy-subrc <> 0.
      CLEAR ls_dtime.
      ls_dtime-cpudt = ls_bkpf-cpudt.
      ls_dtime-tlow = l_tlow.
      ls_dtime-thigh = l_thigh.
      APPEND ls_dtime TO lt_dtime.
    ENDIF.
  ENDLOOP.

  SORT lt_dtime.
  DELETE ADJACENT DUPLICATES FROM lt_dtime[].

  wa_idoctp = 'INCINV_CREATE01'.
  APPEND wa_idoctp TO lt_idoctp.

  IF lt_dtime[] IS NOT INITIAL.
    REFRESH gt_edidc.
    LOOP AT lt_idoctp ASSIGNING <fs_idoctp>.
      SELECT docnum credat cretim FROM edidc
       APPENDING CORRESPONDING FIELDS OF TABLE gt_edidc
       FOR ALL ENTRIES IN lt_dtime
       WHERE idoctp = <fs_idoctp>-idoctp
         AND credat = lt_dtime-cpudt
         AND cretim GE lt_dtime-tlow
         AND cretim LE lt_dtime-thigh.
    ENDLOOP.

  ENDIF.

  SORT gt_edidc BY docnum credat cretim.
  DELETE ADJACENT DUPLICATES FROM gt_edidc
  COMPARING docnum credat cretim.
Back to top
View user's profile Send private message
alezhu
Специалист
Специалист



Joined: 29 Apr 2012
Posts: 86
Location: Spb

PostPosted: Thu Mar 14, 2013 2:54 pm    Post subject: Reply with quote

RMRP это вроде фактура - таблица RBKP
ну а MKPF - это MKPF =)
Back to top
View user's profile Send private message
Ruax
Участник
Участник



Joined: 17 Dec 2012
Posts: 11

PostPosted: Thu Mar 28, 2013 5:30 pm    Post subject: Reply with quote

alezhu wrote:
RMRP это вроде фактура - таблица RBKP
ну а MKPF - это MKPF =)


не в ту степь.. это awtyp.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG.
SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG.
Every effort is made to ensure content integrity. Use information on this site at your own risk.