Sonntag, 19. Februar 2012

ABAP - An other great one - Reset Trading Partner in FI

*&---------------------------------------------------------------------*
*& Report  Y_ECCS_DOC_RESET                                            *
*&                                                                     *
*&---------------------------------------------------------------------*
*&                                                                     *
*&                                                                     *
*&---------------------------------------------------------------------*
REPORT  y_eccs_trading_partner_set  LINE-SIZE 130.

TABLES: bsis, bsas, bsid, bsad, bsik, bsak.
TABLES: ska1, kna1, lfa1.
TABLES: bseg, bkpf, glt3.

DATA: i_bseg TYPE bseg OCCURS 0 WITH HEADER LINE,
      i_bsis TYPE bsis OCCURS 0 WITH HEADER LINE,
      i_bsas TYPE bsas OCCURS 0 WITH HEADER LINE,
      i_bsid TYPE bsid OCCURS 0 WITH HEADER LINE,
      i_bsad TYPE bsad OCCURS 0 WITH HEADER LINE,
      i_bsik TYPE bsik OCCURS 0 WITH HEADER LINE,
      i_bsak TYPE bsak OCCURS 0 WITH HEADER LINE,
      i_glt3 TYPE glt3 OCCURS 0 WITH HEADER LINE.


PARAMETERS: p_bukrs LIKE bsis-bukrs.
SELECT-OPTIONS: s_belnr FOR bsis-belnr NO INTERVALS.
PARAMETERS: p_gjahr LIKE bsis-gjahr.
SELECTION-SCREEN SKIP.
PARAMETERS: p_ovbund LIKE bseg-vbund,
            p_nvbund LIKE bseg-vbund.
SELECTION-SCREEN SKIP.
PARAMETERS: p_test AS CHECKBOX DEFAULT 'X',
            p_log  AS CHECKBOX DEFAULT 'X'.

INITIALIZATION.

AT SELECTION-SCREEN ON s_belnr.
  LOOP AT s_belnr.
    IF s_belnr-option NE 'EQ' OR
       s_belnr-sign   NE 'I'.
      MESSAGE e001(z3) WITH 'Invalid selection of document numbers'.
    ENDIF.
  ENDLOOP.

START-OF-SELECTION.

  IF sy-uname NE 'JOHN' AND
     sy-uname NE 'JIM' AND
     sy-uname NE 'JAMES'.
    IF p_test IS INITIAL.
      p_test = 'X'.
      MESSAGE i001(z3) WITH 'You are not authorized to do this!'.
    ENDIF.
  ENDIF.

  SORT s_belnr.
  DELETE ADJACENT DUPLICATES FROM s_belnr.

  PERFORM run_gl.

  PERFORM log.

END-OF-SELECTION.



*&--------------------------------------------------------------------*
*&      Form  RUN_GL
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
FORM run_gl.

  DATA: l_lines TYPE i,
        l_belnr LIKE bseg-belnr.


  LOOP AT s_belnr.
    l_belnr = s_belnr-low.

    SELECT * FROM bseg WHERE bukrs EQ p_bukrs
                       AND   gjahr EQ p_gjahr
                       AND   belnr EQ l_belnr.

* Check old TP value
      CHECK bseg-vbund = p_ovbund.

      CASE bseg-koart.

        WHEN 'S'.
* G/L account

          i_bseg = bseg.
          APPEND i_bseg.

* for update of underlying documents
          IF bseg-augbl IS INITIAL.
            SELECT SINGLE * FROM bsis WHERE bukrs EQ bseg-bukrs
                                        AND hkont EQ bseg-hkont
                                        AND belnr EQ bseg-belnr
                                        AND gjahr EQ bseg-gjahr
                                        AND buzei EQ bseg-buzei.

            i_bsis = bsis.
            i_bsis-vbund = p_nvbund.
            APPEND i_bsis.

          ELSE.
            SELECT SINGLE * FROM bsas WHERE bukrs EQ bseg-bukrs
                                        AND hkont EQ bseg-hkont
                                        AND belnr EQ bseg-belnr
                                        AND gjahr EQ bseg-gjahr
                                        AND buzei EQ bseg-buzei.

            i_bsas = bsas.
            i_bsas-vbund = p_nvbund.
            APPEND i_bsas.
          ENDIF.

        WHEN 'D'.
* Customer
          i_bseg = bseg.
          APPEND i_bseg.

