Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

Validation in Editable ALV

former_member670450
Participant
0 Kudos

Hi, currently im trying to add some validation to my editable ALV report.

This is what i am trying to do:

1. Make EBELN field mandatory in header and line item

2. When append (method: CREATE_PURCHASE_ORDERS, in url below) a new record in header, once key in ebeln in header, press enter, it will auto populate sy-datum in header (bedat field) and ebeln in line item,

Any appropriate source for me to look into? couldnt find a suitable one

Looked through BCALV_EDIT_04

My source code can be seen in this url, in the comment section:

https://answers.sap.com/questions/13047333/sorting-issue-for-alv-splitter.html?childToView=13047697#...

12 REPLIES 12

geert-janklaps
Active Contributor
0 Kudos

Hi,

You should be able to solve this by implementing logic in the data_changed event of the ALV.

An example can be found in following question:

https://answers.sap.com/questions/6638943/how-to-validate-editable-field-in-alv.html

Best regards,

Geert-Jan Klaps

0 Kudos

Hi,

When Append (&LOCAL&APPEND), key in PO header details in a new entry.

If without entering ebeln field in PO header and click 'save' button, it will prompt error message 'Please enter PO number hdr'

How do i apply this data_change subroutine in PAI on the 'save', it prompts the following error when i added it on PAI 'save'.

0 Kudos

This is the program source code with data_changed added

CLASS LCL_EVENTHANDLER DEFINITION DEFERRED.

DATA: GT_ZHEADER TYPE TABLE OF ZEKKO03,     ""global variable for ZEKKO03
      GT_ZITEMS  TYPE TABLE OF ZEKPO03.     ""global variable for ZEKPO03

DATA: GS_ZHEADER TYPE ZEKKO03,
      GS_ZITEMS  LIKE LINE OF GT_ZITEMS.

DATA: SPLITTER        TYPE REF TO CL_GUI_SPLITTER_CONTAINER,
      GRAPHIC_PARENT1 TYPE REF TO CL_GUI_CONTAINER,
      GRAPHIC_PARENT2 TYPE REF TO CL_GUI_CONTAINER.

DATA: G_GRID_LEFT  TYPE REF TO CL_GUI_ALV_GRID,   "" instance for left grid
      G_GRID_RIGHT TYPE REF TO CL_GUI_ALV_GRID,    "" instance for right grid
      GS_LAYOUT    TYPE LVC_S_LAYO,           "" global structure for layout
      GT_FIELDCAT  TYPE LVC_T_FCAT,           "" global variable for fieldcat
      GS_FIELDCAT  TYPE LVC_S_FCAT,            "" global structure for fieldcat
      CHECK,
      GT_SORT TYPE LVC_T_SORT,
      GS_SORT TYPE LVC_S_SORT.

DATA: BAPIRET2 TYPE BAPIRET2.

CONSTANTS: IV_MAX_ROWS TYPE I VALUE 100.

***  Alv toolbar
DATA: EVENT_HANDLER TYPE REF TO LCL_EVENTHANDLER.

*---------------------------------------------------------------------*
*       CLASS lcl_eventhandler DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*

CLASS LCL_EVENTHANDLER DEFINITION." class definition

  PUBLIC SECTION.

    CLASS-METHODS:
      HANDLE_DOUBLE_CLICK FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
        IMPORTING
          E_ROW
          E_COLUMN
          ES_ROW_NO
          SENDER.

******
    METHODS handle_data_changed
    FOR EVENT data_changed OF cl_gui_alv_grid
    IMPORTING er_data_changed
              e_onf4
              e_onf4_before
              e_onf4_after
              e_ucomm.
******

ENDCLASS.                    "LCL_EVENT_RECEIVER DEFINITION


START-OF-SELECTION.

  CALL SCREEN 100.

