ABAP自用代码

*&---------------------------------------------------------------------*
*& Report ZTESTZQ_0606
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_ZYS_ALV_HM.

*定义一个和数据库表构造一样的构造和内表型(第三种全手动的方法)
TYPES:
  BEGIN OF TYP_ZQ,
     CHK           TYPE   SLIS_FIELDNAME,
    ZMATNR     TYPE  ZQ0606-ZMATNR,                                           "品目コード
    ZPRICE1    TYPE  ZQ0606-ZPRICE1,                                           "进货价格
    ZPRICE2    TYPE  ZQ0606-ZPRICE2,                                           "贩卖价格
    ZCURRENCY  TYPE ZQ0606-ZCURRENCY,                                     "货币单位
    ZNUMBER1   TYPE  ZQ0606-ZNUMBER1,                                       "进货数量
    ZNUMBER2   TYPE  ZQ0606-ZNUMBER2,                                       "贩卖数量
    ZRETURN    TYPE  ZQ0606-ZRETURN,                                         "退货数量
    ZSTOCK     TYPE  ZQ0606-ZSTOCK,                                           "库存数量
    ZQUANTITY  TYPE  ZQ0606-ZQUANTITY,                                      "数量单位
    ZTRANSPORT TYPE  ZQ0606-ZTRANSPORT ,                                 "运输方式
  END OF      TYP_ZQ,
  TYP_T_ZQ TYPE STANDARD TABLE OF TYP_ZQ.

*复杂构造的建法
TYPES:
   BEGIN OF TYP_DATA.
     INCLUDE TYPE ZQ0606.
TYPES:
    ZIDINGYI    TYPE  CHAR5,
   END OF TYP_DATA,
   TYP_T_DATA TYPE STANDARD TABLE OF TYP_DATA.



*データ定義
DATA:
  GDT_ZQ      TYPE   TYP_T_ZQ,                      "定义一个和数据库表构造一样的内表
  GDT_DATA   TYPE TYP_T_DATA,
  GDF_ZPRICE1 TYPE    ZQ0606-ZPRICE1,         "定义选择画面的变量
  GT_FIELDCAT  TYPE       SLIS_T_FIELDCAT_ALV,       "定义列栏位属性表
  GDS_VARIANT  TYPE      DISVARIANT.


*選択画面のバリアントへの定義
PARAMETERS:
  P_VAR TYPE SLIS_VARI.

*選択項目の作成
SELECT-OPTIONS:
    S_PRICE1               FOR      GDF_ZPRICE1.

*在填写框后面出现F4
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_VAR.

    GDS_VARIANT-REPORT = SY-REPID.                "变式的程序名



    CALL FUNCTION 'LVC_VARIANT_F4'
       EXPORTING
         IS_VARIANT                =  GDS_VARIANT
*        IT_DEFAULT_FIELDCAT       =
       I_SAVE                    = 'A'
     IMPORTING
*         E_EXIT                    =
        ES_VARIANT                = GDS_VARIANT
     EXCEPTIONS
       NOT_FOUND                 = 1
       PROGRAM_ERROR        = 2
       OTHERS                      = 3.
*如果取出变式,显示在选择画面上               .
     IF SY-SUBRC = 0.
*       Implement suitable error handling here

       P_VAR = GDS_VARIANT-VARIANT.
     ENDIF.

*主処理イベント
START-OF-SELECTION.

*データベースからデータを読み取る
  PERFORM  F_DATAGET.

*フィールドカタログの定義
  PERFORM  F_FIELDCAT_SET
      USING:                                  "注意using后面有冒号,下面有逗号和句号。不要有全角空格。
                 1  'ZMATNR' '品目' '品目コード' '品目コード',
                 2  'ZPRICE1' '进价' '进货价' '进货价格',
                 3  'ZPRICE2' '贩价' '贩卖价' '贩卖价格',
                 4  'ZCURRENCY' '货币单位' '货币单位' '货币单位',
                 5  'ZNUMBER1' '进数' '进货量' '进货数量',
                 6  'ZNUMBER2' '贩数' '贩卖量' '贩卖数量',
                 7  'ZRETURN' '退数' '退货量' '退货数量',
                 8  'ZSTOCK' '库存' '库存量' '库存数量',
                 9  'ZQUANTITY' '数量单位' '数量单位' '数量单位',
                 10  'ZTRANSPORT' '方式' '运输方式' '运输方式'.

  PERFORM F_ALV_OUTPUT.





