Posted: Mon Mar 04, 2013 5:24 pm Post subject: по номеру заказа на поставку найти idoc
поставили вот такую задачку. сделал 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. как сделать - пока не знаю(
Age: 46 Joined: 05 Nov 2007 Posts: 725 Location: КраснАдар
Posted: Mon Mar 04, 2013 5:58 pm Post subject:
Очень сумбурно... Причем здесь поиск 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
Age: 48 Joined: 25 Jan 2008 Posts: 580 Location: Москва
Posted: Mon Mar 04, 2013 10:25 pm Post subject: Re: по номеру заказа на поставку найти idoc
Ruax wrote:
теперь по ТЗ надо из bkpf выбрать belnr, bldat и cputm
Для этой цели BKPF не нужен - в EKBE есть точно такие же BLDAT (почему BLDAT а не CPUDT?) и CPUTM.
Для выборки номера бух.документа воспользуйтесь алгоритмом John Doe, можно вместо RANGE использовать FOR ALL ENTRIES по таблице с ключом AWTYP, AWKEY. Номер логической системы обычно не используется, поэтому можно обойтись без него _________________ С уважением,
Удав.
Age: 46 Joined: 05 Nov 2007 Posts: 725 Location: КраснАдар
Posted: Wed Mar 06, 2013 11:54 am Post subject:
Тогда 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.
появился вопрос. какой 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.
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.
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.