*&---------------------------------------------------------------------*
*&      Form  read_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM READ_DATA_HEADER.
  DATA:
    LT_ZHEADER TYPE TABLE OF ZEKKO03,
    LS_ZHEADER TYPE ZEKKO03.

  CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
    EXPORTING
      IV_MAX_ROWS = IV_MAX_ROWS
    IMPORTING
      IT_ZHEADER  = GT_ZHEADER.

ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  display_grid
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM DISPLAY_GRID.

  DATA: SPLITTER           TYPE REF TO CL_GUI_SPLITTER_CONTAINER,
        GRAPHIC_PARENT1    TYPE REF TO CL_GUI_CONTAINER,
        GRAPHIC_PARENT2    TYPE REF TO CL_GUI_CONTAINER.

*----------------------------------------------------------------------*
*                       FOR VARIANT
*----------------------------------------------------------------------*
  DATA LS_VARIANT TYPE DISVARIANT .
  DATA SAVE TYPE C.
  SAVE = 'A'.

  CREATE OBJECT SPLITTER
    EXPORTING
      PARENT  = CL_GUI_CONTAINER=>DEFAULT_SCREEN
      ROWS    = 1
      COLUMNS = 2
      ALIGN   = 15.

  CALL METHOD SPLITTER->GET_CONTAINER
    EXPORTING
      ROW       = 1
      COLUMN    = 1
    RECEIVING
      CONTAINER = GRAPHIC_PARENT1.

  CALL METHOD SPLITTER->GET_CONTAINER
    EXPORTING
      ROW       = 1
      COLUMN    = 2
    RECEIVING
      CONTAINER = GRAPHIC_PARENT2.


  CREATE OBJECT G_GRID_LEFT
    EXPORTING
      I_PARENT = GRAPHIC_PARENT1.

  CREATE OBJECT G_GRID_RIGHT
    EXPORTING
      I_PARENT = GRAPHIC_PARENT2.

  LS_VARIANT-REPORT   = SY-REPID.

    PERFORM FIELDCAT.
  PERFORM SORT.
  GS_LAYOUT-EDIT = ABAP_TRUE. 
  gs_layout-sel_mode = 'D'.                
  CALL METHOD G_GRID_LEFT->SET_TABLE_FOR_FIRST_DISPLAY
    EXPORTING
      IS_VARIANT                    = LS_VARIANT
      I_STRUCTURE_NAME              = 'ZEKKO03'
      I_SAVE                        = SAVE
      IS_LAYOUT                     = GS_LAYOUT

    CHANGING
      IT_OUTTAB                     = GT_ZHEADER
      IT_FIELDCATALOG               = GT_FIELDCAT
      IT_SORT                       = GT_SORT
    EXCEPTIONS
      INVALID_PARAMETER_COMBINATION = 1
      PROGRAM_ERROR                 = 2
      TOO_MANY_LINES                = 3
      OTHERS                        = 4.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


  PERFORM FIELDCAT.
  CALL METHOD G_GRID_RIGHT->SET_TABLE_FOR_FIRST_DISPLAY
    EXPORTING
      IS_VARIANT                    = LS_VARIANT
      I_STRUCTURE_NAME              = 'ZEKPO03'
      IS_LAYOUT                     = GS_LAYOUT
      I_SAVE                        = SAVE
    CHANGING
      IT_OUTTAB                     = GT_ZITEMS
      IT_FIELDCATALOG               = GT_FIELDCAT
      IT_SORT                       = GT_SORT
    EXCEPTIONS
      INVALID_PARAMETER_COMBINATION = 1
      PROGRAM_ERROR                 = 2
      TOO_MANY_LINES                = 3
      OTHERS                        = 4.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


ENDFORM.                  "display_grid


*&---------------------------------------------------------------------*
*&      Form  sort
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM FIELDCAT.

  DATA: NO TYPE I VALUE 1.

  IF G_GRID_LEFT IS NOT INITIAL.

    CLEAR GT_FIELDCAT.
    GS_FIELDCAT-ROW_POS = NO.
    GS_FIELDCAT-FIELDNAME = 'EBELN'.
    GS_FIELDCAT-TABNAME = 'ZEKKO03'.
    GS_FIELDCAT-OUTPUTLEN = 20.
    APPEND GS_FIELDCAT TO GT_FIELDCAT.

  ELSEIF G_GRID_RIGHT IS NOT INITIAL.

    APPEND GS_FIELDCAT TO GT_FIELDCAT.

  ENDIF.