* for update of underlying documents
          IF bseg-augbl IS INITIAL.
            SELECT SINGLE * FROM bsid WHERE bukrs EQ bseg-bukrs
                                        AND kunnr EQ bseg-kunnr
                                        AND belnr EQ bseg-belnr
                                        AND gjahr EQ bseg-gjahr
                                        AND buzei EQ bseg-buzei.

            i_bsid = bsid.
            i_bsid-vbund = p_nvbund.
            APPEND i_bsid.

          ELSE.
            SELECT SINGLE * FROM bsad WHERE bukrs EQ bseg-bukrs
                                        AND kunnr EQ bseg-kunnr
                                        AND belnr EQ bseg-belnr
                                        AND gjahr EQ bseg-gjahr
                                        AND buzei EQ bseg-buzei.

            i_bsad = bsad.
            i_bsad-vbund = p_nvbund.
            APPEND i_bsad.
          ENDIF.

        WHEN 'K'.
* Vendor
          i_bseg = bseg.
          APPEND i_bseg.

* for update of underlying documents
          IF bseg-augbl IS INITIAL.
            SELECT SINGLE * FROM bsik WHERE bukrs EQ bseg-bukrs
                                        AND lifnr EQ bseg-lifnr
                                        AND belnr EQ bseg-belnr
                                        AND gjahr EQ bseg-gjahr
                                        AND buzei EQ bseg-buzei.

            i_bsik = bsik.
            i_bsik-vbund = p_nvbund.
            APPEND i_bsik.

          ELSE.
            SELECT SINGLE * FROM bsak WHERE bukrs EQ bseg-bukrs
                                        AND lifnr EQ bseg-lifnr
                                        AND belnr EQ bseg-belnr
                                        AND gjahr EQ bseg-gjahr
                                        AND buzei EQ bseg-buzei.

            i_bsak = bsak.
            i_bsak-vbund = p_nvbund.
            APPEND i_bsak.
          ENDIF.

        WHEN OTHERS.
          MESSAGE e001(z3) WITH 'Unexpected line item type in'
                                   bseg-bukrs bseg-belnr.
      ENDCASE.

    ENDSELECT.
  ENDLOOP.

  DESCRIBE TABLE i_bseg LINES l_lines.
  WRITE : / 'Selected line items   :', l_lines.

  PERFORM update_glt3.

* updates
  CHECK p_test IS INITIAL.

  DESCRIBE TABLE i_bseg LINES l_lines.
  WRITE : / 'Update of records BSEG:', l_lines.
  IF l_lines NE 0.
    UPDATE bseg FROM TABLE i_bseg.
    IF sy-subrc NE 0.
      MESSAGE e001(z3) WITH 'BSEG update error'.
    ENDIF.
  ENDIF.

  DESCRIBE TABLE i_bsis LINES l_lines.
  WRITE : / 'Update of records BSIS:', l_lines.
  IF l_lines NE 0.
    UPDATE bsis FROM TABLE i_bsis.
    IF sy-subrc NE 0.
      MESSAGE e001(z3) WITH 'BSIS update error'.
    ENDIF.
  ENDIF.

  DESCRIBE TABLE i_bsas LINES l_lines.
  WRITE : / 'Update of records BSAS:', l_lines.
  IF l_lines NE 0.
    UPDATE bsas FROM TABLE i_bsas.
    IF sy-subrc NE 0.
      MESSAGE e001(z3) WITH 'BSAS update error'.
    ENDIF.
  ENDIF.

  DESCRIBE TABLE i_bsid LINES l_lines.
  WRITE : / 'Update of records BSID:', l_lines.
  IF l_lines NE 0.
    UPDATE bsid FROM TABLE i_bsid.
    IF sy-subrc NE 0.
      MESSAGE e001(z3) WITH 'BSID update error'.
    ENDIF.
  ENDIF.

  DESCRIBE TABLE i_bsad LINES l_lines.
  WRITE : / 'Update of records BSAD:', l_lines.
  IF l_lines NE 0.
    UPDATE bsad FROM TABLE i_bsad.
    IF sy-subrc NE 0.
      MESSAGE e001(z3) WITH 'BSAD update error'.
    ENDIF.
  ENDIF.

  DESCRIBE TABLE i_bsik LINES l_lines.
  WRITE : / 'Update of records BSIK:', l_lines.
  IF l_lines NE 0.
    UPDATE bsik FROM TABLE i_bsik.
    IF sy-subrc NE 0.
      MESSAGE e001(z3) WITH 'BSIK update error'.
    ENDIF.
  ENDIF.

  DESCRIBE TABLE i_bsak LINES l_lines.
  WRITE : / 'Update of records BSAK:', l_lines.
  IF l_lines NE 0.
    UPDATE bsak FROM TABLE i_bsak.
    IF sy-subrc NE 0.
      MESSAGE e001(z3) WITH 'BSAK update error'.
    ENDIF.
  ENDIF.

