Friday, January 8, 2010

Update program to update infostrcuture S910 when sales order is changed or created

REPORT  zsdis_sorder_rc_update.


TABLES:s910,cdhdr.


TYPE-POOLS:slis.


*Types Decalration
TYPES:BEGIN OF ty_doc,
      item TYPE posnr,            "item no
      no   TYPE vbeln,            "document no
      END OF ty_doc,


*Document type structure
      BEGIN OF ty_doc_auart,
      vbeln TYPE vbeln,
      auart TYPE vbak-auart,
      erdat TYPE vbak-erdat,
      audat TYPE vbak-audat,
      vkorg TYPE vbak-vkorg,
      vtweg TYPE vbak-vtweg,
      END OF ty_doc_auart,


*Item category structure
      BEGIN OF ty_doc_pstyv,
       vbeln     TYPE vbeln,
       posnr     TYPE posnr,
       pstyv     TYPE vbap-pstyv,
       abgru     TYPE vbap-abgru,
       zzreason2 TYPE vbap-zzreason2,
       vrkme     TYPE vbap-vrkme,
       waerk     TYPE vbap-waerk,
       gewei     TYPE vbap-gewei,
       kpein     TYPE vbap-kpein,
       netwr     TYPE vbap-netwr,
       ntgew     TYPE vbap-ntgew,
       zerrorqty TYPE vbap-kpein,
       zerrorval TYPE vbap-netpr,
       zerrorwt  TYPE vbap-ntgew,
      END OF ty_doc_pstyv,


*Chnage header
     BEGIN OF ty_cdhdr,
       objectclas TYPE cdhdr-objectclas,
       objectid   TYPE cdhdr-objectid,
       changenr   TYPE cdhdr-changenr,
       udate      TYPE cdhdr-udate,
       utime      TYPE cdhdr-utime,
     END OF ty_cdhdr,


*Change details
     BEGIN OF ty_cdpos,
       objectclas TYPE cdhdr-objectclas,
       objectid   TYPE cdhdr-objectid,
       changenr   TYPE cdhdr-changenr,
       tabname    TYPE cdpos-tabname,
       tabkey     TYPE cdpos-tabkey,
       fname      TYPE cdpos-fname,
       chngind    TYPE cdpos-chngind,
       value_new  TYPE cdpos-value_new,
       value_old  TYPE cdpos-value_old,
     END OF ty_cdpos,


*display structure
      BEGIN OF ty_data,
        vbeln     TYPE vbeln,
        posnr     TYPE posnr,
        abgru     TYPE vbap-abgru,
        zzreason2 TYPE vbap-zzreason2,
        text(30),
      END OF ty_data,


*log of last program run date and time
      BEGIN OF ty_log,
        zzdate TYPE zsd_log_time-zzdate,
        zztime TYPE zsd_log_time-zztime,
      END OF ty_log,


      BEGIN OF ty_values,
        zzprogname TYPE zsd_log_time-zzprogname,
        zzdate     TYPE zsd_log_time-zzdate,
        zztime     TYPE zsd_log_time-zztime,
      END OF ty_values,


      BEGIN OF ty_date,
        vbeln TYPE vbeln,
        date  TYPE sy-datum,
        time  TYPE sy-uzeit,
      END OF ty_date.


DATA:lw_repid TYPE sy-repid.


DATA:slis_ev_top_of_page   TYPE slis_formname VALUE 'TOP_OF_PAGE'.


CONSTANTS:c_formname_top_of_page TYPE slis_formname
                                 VALUE 'TOP_OF_PAGE'.


DATA:t_cdhdr           TYPE STANDARD TABLE OF ty_cdhdr,
     t_cdpos           TYPE STANDARD TABLE OF ty_cdpos,
     t_date            TYPE STANDARD TABLE OF ty_date,
     t_doc_auart       TYPE STANDARD TABLE OF ty_doc_auart,
     t_doc_pstyv       TYPE STANDARD TABLE OF ty_doc_pstyv,
     t_log             TYPE STANDARD TABLE OF ty_log,
     t_data            TYPE STANDARD TABLE OF ty_data,
     wa_date           TYPE ty_date,
     wa_log            TYPE ty_log,
     wa_s910           TYPE s910,
     wa_cdhdr          TYPE ty_cdhdr,
     wa_cdpos          TYPE ty_cdpos,
     wa_doc_auart      TYPE ty_doc_auart,
     wa_doc_pstyv      TYPE ty_doc_pstyv,
     t_zbc_const       TYPE STANDARD TABLE OF zbc_const,
     t_doc             TYPE STANDARD TABLE OF ty_doc,
     wa_doc            TYPE ty_doc,
     wa_values         TYPE ty_values,
     wa_data           TYPE ty_data,
     wa_zbc_const      TYPE zbc_const.