ENDFORM.                  "fieldname


FORM SORT.

   DATA: NO TYPE I VALUE 1.

  IF G_GRID_LEFT IS NOT INITIAL.
    CLEAR gt_sort.
    no = no + 1.
    GS_SORT-SPOS = NO.
    GS_SORT-FIELDNAME = 'EBELN'.
    GS_SORT-DOWN = 'X'.
    APPEND GS_SORT TO GT_SORT.


  ELSEIF g_grid_right IS NOT INITIAL.
    CLEAR gt_sort.
    GS_SORT-SPOS = NO.
    GS_SORT-FIELDNAME = 'EBELN'.
    GS_SORT-DOWN = 'X'.
    APPEND GS_SORT TO GT_SORT.

  ENDIF.
ENDFORM.


*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.

  SET PF-STATUS 'MAIN'.
  SET TITLEBAR 'ZPROJ03_ALV'.

  IF G_GRID_LEFT IS INITIAL.

    PERFORM READ_DATA_HEADER.
    PERFORM DISPLAY_GRID.
    PERFORM SWITCH_EDIT_MODE.

    CREATE OBJECT EVENT_HANDLER.
    SET HANDLER EVENT_HANDLER->HANDLE_DOUBLE_CLICK FOR G_GRID_LEFT.

  ENDIF.


ENDMODULE.                 " STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.

  CALL METHOD CL_GUI_CFW=>DISPATCH.

  CASE SY-UCOMM.

    WHEN 'BACK'.
      SET SCREEN 0. LEAVE SCREEN.
    WHEN 'EXIT'.
      SET SCREEN 0. LEAVE SCREEN.
    WHEN 'CANCEL'.
      LEAVE PROGRAM. LEAVE SCREEN.
    WHEN 'DELETE'.
      PERFORM SAVE_DATABASE_DELETE.
    WHEN 'SAVE'.
      PERFORM SAVE_DATABASE_UPDATE.
      PERFORM data_changed.
    WHEN '&LOCAL&APPEND'.
      PERFORM SAVE_DATABASE_APPEND.
    WHEN 'SWITCH'.
      PERFORM SWITCH_EDIT_MODE.
    WHEN OTHERS.
*     do nothing

  ENDCASE.


ENDMODULE.                 " USER_COMMAND_0100  INPUT


*  ===============================================================
*   LOCAL CLASSES: IMPLEMENTATION
*  ===============================================================
CLASS LCL_EVENTHANDLER IMPLEMENTATION." implementation
  METHOD  HANDLE_DOUBLE_CLICK.

