
* Add line to internal table LT_ENTRY
ls_entry-action = shoot.
ls_entry-aim = foot.
APPEND ls_entry TO lt_entry.
* Version 2 using field-symbol
APPEND INITIAL LINE TO lt_entry ASSIGNING <ls_entry>.
<ls_entry>-action = shoot.
<ls_entry>-aim = foot.
* Version 3
APPEND VALUE #( action = shoot
aim = foot ) TO lt_entry.
* Version 4
lt_entry = VALUE #( BASE lt_entry
( action = shoot aim = foot ) ).
- CAPRA: Okay, so you are an ABAP developer? That don't impress me much. Don't get me wrong, I think you're alright, but which subset of the 700+ keywords do you really know and use?
- me: I can GROUP BY with representative binding!
- CAPRA: wow! are you now a member of a group WITHOUT MEMBERS?
- me: Stop kidding me!
METHOD update.
DATA ls_item LIKE LINE OF it_item.
DATA lt_item TYPE tt_item.
LOOP AT it_item INTO ls_item.
AT NEW ebeln.
CLEAR lt_item.
ENDAT.
APPEND ls_item TO lt_item.
AT END OF ebeln.
update_po( lt_item ).
ENDAT.
ENDLOOP.
ENDMETHOD. "update
METHOD update.
LOOP AT it_item INTO DATA(ls_item) GROUP BY ls_item-ebeln INTO DATA(lv_ebeln).
update_po( VALUE #( FOR g IN GROUP lv_ebeln ( g ) ) ).
ENDLOOP.
ENDMETHOD.
METHOD get_current_message.
DATA lt_return LIKE it_return.
DATA ls_return TYPE bapiret2.
* Priority
SORT lt_return BY type.
LOOP AT lt_return INTO ls_return.
EXIT.
ENDLOOP.
rv_message = ls_return-message.
ENDMETHOD. "get_current_message
METHOD get_current_message.
* Priority
LOOP AT it_return INTO DATA(ls_return) GROUP BY ls_return-type.
rv_message = ls_return-message.
RETURN.
ENDLOOP.
ENDMETHOD.
METHOD priority.
rv_prio = SWITCH #( iv_type WHEN 'A' THEN 0
WHEN 'X' THEN 1
WHEN 'E' THEN 2
WHEN 'W' THEN 3
WHEN 'S' THEN 4
ELSE 5 ).
ENDMETHOD.
METHOD get_current_message.
LOOP AT it_return INTO DATA(ls_return) GROUP BY priority( ls_return-type ).
rv_message = ls_return-message.
RETURN.
ENDLOOP.
ENDMETHOD.
METHOD get_current_message.
LOOP AT it_return INTO DATA(ls_return)
GROUP BY translate( val = ls_return-type from = `AXEWS ` to = `012345` ).
rv_message = ls_return-message.
RETURN.
ENDLOOP.
ENDMETHOD.
METHOD get_current_message.
LOOP AT it_return INTO DATA(ls_return) GROUP BY
translate( val = ls_return-type from = `AXEWSI ` to = `0123456` ) ASCENDING.
rv_message = ls_return-message.
RETURN.
ENDLOOP.
ENDMETHOD.
* we check witch idoc message types contains the required segment
lt_edidc[] = ct_edidc[].
SORT lt_edidc BY idoctp cimtyp.
DELETE ADJACENT DUPLICATES FROM lt_edidc COMPARING idoctp cimtyp.
LOOP AT lt_edidc ASSIGNING <ls_edidc>.
REFRESH lt_syntax.
CALL FUNCTION 'EDI_IDOC_SYNTAX_GET'
EXPORTING
pi_idoctyp = <ls_edidc>-idoctp
pi_cimtyp = <ls_edidc>-cimtyp
TABLES
pt_syntax_table = lt_syntax
EXCEPTIONS
OTHERS = 0.
READ TABLE lt_syntax TRANSPORTING NO FIELDS WITH KEY segtyp = iv_segnam.
IF sy-subrc NE 0.
DELETE ct_edidc WHERE idoctp = <ls_edidc>-idoctp
AND cimtyp = <ls_edidc>-cimtyp.
ENDIF.
ENDLOOP.
METHOD filter_by_segment.
DATA lt_syntax TYPE STANDARD TABLE OF edi_iapi06.
LOOP AT ct_edidc INTO DATA(ls_edidc)
GROUP BY ( idoctp = ls_edidc-idoctp
cimtyp = ls_edidc-cimtyp )
WITHOUT MEMBERS ASSIGNING FIELD-SYMBOL(<ls_group>).
CLEAR lt_syntax[].
CALL FUNCTION 'EDI_IDOC_SYNTAX_GET'
EXPORTING
pi_idoctyp = <ls_group>-idoctp
pi_cimtyp = <ls_group>-cimtyp
TABLES
pt_syntax_table = lt_syntax
EXCEPTIONS
OTHERS = 0.
CHECK NOT line_exists( lt_syntax[ segtyp = iv_segnam ] ).
DELETE ct_edidc WHERE idoctp = <ls_group>-idoctp
AND cimtyp = <ls_group>-cimtyp.
ENDLOOP.
ENDMETHOD.
METHOD add_data.
DATA lv_logsy TYPE logsys.
DATA ls_totals TYPE lcl_contract=>ts_totals.
DATA lv_error TYPE flag.
DATA lo_contract TYPE REF TO lcl_contract.
FIELD-SYMBOLS <ls_ekab> TYPE ts_ekab.
CHECK mt_ekab IS NOT INITIAL.
lv_logsy = get_logsys( ).
CREATE OBJECT lo_contract
EXPORTING
io_ekab = me
io_rfc = io_rfc.
* Value Contracts
LOOP AT mt_ekab ASSIGNING <ls_ekab>.
AT NEW konnr.
lo_contract->consumption( EXPORTING iv_konnr = <ls_ekab>-konnr
IMPORTING es_totals = ls_totals
ev_error = lv_error ).
ENDAT.
<ls_ekab>-logsy = lv_logsy.
<ls_ekab>-wrbtr = read_history( <ls_ekab> ).
IF <ls_ekab>-erekz EQ abap_true.
<ls_ekab>-total = <ls_ekab>-wrbtr.
ELSE.
<ls_ekab>-total = <ls_ekab>-netwr.
ENDIF.
IF lv_error EQ abap_false.
<ls_ekab>-rewwb = ls_totals-value.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD add_data.
CHECK mt_ekab IS NOT INITIAL.
DATA(lv_logsy) = get_logsys( ).
DATA(lo_contract) = NEW lcl_contract( io_ekab = me
io_rfc = io_rfc ).
LOOP AT mt_ekab INTO DATA(ls_ekab) GROUP BY ls_ekab-konnr INTO DATA(lv_konnr).
lo_contract->consumption( EXPORTING iv_konnr = lv_konnr
IMPORTING es_totals = DATA(ls_totals)
ev_error = DATA(lv_error) ).
LOOP AT GROUP lv_konnr ASSIGNING FIELD-SYMBOL(<ls_ekab>).
<ls_ekab>-logsy = lv_logsy.
<ls_ekab>-wrbtr = read_history( <ls_ekab> ).
<ls_ekab>-total = SWITCH #( <ls_ekab>-erekz WHEN 'X' THEN <ls_ekab>-wrbtr
ELSE ls_ekab>-netwr ).
IF lv_error EQ abap_false.
<ls_ekab>-rewwb = ls_totals-value.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDMETHOD.
METHOD convert.
CLEAR et_comm.
LOOP AT it_ekab ASSIGNING FIELD-SYMBOL(<ls_ekab>)
GROUP BY ( ekgrp2 = <ls_ekab>-ekgrp2
konnr = <ls_ekab>-konnr
logsy = <ls_ekab>-logsy ) INTO DATA(ls_group).
DATA(ls_comm) = VALUE ts_comm( ekgrp2 = ls_group-ekgrp2
konnr = ls_group-konnr
logsy = ls_group-logsy ).
LOOP AT GROUP ls_group INTO DATA(ls_ekab).
ls_comm-ktwrt = ls_ekab-ktwrt. " Contract target value
ls_comm-total = ls_ekab-rewwb. " Contract sum of releases
ls_comm-kwaers = ls_ekab-kwaers. " Contract currency
ADD ls_ekab-total TO ls_comm-wrbtr. " Sum invoices or PO value if no EREKZ
ENDLOOP.
ls_comm-exceeded = xsdbool( ls_comm-wrbtr + ls_ekab-rewwb > ls_comm-ktwrt ).
APPEND ls_comm TO et_comm.
ENDLOOP.
ENDMETHOD.
METHOD convert.
DATA ls_comm TYPE ts_comm.
FIELD-SYMBOLS <ls_ekab> TYPE ts_ekab.
CLEAR et_comm.
TYPES: BEGIN OF ts_key,
ekgrp2 TYPE ekgrp,
konnr TYPE konnr,
logsy TYPE logsys,
END OF ts_key.
DATA lt_key TYPE SORTED TABLE OF ts_key WITH UNIQUE KEY ekgrp2 konnr logsy.
DATA ls_key LIKE LINE OF lt_key.
LOOP AT mt_ekab ASSIGNING <ls_ekab>.
MOVE-CORRESPONDING <ls_ekab> TO ls_key.
INSERT ls_key INTO TABLE lt_key.
ENDLOOP.
LOOP AT lt_key INTO ls_key.
LOOP AT it_ekab ASSIGNING <ls_ekab> WHERE ekgrp2 = ls_key-ekgrp2
AND konnr = ls_key-konnr
AND logsy = ls_key-logsy.
AT FIRST.
MOVE-CORRESPONDING <ls_ekab> TO ls_comm.
ENDAT.
ls_comm-ktwrt = <ls_ekab>-ktwrt. " Contract target value
ls_comm-total = <ls_ekab>-rewwb. " Contract sum of releases
ls_comm-kwaers = <ls_ekab>-kwaers. " Contract currency
ADD <ls_ekab>-total TO ls_comm-wrbtr. " Sum invoices or PO value if no EREKZ
AT LAST.
DATA lv_sum LIKE ls_comm-wrbtr.
lv_sum = ls_comm-wrbtr + <ls_ekab>-rewwb.
IF lv_sum > ls_comm-ktwrt.
ls_comm-to_be_checked = abap_true.
ELSE.
ls_comm-to_be_checked = abap_false.
ENDIF.
APPEND ls_comm TO et_comm.
ENDAT.
ENDLOOP.
ENDLOOP.
ENDMETHOD. "convert
METHOD convert.
et_comm = VALUE #( FOR GROUPS ls_group OF <ls_ekab> IN it_ekab
GROUP BY ( ekgrp2 = <ls_ekab>-ekgrp2
konnr = <ls_ekab>-konnr
logsy = <ls_ekab>-logsy
ktwrt = <ls_ekab>-ktwrt " target value
total = <ls_ekab>-rewwb " sum of releases
kwaers = <ls_ekab>-kwaers " Contract currency
exceeded = <ls_ekab>-exceeded
rewwb = <ls_ekab>-rewwb
count = GROUP SIZE )
( VALUE #( LET lv_sum = REDUCE wrbtr( INIT lv_val TYPE wrbtr
FOR ls_ekab IN GROUP ls_group
NEXT lv_val = lv_val + ls_ekab-total )
IN BASE CORRESPONDING ts_comm( ls_group )
wrbtr = lv_sum " Sum invoices or PO value if no EREKZ
to_be_checked = xsdbool( lv_sum + ls_group-rewwb > ls_group-ktwrt ) ) ) ).
ENDMETHOD.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
3 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 |