DATA:wa_fldcat TYPE slis_fieldcat_alv,
     wa_layout  TYPE slis_layout_alv.


DATA:t_events TYPE slis_t_event,      " ALV events
     t_fcat TYPE  slis_t_fieldcat_alv.


RANGES:r_auart    FOR vbak-auart,
       r_date     FOR sy-datum,
       r_time     FOR sy-uzeit,
       r_category FOR vbap-pstyv.


DATA:w_date  TYPE sy-datum,
     w_tabix TYPE sy-tabix,
     w_time  TYPE sy-uzeit.


DATA:w_new(3) TYPE c,
     w_old(3) TYPE c.




SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE text-s01.
*Initial run radiobutton
PARAMETERS:p_inlrun RADIOBUTTON GROUP g1 DEFAULT 'X',
*Latest Updates radiobutton
           p_update RADIOBUTTON GROUP g1.
SELECTION-SCREEN: END OF BLOCK b1.


SELECTION-SCREEN: BEGIN OF BLOCK b2 WITH FRAME TITLE text-s02.
SELECT-OPTIONS:s_date FOR cdhdr-udate DEFAULT sy-datum,  "date
               s_time FOR cdhdr-utime.                   "time
SELECTION-SCREEN: END OF BLOCK b2.


START-OF-SELECTION.


  SELECT zzdate zztime
    FROM zsd_log_time
    INTO TABLE t_log
    WHERE zzprogname = sy-repid.


  SORT t_log[] BY zzdate DESCENDING
                  zztime DESCENDING.


  READ TABLE t_log INTO wa_log INDEX 1.


  r_date-sign = 'I'.
  r_date-option = 'BT'.
  r_date-low  = wa_log-zzdate.
  r_date-high = sy-datum.
  APPEND r_date.


  r_time-sign = 'I'.
  r_time-option = 'BT'.
  r_time-low  = wa_log-zztime.
  r_time-high = sy-uzeit.
  APPEND r_date.




  IF p_inlrun = 'X'.
    SELECT objectclas objectid changenr
           udate      utime
      FROM cdhdr
      INTO TABLE t_cdhdr
      WHERE objectclas = 'VERKBELEG'
      AND udate IN s_date
      AND utime IN s_time
      AND change_ind = 'U'.
  ELSE.
    SELECT objectclas objectid changenr
           udate      utime
     FROM cdhdr
     INTO TABLE t_cdhdr
     WHERE objectclas = 'VERKBELEG'
     AND udate IN r_date
     AND utime IN r_time
     AND change_ind = 'U'.
  ENDIF.


  SORT t_cdhdr[] BY objectid changenr.
  IF t_cdhdr[] IS NOT INITIAL.
    SELECT objectclas
           objectid
           changenr
           tabname
           tabkey
           fname
           chngind
           value_new
           value_old
         FROM cdpos
      INTO TABLE t_cdpos
      FOR ALL ENTRIES IN t_cdhdr
      WHERE   objectid   = t_cdhdr-objectid
      AND     changenr   = t_cdhdr-changenr
      AND     objectclas = 'VERKBELEG'
      AND     tabname    = 'VBAP'
      AND     fname      IN ('ABGRU','ZZREASON2')
      AND     chngind    = 'U'.
  ENDIF.


  LOOP AT t_cdpos INTO wa_cdpos.


    IF wa_cdpos-value_new = '0' OR wa_cdpos-value_new = '00'.
      CLEAR wa_cdpos-value_new.
    ENDIF.


    IF wa_cdpos-value_old = '0' OR wa_cdpos-value_old = '00'.
      CLEAR wa_cdpos-value_old.
    ENDIF.


    IF wa_cdpos-value_new = wa_cdpos-value_old.
      DELETE t_cdpos INDEX sy-tabix.
    ENDIF.
    wa_doc-no   = wa_cdpos-tabkey+3(10).
    wa_doc-item = wa_cdpos-tabkey+13(6).
    APPEND wa_doc TO t_doc.
    READ TABLE t_cdhdr INTO wa_cdhdr
                       WITH KEY objectid = wa_cdpos-objectid
                                changenr = wa_cdpos-changenr
                                BINARY SEARCH.
    IF sy-subrc = 0.
      wa_date-vbeln = wa_doc-no.
      wa_date-date  = wa_cdhdr-udate.
      wa_date-time  = wa_cdhdr-utime.
      APPEND wa_date TO t_date.
    ENDIF.
    CLEAR:wa_cdpos,wa_cdhdr.
  ENDLOOP.


  SELECT * FROM zbc_const
  INTO TABLE t_zbc_const
  WHERE progname = 'ZSDIS_SORDER_RC_UPDATE'.


  LOOP AT t_zbc_const INTO wa_zbc_const.
    IF wa_zbc_const-fieldname = 'R_AUART'.
      r_auart-sign   = wa_zbc_const-sign.
      r_auart-option = wa_zbc_const-opti.
      r_auart-low    = wa_zbc_const-low.
      r_auart-high   = wa_zbc_const-high.
      APPEND r_auart.
    ENDIF.
    IF wa_zbc_const-fieldname = 'R_CATEGORY'.
      r_category-sign   = wa_zbc_const-sign.
      r_category-option = wa_zbc_const-opti.
      r_category-low    = wa_zbc_const-low.
      r_category-high   = wa_zbc_const-high.
      APPEND r_category.
    ENDIF.
    CLEAR wa_zbc_const.
  ENDLOOP.




  SORT t_doc[] BY no item.


  DELETE ADJACENT DUPLICATES FROM t_doc
                  COMPARING ALL FIELDS.
  IF t_doc[] IS NOT INITIAL.
    SELECT vbeln
           auart
           erdat
           audat
           vkorg
           vtweg
      FROM vbak
      INTO TABLE t_doc_auart
      FOR ALL ENTRIES IN t_doc
      WHERE vbeln = t_doc-no.


    SELECT vbeln posnr pstyv
           abgru zzreason2
           vrkme waerk gewei
           kpein netwr ntgew
      FROM vbap
      INTO TABLE t_doc_pstyv
      FOR ALL ENTRIES IN t_doc
      WHERE   vbeln = t_doc-no
      AND     posnr = t_doc-item.
  ENDIF.


  LOOP AT t_doc_auart INTO wa_doc_auart.
    IF wa_doc_auart-auart IN r_auart.
      CONTINUE.
    ELSE.
      w_tabix = sy-tabix.
      READ TABLE t_doc INTO wa_doc WITH
                KEY no = wa_doc_auart-vbeln
                             BINARY SEARCH.
      IF sy-subrc = 0.
        DELETE t_doc       INDEX sy-tabix.
        DELETE t_doc_auart INDEX w_tabix.
      ENDIF.
    ENDIF.
    CLEAR wa_doc_auart.
  ENDLOOP.


  LOOP AT t_doc_pstyv INTO wa_doc_pstyv.
    IF wa_doc_pstyv-pstyv IN r_category.
      CONTINUE.
    ELSE.
      w_tabix = sy-tabix.
      READ TABLE t_doc INTO wa_doc WITH
                KEY no   = wa_doc_pstyv-vbeln
                    item = wa_doc_pstyv-posnr
                            BINARY SEARCH.
      IF sy-subrc = 0.
        DELETE t_doc       INDEX sy-tabix.
        DELETE t_doc_pstyv INDEX w_tabix.
      ENDIF.
    ENDIF.
    CLEAR wa_doc_pstyv.
  ENDLOOP.


  SORT t_date BY vbeln.
  LOOP AT t_doc INTO wa_doc.
    READ TABLE t_doc_pstyv INTO wa_doc_pstyv
                    WITH KEY vbeln = wa_doc-no
                             posnr = wa_doc-item
                             BINARY SEARCH.
    IF sy-subrc = 0.
      READ TABLE t_doc_auart INTO wa_doc_auart
                       WITH KEY vbeln = wa_doc-no
                            BINARY SEARCH.
      IF sy-subrc = 0.
        READ TABLE t_date INTO wa_date
                            WITH KEY vbeln = wa_doc-no
                            BINARY SEARCH.
        IF sy-subrc = 0.
          UPDATE s910 SET zzreason1       = wa_doc_pstyv-abgru
                          zzreason2       = wa_doc_pstyv-zzreason2
                          aedat           = wa_date-date
                          erzet           = wa_date-time
                          WHERE vbeln     = wa_doc_pstyv-vbeln
                          AND   posnr     = wa_doc_pstyv-posnr
                          AND   vrsio     = '000'
                          AND   sptag     = wa_doc_auart-erdat
                          AND   auart     = wa_doc_auart-auart
                          AND   erdat     = wa_doc_auart-erdat
                          AND   vkorg     = wa_doc_auart-vkorg
                          AND   vtweg     = wa_doc_auart-vtweg
                          AND   ssour     = ''.
          IF sy-subrc = 0.
            MOVE-CORRESPONDING wa_doc_pstyv TO wa_data.
            wa_data-text  = 'Updation'.
            APPEND wa_data TO t_data.
          ELSE.
            wa_s910-ssour     = ''.
            wa_s910-vrsio     = '000'.
            wa_s910-sptag     = wa_doc_auart-erdat.
            wa_s910-vbeln     = wa_doc_pstyv-vbeln.
            wa_s910-posnr     = wa_doc_pstyv-posnr.
            wa_s910-auart     = wa_doc_auart-auart.
            wa_s910-erdat     = wa_doc_auart-audat.
            wa_s910-vkorg     = wa_doc_auart-vkorg.
            wa_s910-vtweg     = wa_doc_auart-vtweg.
            wa_s910-zzreason1 = wa_doc_pstyv-abgru.
            wa_s910-zzreason2 = wa_doc_pstyv-zzreason2.
            wa_s910-vrkme     = wa_doc_pstyv-vrkme.
            wa_s910-waerk     = wa_doc_pstyv-waerk.
            wa_s910-gewei     = wa_doc_pstyv-gewei.
            wa_s910-zerrorqty = wa_doc_pstyv-kpein.
            wa_s910-zerrorval = wa_doc_pstyv-netwr.
            wa_s910-zerrorwt  = wa_doc_pstyv-ntgew.
            wa_s910-aedat     = sy-datum.
            wa_s910-erzet     = sy-uzeit.
            INSERT s910 FROM wa_s910.
            IF sy-subrc = 0.
              MOVE-CORRESPONDING wa_s910 TO wa_data.
              wa_data-abgru = wa_s910-zzreason1.
              wa_data-text = 'Insertion'.
              APPEND wa_data TO t_data.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.
    CLEAR:wa_data,wa_s910,wa_doc_pstyv,wa_doc_auart.
  ENDLOOP.