ENDFORM.                    "RUN_GL
*&--------------------------------------------------------------------*
*&      Form  UPDATE_GLT3
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
FORM update_glt3 .

  DATA: l_lines TYPE i,
        l_found,
        l_fieldname(12) TYPE c.

  FIELD-SYMBOLS <hsl>.
  FIELD-SYMBOLS <tsl>.
  FIELD-SYMBOLS <ksl>.


  REFRESH i_glt3.

  LOOP AT i_bseg.
    SELECT SINGLE * FROM bkpf WHERE bukrs EQ i_bseg-bukrs
                              AND   gjahr EQ i_bseg-gjahr
                              AND   belnr EQ i_bseg-belnr.

    UNASSIGN <hsl>.
    UNASSIGN <tsl>.
    UNASSIGN <ksl>.

    CONCATENATE 'I_GLT3-HSL' bkpf-monat INTO l_fieldname.
    ASSIGN (l_fieldname) TO <hsl>.

    CONCATENATE 'I_GLT3-TSL' bkpf-monat INTO l_fieldname.
    ASSIGN (l_fieldname) TO <tsl>.

    CONCATENATE 'I_GLT3-KSL' bkpf-monat INTO l_fieldname.
    ASSIGN (l_fieldname) TO <ksl>.

* for the old VBUND value
    CLEAR l_found.
    LOOP AT i_glt3 WHERE bukrs EQ i_bseg-bukrs
                              AND   ryear EQ i_bseg-gjahr
                              AND   racct EQ i_bseg-hkont
                              AND   rbusa EQ i_bseg-gsber
                              AND   rassc EQ i_bseg-vbund
                              AND   rtcur EQ bkpf-waers
                              AND   drcrk EQ i_bseg-shkzg.
      l_found = 'X'.
      EXIT.
    ENDLOOP.

    IF l_found IS INITIAL.
      PERFORM create_glt3.
    ENDIF.

    CLEAR l_found.
    LOOP AT i_glt3 WHERE bukrs EQ i_bseg-bukrs
                              AND   ryear EQ i_bseg-gjahr
                              AND   racct EQ i_bseg-hkont
                              AND   rbusa EQ i_bseg-gsber
                              AND   rassc EQ i_bseg-vbund
                              AND   rtcur EQ bkpf-waers
                              AND   drcrk EQ i_bseg-shkzg.
      l_found = 'X'.
      IF i_bseg-shkzg EQ 'S'.
        SUBTRACT i_bseg-wrbtr FROM <tsl>.
        SUBTRACT i_bseg-dmbtr FROM <hsl>.
        SUBTRACT i_bseg-dmbtr FROM <ksl>.
      ELSE.
        ADD i_bseg-wrbtr TO <tsl>.
        ADD i_bseg-dmbtr TO <hsl>.
        ADD i_bseg-dmbtr TO <ksl>.
      ENDIF.

      MODIFY i_glt3.
      EXIT.
    ENDLOOP.

    IF l_found IS INITIAL.
      MESSAGE e001(z3) WITH 'Still no GLT3 ?!'.
    ENDIF.


* for the new VBUND value (initial)
    i_bseg-vbund = p_nvbund.
    CLEAR l_found.
    LOOP AT i_glt3 WHERE bukrs EQ i_bseg-bukrs
                              AND   ryear EQ i_bseg-gjahr
                              AND   racct EQ i_bseg-hkont
                              AND   rbusa EQ i_bseg-gsber
                              AND   rassc EQ i_bseg-vbund
                              AND   rtcur EQ bkpf-waers
                              AND   drcrk EQ i_bseg-shkzg.
      l_found = 'X'.
      EXIT.
    ENDLOOP.

    IF l_found IS INITIAL.
      PERFORM create_glt3.
    ENDIF.

    CLEAR l_found.
    LOOP AT i_glt3 WHERE bukrs EQ i_bseg-bukrs
                              AND   ryear EQ i_bseg-gjahr
                              AND   racct EQ i_bseg-hkont
                              AND   rbusa EQ i_bseg-gsber
                              AND   rassc EQ i_bseg-vbund
                              AND   rtcur EQ bkpf-waers
                              AND   drcrk EQ i_bseg-shkzg.
      l_found = 'X'.
      IF i_bseg-shkzg EQ 'S'.
        ADD i_bseg-wrbtr TO <tsl>.
        ADD i_bseg-dmbtr TO <hsl>.
        ADD i_bseg-dmbtr TO <ksl>.
      ELSE.
        SUBTRACT i_bseg-wrbtr FROM <tsl>.
        SUBTRACT i_bseg-dmbtr FROM <hsl>.
        SUBTRACT i_bseg-dmbtr FROM <ksl>.
      ENDIF.
      MODIFY i_glt3.
      EXIT.
    ENDLOOP.

    IF l_found IS INITIAL.
      MESSAGE e001(z3) WITH 'Still no GLT3 ?!'.
    ENDIF.

    MODIFY i_bseg.
  ENDLOOP.

  CHECK p_test IS INITIAL.

  DESCRIBE TABLE i_glt3 LINES l_lines.
  WRITE : / 'Update of records GLT3:', l_lines.
  IF l_lines NE 0.
    MODIFY glt3 FROM TABLE i_glt3.
    IF sy-subrc NE 0.
      MESSAGE e001(z3) WITH 'GLT3 update error'.
    ENDIF.
  ENDIF.

