Enhanced ABAP source code for SAP BDC Call Transaction program


*Code used to create BDC
REPORT zf005rep NO STANDARD PAGE HEADING
                LINE-SIZE 212.
*-----------------------------------------------------------------------
* Data declaration
TABLES: kna1, industype.
TYPES: BEGIN OF t_kna1,
  dummy(2)    TYPE c,
  check    TYPE c,
  kunnr     LIKE kna1-kunnr,
  name1     LIKE kna1-name1,
  sortl     LIKE kna1-sortl,
  j_1kftind LIKE kna1-j_1kftind,
  new_inst  LIKE kna1-j_1kftind,
  err_msg   LIKE t100-text,
 END OF t_kna1.
DATA: it_kna1  TYPE STANDARD TABLE OF t_kna1 INITIAL SIZE 0,
      wa_kna1  TYPE t_kna1,
      it_error TYPE STANDARD TABLE OF t_kna1 INITIAL SIZE 0,
      wa_error TYPE t_kna1.
DATA: w_textout            LIKE t100-text.
DATA: gd_update TYPE i,
      gd_lines TYPE i.
*Used to store BDC data
DATA: BEGIN OF bdc_tab OCCURS 0.
        INCLUDE STRUCTURE bdcdata.
DATA: END OF bdc_tab.
*Used to stores error information from CALL TRANSACTION Function Module
DATA: BEGIN OF messtab OCCURS 0.
        INCLUDE STRUCTURE bdcmsgcoll.
DATA: END OF messtab.
*-----------------------------------------------------------------------
*Screen declaration
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME
                                    TITLE text-001.
SELECT-OPTIONS: so_kunnr FOR kna1-kunnr OBLIGATORY,
                p_ftind FOR industype-indtype.
SELECTION-SCREEN END OF BLOCK block1.
SELECTION-SCREEN BEGIN OF BLOCK block2 WITH FRAME
                                    TITLE text-002.
PARAMETERS:  p_new   LIKE kna1-j_1kftind.
SELECTION-SCREEN END OF BLOCK block2.
************************************************************************
*AT SELECTION-SCREEN.
AT SELECTION-SCREEN.
* Check for valid instalment text
  LOOP AT p_ftind.
    CALL FUNCTION 'FIELD_EXIT_INDTYP'
         EXPORTING
              input  = p_ftind-low
         IMPORTING
              output = p_ftind-low.
    CALL FUNCTION 'FIELD_EXIT_INDTYP'
         EXPORTING
              input  = p_ftind-high
         IMPORTING
              output = p_ftind-high.
   modify p_ftind.
  ENDLOOP.
  CALL FUNCTION 'FIELD_EXIT_INDTYP'
       EXPORTING
            input  = p_new
       IMPORTING
            output = p_new.
************************************************************************
*START-OF-SELECTION
START-OF-SELECTION.
* Retrieve data from customer master table(KNA1)
  SELECT kunnr name1 sortl j_1kftind
    INTO CORRESPONDING FIELDS OF TABLE it_kna1
    FROM kna1
   WHERE kunnr IN so_kunnr AND
         j_1kftind IN p_ftind.
************************************************************************
*END-OF-SELECTION
END-OF-SELECTION.
* Check data has been retrieved ready for processing
  DESCRIBE TABLE it_kna1 LINES gd_lines.
  IF gd_lines LE 0.
*   Display message if no data has been retrieved
    MESSAGE i003(zp) WITH 'No Records Found'(003).
  ELSE.
*   Set GUI status for screen
    PERFORM set_gui_status.
*   Display column headings
    PERFORM display_column_headings.
*   Display Report
    PERFORM display_report.
  ENDIF.
************************************************************************
*AT USER-COMMAND.
AT USER-COMMAND.
  CLEAR: bdc_tab, gd_update.
  REFRESH: bdc_tab.
  CASE sy-ucomm.
*:::WHEN.............................Perform customer instalment update
    WHEN 'SAVE'.
      DO.
*     "Reads the who report line
*     read line sy-index line value into wa_kna1
        CLEAR wa_kna1.
*       Read displayed report line
*       Only retreives specific fields i.e. kna1-check
        READ LINE sy-index FIELD VALUE wa_kna1-check INTO wa_kna1-check
                                       wa_kna1-kunnr INTO wa_kna1-kunnr
                                       wa_kna1-name1 INTO wa_kna1-name1
                                       wa_kna1-sortl INTO wa_kna1-sortl
                                       wa_kna1-j_1kftind INTO
                                                     wa_kna1-j_1kftind
                                       p_new INTO p_new.