END-OF-SELECTION.


  DELETE FROM zsd_log_time
   WHERE zzprogname = sy-repid.


  wa_values-zzprogname = sy-repid.
  wa_values-zzdate     = sy-datum.
  wa_values-zztime     = sy-uzeit.


  INSERT zsd_log_time FROM wa_values.


*assigning the program name
  lw_repid = sy-repid.
  PERFORM fill_field_catalog.


  PERFORM eventtab_build
         USING t_events[].


*optimizing the column width
  wa_layout-colwidth_optimize = 'X'.         "'X'.


  DELETE ADJACENT DUPLICATES FROM t_data
           COMPARING ALL FIELDS.
*dispalying the ALV in output as list
  CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
    EXPORTING
      i_callback_program = lw_repid
      is_layout          = wa_layout
      it_fieldcat        = t_fcat
      it_events          = t_events
    TABLES
      t_outtab           = t_data
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
*&---------------------------------------------------------------------*
*&      Form  FILL_FIELD_CATALOG
*&---------------------------------------------------------------------*
FORM fill_field_catalog .
  CLEAR wa_fldcat .
*Sales Order no.
  CLEAR wa_fldcat .
  wa_fldcat-col_pos = 2.
  wa_fldcat-tabname = 'T_DATA'.
  wa_fldcat-fieldname = 'VBELN'.
  wa_fldcat-seltext_m = 'Sales Order no.'(005)  .
  wa_fldcat-outputlen = '40'.
  APPEND wa_fldcat TO t_fcat .


