ABAP alv数据修改+单元格变色

*---------------------------------------------------------------------*
* Program   : ZEXT_ISSUE_DOCUMENT_FIX                                 *
* Title     : 问题单据处理                                              *
* Type      : Manually                                                *
* Created by:  xx                                                     *
* Created on:  yyyy/MM/dd                                             *
* Change/Transport Number:                                            *
* Description : 问题单据处理                                            *
*---------------------------------------------------------------------*
* MODIFICATION LOG:                                                   *
* VER  DD/MM/YY  Author         DESCRIPTION      CHANGE REQUEST       *
* ---  --------  -------------  ---------------------- ---------------*
* 000  00/00/00  wh           Initial release                         *
*---------------------------------------------------------------------*
REPORT  ZEXT_ISSUE_DOCUMENT_FIX.

INCLUDE: zext_issue_document_fix_top,   "Defination
         zext_issue_document_fix_sel,   "Selection screen
         zext_issue_document_fix_f01.   "Subroutines

*---------------------------------------------------------------------*
*                        INITIALIZATION                               *
*---------------------------------------------------------------------*
INITIALIZATION.

*---------------------------------------------------------------------*
*                        START-OF-SELECTION                           *
*---------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM f_fetch_data.   "获取数据
  PERFORM f_set_parame.   "ALV字段
  PERFORM f_alv_display.  "ALV输出

*---------------------------------------------------------------------*
*                        END-OF-SELECTION                             *
*---------------------------------------------------------------------*
END-OF-SELECTION.
  PERFORM f_free_memory.
*&---------------------------------------------------------------------*
*&  包括                ZEXT_ISSUE_DOCUMENT_FIX_TOP
*&---------------------------------------------------------------------*

TABLES: crmd_orderadm_h,
        crmd_orderadm_i,
        crmd_link,
        crmd_partner,
        bbp_pdorg,
        bbp_pdtax,
        zext_benefits.


CONSTANTS: gc_e          TYPE c LENGTH 1 VALUE 'E'.

TYPES: BEGIN OF tys_out,
        channel_id    TYPE zext_order_h-channel_id,
        object_id     TYPE crmd_orderadm_h-object_id,
        ext_id        TYPE zext_sc_h-ext_id,
        number_int    TYPE crmd_orderadm_i-number_int,
        guid_set      TYPE crmd_link-guid_set,
        ext_tax_rate  TYPE zext_sc_i-ext_tax_rate,
        partner       TYPE crmd_partner-guid,
        disabled      TYPE crmd_partner-disabled,
        pdorg         TYPE bbp_pdorg-guid,
        proc_org_resp TYPE bbp_pdorg-proc_org_resp,
        proc_org      TYPE bbp_pdorg-proc_org,
        proc_group    TYPE bbp_pdorg-proc_group,
        tax           TYPE bbp_pdtax-guid,
        tax_code      TYPE bbp_pdtax-tax_code,
        bbpsguid      TYPE bbp_pdacc-set_guid,
        g_l_acct      TYPE bbp_pdacc-g_l_acct,
        guid_hi       TYPE crmd_link-guid_hi,
        cellcolor     TYPE lvc_t_scol,"单元格颜色字段
      END OF tys_out.

DATA:   gt_out           TYPE   TABLE OF  tys_out,
        gs_out           TYPE   tys_out.

DATA:   gt_fieldcat      TYPE lvc_t_fcat.
DATA:   gr_grid          TYPE REF TO cl_gui_alv_grid.
DATA:   gv_ret           TYPE char1 VALUE 'X'.
DATA:   gs_cellcolor     TYPE lvc_s_scol,
        gt_zext          TYPE TABLE OF zext_benefits,
        gs_zext          TYPE zext_benefits.
*&---------------------------------------------------------------------*
*&  包括                ZEXT_ISSUE_DOCUMENT_FIX_SEL
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK zsdf1 WITH FRAME TITLE text-s01.

PARAMETERS:     p_cid    LIKE zext_order_h-channel_id AS LISTBOX VISIBLE LENGTH 20 DEFAULT ' '.
SELECT-OPTIONS: s_crmdid FOR crmd_orderadm_h-object_id OBLIGATORY.