*   define local data
    DATA:
      LT_ZHEADER TYPE TABLE OF ZEKKO03,
      LT_ZITEMS2 TYPE TABLE OF ZEKPO03,
      LS_ZHEADER TYPE ZEKKO03,
      LS_ZITEMS2 LIKE LINE OF LT_ZITEMS2.       """ like line of applicable to structure for ztables

    IF e_row-index gt 0.


           READ TABLE GT_ZHEADER INDEX e_row-index INTO LS_ZHEADER.   """use ALV internal table to perform read data

          CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS           """""select line items based on header
            EXPORTING
              IV_KEY    = LS_Zheader-EBELN
*             IV_MAX_ROWS =
            IMPORTING
*             IT_ZHEADER  =
              IT_ZITEMS = LT_ZITEMS2
*             ES_BAPIRET2 =
            .
     ENDIF.

        GT_ZITEMS = LT_ZITEMS2.
        G_GRID_RIGHT->REFRESH_TABLE_DISPLAY( ). 

  ENDMETHOD.

******
    METHOD handle_data_changed.
    PERFORM data_changed USING er_data_changed.
  ENDMETHOD.
*
*******

ENDCLASS.                    "LCL_EVENT_RECEIVER IMPLEMENTATION

<br>

0 Kudos

Continuing program source code, Ive attached respective methods

Sorry for the trouble

FORM data_changed USING p_er_data_changed TYPE REF TO cl_alv_changed_data_protocol.

DATA: ls_mod_cells TYPE lvc_s_modi,
      lv_ebeln TYPE zebeln_emnt.

  DATA:
    LT_ZHEADER_MOD TYPE TABLE OF ZEKKO03,
    LT_ZITEMS_mod  TYPE TABLE OF ZEKPO03,
    LS_ZHEADER_mod TYPE ZEKKO03,
    LS_ZITEMS_mod LIKE LINE OF LT_ZITEMS_mod.

loop at p_er_data_changed->mt_good_cells INTO ls_mod_cells.

  CASE ls_mod_cells-fieldname.

    WHEN 'EBELN'.
          CALL METHOD p_er_data_changed->get_cell_value
          EXPORTING
            i_row_id    = ls_mod_cells-row_id
            i_fieldname = 'EBELN'
          IMPORTING
            e_value     = lv_ebeln.

          CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
            EXPORTING
*              IV_KEY      =
              IV_MAX_ROWS = IV_MAX_ROWS
            IMPORTING
              IT_ZHEADER  = lt_zheader_mod   .

          CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
            EXPORTING
              IV_KEY      = lv_ebeln
*              IV_MAX_ROWS = 0
            IMPORTING
              IT_ZHEADER  = lt_zheader_mod
              .

          gt_zheader = lt_zheader_mod.

        PERFORM save_database_update.

        if lv_ebeln IS INITIAL.

            CALL METHOD p_er_data_changed->add_protocol_entry
            EXPORTING
              i_msgid     = 'ZMM'
              i_msgno     = '999'
              i_msgty     = 'E'
              i_msgv1     = 'Please enter PO number hdr'
              i_fieldname = ls_mod_cells-fieldname
              i_row_id    = ls_mod_cells-row_id.
          EXIT.

        endif.

        g_grid_left->refresh_table_display( ).

  ENDCASE.

ENDLOOP.

ENDFORM.

*****

FORM SWITCH_EDIT_MODE.


  IF G_GRID_LEFT->IS_READY_FOR_INPUT( ) EQ 0.

    CALL METHOD G_GRID_LEFT->SET_READY_FOR_INPUT
      EXPORTING
        I_READY_FOR_INPUT = 1.
  ELSE.
    CALL METHOD G_GRID_LEFT->SET_READY_FOR_INPUT
      EXPORTING
        I_READY_FOR_INPUT = 0.
  ENDIF.



ENDFORM.                               " SWITCH_EDIT_MODE



*&---------------------------------------------------------------------*
*&      Form  SAVE TO DB
*&---------------------------------------------------------------------*
*       text : saving into DDIC from internal table
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SAVE_DATABASE_APPEND.

  DATA:
    LT_ZHEADER_APP TYPE TABLE OF ZEKKO03,
    LT_ZITEMS_APP  TYPE TABLE OF ZEKPO03,
    LS_ZHEADER_APP TYPE ZEKKO03,
    LS_ZITEMS_APP  LIKE LINE OF LT_ZITEMS_APP.


  CALL METHOD G_GRID_LEFT->CHECK_CHANGED_DATA
    IMPORTING
      E_VALID = CHECK.

  CALL METHOD G_GRID_RIGHT->CHECK_CHANGED_DATA
    IMPORTING
      E_VALID = CHECK.

  CALL METHOD ZCL_03_DATA_MODEL=>CREATE_PURCHASE_ORDERS
    EXPORTING
      IT_ZHEADER = LT_ZHEADER_APP
      IT_ZITEMS  = LT_ZITEMS_APP.

  GT_ZHEADER = LT_ZHEADER_APP.
  GT_ZITEMS = LT_ZITEMS_APP.

ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  SAVE TO DB
*&---------------------------------------------------------------------*
*       text : saving into DDIC from internal table
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SAVE_DATABASE_UPDATE.

  CALL METHOD G_GRID_LEFT->CHECK_CHANGED_DATA
    IMPORTING
      E_VALID = CHECK.

  CALL METHOD G_GRID_RIGHT->CHECK_CHANGED_DATA
    IMPORTING
      E_VALID = CHECK.

  CALL METHOD ZCL_03_DATA_MODEL=>UPDATE_PURCHASE_ORDERS
    EXPORTING
      IT_ZHEADER  = GT_ZHEADER
      IT_ZITEMS   = GT_ZITEMS
    IMPORTING
      ES_BAPIRET2 = BAPIRET2.
ENDFORM.

FORM SAVE_DATABASE_DELETE.

  DATA:
    LT_ZHEADER_DEL TYPE TABLE OF ZEKKO03,
    LT_ZITEMS2_DEL TYPE TABLE OF ZEKPO03,
    LS_ZHEADER_DEL TYPE ZEKKO03,
    LS_ZITEMS2_DEL LIKE LINE OF LT_ZITEMS2_DEL.

   DATA:
    LT_ZHEADER_DEL_01 TYPE TABLE OF ZEKKO03,
    LT_ZITEMS2_DEL_01 TYPE TABLE OF ZEKPO03.

  DATA: LT_ROWID_DEL TYPE LVC_T_ROID,
        LS_ROWIN_DEL LIKE LINE OF LT_ROWID_DEL.


  CALL METHOD G_GRID_LEFT->GET_SELECTED_ROWS
    IMPORTING
      ET_ROW_NO     = LT_ROWID_DEL.

*--- Through the index capturing the values of selected rows
  LOOP AT LT_ROWID_DEL INTO LS_ROWIN_DEL.                       """" to get a row

    CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS     """get all data for header
      EXPORTING
*       IV_KEY      =
        IV_MAX_ROWS = IV_MAX_ROWS
      IMPORTING
        IT_ZHEADER  = LT_ZHEADER_DEL    .

    READ TABLE gt_zheader INDEX LS_ROWIN_DEL-ROW_ID INTO LS_ZHEADER_DEL.  

    CLEAR LT_ZHEADER_DEL.

    CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS
      EXPORTING
        IV_KEY      = LS_ZHEADER_DEL-EBELN
*        IV_MAX_ROWS = 0
      IMPORTING
        IT_ZHEADER  = LT_ZHEADER_DEL
*        IT_ZITEMS   =
*        ES_BAPIRET2 =
        .


    CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS             """get a row of line item based on key
      EXPORTING
        IV_KEY    = LS_ZHEADER_DEL-EBELN