*Sales item no
  CLEAR wa_fldcat .
  wa_fldcat-col_pos = 3.
  wa_fldcat-tabname = 'T_DATA'.
  wa_fldcat-fieldname = 'POSNR'.
  wa_fldcat-seltext_m = 'Sales Item no.'(006)  .
  wa_fldcat-outputlen = '45'.
  APPEND wa_fldcat TO t_fcat .


*Reason code 1
  CLEAR wa_fldcat .
  wa_fldcat-col_pos = 3.
  wa_fldcat-tabname = 'T_DATA'.
  wa_fldcat-fieldname = 'ABGRU'.
  wa_fldcat-seltext_m = 'Reason code 1'(007).
  wa_fldcat-outputlen = '12'.
  APPEND wa_fldcat TO t_fcat .


*Reason code 2
  CLEAR wa_fldcat .
  wa_fldcat-col_pos = 4.
  wa_fldcat-tabname = 'T_DATA'.
  wa_fldcat-fieldname = 'ZZREASON2'.
  wa_fldcat-seltext_m = 'Reason code 2'(008).
  wa_fldcat-outputlen = '45'.
  APPEND wa_fldcat TO t_fcat .


*description of message
  CLEAR wa_fldcat .
  wa_fldcat-col_pos = 4.
  wa_fldcat-tabname = 'T_DATA'.
  wa_fldcat-fieldname = 'TEXT'.
  wa_fldcat-seltext_m = 'Update/Insert'(009).
  wa_fldcat-outputlen = '80'.
  APPEND wa_fldcat TO t_fcat .