*       If NE 0 then end of report has been reached
        IF sy-subrc NE 0.
          EXIT.
        ELSE.
          CASE wa_kna1-check.
            WHEN 'X'.
*             Update Customer master data (instalment text)
              PERFORM bdc_update.
          ENDCASE.
        ENDIF.
      ENDDO.
*     Display message confirming number of records updated
      IF gd_update GT 1.
        MESSAGE i003(zp) WITH gd_update 'Records updated'(004).
      ELSE.
        MESSAGE i003(zp) WITH gd_update 'Record updated'(005).
      ENDIF.
*     Check errors table
      DESCRIBE TABLE it_error LINES gd_lines.
*     If errors exist then display errors report
      IF gd_lines GT 0.
*       Display errors report
        PERFORM display_error_headings.
        PERFORM display_error_report.
      ELSE.
*       If no errors then return to selection screen
        LEAVE TO SCREEN 0.
      ENDIF.
*:::WHEN............................Select all entries on report
    WHEN 'ALL'.
*     Set all check values to 'X'
      LOOP AT it_kna1 INTO wa_kna1.
        wa_kna1-check = 'X'.
        MODIFY it_kna1 FROM wa_kna1.
      ENDLOOP.
*     Display column headings
      PERFORM display_column_headings.
*     Display Report
      PERFORM display_report.
      sy-lsind = sy-lsind - 1.
*:::WHEN............................De-select all entries on report
    WHEN 'DESEL'.
*     Set all check values to space
      LOOP AT it_kna1 INTO wa_kna1.
        wa_kna1-check = ' '.
        MODIFY it_kna1 FROM wa_kna1.
      ENDLOOP.
*     Display column headings
      PERFORM display_column_headings.
*     Display Report
      PERFORM display_report.
      sy-lsind = sy-lsind - 1.
  ENDCASE.
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_COLUMN_HEADINGS
*&---------------------------------------------------------------------*
*       Display column headings
*----------------------------------------------------------------------*
FORM display_column_headings.
  WRITE: sy-uline(135).
  FORMAT COLOR COL_HEADING.
  WRITE:/      sy-vline,
               ' ', sy-vline,
          (10) 'Customer'(006), sy-vline,
          (35) 'Name'(007), sy-vline,
          (10) 'Sort'(008), sy-vline,
          (30) 'Instalment plan'(009), sy-vline,
          (30) 'New Instalment plan'(010), sy-vline.
  WRITE: sy-uline(135).
  FORMAT COLOR COL_NORMAL.
ENDFORM.                    " DISPLAY_COLUMN_HEADINGS
*&---------------------------------------------------------------------*
*&      Form  SET_GUI_STATUS
*&---------------------------------------------------------------------*
*       Sets gui status for screen (pf-status)
*----------------------------------------------------------------------*
FORM set_gui_status.
  SET PF-STATUS 'REPORT'.
ENDFORM.                    " SET_GUI_STATUS
*&---------------------------------------------------------------------*
*&      Form  BDC_UPDATE
*&---------------------------------------------------------------------*
*       Populate BDC table and call transaction FD02
*----------------------------------------------------------------------*
FORM bdc_update.
  PERFORM dynpro USING:
      'X'   'SAPMF02D'        '0106',
      ' '   'BDC_CURSOR'      'RF02D-D0120',
      ' '   'RF02D-KUNNR'     wa_kna1-kunnr,              "Customer num
      ' '   'RF02D-D0120'     'X',
      ' '   'BDC_OKCODE'      '/00',                      "OK code
      'X'   'SAPMF02D'        '0120',
      ' '   'BDC_CURSOR'      'KNA1-J_1KFTIND',
      ' '   'KNA1-J_1KFTIND'  p_new,
      ' '   'BDC_OKCODE'      '=UPDA'.                      "OK code
* Call transaction to update customer instalment text
  CALL TRANSACTION 'FD02' USING bdc_tab MODE 'N' UPDATE 'S'
         MESSAGES INTO messtab.
* Check if update was succesful
  IF sy-subrc EQ 0.
    ADD 1 TO gd_update.
  ELSE.
*   Retrieve error messages displayed during BDC update
    LOOP AT messtab WHERE msgtyp = 'E'.
*     Builds actual message based on info returned from Call transaction
      CALL FUNCTION 'MESSAGE_TEXT_BUILD'
           EXPORTING
                msgid               = messtab-msgid
                msgnr               = messtab-msgnr
                msgv1               = messtab-msgv1
                msgv2               = messtab-msgv2
                msgv3               = messtab-msgv3
                msgv4               = messtab-msgv4
           IMPORTING
                message_text_output = w_textout.
    ENDLOOP.