*       IV_MAX_ROWS =
      IMPORTING
*       IT_ZHEADER  =
        IT_ZITEMS = LT_ZITEMS2_DEL
*       ES_BAPIRET2 =
      .

    CALL METHOD ZCL_03_DATA_MODEL=>DELETE_PURCHASE_ORDERS
      EXPORTING
        IT_ZHEADER = LT_ZHEADER_DEL
        IT_ZITEMS  = LT_ZITEMS2_DEL    .

  ENDLOOP.

  CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS   
    EXPORTING
      IV_MAX_ROWS = IV_MAX_ROWS
    IMPORTING
      IT_ZHEADER  = LT_ZHEADER_DEL_01   .

  CALL METHOD ZCL_03_DATA_MODEL=>SELECT_PURCHASE_ORDERS 
    EXPORTING
      IV_KEY    = LS_ZHEADER_DEL-EBELN
*     IV_MAX_ROWS =
    IMPORTING
*     IT_ZHEADER =
      IT_ZITEMS = LT_ZITEMS2_DEL_01
*     ES_BAPIRET2 =
    .

  GT_ZHEADER = LT_ZHEADER_DEL_01.
  GT_ZITEMS  = LT_ZITEMS2_DEL_01.

  G_GRID_LEFT->REFRESH_TABLE_DISPLAY( ).
  G_GRID_RIGHT->REFRESH_TABLE_DISPLAY( ).

  CLEAR LT_ZITEMS2_DEL.
  CLEAR LT_ZHEADER_DEL_01.
  CLEAR LT_ZITEMS2_DEL_01.


ENDFORM.                    " SAVE_DATABASE<br>

0 Kudos

Rest of the methods attached

former_member670450
Participant
0 Kudos

I wanted to add the error in SAVE_DATABASE_APPEND subroutine in my program to make ebeln as mandatory field, anything that i have missed?