*&---------------------------------------------------------------------*
*& Form F_DATAGET
*&---------------------------------------------------------------------*
*& データベースからデータを読み取る
*&---------------------------------------------------------------------*
*& -->  ZQ0606
*& <--  GDT_ZQ
*&---------------------------------------------------------------------*
FORM F_DATAGET .
  SELECT
            ZMATNR
            ZPRICE1
            ZPRICE2
            ZCURRENCY
            ZNUMBER1
            ZNUMBER2
            ZRETURN
            ZSTOCK
            ZQUANTITY
           ZTRANSPORT
    INTO  CORRESPONDING FIELDS OF TABLE GDT_ZQ
    FROM ZQ0606
    WHERE ZPRICE1 IN S_PRICE1.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_FIELDCAT_SET
*&---------------------------------------------------------------------*
*フィールドカタログの定義
*&---------------------------------------------------------------------*
*&      --> P_COL
*&      --> P_FIELDNAME
*&      --> P_LTEXT
*&      --> P_MTEXT
*&      --> P_STEXT
*&---------------------------------------------------------------------*
FORM F_FIELDCAT_SET
                USING    VALUE(P_COL)               LIKE      SY-CUCOL                    "  位置          TYPE  I
                              VALUE(P_FIELDNAME)   TYPE     SLIS_FIELDNAME           "  字段名
                              VALUE(P_LTEXT)           LIKE       DD03P-SCRTEXT_L      "  长字符串
                              VALUE(P_MTEXT)          LIKE       DD03P-SCRTEXT_M      "  中字符串
                              VALUE(P_STEXT)           LIKE       DD03P-SCRTEXT_S.     "  短字符串"    TYPE  ANY

*データ定義
  DATA:

    LS_FIELDCAT TYPE       SLIS_FIELDCAT_ALV.         "定义列栏位属性表的构造

*FIELDCATALOG 赋值 到项目名
  LS_FIELDCAT-COL_POS = P_COL.
  LS_FIELDCAT-FIELDNAME = P_FIELDNAME.
  LS_FIELDCAT-TABNAME   = 'GDT_ZQ'.
*  LS_FIELDCAT-REF_FIELDNAME = P_FIELDNAME.
*  LS_FIELDCAT-REF_TABNAME   = 'ZQ0606'.
  LS_FIELDCAT-SELTEXT_L = P_LTEXT.
  LS_FIELDCAT-SELTEXT_M = P_MTEXT.
  LS_FIELDCAT-SELTEXT_S = P_STEXT.

*フィールドカタログの設定
*  IF LS_FIELDCAT-FIELDNAME = 'ZMATNR'.
*    LS_FIELDCAT-HOTSPOT = 'X'.                                 "作为热点显示可触发鼠标触发事件
* ENDIF.

* IF LS_FIELDCAT-FIELDNAME = 'ZMATNR'.
*   LS_FIELDCAT-EMPHASIZE = 'C100'.                              "带有颜色的高亮列(其中X=1-7)颜色同format)
* ENDIF.

IF LS_FIELDCAT-FIELDNAME = 'ZRETURN'.
  LS_FIELDCAT-DO_SUM = ABAP_ON.                                "总计列值总和
ENDIF.

IF LS_FIELDCAT-FIELDNAME = 'ZTRANSPORT'.
  LS_FIELDCAT-EDIT = ABAP_ON.

ENDIF.                             "可编辑


APPEND LS_FIELDCAT TO GT_FIELDCAT.


ENDFORM.

*&---------------------------------------------------------------------*
*& Form F_ALV_OUTPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM F_ALV_OUTPUT .

DATA LG_LAYOUT     TYPE   SLIS_LAYOUT_ALV.         "レイアウト定義

*レイアウト設定
    LG_LAYOUT-ZEBRA = ABAP_ON.                               "斑马线
    LG_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.                    "最优化宽度
    LG_LAYOUT-EDIT = ABAP_ON.                                  "列值可编辑
    LG_LAYOUT-F2CODE = 'F2CODE'.                              "双击事件    type型是sy-ucomm
    LG_LAYOUT-BOX_FIELDNAME = 'CHK'.
    GDS_VARIANT-REPORT = SY-REPID.                "变式的程序名
* GDS_VARIANT-VARIANT = '/AAA'.                   "这样可以把变式定死,进去的时候就显示/AAA,但是不好
    GDS_VARIANT-VARIANT = P_VAR.                  "这样可以进去的时候就显示选择画面上选好的变式


CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
*   I_INTERFACE_CHECK                 = ' '
*   I_BYPASSING_BUFFER                = ' '
*   I_BUFFER_ACTIVE                   = ' '
   I_CALLBACK_PROGRAM                = SY-REPID
   I_CALLBACK_PF_STATUS_SET          = 'F_STATUS_SET'
   I_CALLBACK_USER_COMMAND           = 'F_USERCOMMAND'   "自己建的按钮要想有功能需要user command 响应
   I_CALLBACK_TOP_OF_PAGE            = 'F_TOPPAGE'
*   I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*   I_CALLBACK_HTML_END_OF_LIST       = ' '
*   I_STRUCTURE_NAME                  =
*   I_BACKGROUND_ID                   = ' '
*   I_GRID_TITLE                      =
*   I_GRID_SETTINGS                   =
   IS_LAYOUT                         = LG_LAYOUT
   IT_FIELDCAT                       =  GT_FIELDCAT
*   IT_EXCLUDING                      =
*   IT_SPECIAL_GROUPS                 =
*   IT_SORT                           =
*   IT_FILTER                         =
*   IS_SEL_HIDE                       =
*   I_DEFAULT                         = 'X'
   I_SAVE                            = 'A'
   IS_VARIANT                    = GDS_VARIANT
*   IT_EVENTS                         =
*   IT_EVENT_EXIT                     =
*   IS_PRINT                          =
*   IS_REPREP_ID                      =
*   I_SCREEN_START_COLUMN             = 0
*   I_SCREEN_START_LINE               = 0
*   I_SCREEN_END_COLUMN               = 0
*   I_SCREEN_END_LINE                 = 0
*   I_HTML_HEIGHT_TOP                 = 0
*   I_HTML_HEIGHT_END                 = 0
*   IT_ALV_GRAPHICS                   =
*   IT_HYPERLINK                      =
*   IT_ADD_FIELDCAT                   =
*   IT_EXCEPT_QINFO                   =
*   IR_SALV_FULLSCREEN_ADAPTER        =
*   O_PREVIOUS_SRAL_HANDLER           =
* IMPORTING
*   E_EXIT_CAUSED_BY_CALLER           =
*   ES_EXIT_CAUSED_BY_USER            =
  TABLES
    T_OUTTAB                          = GDT_ZQ
 EXCEPTIONS
   PROGRAM_ERROR                     = 1
   OTHERS                            = 2
          .
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.

*设置功能按钮和菜单栏按钮
FORM F_STATUS_SET
  USING RT_EXTAB  TYPE  SLIS_T_EXTAB.        "ex:除去,是一个除去的表




  DATA    LDS_EXTAB  TYPE  SLIS_EXTAB.       "定义上面除去表的构造

    IF SY-UNAME = 'STC_ZQ'.                   "给账户设置权限
      LDS_EXTAB-FCODE = '&ETA'.                  "当机能code为  &ETA时,添加到除去内表。
      APPEND LDS_EXTAB TO RT_EXTAB.
   ENDIF.

  SET  PF-STATUS  'S100' EXCLUDING RT_EXTAB .  "不要这个表里的数据(除去的方法)

ENDFORM.

*usercommand 响应按钮的动作          只有自己建的按钮才会响应
FORM F_USERCOMMAND
  USING  I_UCOMM  LIKE  SY-UCOMM
             IS_SELFIELD TYPE  SLIS_SELFIELD.           "他是一个构造,包括了双击那行数据的行数、点击那行的字段、点击的值等等

   DATA  LDS_ZQ  TYPE TYP_ZQ.             "定义内表构造
   DATA  LR_GRID TYPE REF TO CL_GUI_ALV_GRID.  "可以在alv修改后同步更新到内表

   CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
*    EXPORTING
*      IR_SALV_FULLSCREEN_ADAPTER       =
    IMPORTING
*      ET_EXCLUDING                     =
*      E_REPID                          =
*      E_CALLBACK_PROGRAM               =
*      E_CALLBACK_ROUTINE               =
      E_GRID                           = LR_GRID
*      ET_FIELDCAT_LVC                  =
*      ER_TRACE                         =
*      E_FLG_NO_HTML                    =
*      ES_LAYOUT_KKBLO                  =
*      ES_SEL_HIDE                      =
*      ET_EVENT_EXIT                    =
*      ER_FORM_TOL                      =
*      ER_FORM_EOL                      =
             .
   CALL METHOD LR_GRID->CHECK_CHANGED_DATA.


  IF I_UCOMM = 'JUMP'.
    WRITE 'JUMP'.
    LEAVE TO LIST-PROCESSING.                  "在alv界面想写write必须加上这个语句


    ELSEIF I_UCOMM = 'F2CODE'.
      READ TABLE GDT_ZQ INTO LDS_ZQ
      INDEX IS_SELFIELD-TABINDEX.                                "把双击的那条数据放到内表里(单条)



      SET PARAMETER ID 'AUN' FIELD LDS_ZQ-ZMATNR.