SELECTION-SCREEN END OF BLOCK zsdf1.
*&---------------------------------------------------------------------*
*&  包括                ZEXT_ISSUE_DOCUMENT_FIX_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  F_FETCH_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM f_fetch_data .
  DATA: lv_guid_h TYPE crmt_object_guid,
        lv_guid_i TYPE crmt_object_guid.

  SELECT crmd_orderadm_h~guid
         crmd_orderadm_h~object_id
         crmd_orderadm_i~guid
         crmd_orderadm_i~number_int
    FROM crmd_orderadm_h
   INNER JOIN crmd_orderadm_i ON crmd_orderadm_i~header   = crmd_orderadm_h~guid
    INTO (lv_guid_h,gs_out-object_id,lv_guid_i,gs_out-number_int)
   WHERE crmd_orderadm_h~object_id IN s_crmdid.
*External Order ID
    CLEAR: gs_out-ext_id,
           gs_out-channel_id.
    SELECT SINGLE zext_sc_h~ext_id
                  zext_order_h~channel_id
      FROM zext_sc_h
     INNER JOIN zext_order_h ON zext_order_h~orderid = zext_sc_h~ext_id
      INTO (gs_out-ext_id,gs_out-channel_id)
     WHERE zext_sc_h~guid          = lv_guid_h
       AND zext_order_h~channel_id = p_cid.
*External tax
    CLEAR: gs_out-ext_tax_rate.
    SELECT SINGLE ext_tax_rate
      FROM zext_sc_i
      INTO gs_out-ext_tax_rate
     WHERE  zext_sc_i~guid          = lv_guid_i.
*Partner
    CLEAR: gs_out-partner,
           gs_out-disabled.
    SELECT SINGLE crmd_partner~guid
                  crmd_partner~disabled
      FROM crmd_link
     INNER JOIN crmd_partner ON crmd_partner~guid        = crmd_link~guid_set
      INTO (gs_out-partner,gs_out-disabled)
     WHERE crmd_link~guid_hi        = lv_guid_i
       AND crmd_link~objtype_hi     = '06'
       AND crmd_link~objtype_set    = '07'
       AND crmd_partner~partner_fct = '00000019'.
*ORG
    CLEAR: gs_out-pdorg,
           gs_out-proc_org_resp,
           gs_out-proc_org,
           gs_out-proc_group.
    SELECT SINGLE bbp_pdorg~guid
                  bbp_pdorg~proc_org_resp
                  bbp_pdorg~proc_org
                  bbp_pdorg~proc_group
      FROM crmd_link
     INNER JOIN bbp_pdorg ON bbp_pdorg~set_guid = crmd_link~guid_set
      INTO (gs_out-pdorg,gs_out-proc_org_resp,gs_out-proc_org,gs_out-proc_group)
     WHERE crmd_link~guid_hi     = lv_guid_i
       AND crmd_link~objtype_hi  = '06'
       AND crmd_link~objtype_set = '21'.
*Tax code
    CLEAR: gs_out-tax,
           gs_out-tax_code.
    SELECT SINGLE bbp_pdtax~guid
                  bbp_pdtax~tax_code
                  crmd_link~guid_set               
                  crmd_link~guid_hi                 
      FROM crmd_link
     INNER JOIN bbp_pdtax ON bbp_pdtax~set_guid = crmd_link~guid_set
      INTO (gs_out-tax,gs_out-tax_code,gs_out-bbpsguid,gs_out-guid_hi)
     WHERE crmd_link~guid_hi     = lv_guid_i
       AND crmd_link~objtype_hi  = '06'
       AND crmd_link~objtype_set = '34'.
*G_L_ACCT
    CLEAR gs_out-g_l_acct.
    SELECT SINGLE bbp_pdacc~g_l_acct
      FROM crmd_link
     INNER JOIN bbp_pdacc ON bbp_pdacc~set_guid = crmd_link~guid_set
      INTO gs_out-g_l_acct
     WHERE crmd_link~guid_hi     = lv_guid_i
       AND crmd_link~objtype_hi  = '06'
       AND crmd_link~objtype_set = '31'.
    APPEND gs_out TO gt_out.
    CLEAR: gs_out,
           lv_guid_h,
           lv_guid_i.
  ENDSELECT.
  IF gt_out IS NOT INITIAL.
    SORT gt_out BY channel_id ASCENDING
                   object_id  ASCENDING
                   number_int ASCENDING.
  ELSE.
    MESSAGE '未查询到数据!' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.
  SELECT *
    FROM zext_benefits
    INTO TABLE gt_zext.

ENDFORM.                    " F_FETCH_DATA
*&---------------------------------------------------------------------*
*&      Form  F_SET_PARAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM f_set_parame.
  CONSTANTS: lc_structrue TYPE dd02l-tabname VALUE 'ZSRM_ISSUE_DOCUMENT_01',
             lc_x TYPE c LENGTH 1 VALUE 'X'.
  REFRESH  gt_fieldcat.
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name       = lc_structrue
      i_client_never_display = lc_x
    CHANGING
      ct_fieldcat            = gt_fieldcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.
  IF sy-subrc <> 0.