venkateswaran_k
Active Contributor
0 Kudos

Hi

In your METHOD UPDATE_PURCHASE_ORDERS., you may add a validation routine

Perform Validate - in that loop through it_header table and if any ebeln is initial set the flag ok_to_save to 'N'.

In the method put if statement as IF ok_to_save = 'Y'......

else display the message.

0 Kudos

Hi sorry dont get you

Is it something like this? Please correct me

value( IT_ZHEADER )      TYPE ZEKKO03_TT          PO Header Table Type
value( IT_ZITEMS )         TYPE ZEKPO03_TT       PO Item Table Type
IV_SAVE                     TYPE BOOLEAN          Boolean Variable (X = True, - = False, Space = Unknown)
value( ES_BAPIRET2 )      TYPE BAPIRET2          Return Parameter




  METHOD UPDATE_PURCHASE_ORDERS.

DATA: ls_zheader LIKE LINE OF it_zheader,
      lv_ebeln TYPE zekko03-ebeln.

if it_zheader IS NOT INITIAL.

        modify zekko03 FROM TABLE it_zheader .
        IF SY-SUBRC = 0.
          COMMIT WORK.
          ES_BAPIRET2-TYPE = 'S'.
          ES_BAPIRET2-MESSAGE = 'Successfully updated for table ZEKKO03'.

        ELSE.
          ROLLBACK WORK.
          ES_BAPIRET2-TYPE = 'E'.
          ES_BAPIRET2-MESSAGE = 'Error updating table ZEKKO03'.
        ENDIF.

        modify zekpo03 FROM TABLE it_zitems .
        IF SY-SUBRC = 0.
          COMMIT WORK.
          ES_BAPIRET2-TYPE = 'S'.
          ES_BAPIRET2-MESSAGE = 'Successfully updated for table ZEKKO03'.

        ELSE.
          ROLLBACK WORK.
          ES_BAPIRET2-TYPE = 'E'.
          ES_BAPIRET2-MESSAGE = 'Error updating table ZEKKO03'.
        ENDIF.

endif.



LOOP AT it_zheader INTO ls_zheader.

  IF lv_ebeln IS INITIAL.

    if iv_save = '-'.
      MESSAGE 'Please enter PO number' TYPE 'E'.

    elseif iv_save = 'X'.


    endif.

  ENDIF.

ENDLOOP.<br>

venkateswaran_k
Active Contributor
0 Kudos

Hi

Please as below

Declare a global variable iv_save type c length 1 default space.

In your method, include statement as below

METHOD UPDATE_PURCHASE_ORDERS.
DATA: ls_zheader LIKE LINE OF it_zheader,
     lv_ebeln TYPE zekko03-ebeln.
     
     PERFORM VALIDATE_IT.   <===== ADD STATEMENT LINE HERE
     IF IV_SAVE = 'Y'       <== add if statement to validate if the flag is okay
         if it_zheader IS NOT INITIAL.
         ....
         .....
     ENDIF.
     ELSE.
       MESSAGE 'IN INTERNAL TABLE PO NUMBER IS MISSING'.. TYPE 'S' DISPLAY LIKE 'S'.
     ENDIF<br>

and in the subroutine

FORM VALIDATE_IT.
   IV_SAVE = 'Y'.
   LOOP IT_HEADER INTO LS_HEADER.
     IF LS_HEADER-EBELN = ''.
       IV_SAVE = 'N'.
     ENDIF.
   ENDLOOP.
ENDFORM


0 Kudos

Hi sir, cant actually include perform in method, perform can only be included in program, else it will prompt this error

Im doing it this way instead, not sure if its correct logically. When the code is added, it affects the update, meaning update not reflected

value( IT_ZHEADER )	TYPE ZEKKO03_TT	PO Header Table Type
value( IT_ZITEMS )	TYPE ZEKPO03_TT	PO Item Table Type
value( IV_SAVE )	TYPE C OPTIONAL	
value( ES_BAPIRET2 )	TYPE BAPIRET2	Return Parameter

   METHOD UPDATE_PURCHASE_ORDERS.