*      CALL TRANSACTION 'VA03'.                                                       '进入查询界面
      CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.                 "直接进入检索

ENDIF.



CASE I_UCOMM.

  WHEN 'DELETE'.
    LOOP AT GDT_ZQ INTO LDS_ZQ
      WHERE CHK = ABAP_ON.
  IF SY-SUBRC = 0.

     DELETE FROM ZQ0606
     WHERE ZMATNR = LDS_ZQ-ZMATNR.
       IF SY-SUBRC = 0.
          COMMIT WORK AND WAIT.
       ELSE.
           ROLLBACK WORK.
       ENDIF.
      CLEAR LDS_ZQ.
 ENDIF.
ENDLOOP.


  WHEN 'CHANGE'.
   LOOP AT GDT_ZQ INTO LDS_ZQ
      WHERE CHK = ABAP_ON.
   IF SY-SUBRC = 0.
      UPDATE ZQ0606
        SET ZMATNR = LDS_ZQ-ZMATNR
               ZPRICE1 = LDS_ZQ-ZPRICE1
               ZPRICE2 = LDS_ZQ-ZPRICE2
               ZCURRENCY = LDS_ZQ-ZCURRENCY
               ZNUMBER1 = LDS_ZQ-ZNUMBER1
               ZNUMBER2 = LDS_ZQ-ZNUMBER2
               ZRETURN = LDS_ZQ-ZRETURN
               ZSTOCK = LDS_ZQ-ZSTOCK
               ZQUANTITY = LDS_ZQ-ZQUANTITY
               ZTRANSPORT = LDS_ZQ-ZTRANSPORT
         WHERE ZMATNR = LDS_ZQ-ZMATNR.

       IF SY-SUBRC = 0.
          COMMIT WORK AND WAIT.
       ELSE.
           ROLLBACK WORK.
       ENDIF.
      CLEAR LDS_ZQ.
   ENDIF.
ENDLOOP.


WHEN 'SAVE'.

   DATA : GDT_ZQ2 TYPE STANDARD TABLE OF  ZQ0606,
              LDS_ZQ2  TYPE ZQ0606.
    LOOP AT GDT_ZQ INTO LDS_ZQ.
      MOVE-CORRESPONDING LDS_ZQ TO LDS_ZQ2.
      APPEND LDS_ZQ2 TO GDT_ZQ2.
    ENDLOOP.

   LOOP AT GDT_ZQ INTO LDS_ZQ
     WHERE CHK = ABAP_ON.

     READ TABLE GDT_ZQ2 INTO LDS_ZQ2
     WITH KEY ZMATNR = LDS_ZQ-ZMATNR.
   IF SY-SUBRC = 0.
      INSERT  ZQ0606  FROM  LDS_ZQ2.
       IF SY-SUBRC = 0.
          COMMIT WORK AND WAIT.
       ELSE.
           ROLLBACK WORK.
       ENDIF.
      CLEAR LDS_ZQ.
   ENDIF.
 ENDLOOP.

ENDCASE.

ENDFORM.


*定义表头
FORM F_TOPPAGE.
  DATA:
        LST_LIST_HEADER TYPE SLIS_LISTHEADER,                "构造     只有type,key,info字段
        LIT_LIST_HEADER TYPE SLIS_T_LISTHEADER.              "内表    H=HEADER ,S=SELECTION,A=ACTION

  LST_LIST_HEADER-TYP = 'H'.
  LST_LIST_HEADER-INFO = '受注传票'.    "大标题,黑体
  APPEND LST_LIST_HEADER TO LIT_LIST_HEADER.

  LST_LIST_HEADER-TYP  = 'S'.
  LST_LIST_HEADER-KEY = '日付'.             "加黑
  LST_LIST_HEADER-INFO = '2023/05/10'.  "不加黑
  APPEND LST_LIST_HEADER TO LIT_LIST_HEADER.

  LST_LIST_HEADER-TYP  = 'A'.                "斜体
  LST_LIST_HEADER-INFO = '张倩'.
  APPEND LST_LIST_HEADER TO LIT_LIST_HEADER.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      IT_LIST_COMMENTARY       = LIT_LIST_HEADER
*     I_LOGO                   =
*     I_END_OF_LIST_GRID       =
*     I_ALV_FORM               =
            .

ENDFORM.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵奕升

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值