*&---------------------------------------------------------------------*
*& 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.