*   Build error table, display as report which allows reprocessing
    wa_error = wa_kna1.
    wa_error-check = ' '.
    wa_error-new_inst = p_new.
    wa_error-err_msg = w_textout.
    APPEND wa_error TO it_error.
    CLEAR: wa_error.
  ENDIF.
* Clear bdc date table
  CLEAR: bdc_tab.
  REFRESH: bdc_tab.
ENDFORM.                    " BDC_UPDATE
*---------------------------------------------------------------------*
*       FORM DYNPRO                                                   *
*---------------------------------------------------------------------*
*       stores values to bdc table                                    *
*---------------------------------------------------------------------*
*  -->  DYNBEGIN                                                      *
*  -->  NAME                                                          *
*  -->  VALUE                                                         *
*---------------------------------------------------------------------*
FORM dynpro USING    dynbegin name value.
  IF dynbegin = 'X'.
    CLEAR bdc_tab.
    MOVE:  name TO bdc_tab-program,
           value TO bdc_tab-dynpro,
           'X'  TO bdc_tab-dynbegin.
    APPEND bdc_tab.
  ELSE.
    CLEAR bdc_tab.
    MOVE:  name TO bdc_tab-fnam,
           value TO bdc_tab-fval.
    APPEND bdc_tab.
  ENDIF.
ENDFORM.                               " DYNPRO
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_REPORT
*&---------------------------------------------------------------------*
*       Display Report
*----------------------------------------------------------------------*
FORM display_report.
* Sort table by sort field (it_kna1-sortl).
  SORT it_kna1 BY sortl.
* Loop at data table
  LOOP AT it_kna1 INTO wa_kna1.
    WRITE:/      sy-vline,
                 wa_kna1-check AS CHECKBOX, sy-vline,
            (10) wa_kna1-kunnr, sy-vline,
            (35) wa_kna1-name1, sy-vline,
            (10) wa_kna1-sortl, sy-vline,
            (30) wa_kna1-j_1kftind, sy-vline,
            (30) p_new, sy-vline.
    HIDE: wa_kna1, p_new.
    CLEAR: wa_kna1.
  ENDLOOP.
  WRITE: sy-uline(135).
ENDFORM.                    " DISPLAY_REPORT
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_ERROR_REPORT
*&---------------------------------------------------------------------*
*       Display error report data
*----------------------------------------------------------------------*
FORM display_error_report.
  LOOP AT it_error INTO wa_kna1.
    WRITE:/      sy-vline,
                 wa_kna1-check AS CHECKBOX, sy-vline,
            (10) wa_kna1-kunnr, sy-vline,
            (35) wa_kna1-name1, sy-vline,
            (10) wa_kna1-sortl, sy-vline,
            (30) wa_kna1-j_1kftind, sy-vline,
            (30) p_new, sy-vline,
            (73) wa_kna1-err_msg, sy-vline.
    HIDE: wa_kna1, p_new.
    CLEAR: wa_kna1.
  ENDLOOP.
  WRITE: sy-uline(211).
  sy-lsind = sy-lsind - 1.
  REFRESH: it_error.
ENDFORM.                    " DISPLAY_ERROR_REPORT
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_ERROR_HEADINGS
*&---------------------------------------------------------------------*
*       Display error report headings
*----------------------------------------------------------------------*
FORM display_error_headings.
  WRITE:2 ' Error Report '(018) COLOR COL_NEGATIVE.
  SKIP.
  WRITE:2 'Ther following records failed during update:'(017).
  WRITE: sy-uline(211).
  FORMAT COLOR COL_HEADING.
  WRITE:/      sy-vline,
               ' ', sy-vline,
          (10) 'Customer'(011), sy-vline,
          (35) 'Name'(012), sy-vline,
          (10) 'Sort'(013), sy-vline,
          (30) 'Instalment plan'(014), sy-vline,
          (30) 'New Instalment plan'(015), sy-vline,
          (73) 'Error Message'(016), sy-vline.
  WRITE: sy-uline(211).
  FORMAT COLOR COL_NORMAL.
ENDFORM.                    " DISPLAY_ERROR_HEADINGS

Related Articles

SAP ABAP BDC creation - Example code and information on call transaction and batch input session
SAP BDC ABAP report using Call Transaction to automate data input
ABAP SAP BDC Call Transaction report Source Code and documentation
ABAP Source Code for SAP BDC report using Call Transaction
SAP Direct database update within an ABAP report
SAP Date format for BDC entry
Create SAP BDC transaction recording so you can automate data input
bdc session development
Generate ABAP program from SHDB SAP transaction recording made in any client
Updating SAP databases - Example ABAP code and information on database update techniques