Files
Ai/TrafagSalesExporter/spartenlogic/Z_PRODSPARTE_MAP_BUILD.abap
T

409 lines
11 KiB
ABAP

*&---------------------------------------------------------------------*
*& Report Z_PRODSPARTE_MAP_BUILD
*&---------------------------------------------------------------------*
*& Zweck: Baut ZPRODSPARTE_MAP direkt aus den KEDE/KEDR-Regeltabellen.
*&
*& Quelle:
*& K9RT761000002 PAPH1 von-bis -> Produktfamilie WWPFA
*& K9RT761000003 Produktfamilie von-bis -> Produktsparte WWPSP
*&
*& Ergebnis:
*& ZPRODSPARTE_MAP bleibt eine flache Einzelwert-Tabelle:
*& PAPH1 -> WWPFA -> WWPSP
*&
*& Die Von-bis-Regeln werden vollstaendig in Einzel-PAPH1 expandiert,
*& damit ZPRODSPARTE_MAP mindestens alle KEDE-/Data(4)-Referenzcodes
*& enthaelt. Reale PAPH1-Codes aus MVKE/CE11000 werden optional
*& zusaetzlich aufgenommen, aendern aber nicht die Referenzabdeckung.
*&---------------------------------------------------------------------*
REPORT z_prodsparte_map_build.
PARAMETERS: p_vkorg TYPE vkorg,
p_vtweg TYPE vtweg.
PARAMETERS: p_ce TYPE abap_bool DEFAULT 'X' AS CHECKBOX.
PARAMETERS: p_test TYPE abap_bool DEFAULT 'X' AS CHECKBOX.
TYPES: BEGIN OF ty_code,
paph1 TYPE zprodsparte_map-paph1,
END OF ty_code.
TYPES: BEGIN OF ty_pfa_rule,
sour1_from TYPE k9rt761000002-sour1_from,
sour1_to TYPE k9rt761000002-sour1_to,
valid_from TYPE k9rt761000002-valid_from,
target1 TYPE k9rt761000002-target1,
END OF ty_pfa_rule.
TYPES: BEGIN OF ty_spa_rule,
sour1_from TYPE k9rt761000003-sour1_from,
sour1_to TYPE k9rt761000003-sour1_to,
valid_from TYPE k9rt761000003-valid_from,
target1 TYPE k9rt761000003-target1,
END OF ty_spa_rule.
TYPES tt_code TYPE STANDARD TABLE OF ty_code WITH DEFAULT KEY.
TYPES tt_map TYPE STANDARD TABLE OF zprodsparte_map WITH DEFAULT KEY.
DATA: gt_code TYPE SORTED TABLE OF ty_code WITH UNIQUE KEY paph1,
gt_pfa TYPE STANDARD TABLE OF ty_pfa_rule WITH DEFAULT KEY,
gt_spa TYPE STANDARD TABLE OF ty_spa_rule WITH DEFAULT KEY.
DATA: gv_rule_expanded TYPE i,
gv_real_added TYPE i,
gv_unsupported TYPE i.
START-OF-SELECTION.
PERFORM load_rules.
PERFORM load_codes.
PERFORM build_map.
FORM load_codes.
DATA lt_prodh TYPE STANDARD TABLE OF mvke-prodh WITH DEFAULT KEY.
DATA lt_ce_paph1 TYPE STANDARD TABLE OF ce11000-paph1 WITH DEFAULT KEY.
LOOP AT gt_pfa INTO DATA(ls_pfa_rule).
PERFORM add_paph1_range USING ls_pfa_rule-sour1_from
ls_pfa_rule-sour1_to.
ENDLOOP.
IF p_vkorg IS INITIAL AND p_vtweg IS INITIAL.
SELECT DISTINCT prodh
FROM mvke
INTO TABLE @lt_prodh
WHERE prodh <> @space.
ELSEIF p_vkorg IS NOT INITIAL AND p_vtweg IS INITIAL.
SELECT DISTINCT prodh
FROM mvke
INTO TABLE @lt_prodh
WHERE vkorg = @p_vkorg
AND prodh <> @space.
ELSEIF p_vkorg IS INITIAL AND p_vtweg IS NOT INITIAL.
SELECT DISTINCT prodh
FROM mvke
INTO TABLE @lt_prodh
WHERE vtweg = @p_vtweg
AND prodh <> @space.
ELSE.
SELECT DISTINCT prodh
FROM mvke
INTO TABLE @lt_prodh
WHERE vkorg = @p_vkorg
AND vtweg = @p_vtweg
AND prodh <> @space.
ENDIF.
LOOP AT lt_prodh INTO DATA(lv_prodh).
INSERT VALUE ty_code( paph1 = lv_prodh(5) ) INTO TABLE gt_code.
gv_real_added = gv_real_added + 1.
ENDLOOP.
IF p_ce = abap_true.
SELECT DISTINCT paph1
FROM ce11000
INTO TABLE @lt_ce_paph1
WHERE paph1 <> @space.
LOOP AT lt_ce_paph1 INTO DATA(lv_paph1).
INSERT VALUE ty_code( paph1 = lv_paph1 ) INTO TABLE gt_code.
gv_real_added = gv_real_added + 1.
ENDLOOP.
ENDIF.
WRITE: / 'PAPH1-Codes aus KEDE-Expansion :', gv_rule_expanded.
WRITE: / 'Zusaetzliche reale Code-Versuche:', gv_real_added.
WRITE: / 'Nicht expandierbare Bereiche :', gv_unsupported.
WRITE: / 'PAPH1-Codes gesamt eindeutig :', lines( gt_code ).
IF gt_code IS INITIAL.
MESSAGE 'Keine PAPH1-Codes gefunden.' TYPE 'E'.
ENDIF.
ENDFORM.
FORM add_paph1_range USING iv_from TYPE k9rt761000002-sour1_from
iv_to TYPE k9rt761000002-sour1_to.
DATA: lv_from TYPE string,
lv_to TYPE string.
lv_from = iv_from.
lv_to = iv_to.
CONDENSE: lv_from, lv_to.
IF lv_from IS INITIAL.
gv_unsupported = gv_unsupported + 1.
RETURN.
ENDIF.
IF lv_to IS INITIAL.
lv_to = lv_from.
ENDIF.
IF lv_from CO '0123456789'
AND lv_to CO '0123456789'.
DATA(lv_from_i) = CONV i( lv_from ).
DATA(lv_to_i) = CONV i( lv_to ).
DATA(lv_width) = strlen( lv_from ).
IF lv_to_i < lv_from_i.
gv_unsupported = gv_unsupported + 1.
RETURN.
ENDIF.
DATA(lv_count) = lv_to_i - lv_from_i + 1.
DO lv_count TIMES.
DATA(lv_num) = lv_from_i + sy-index - 1.
DATA(lv_paph1_num) =
|{ lv_num ALIGN = RIGHT PAD = '0' WIDTH = lv_width }|.
INSERT VALUE ty_code( paph1 = lv_paph1_num ) INTO TABLE gt_code.
gv_rule_expanded = gv_rule_expanded + 1.
ENDDO.
RETURN.
ENDIF.
IF strlen( lv_from ) = 4
AND strlen( lv_to ) = 4
AND lv_from(2) = lv_to(2).
DATA(lv_alpha) = `0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ`.
DATA(lv_alpha_len) = strlen( lv_alpha ).
DATA(lv_prefix) = lv_from(2).
DO lv_alpha_len TIMES.
DATA(lv_off3) = sy-index - 1.
DATA(lv_c3) = lv_alpha+lv_off3(1).
DO lv_alpha_len TIMES.
DATA(lv_off4) = sy-index - 1.
DATA(lv_c4) = lv_alpha+lv_off4(1).
DATA(lv_paph1_alpha) = |{ lv_prefix }{ lv_c3 }{ lv_c4 }|.
IF lv_paph1_alpha >= lv_from
AND lv_paph1_alpha <= lv_to.
INSERT VALUE ty_code( paph1 = lv_paph1_alpha ) INTO TABLE gt_code.
gv_rule_expanded = gv_rule_expanded + 1.
ENDIF.
ENDDO.
ENDDO.
RETURN.
ENDIF.
gv_unsupported = gv_unsupported + 1.
ENDFORM.
FORM load_rules.
SELECT sour1_from, sour1_to, valid_from, target1
FROM k9rt761000002
INTO TABLE @gt_pfa
WHERE sour1_from <> @space
AND target1 <> @space
AND delete_flg <> 'X'.
SELECT sour1_from, sour1_to, valid_from, target1
FROM k9rt761000003
INTO TABLE @gt_spa
WHERE sour1_from <> @space
AND target1 <> @space
AND delete_flg <> 'X'.
SORT gt_pfa BY valid_from DESCENDING sour1_from sour1_to.
SORT gt_spa BY valid_from DESCENDING sour1_from sour1_to.
WRITE: / 'KEDR-Regeln PAPH1->WWPFA :', lines( gt_pfa ).
WRITE: / 'KEDR-Regeln WWPFA->WWPSP :', lines( gt_spa ).
ULINE.
IF gt_pfa IS INITIAL.
MESSAGE 'Keine KEDE-Regeln in K9RT761000002 gefunden.' TYPE 'E'.
ENDIF.
IF gt_spa IS INITIAL.
MESSAGE 'Keine KEDE-Regeln in K9RT761000003 gefunden.' TYPE 'E'.
ENDIF.
ENDFORM.
FORM build_map.
DATA: lt_insert TYPE tt_map,
lt_no_pfa TYPE tt_code,
lt_no_spa TYPE tt_code.
LOOP AT gt_code INTO DATA(ls_code).
DATA: lv_wwpfa TYPE zprodsparte_map-wwpfa,
lv_wwpsp TYPE zprodsparte_map-wwpsp,
lv_found_pfa TYPE abap_bool,
lv_found_spa TYPE abap_bool,
lv_best_date TYPE dats,
lv_best_exact TYPE abap_bool.
CLEAR: lv_wwpfa,
lv_wwpsp,
lv_found_pfa,
lv_found_spa,
lv_best_date,
lv_best_exact.
LOOP AT gt_pfa INTO DATA(ls_pfa).
DATA(lv_pfa_to) = ls_pfa-sour1_to.
IF lv_pfa_to IS INITIAL.
lv_pfa_to = ls_pfa-sour1_from.
ENDIF.
IF ls_code-paph1 < ls_pfa-sour1_from
OR ls_code-paph1 > lv_pfa_to.
CONTINUE.
ENDIF.
DATA(lv_exact_pfa) = abap_false.
IF ls_code-paph1 = ls_pfa-sour1_from
AND ls_code-paph1 = lv_pfa_to.
lv_exact_pfa = abap_true.
ENDIF.
IF lv_found_pfa = abap_false
OR ls_pfa-valid_from > lv_best_date
OR ( ls_pfa-valid_from = lv_best_date
AND lv_best_exact = abap_false
AND lv_exact_pfa = abap_true ).
lv_found_pfa = abap_true.
lv_best_date = ls_pfa-valid_from.
lv_best_exact = lv_exact_pfa.
lv_wwpfa = ls_pfa-target1.
ENDIF.
ENDLOOP.
IF lv_found_pfa = abap_false.
APPEND ls_code TO lt_no_pfa.
CONTINUE.
ENDIF.
CLEAR: lv_best_date, lv_best_exact.
LOOP AT gt_spa INTO DATA(ls_spa).
DATA(lv_spa_to) = ls_spa-sour1_to.
IF lv_spa_to IS INITIAL.
lv_spa_to = ls_spa-sour1_from.
ENDIF.
IF lv_wwpfa < ls_spa-sour1_from
OR lv_wwpfa > lv_spa_to.
CONTINUE.
ENDIF.
DATA(lv_exact_spa) = abap_false.
IF lv_wwpfa = ls_spa-sour1_from
AND lv_wwpfa = lv_spa_to.
lv_exact_spa = abap_true.
ENDIF.
IF lv_found_spa = abap_false
OR ls_spa-valid_from > lv_best_date
OR ( ls_spa-valid_from = lv_best_date
AND lv_best_exact = abap_false
AND lv_exact_spa = abap_true ).
lv_found_spa = abap_true.
lv_best_date = ls_spa-valid_from.
lv_best_exact = lv_exact_spa.
lv_wwpsp = ls_spa-target1.
ENDIF.
ENDLOOP.
IF lv_found_spa = abap_false.
APPEND ls_code TO lt_no_spa.
ENDIF.
APPEND VALUE zprodsparte_map(
paph1 = ls_code-paph1
wwpfa = lv_wwpfa
wwpsp = lv_wwpsp
crdate = sy-datum
cruser = sy-uname ) TO lt_insert.
ENDLOOP.
WRITE: / 'Saetze fuer ZPRODSPARTE_MAP :', lines( lt_insert ).
WRITE: / 'PAPH1 ohne Produktfamilie :', lines( lt_no_pfa ).
WRITE: / 'PAPH1 ohne Produktsparte :', lines( lt_no_spa ).
ULINE.
PERFORM show_preview USING lt_insert lt_no_pfa lt_no_spa.
IF lt_insert IS INITIAL.
WRITE: / 'Keine Saetze zum Schreiben. Tabelle bleibt unveraendert.'.
RETURN.
ENDIF.
IF p_test = abap_true.
WRITE: / 'TESTLAUF - keine DB-Aenderung.'.
RETURN.
ENDIF.
DELETE FROM zprodsparte_map.
INSERT zprodsparte_map FROM TABLE lt_insert.
IF sy-subrc = 0.
COMMIT WORK.
WRITE: / lines( lt_insert ), 'Saetze in ZPRODSPARTE_MAP geschrieben.'.
ELSE.
ROLLBACK WORK.
WRITE: / 'Fehler beim Schreiben, sy-subrc=', sy-subrc.
ENDIF.
ENDFORM.
FORM show_preview USING it_insert TYPE tt_map
it_no_pfa TYPE tt_code
it_no_spa TYPE tt_code.
FIELD-SYMBOLS: <ls_insert> TYPE zprodsparte_map,
<ls_code> TYPE ty_code.
WRITE: / '=== Vorschau Mapping max. 30 ==='.
WRITE: / 'PAPH1', 10 'WWPFA', 20 'WWPSP'.
ULINE.
DATA lv_i TYPE i.
LOOP AT it_insert ASSIGNING <ls_insert>.
lv_i = lv_i + 1.
IF lv_i > 30.
EXIT.
ENDIF.
WRITE: / <ls_insert>-paph1,
10 <ls_insert>-wwpfa,
20 <ls_insert>-wwpsp.
ENDLOOP.
IF it_no_pfa IS NOT INITIAL.
ULINE.
WRITE: / '=== Erste PAPH1 ohne Produktfamilie ==='.
CLEAR lv_i.
LOOP AT it_no_pfa ASSIGNING <ls_code>.
lv_i = lv_i + 1.
IF lv_i > 30.
EXIT.
ENDIF.
WRITE: / <ls_code>-paph1.
ENDLOOP.
ENDIF.
IF it_no_spa IS NOT INITIAL.
ULINE.
WRITE: / '=== Erste PAPH1 ohne Produktsparte ==='.
CLEAR lv_i.
LOOP AT it_no_spa ASSIGNING <ls_code>.
lv_i = lv_i + 1.
IF lv_i > 30.
EXIT.
ENDIF.
WRITE: / <ls_code>-paph1.
ENDLOOP.
ENDIF.
ULINE.
ENDFORM.