*   程序内部错误,请联系系统管理员!
    EXIT.
  ENDIF.

ENDFORM.                    " F_SET_PARAME
*&---------------------------------------------------------------------*
*&      Form  F_ALV_DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM f_alv_display.
  DATA: ls_layout  TYPE lvc_s_layo.
*      DATA: lv_title   TYPE c LENGTH 6 VALUE '问题单据处理'.
  CONSTANTS: lc_x  TYPE c LENGTH 1 VALUE 'X'.
  DATA: ls_event   TYPE slis_alv_event.
  ls_layout-cwidth_opt = 'X'.
  ls_layout-zebra = 'X'.
  LOOP AT gt_out INTO gs_out.
    READ TABLE gt_zext INTO gs_zext WITH KEY g_l_acct = gs_out-g_l_acct.
    IF sy-subrc = 0 AND gs_out-channel_id = 'EXT_JD'."循环内表,如果数据读取成功并且channel_id = EXT_JD则内表该行的G_L_ACCT字段所在单元格背景变红
      CLEAR gs_cellcolor.
      gs_cellcolor-fname = 'G_L_ACCT'. " 需要变色的字段
      gs_cellcolor-color-col = 6.
      gs_cellcolor-color-int = 1.
      gs_cellcolor-color-inv = 0.
      APPEND gs_cellcolor TO gs_out-cellcolor.
      MODIFY gt_out FROM gs_out.
    ENDIF.
    CLEAR: gs_out,
           gs_zext.
  ENDLOOP.
  ls_layout-ctab_fname = 'CELLCOLOR'. "指定存储颜色的栏位名(可能是报表gt_out 的字段)
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'PF_STATUS_SET'
      i_callback_user_command  = 'USER_COMMAND'
      is_layout_lvc            = ls_layout
      it_fieldcat_lvc          = gt_fieldcat[]
      i_default                = lc_x
      i_save                   = lc_x
    TABLES
      t_outtab                 = gt_out[]
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.

  IF sy-subrc <> 0.
    MESSAGE  text-s03 TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

ENDFORM.                    " F_ALV_DISPLAY

*&---------------------------------------------------------------------*
*&      Form  pf_status_set
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM pf_status_set USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'MAIN_STATUS'.
ENDFORM.                    "PF_STATUS_SET

*&---------------------------------------------------------------------*
*&      Form  user_command
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->UCOMM      text
*      -->SELFIELD   text
*----------------------------------------------------------------------*
FORM user_command USING ucomm    LIKE sy-ucomm
                        selfield TYPE slis_selfield.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'   "接收屏幕ALV,放置容器
    IMPORTING
      e_repid = sy-cprog
      e_grid  = gr_grid.
  CASE ucomm.
    WHEN '&CHANGE'.
      PERFORM f_reset USING selfield.
    WHEN '&DATA_SAVE'.
      PERFORM f_save_data.
*      gv_initial = 'S'.
      PERFORM f_reset USING selfield.
    WHEN 'STOP'.
      LEAVE PROGRAM.
    WHEN OTHERS.
  ENDCASE.
ENDFORM.                    "USER_COMMAND

*&---------------------------------------------------------------------*
*&      Form  FRESET
*&---------------------------------------------------------------------*
*       Reset layout
*----------------------------------------------------------------------*
FORM f_reset USING is_selfield TYPE slis_selfield.

  is_selfield-col_stable = abap_on.   "防止列跑位
  is_selfield-row_stable = abap_on.   "防止行跑位
  is_selfield-refresh    = abap_on.

  PERFORM frm_when_changed.          "刷新ALV网格并保持位置(单元格行列位置不变)

  DATA: ls_layout TYPE lvc_s_layo.

  PERFORM f_mod_fieldcat.
  CALL METHOD gr_grid->set_frontend_fieldcatalog
    EXPORTING
      it_fieldcatalog = gt_fieldcat.

  CLEAR ls_layout.
  "获取ALV变化过后的布局参数
  CALL METHOD gr_grid->get_frontend_layout
    IMPORTING
      es_layout = ls_layout.
  "重新回写自适应宽度
  ls_layout-cwidth_opt = 'X'.
  ls_layout-zebra = 'X'.
  "回写ALV变化过后的布局参数
  CALL METHOD gr_grid->set_frontend_layout
    EXPORTING
      is_layout = ls_layout.
ENDFORM.                    " F_RESET