ENDFORM.                    "UPDATE_GLT3
*&--------------------------------------------------------------------*
*&      Form  LOG
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
FORM log.

  CHECK p_log IS NOT INITIAL.

  LOOP AT i_bseg WHERE shkzg EQ 'S'.
    WRITE: / i_bseg-bukrs,
             i_bseg-belnr,
             i_bseg-gjahr,
             i_bseg-buzei,
             i_bseg-hkont,
             i_bseg-vbund,
             i_bseg-gsber,
             i_bseg-shkzg,
             i_bseg-dmbtr.
  ENDLOOP.

  LOOP AT i_glt3 WHERE drcrk EQ 'S'.
    WRITE: / i_glt3-bukrs,
             i_glt3-racct,
             i_glt3-rbusa,
             i_glt3-rtcur,
             i_glt3-rassc,
             i_glt3-drcrk.
  ENDLOOP.

  LOOP AT i_bseg WHERE shkzg EQ 'H'.
    WRITE: / i_bseg-bukrs,
             i_bseg-belnr,
             i_bseg-gjahr,
             i_bseg-buzei,
             i_bseg-hkont,
             i_bseg-vbund,
             i_bseg-gsber,
             i_bseg-shkzg,
             i_bseg-dmbtr.
  ENDLOOP.

  LOOP AT i_glt3 WHERE drcrk EQ 'H'.
    WRITE: / i_glt3-bukrs,
             i_glt3-racct,
             i_glt3-rbusa,
             i_glt3-rtcur,
             i_glt3-rassc,
             i_glt3-drcrk.
  ENDLOOP.

ENDFORM.                    "LOG
*&--------------------------------------------------------------------*
*&      Form  CREATE_GLT3
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
FORM create_glt3.

  FIELD-SYMBOLS: <feld>.

  SELECT SINGLE * FROM glt3 WHERE bukrs EQ i_bseg-bukrs
                            AND   ryear EQ i_bseg-gjahr
                            AND   racct EQ i_bseg-hkont
                            AND   rbusa EQ i_bseg-gsber
                            AND   rassc EQ i_bseg-vbund
                            AND   rtcur EQ bkpf-waers
                            AND   drcrk EQ i_bseg-shkzg.

  IF sy-subrc EQ 0.
    i_glt3 = glt3.
    APPEND i_glt3.
    EXIT.
  ENDIF.

  SELECT SINGLE * FROM glt3 WHERE bukrs EQ i_bseg-bukrs
                                AND   ryear EQ i_bseg-gjahr
                                AND   racct EQ i_bseg-hkont.

  IF sy-subrc NE 0.
    MESSAGE e001(z3) WITH 'GLT3 not found for:'
                             i_bseg-bukrs
                             i_bseg-hkont
                             i_bseg-gjahr.
  ENDIF.

  i_glt3 = glt3.
  i_glt3-rbusa = i_bseg-gsber.
  i_glt3-rassc = i_bseg-vbund.
  i_glt3-rtcur =   bkpf-waers.
  i_glt3-drcrk = i_bseg-shkzg.

* clear amount fields
  DO.
    CHECK sy-index GT 16.
    ASSIGN COMPONENT sy-index OF STRUCTURE i_glt3 TO <feld>.
    IF sy-subrc NE 0.
      EXIT.
    ENDIF.
    CLEAR <feld>.
  ENDDO.

  APPEND i_glt3.
  EXIT.

ENDFORM.                    "CREATE_GLT3

0 Kommentare:

Kommentar veröffentlichen