ENDFORM.                    " FILL_FIELD_CATALOG
*&---------------------------------------------------------------------*
*&      Form  EVENTTAB_BUILD
*&---------------------------------------------------------------------*


FORM eventtab_build  USING  lt_events TYPE slis_t_event.


* Temporary event work area
  DATA: l_event TYPE slis_alv_event.


* Get events
  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
    EXPORTING
      i_list_type = 0
    IMPORTING
      et_events   = lt_events.


* Read through event table for TOP_OF_PAGE
  READ TABLE lt_events
       WITH KEY name = slis_ev_top_of_page
       INTO l_event.


* If event was found, set form name TOP_OF_PAGE
  IF sy-subrc EQ 0.


    l_event-form = c_formname_top_of_page.  " TOP_OF_PAGE
    APPEND l_event TO lt_events.


  ENDIF.


ENDFORM.                    " EVENTTAB_BUILD


*&------------------------------------------------------------------*
*&      Form TOP OF PAGE
*&------------------------------------------------------------------*
FORM top_of_page .                                          "#EC CALLED


  DATA : lt_list_header TYPE slis_t_listheader,
         lwa_list_header TYPE slis_listheader,
         lw_auart(20) TYPE c,
         lw_success(60) TYPE c.


*dipslaying the total no of records
  lwa_list_header-typ  = 'S'.
  lwa_list_header-key = 'Username'(013).
  lwa_list_header-info = sy-uname.
  APPEND lwa_list_header TO lt_list_header.
  CLEAR lwa_list_header .


*displaying the date
  lwa_list_header-typ  = 'S'.
  lwa_list_header-key = 'Date'(010).
  WRITE sy-datum TO lwa_list_header-info.
  APPEND lwa_list_header TO lt_list_header.
  CLEAR lwa_list_header .


*displaying the time
  lwa_list_header-typ  = 'S'.
  lwa_list_header-key = 'Time'(011).
  WRITE sy-uzeit TO lwa_list_header-info.
  APPEND lwa_list_header TO lt_list_header.
  CLEAR lwa_list_header .


* Calling FM to display the data in the top of page
  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary = lt_list_header.


  FREE : lt_list_header.


ENDFORM.                    "top_of_page

No comments:

Post a Comment

About Me

I have 5+ years experience in SAP ABAP and ABAP CRM.I am working with SAP LABS now.

Search This Blog