*&---------------------------------------------------------------------*
*&      Form  frm_when_changed
*&---------------------------------------------------------------------*
*       Reset frm_when_changed
*----------------------------------------------------------------------*
FORM frm_when_changed.
  DATA: ls_stbl TYPE lvc_s_stbl.
  ls_stbl-row = 'X'.
  ls_stbl-col = 'X'.
  CALL METHOD gr_grid->refresh_table_display
    EXPORTING
      is_stable = ls_stbl.
ENDFORM.                 " frm_when_changed

*&---------------------------------------------------------------------*
*&      Form  F_MOD_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM f_mod_fieldcat .
  DATA: ls_fieldcat TYPE lvc_s_fcat.
  LOOP AT gt_fieldcat INTO ls_fieldcat.
    IF ls_fieldcat-fieldname = 'DISABLED'.
      ls_fieldcat-edit       = abap_on.
      MODIFY gt_fieldcat FROM ls_fieldcat.
    ENDIF.
    IF ls_fieldcat-fieldname = 'PROC_ORG_RESP'.
      ls_fieldcat-edit       = abap_on.
      MODIFY gt_fieldcat FROM ls_fieldcat.
    ENDIF.
    IF ls_fieldcat-fieldname = 'PROC_ORG'.
      ls_fieldcat-edit = abap_on.
      MODIFY gt_fieldcat FROM ls_fieldcat.
    ENDIF.
    IF ls_fieldcat-fieldname = 'PROC_GROUP'.
      ls_fieldcat-edit      = abap_on.
      MODIFY gt_fieldcat FROM ls_fieldcat.
    ENDIF.
    IF ls_fieldcat-fieldname = 'TAX_CODE'.
      ls_fieldcat-edit      = abap_on.
      MODIFY gt_fieldcat FROM ls_fieldcat.
    ENDIF.
    CLEAR ls_fieldcat.
  ENDLOOP.
ENDFORM.                    " F_MOD_FIELDCAT

*&---------------------------------------------------------------------*
*&      Form  F_SAVE_DATA
*&---------------------------------------------------------------------*
*       Save data
*----------------------------------------------------------------------*
FORM f_save_data.
  DATA:  lv_err_text TYPE c LENGTH 1000,
         lcx_error   TYPE REF TO cx_root.

  CALL METHOD gr_grid->check_changed_data
    IMPORTING
      e_valid = gv_ret.

  TRY.
      LOOP AT gt_out INTO gs_out.
        UPDATE crmd_partner SET disabled      = gs_out-disabled
                          WHERE guid          = gs_out-partner
                            AND partner_fct   = '00000019'.
        IF sy-subrc = 0.
          COMMIT WORK AND WAIT.
        ELSE.
          ROLLBACK WORK.
        ENDIF.
        UPDATE bbp_pdorg    SET proc_org_resp = gs_out-proc_org_resp
                                proc_org      = gs_out-proc_org
                                proc_group    = gs_out-proc_group
                          WHERE guid          = gs_out-pdorg.
        IF sy-subrc = 0.
          COMMIT WORK AND WAIT.
        ELSE.
          ROLLBACK WORK.
        ENDIF.
        UPDATE bbp_pdtax    SET tax_code      = gs_out-tax_code
                          WHERE set_guid      = gs_out-bbpsguid.
        IF sy-subrc = 0.
          UPDATE bbp_pdigp    SET tax_code      = gs_out-tax_code
                            WHERE guid          = gs_out-guid_hi.
          IF sy-subrc = 0.
            COMMIT WORK AND WAIT.
          ELSE.
            ROLLBACK WORK.
          ENDIF.
        ELSE.
          ROLLBACK WORK.
        ENDIF.
        CLEAR gs_out.
      ENDLOOP.
*      modify znmsmm_t20 from table lt_t20[].
    CATCH cx_sy_open_sql_db INTO lcx_error.
      lv_err_text = lcx_error->get_text( ).  "得到错误信息
      sy-subrc = 4.                          "改变系统变量
  ENDTRY.
  IF sy-subrc = 0.
    COMMIT WORK.
    MESSAGE '修改成功!' TYPE 'S'.
*   保存成功!
  ELSE.
    ROLLBACK WORK.
    MESSAGE lv_err_text TYPE gc_e.
  ENDIF.
ENDFORM.                    "f_save_data

*&---------------------------------------------------------------------*
*&      Form  F_FREE_MEMORY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM f_free_memory .
  FREE: gt_out.
ENDFORM.                    " F_FREE_MEMORY

 

posted @ 2022-09-28 15:45  狂奔的蜗牛君丶  阅读(273)  评论(0)    收藏  举报