DATA: ls_zheader LIKE LINE OF it_zheader,
      lv_ebeln TYPE zekko03-ebeln.

if iv_save = 'Y'.
if it_zheader IS NOT INITIAL.

        modify zekko03 FROM TABLE it_zheader .
        IF SY-SUBRC = 0.
          COMMIT WORK.
          ES_BAPIRET2-TYPE = 'S'.
          ES_BAPIRET2-MESSAGE = 'Successfully updated for table ZEKKO03'.

        ELSE.
          ROLLBACK WORK.
          ES_BAPIRET2-TYPE = 'E'.
          ES_BAPIRET2-MESSAGE = 'Error updating table ZEKKO03'.
        ENDIF.

        modify zekpo03 FROM TABLE it_zitems .
        IF SY-SUBRC = 0.
          COMMIT WORK.
          ES_BAPIRET2-TYPE = 'S'.
          ES_BAPIRET2-MESSAGE = 'Successfully updated for table ZEKKO03'.

        ELSE.
          ROLLBACK WORK.
          ES_BAPIRET2-TYPE = 'E'.
          ES_BAPIRET2-MESSAGE = 'Error updating table ZEKKO03'.
        ENDIF.

endif.
else.
  MESSAGE 'Please enter PO number' TYPE 'S' DISPLAY LIKE 'S'.
  endif.



  ENDMETHOD.
<br>
DATA: GT_ZHEADER TYPE TABLE OF ZEKKO03,     ""global variable for ZEKKO03
      GT_ZITEMS  TYPE TABLE OF ZEKPO03.     ""global variable for ZEKPO03

DATA: GS_ZHEADER TYPE ZEKKO03,
      GS_ZITEMS  LIKE LINE OF GT_ZITEMS,
      gv_save TYPE c LENGTH 1 VALUE ' '.


*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
  CASE SY-UCOMM.
WHEN 'SAVE'.
      PERFORM SAVE_DATABASE_UPDATE.
      PERFORM validate_update.

  ENDCASE.


ENDMODULE.   



*&---------------------------------------------------------------------*
*&      Form  SAVE TO DB
*&---------------------------------------------------------------------*
*       text : saving into DDIC from internal table
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SAVE_DATABASE_UPDATE.

  CALL METHOD G_GRID_LEFT->CHECK_CHANGED_DATA
    IMPORTING
      E_VALID = CHECK.

  CALL METHOD G_GRID_RIGHT->CHECK_CHANGED_DATA
    IMPORTING
      E_VALID = CHECK.

*  CALL METHOD ZCL_03_DATA_MODEL=>UPDATE_PURCHASE_ORDERS
*    EXPORTING
*      IT_ZHEADER  = GT_ZHEADER
*      IT_ZITEMS   = GT_ZITEMS
*    IMPORTING
*      ES_BAPIRET2 = BAPIRET2.

CALL METHOD ZCL_03_DATA_MODEL=>UPDATE_PURCHASE_ORDERS
  EXPORTING
    IT_ZHEADER  = gt_zheader
    IT_ZITEMS   = gt_zitems
    IV_SAVE     = gv_save
*  IMPORTING
*    ES_BAPIRET2 =
    .
ENDFORM.


FORM validate_update.

gv_save = 'Y'.
LOOP AT gt_zheader INTO gs_zheader.

  IF gs_zheader-ebeln = ' '.
    gv_save = 'N'.

  ENDIF.

endloop.
ENDFORM.

Hi

You need to swap as below

MODULE USER_COMMAND_0100 INPUT.
  CASE SY-UCOMM.
WHEN 'SAVE'.
      PERFORM validate_update.             <===== first line is this validate 
      IF GV_SAVE = 'Y'.                    <== Add line as below
        PERFORM SAVE_DATABASE_UPDATE.
      ELSE.
        MESSAGE 'Please fillin the PO numbers in the table...' TYPE 'S' DISPLAY LIKE 'S'.
      ENDIF.

  ENDCASE.
ENDMODULE.   

0 Kudos

Hi sir

Thank you , it worked with all your logic inserted in the update method.