深耕CSDN多年,很少看到SAP ABAP开发的文章,但其实,SAP ERP的项目很多,ABAPer的需求量很大的,而且薪资很高。所以,我这里就破天荒的开个头,也算是SAP行业开发语言ABAP在CSDN的处女行了。。
首先,做过JAVA的朋友都可以体会到,如果会了Java Script,再去学SAP ABAP,那简直简单快乐的不行。。因为SAP的开发语言-ABAP,简单。。。太过于简单了,几乎相当于FOXBASE FOXPRO,因为都是围绕着关系数据库展开的。近些年SAP展开自己的HANA 数据库,才开始慢慢转由ABAP+JAVA,但同时也支持源开发语言ABAP.
无独有偶,台湾鼎新 TIPTOP ERP,采用的是4GL 开发语言,就是ABAP的一个分支。
作为一个前端业务顾问,我也深知,学会SAP ABAP Coding的重要性,起码实际案例项目环境中,DEBUG时不求人。于是我就疯狂的开始了我的ABAP代码之路。
SAP ABAP开发之-smartforms
很多项目要打印,比如公司的出库单要打印,签字,打印5联纸等。销售合同有时也需要打印,盖章发送PDF等,这个时候就需要SAP ABAP画一个smartforms,即表格,以销售发货单的打印为例,源代码Coding如下:
* 创建者:
* 申请者:
*----------------------------------------------------------------------*
* 概要 :1)发货单单打印
*----------------------------------------------------------------------*
* 变更记录
* DESCRIPTION:
* 1.初始开发
* 2012/INS-DAY BY (YAHUA) DEVK900449
* DESCRIPTION:
* 1.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
* 2.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
*
*----------------------------------------------------------------------*
REPORT ZSDP_FHD NO STANDARD PAGE HEADING
LINE-SIZE 255
LINE-COUNT 65
MESSAGE-ID ZSD_DEV.
TABLES:LIKP,LIPS,KNA1,MARA,ZSDT_GSDY,ZSDT_FHINF.
*----------------------------------------------------------------------*
* INCLUDE *
*----------------------------------------------------------------------*
INCLUDE:ZZZI_GI_COMMON.
*----------------------------------------------------------------------*
* TYPE-POOLS *
*----------------------------------------------------------------------*
TYPE-POOLS:SLIS.
*----------------------------------------------------------------------*
* TABLES *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* INTERNAL AND WORKAREA
*----------------------------------------------------------------------*
TYPES: BEGIN OF STYPE_FIELDS, "N599966
FIELDNAME TYPE AIND_STR3-FIELDNAME, "N599966
END OF STYPE_FIELDS.
TYPES:BEGIN OF ty_s_itemsc,
VBELN TYPE LIKP-VBELN,
POSNR TYPE LIPS-POSNR,
MATNR TYPE MARA-MATNR,
arktx TYPE lips-arktx,
lgort TYPE lips-lgort,
LFIMG TYPE LIPS-LFIMG,"交货数量
MSEHL TYPE t006a-MSEHL,"单位
kunnr TYPE kunnr,
kunag TYPE kunnr,
vkorg TYPE vkorg,
ernam TYPE ernam,
mvgr4 TYPE mvgr4,
bezei TYPE bezei,
name1 TYPE name1,
name2 TYPE name1,
name3 TYPE name1,
butxt TYPE butxt,
wadat TYPE likp-wadat,
END OF ty_s_itemsc.
DATA: G_T_FIELDS TYPE STANDARD TABLE OF STYPE_FIELDS.
DATA: save_ok TYPE sy-ucomm.
data:it_t_item type table of ty_s_itemsc,
wa_s_item type ty_s_itemsc.
DATA:WA_ALV TYPE ZSDP_FHD=>GTY_S_OUT,
TB_LIKP TYPE ZSDP_FHD=>GTY_T_LIKP,
WA_LIKP TYPE ZSDP_FHD=>GTY_S_LIKP,
tb_fhd1 TYPE TABLE OF zsdt_fhinf,
wa_fhd1 TYPE zsdt_fhinf,
LT_LIKP TYPE ZSDP_FHD=>GTY_T_LIKP,
LS_LIKP TYPE ZSDP_FHD=>GTY_S_LIKP,
TB_OUT TYPE ZSDP_FHD=>GTY_T_OUT,
WA_OUT TYPE ZSDP_FHD=>GTY_S_OUT.
DATA:FORM_NAME TYPE TDSFNAME VALUE 'ZSD_FHD2'.
DATA: COND(72) TYPE C,
STATUS TYPE N,
IT_COND LIKE TABLE OF COND.
*----------------------------------------------------------------------*
* ALV参数定义
*----------------------------------------------------------------------*
DATA: IT_FIELDCAT TYPE LVC_T_FCAT,
IT_EXCLUDING
TYPE SLIS_T_EXTAB,
IT_EVENTS TYPE SLIS_T_EVENT,
WA_FIELDCAT TYPE LVC_S_FCAT,
WA_LAYOUT TYPE LVC_S_LAYO,
G_REPID TYPE SY-REPID.
DATA: G_RS38L_FNAM TYPE RS38L_FNAM.
DATA: IT_FCODE TYPE TABLE OF SY-UCOMM."GUI用变量
DATA:COS_LINE TYPE I VALUE 6.
"CONTROLS: TC_ITEM TYPE TABLEVIEW USING SCREEN 9000.
*&---------------------------------------------------------------------*
*& INITIALIZATION.
*&---------------------------------------------------------------------*
INITIALIZATION.
G_REPID = SY-REPID.
SELECTION-SCREEN BEGIN OF BLOCK blk_01 WITH FRAME TITLE text-f01.
PARAMETERS:p_new RADIOBUTTON GROUP rb01 USER-COMMAND disp DEFAULT 'X'.
PARAMETERS:p_old RADIOBUTTON GROUP rb01 .
SELECTION-SCREEN END OF BLOCK blk_01.
SELECTION-SCREEN BEGIN OF BLOCK BLK_CRITERIA WITH FRAME TITLE TEXT-F02
.
SELECT-OPTIONS: S_VKORG FOR LIKP-VKORG NO INTERVALS NO-EXTENSION
MODIF ID new,
"销售组织
S_VTWEG FOR LIPS-VTWEG NO INTERVALS NO-EXTENSION
MODIF ID new,
"分销渠道
S_WERKS FOR LIPS-WERKS NO INTERVALS NO-EXTENSION
MODIF ID new,
"工厂
S_VSTEL FOR LIKP-VSTEL NO INTERVALS NO-EXTENSION
MODIF ID new,
"装运点
S_KUNNR FOR LIKP-KUNNR NO INTERVALS NO-EXTENSION
MODIF ID new.
"送达方
SELECT-OPTIONS: S_ERNAM FOR LIKP-ERNAM MODIF ID new,"创建人
S_ERDAT FOR LIKP-ERDAT MODIF ID new,"创建时间
S_LGORT FOR LIPS-LGORT MODIF ID new,"库存地
S_VBELN FOR LIKP-VBELN MATCHCODE OBJECT zsdh_fhqd
MODIF ID new.
"交货单号."发货单.
PARAMETERS: P_CB1 TYPE C AS CHECKBOX .
SELECT-OPTIONS: S_ZNUM FOR ZSDT_FHINF-ZNUM OBLIGATORY NO
INTERVALS
NO-EXTENSION MODIF ID OLD.
SELECTION-SCREEN END OF BLOCK BLK_CRITERIA.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_ZNUM-LOW.
PERFORM frm_getznum_f4 CHANGING S_ZNUM-LOW.
AT SELECTION-SCREEN OUTPUT.
* * 处理录入编辑状态
LOOP AT SCREEN.
IF p_new = 'X'. "新货物运单
IF screen-group1 = 'NEW'.
screen-input = 1.
ENDIF.
IF screen-group1 = 'OLD' .
screen-input = 0.
ENDIF.
CLEAR S_ZNUM .
ELSE. "重复打印货物运单
IF screen-group1 = 'OLD'.
screen-input = 1.
ENDIF.
IF screen-group1 = 'NEW' OR screen-group1 = 'ALL'.
screen-input = 0.
ENDIF.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
*&---------------------------------------------------------------------*
*& AT SELECTION-SCREEN
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.
*在此进行权限对象的检查
START-OF-SELECTION.
"PERFORM FRM_CONSTR_COND.
IF p_new = 'X'.
PERFORM FRM_GET_DATA.
IF TB_LIKP IS NOT INITIAL.
PERFORM FRM_INIT_LAYOUT.
PERFORM FRM_INIT_FIELDCAT.
PERFORM FRM_EVENT_BUILD.
PERFORM FRM_ALV_OUTPUT.
ELSE.
MESSAGE I001(ZSD_DEV).
ENDIF.
ELSE.
PERFORM frm_get_fhinf.
ENDIF.
*&---------------------------------------------------------------------*
*& FORM FRM_GET_DATA
*&---------------------------------------------------------------------*
* 获取需要输出的数据
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .
DATA:LT_KNA1 TYPE ZSDP_FHD=>GTY_T_KNA1,
LS_KNA1 TYPE ZSDP_FHD=>GTY_S_KNA1,
LT_KNA2 TYPE ZSDP_FHD=>GTY_T_KNA1,
LS_KNA2 TYPE ZSDP_FHD=>GTY_S_KNA1,
LT_VBUK TYPE ZSDP_FHD=>GTY_T_VBUK,
LS_VBUK TYPE ZSDP_FHD=>GTY_S_VBUK,
LT_VBAK TYPE ZSDP_FHD=>GTY_T_VBAL,
LS_VBAK TYPE ZSDP_FHD=>GTY_S_VBAL,
LT_T001 TYPE ZSDP_TY2007=>GTY_TB_T001,
LS_T001 TYPE ZSDP_TY2007=>GTY_ST_T001,
LT_LZYK TYPE STANDARD TABLE OF ZSDT_JHXX,
LS_LZYK TYPE ZSDT_JHXX,
LT_TVKOT TYPE ZSDP_FHD=>GTY_T_TVKOT,
LS_TVKOT TYPE ZSDP_FHD=>GTY_S_TVKOT ,
LT_MVKE TYPE ZSDP_FHD=>GTY_T_MVKE,
LS_MVKE TYPE ZSDP_FHD=>GTY_S_MVKE,
LT_TVM4T TYPE ZSDP_FHD=>GTY_T_TVM4T,
LS_TVM4T TYPE ZSDP_FHD=>GTY_S_TVM4T.
DATA:LV_MUM TYPE I,
LV_LINES TYPE I.
SELECT VKORG VTEXT FROM TVKOT
INTO TABLE LT_TVKOT
WHERE SPRAS = '1'.
SORT LT_TVKOT BY VKORG.
SELECT BUKRS DYDMS
INTO TABLE LT_T001
FROM ZSDT_GSDY .
SORT LT_T001 BY BUKRS.
SELECT
LIKP~VBELN
LIKP~VKORG
LIPS~POSNR
LIPS~VTWEG
LIKP~ERNAM
LIKP~ERDAT
LIKP~VSTEL
LIPS~WERKS
LIKP~KUNNR
LIKP~KUNAG
LIKP~WADAT
LIPS~MATNR
LIPS~ARKTX
LIPS~LFIMG
LIPS~VRKME
LIPS~WERKS
LIPS~LGORT
LIPS~VGBEL
LIPS~VGPOS
INTO CORRESPONDING FIELDS OF TABLE TB_LIKP
FROM LIKP INNER JOIN LIPS ON LIKP~VBELN EQ LIPS~VBELN
WHERE LIKP~VBELN IN S_VBELN AND
LIKP~ERNAM IN S_ERNAM AND
LIPS~LGORT IN S_LGORT AND
LIKP~VKORG IN S_VKORG AND
LIPS~WERKS IN S_WERKS AND
LIKP~VSTEL IN S_VSTEL AND
LIKP~KUNNR IN S_KUNNR .
SELECT MATNR MVGR4 FROM MVKE
INTO TABLE LT_MVKE
FOR ALL ENTRIES IN TB_LIKP
WHERE MATNR = TB_LIKP-MATNR.
SORT LT_MVKE BY MATNR.
SELECT MVGR4 BEZEI FROM TVM4T
INTO TABLE LT_TVM4T.
SORT LT_TVM4T BY MVGR4.
SELECT VBELN BUKRS_VF FROM VBAK
INTO TABLE LT_VBAK
FOR ALL ENTRIES IN TB_LIKP
WHERE VBELN = TB_LIKP-VGBEL.
SORT LT_VBAK BY VBELN.
SELECT
KUNNR
NAME1
INTO CORRESPONDING FIELDS OF TABLE LT_KNA1
FROM KNA1
FOR ALL ENTRIES IN TB_LIKP
WHERE KUNNR = TB_LIKP-KUNNR.
SORT LT_KNA1 BY KUNNR.
SELECT
KUNNR
NAME1
INTO CORRESPONDING FIELDS OF TABLE LT_KNA2
FROM KNA1
FOR ALL ENTRIES IN TB_LIKP
WHERE KUNNR = TB_LIKP-KUNAG.
SORT LT_KNA1 BY KUNNR.
LOOP AT TB_LIKP INTO WA_LIKP.
READ TABLE LT_KNA1 INTO LS_KNA1 WITH KEY KUNNR = WA_LIKP-KUNNR
BINARY SEARCH.
IF SY-SUBRC EQ 0.
WA_LIKP-NAME2 = LS_KNA1-NAME1.
ENDIF.
READ TABLE LT_KNA2 INTO LS_KNA2 WITH KEY KUNNR = WA_LIKP-KUNAG
BINARY SEARCH.
IF SY-SUBRC EQ 0.
WA_LIKP-NAME1 = LS_KNA2-NAME1.
ENDIF.
READ TABLE LT_MVKE INTO LS_MVKE WITH KEY MATNR = WA_LIKP-MATNR
BINARY SEARCH.
IF SY-SUBRC EQ 0.
WA_LIKP-MVGR4 = LS_MVKE-MVGR4.
READ TABLE LT_TVM4T INTO LS_TVM4T WITH KEY MVGR4 = WA_LIKP-MVGR4
BINARY SEARCH.
IF SY-SUBRC EQ 0.
WA_LIKP-BEZEI = LS_TVM4T-BEZEI.
ENDIF.
ENDIF.
MODIFY TB_LIKP FROM WA_LIKP TRANSPORTING NAME1 NAME2 MVGR4 BEZEI.
CLEAR:WA_LIKP.
ENDLOOP.
FREE:LT_KNA1.
FREE:LT_LZYK.
SELECT VBELN CMGST
FROM VBUK
INTO TABLE LT_VBUK
FOR ALL ENTRIES IN TB_LIKP
WHERE VBELN = TB_LIKP-VBELN.
SORT LT_VBUK BY VBELN.
SELECT VBELN POSNR LZYKNUM
FROM ZSDT_JHXX
INTO CORRESPONDING FIELDS OF TABLE LT_LZYK
FOR ALL ENTRIES IN TB_LIKP
WHERE VBELN = TB_LIKP-VBELN.
SORT LT_LZYK BY VBELN POSNR.
LOOP AT TB_LIKP INTO WA_LIKP.
READ TABLE LT_VBAK INTO LS_VBAK WITH KEY VBELN = WA_LIKP-VGBEL
.
IF SY-SUBRC EQ 0.
READ TABLE LT_T001 INTO LS_T001 WITH KEY BUKRS =
LS_VBAK-BUKRS_VF .
IF SY-SUBRC EQ 0.
WA_LIKP-BUTXT = LS_T001-DYDMS .
ENDIF.
ENDIF.
READ TABLE LT_VBUK INTO LS_VBUK WITH KEY VBELN = WA_LIKP-VBELN
BINARY SEARCH.
IF SY-SUBRC EQ 0.
WA_LIKP-CMGST = LS_VBUK-CMGST.
ENDIF.
READ TABLE LT_TVKOT INTO LS_TVKOT WITH KEY VKORG = WA_LIKP-VKORG
BINARY SEARCH.
IF SY-SUBRC EQ 0.
WA_LIKP-VTEXT = LS_TVKOT-VTEXT.
ENDIF.
READ TABLE LT_LZYK INTO LS_LZYK WITH KEY VBELN = WA_LIKP-VBELN
POSNR = WA_LIKP-POSNR BINARY SEARCH.
IF SY-SUBRC EQ 0.
WA_LIKP-LZYKNUM = LS_LZYK-LZYKNUM.
ENDIF.
MODIFY TB_LIKP FROM WA_LIKP TRANSPORTING CMGST VTEXT BUTXT LZYKNUM.
CLEAR:WA_LIKP.
ENDLOOP.
SORT tb_likp by vbeln posnr.
FREE:LT_VBUK.
ENDFORM. "FRM_GET_DATA
*&---------------------------------------------------------------------*
*& FORM FRM_INIT_LAYOUT
*&---------------------------------------------------------------------*
* 设置ALV输出格式
*----------------------------------------------------------------------*
FORM FRM_INIT_LAYOUT .
WA_LAYOUT-ZEBRA = 'X'.
WA_LAYOUT-CWIDTH_OPT = 'X'.
WA_LAYOUT-DETAILINIT = 'X'.
WA_LAYOUT-BOX_FNAME = 'CHBOX'.
ENDFORM. "FRM_INIT_LAYOUT
*&---------------------------------------------------------------------*
*& FORM FRM_INIT_FIELDCAT
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
FORM FRM_INIT_FIELDCAT.
CLEAR WA_FIELDCAT. "1 交货单号
WA_FIELDCAT-FIELDNAME = 'VBELN'.
WA_FIELDCAT-REF_TABLE = 'LIKP'.
WA_FIELDCAT-REF_FIELD = 'VBELN'.
WA_FIELDCAT-HOTSPOT = 'X'.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT. "1 交货单号
WA_FIELDCAT-FIELDNAME = 'POSNR'.
"WA_FIELDCAT-REF_TABLE = 'LIKP'.
"WA_FIELDCAT-REF_FIELD = 'POSNR'.
WA_FIELDCAT-SCRTEXT_L = TEXT-006.
WA_FIELDCAT-SCRTEXT_M = TEXT-006.
WA_FIELDCAT-SCRTEXT_S = TEXT-006.
WA_FIELDCAT-HOTSPOT = 'X'.
WA_FIELDCAT-NO_ZERO = 'X'.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT. "5 售达方
WA_FIELDCAT-FIELDNAME = 'NAME2'.
WA_FIELDCAT-REF_TABLE = 'KNA1'.
WA_FIELDCAT-SCRTEXT_L = TEXT-001.
WA_FIELDCAT-SCRTEXT_M = TEXT-001.
WA_FIELDCAT-SCRTEXT_S = TEXT-001.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT. "6 送达方
WA_FIELDCAT-FIELDNAME = 'NAME1'.
WA_FIELDCAT-REF_TABLE = 'KNA1'.
WA_FIELDCAT-SCRTEXT_L = TEXT-002.
WA_FIELDCAT-SCRTEXT_M = TEXT-002.
WA_FIELDCAT-SCRTEXT_S = TEXT-002.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT. "6 送达方
WA_FIELDCAT-FIELDNAME = 'VKORG'.
"WA_FIELDCAT-REF_TABLE = 'TVKOT'.
WA_FIELDCAT-SCRTEXT_L = TEXT-003.
WA_FIELDCAT-SCRTEXT_M = TEXT-003.
WA_FIELDCAT-SCRTEXT_S = TEXT-003.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT. "6 送达方
WA_FIELDCAT-FIELDNAME = 'VTEXT'.
" WA_FIELDCAT-REF_TABLE = 'TVKOT'.
WA_FIELDCAT-SCRTEXT_L = TEXT-004.
WA_FIELDCAT-SCRTEXT_M = TEXT-004.
WA_FIELDCAT-SCRTEXT_S = TEXT-004.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
CLEAR WA_FIELDCAT. "6 送达方
WA_FIELDCAT-FIELDNAME = 'VSTEL'.
WA_FIELDCAT-REF_TABLE = 'LIKP'.
WA_FIELDCAT-SCRTEXT_L = TEXT-005.
WA_FIELDCAT-SCRTEXT_M = TEXT-005.
WA_FIELDCAT-SCRTEXT_S = TEXT-005.
APPEND WA_FIELDCAT TO IT_FIELDCAT.
* CLEAR WA_FIELDCAT. "6 送达方
* WA_FIELDCAT-FIELDNAME = 'VTEXT'.
* "WA_FIELDCAT-REF_TABLE = .
* WA_FIELDCAT-SCRTEXT_L = TEXT-006.
* WA_FIELDCAT-SCRTEXT_M = TEXT-006.
* WA_FIELDCAT-SCRTEXT_S = TEXT-006.
* APPEND WA_FIELDCAT TO IT_FIELDCAT.
* CLEAR WA_FIELDCAT. "6 送达方
* WA_FIELDCAT-FIELDNAME = 'LZYKNUM'.
* WA_FIELDCAT-REF_TABLE = 'ZSDT_JHXX'.
* WA_FIELDCAT-REF_FIELD = 'LZYKNUM'.
* WA_FIELDCAT-EDIT = 'X'.
* WA_FIELDCAT-SCRTEXT_L = TEXT-006.
* WA_FIELDCAT-SCRTEXT_M = TEXT-006.
* WA_FIELDCAT-SCRTEXT_S = TEXT-006.
"APPEND WA_FIELDCAT TO IT_FIELDCAT.
ENDFORM. "FRM_INIT_FIELDCAT
*&---------------------------------------------------------------------*
*& FORM FRM_EVENT_BUILD
*&---------------------------------------------------------------------*
FORM FRM_EVENT_BUILD.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
I_LIST_TYPE = 4
IMPORTING
ET_EVENTS = IT_EVENTS.
DELETE IT_EVENTS WHERE FORM IS INITIAL.
ENDFORM. "FRM_EVENT_BUILD
*&---------------------------------------------------------------------*
*& FORM FRM_ALV_OUTPUT
*&---------------------------------------------------------------------*
* ALV输出报表结果
*----------------------------------------------------------------------*
FORM FRM_ALV_OUTPUT.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = G_REPID
I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
I_CALLBACK_USER_COMMAND = 'ALV_USER_COMMAND'
IS_LAYOUT_LVC = WA_LAYOUT
IT_FIELDCAT_LVC = IT_FIELDCAT
IT_EXCLUDING = IT_EXCLUDING
I_DEFAULT = 'X'
I_SAVE = 'A'
IT_EVENTS = IT_EVENTS
TABLES
T_OUTTAB = TB_LIKP
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.
ENDFORM. "FRM_ALV_OUTPUT
*----------------------------------------------------------------------*
* FORM USER_COMMAND *
*----------------------------------------------------------------------*
FORM ALV_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.
"画面迁移跳转。
CASE R_UCOMM.
WHEN '&BACK' OR '&CANC'.
PERFORM frm_exit_data.
WHEN 'UPDAT'.
PERFORM frm_update_data.
WHEN '&IC1'.
CASE RS_SELFIELD-FIELDNAME.
WHEN 'VBELN'."【销售订单号】按下,画面迁移
SET PARAMETER ID 'VL' FIELD RS_SELFIELD-VALUE.
CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN.
ENDCASE.
* WHEN '&SAVE'.
* PERFORM FRM_SAVE.
ENDCASE.
ENDFORM. "ALV_USER_COMMAND
*----------------------------------------------------------------------*
* FORM PF_STATUS_SET *
*----------------------------------------------------------------------*
FORM PF_STATUS_SET USING I_RT_EXTAB TYPE SLIS_T_EXTAB.
SET PF-STATUS 'ZFHD' EXCLUDING IT_FCODE.
ENDFORM. "PF_STATUS_SET
*&---------------------------------------------------------------------*
*& Form FRM_EXIT_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_EXIT_DATA .
LEAVE TO SCREEN 0.
ENDFORM. " FRM_EXIT_DATA
*&---------------------------------------------------------------------*
*& Form FRM_UPDATE_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM FRM_UPDATE_DATA .
DATA:LT_T006A TYPE ZSDP_FHD=>GTY_T_T006A,
LS_T006A TYPE ZSDP_FHD=>GTY_S_T006A.
DATA:lt_fhd1 TYPE TABLE OF zsdt_fhinf,
ls_fhd1 TYPE zsdt_fhinf.
DATA:L_TABIX TYPE SY-TABIX,
name1 TYPE name1,
name2 TYPE name2,
t_create TYPE String,
erdat TYPE erdat.
FREE:LT_LIKP.
CLEAR:WA_ALV,
WA_FHD1.
LT_LIKP = TB_LIKP.
LOOP AT LT_LIKP INTO LS_LIKP WHERE CHBOX <> 'X'.
L_TABIX = SY-TABIX.
DELETE LT_LIKP FROM L_TABIX TO L_TABIX.
ENDLOOP.
SELECT MSEHI MSEHL
INTO TABLE LT_T006A
FROM T006A
FOR ALL ENTRIES IN LT_LIKP
WHERE MSEHI = LT_LIKP-VRKME AND
SPRAS = '1'.
FREE:it_t_item.
IF LT_LIKP IS NOT INITIAL.
SELECT znum vbeln posnr
into TABLE lt_fhd1
FROM zsdt_fhinf
for all ENTRIES IN lt_likp
WHERE vbeln = lt_likp-vbeln and posnr = lt_likp-posnr
AND lovem <> 'X'.
IF lt_fhd1 IS NOT INITIAL.
MESSAGE e083(ZSD_DEV).
ELSE.
status = '1'.
LOOP AT LT_LIKP INTO ls_likp.
IF ls_likp-CMGST EQ 'B'.
MESSAGE '交货单信用冻结,请释放交货单再打印!' TYPE 'E'.
ENDIF.
wa_s_item-vbeln = ls_likp-vbeln.
wa_s_item-posnr = ls_likp-posnr.
wa_s_item-matnr = ls_likp-matnr.
wa_s_item-arktx = ls_likp-arktx.
wa_s_item-LFIMG = ls_likp-LFIMG.
wa_s_item-lgort = ls_likp-lgort.
wa_s_item-mvgr4 = ls_likp-mvgr4.
wa_s_item-bezei = ls_likp-bezei.
wa_s_item-vkorg = LS_likp-vkorg.
wa_s_item-kunnr = LS_likp-kunnr.
wa_s_item-kunag = LS_likp-kunag.
wa_s_item-LGORT = LS_likp-LGORT.
wa_s_item-name1 = LS_likp-name1.
wa_s_item-name2 = LS_likp-name2.
wa_s_item-name3 = LS_likp-vtext.
wa_s_item-wadat = LS_likp-wadat.
wa_s_item-butxt = LS_likp-butxt.
IF sy-tabix eq 1.
wa_alv-name1 = ls_likp-name1.
wa_alv-name2 = ls_likp-name2.
wa_alv-erdat = ls_likp-WADAT.
ELSE.
IF wa_alv-name1 NE ls_likp-name1 or wa_alv-name2 NE
ls_likp-name2 or wa_alv-erdat ne ls_likp-WADAT.
MESSAGE e077(ZSD_DEV).
ENDIF.
ENDIF.
READ TABLE LT_T006A INTO LS_T006A WITH KEY MSEHI = LS_LIKP-VRKME
BINARY SEARCH.
IF SY-SUBRC EQ 0.
wa_s_ITEM-MSEHL = LS_T006A-MSEHL.
ENDIF.
"wa_s_item-vbeln = ls_likp-vbeln.
APPEND wa_s_item to it_t_item.
wa_alv-name1 = ls_likp-name1.
wa_alv-name2 = ls_likp-name2.
wa_alv-name3 = ls_likp-vtext.
wa_alv-erdat = ls_likp-WADAT.
WA_ALV-BUTXT = LS_likp-BUTXT.
SELECT
ADRP~NAME_TEXT INTO T_CREATE
FROM ADRP INNER JOIN USR21 ON ADRP~PERSNUMBER =
USR21~PERSNUMBER
WHERE USR21~BNAME = sy-uname.
ENDSELECT.
WA_ALV-namex = T_CREATE.
ENDLOOP.
CALL SCREEN 9000.
ENDIF.
ENDIF.
ENDFORM. "FRM_UPDATE_DATA
*&SPWIZARD: DECLARATION OF TABLECONTROL 'TC_ITEM' ITSELF
CONTROLS: TC_ITEM TYPE TABLEVIEW USING SCREEN 9000.
*&SPWIZARD: LINES OF TABLECONTROL 'TC_ITEM'
DATA: G_TC_ITEM_LINES LIKE SY-LOOPC.
DATA: OK_CODE LIKE SY-UCOMM.
*&SPWIZARD: OUTPUT MODULE FOR TC 'TC_ITEM'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE TC_ITEM_CHANGE_TC_ATTR OUTPUT.
DESCRIBE TABLE IT_T_ITEM LINES TC_ITEM-lines.
ENDMODULE. "TC_ITEM_CHANGE_TC_ATTR OUTPUT
*&SPWIZARD: OUTPUT MODULE FOR TC 'TC_ITEM'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: GET LINES OF TABLECONTROL
MODULE TC_ITEM_GET_LINES OUTPUT.
G_TC_ITEM_LINES = SY-LOOPC.
ENDMODULE. "TC_ITEM_GET_LINES OUTPUT
*&SPWIZARD: INPUT MODULE FOR TC 'TC_ITEM'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: PROCESS USER COMMAND
MODULE TC_ITEM_USER_COMMAND INPUT.
OK_CODE = SY-UCOMM.
PERFORM USER_OK_TC USING 'TC_ITEM'
'IT_T_ITEM'
' '
CHANGING OK_CODE.
SY-UCOMM = OK_CODE.
ENDMODULE. "TC_ITEM_USER_COMMAND INPUT
*----------------------------------------------------------------------*
* INCLUDE TABLECONTROL_FORMS *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form USER_OK_TC *
*&---------------------------------------------------------------------*
FORM USER_OK_TC USING P_TC_NAME TYPE DYNFNAM
P_TABLE_NAME
P_MARK_NAME
CHANGING P_OK LIKE SY-UCOMM.
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA: L_OK TYPE SY-UCOMM,
L_OFFSET TYPE I.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
*&SPWIZARD: Table control specific operations *
*&SPWIZARD: evaluate TC name and operations *
SEARCH P_OK FOR P_TC_NAME.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
L_OFFSET = STRLEN( P_TC_NAME ) + 1.
L_OK = P_OK+L_OFFSET.
*&SPWIZARD: execute general and TC specific operations *
CASE L_OK.
WHEN 'INSR'. "insert row
PERFORM FCODE_INSERT_ROW USING P_TC_NAME
P_TABLE_NAME.
CLEAR P_OK.
WHEN 'DELE'. "delete row
PERFORM FCODE_DELETE_ROW USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME.
CLEAR P_OK.
WHEN 'P--' OR "top of list
'P-' OR "previous page
'P+' OR "next page
'P++'. "bottom of list
PERFORM COMPUTE_SCROLLING_IN_TC USING P_TC_NAME
L_OK.
CLEAR P_OK.
* WHEN 'L--'. "total left
* PERFORM FCODE_TOTAL_LEFT USING P_TC_NAME.
*
* WHEN 'L-'. "column left
* PERFORM FCODE_COLUMN_LEFT USING P_TC_NAME.
*
* WHEN 'R+'. "column right
* PERFORM FCODE_COLUMN_RIGHT USING P_TC_NAME.
*
* WHEN 'R++'. "total right
* PERFORM FCODE_TOTAL_RIGHT USING P_TC_NAME.
*
WHEN 'MARK'. "mark all filled lines
PERFORM FCODE_TC_MARK_LINES USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME .
CLEAR P_OK.
WHEN 'DMRK'. "demark all filled lines
PERFORM FCODE_TC_DEMARK_LINES USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME .
CLEAR P_OK.
* WHEN 'SASCEND' OR
* 'SDESCEND'. "sort column
* PERFORM FCODE_SORT_TC USING P_TC_NAME
* l_ok.
ENDCASE.
ENDFORM. " USER_OK_TC
*&---------------------------------------------------------------------*
*& Form FCODE_INSERT_ROW *
*&---------------------------------------------------------------------*
FORM fcode_insert_row
USING P_TC_NAME TYPE DYNFNAM
P_TABLE_NAME .
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA L_LINES_NAME LIKE FELD-NAME.
DATA L_SELLINE LIKE SY-STEPL.
DATA L_LASTLINE TYPE I.
DATA L_LINE TYPE I.
DATA L_TABLE_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE CXTAB_CONTROL.
FIELD-SYMBOLS <TABLE> TYPE STANDARD TABLE.
FIELD-SYMBOLS <LINES> TYPE I.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (P_TC_NAME) TO <TC>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body
ASSIGN (L_TABLE_NAME) TO <TABLE>. "not headerline
*&SPWIZARD: get looplines of TableControl *
CONCATENATE 'G_' P_TC_NAME '_LINES' INTO L_LINES_NAME.
ASSIGN (L_LINES_NAME) TO <LINES>.
*&SPWIZARD: get current line *
GET CURSOR LINE L_SELLINE.
IF SY-SUBRC <> 0. " append line to table
L_SELLINE = <TC>-LINES + 1.
*&SPWIZARD: set top line *
IF L_SELLINE > <LINES>.
<TC>-TOP_LINE = L_SELLINE - <LINES> + 1 .
ELSE.
<TC>-TOP_LINE = 1.
ENDIF.
ELSE. " insert line into table
L_SELLINE = <TC>-TOP_LINE + L_SELLINE - 1.
L_LASTLINE = <TC>-TOP_LINE + <LINES> - 1.
ENDIF.
*&SPWIZARD: set new cursor line *
L_LINE = L_SELLINE - <TC>-TOP_LINE + 1.
*&SPWIZARD: insert initial line *
INSERT INITIAL LINE INTO <TABLE> INDEX L_SELLINE.
<TC>-LINES = <TC>-LINES + 1.
*&SPWIZARD: set cursor *
SET CURSOR LINE L_LINE.
ENDFORM. " FCODE_INSERT_ROW
*&---------------------------------------------------------------------*
*& Form FCODE_DELETE_ROW *
*&---------------------------------------------------------------------*
FORM fcode_delete_row
USING P_TC_NAME TYPE DYNFNAM
P_TABLE_NAME
P_MARK_NAME .
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA L_TABLE_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE cxtab_control.
FIELD-SYMBOLS <TABLE> TYPE STANDARD TABLE.
FIELD-SYMBOLS <WA>.
FIELD-SYMBOLS <MARK_FIELD>.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (P_TC_NAME) TO <TC>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body
ASSIGN (L_TABLE_NAME) TO <TABLE>. "not headerline
*&SPWIZARD: delete marked lines *
DESCRIBE TABLE <TABLE> LINES <TC>-LINES.
LOOP AT <TABLE> ASSIGNING <WA>.
*&SPWIZARD: access to the component 'FLAG' of the table header *
ASSIGN COMPONENT P_MARK_NAME OF STRUCTURE <WA> TO <MARK_FIELD>.
IF <MARK_FIELD> = 'X'.
DELETE <TABLE> INDEX SYST-TABIX.
IF SY-SUBRC = 0.
<TC>-LINES = <TC>-LINES - 1.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. " FCODE_DELETE_ROW
*&---------------------------------------------------------------------*
*& Form COMPUTE_SCROLLING_IN_TC
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_TC_NAME name of tablecontrol
* -->P_OK ok code
*----------------------------------------------------------------------*
FORM COMPUTE_SCROLLING_IN_TC USING P_TC_NAME
P_OK.
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA L_TC_NEW_TOP_LINE TYPE I.
DATA L_TC_NAME LIKE FELD-NAME.
DATA L_TC_LINES_NAME LIKE FELD-NAME.
DATA L_TC_FIELD_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE cxtab_control.
FIELD-SYMBOLS <LINES> TYPE I.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (P_TC_NAME) TO <TC>.
*&SPWIZARD: get looplines of TableControl *
CONCATENATE 'G_' P_TC_NAME '_LINES' INTO L_TC_LINES_NAME.
ASSIGN (L_TC_LINES_NAME) TO <LINES>.
*&SPWIZARD: is no line filled? *
IF <TC>-LINES = 0.
*&SPWIZARD: yes, ... *
L_TC_NEW_TOP_LINE = 1.
ELSE.
*&SPWIZARD: no, ... *
CALL FUNCTION 'SCROLLING_IN_TABLE'
EXPORTING
ENTRY_ACT = <TC>-TOP_LINE
ENTRY_FROM = 1
ENTRY_TO = <TC>-LINES
LAST_PAGE_FULL = 'X'
LOOPS = <LINES>
OK_CODE = P_OK
OVERLAPPING = 'X'
IMPORTING
ENTRY_NEW = L_TC_NEW_TOP_LINE
EXCEPTIONS
* NO_ENTRY_OR_PAGE_ACT = 01
* NO_ENTRY_TO = 02
* NO_OK_CODE_OR_PAGE_GO = 03
OTHERS = 0.
ENDIF.
*&SPWIZARD: get actual tc and column *
GET CURSOR FIELD L_TC_FIELD_NAME
AREA L_TC_NAME.
IF SYST-SUBRC = 0.
IF L_TC_NAME = P_TC_NAME.
*&SPWIZARD: et actual column *
SET CURSOR FIELD L_TC_FIELD_NAME LINE 1.
ENDIF.
ENDIF.
*&SPWIZARD: set the new top line *
<TC>-TOP_LINE = L_TC_NEW_TOP_LINE.
ENDFORM. " COMPUTE_SCROLLING_IN_TC
*&---------------------------------------------------------------------*
*& Form FCODE_TC_MARK_LINES
*&---------------------------------------------------------------------*
* marks all TableControl lines
*----------------------------------------------------------------------*
* -->P_TC_NAME name of tablecontrol
*----------------------------------------------------------------------*
FORM FCODE_TC_MARK_LINES USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME.
*&SPWIZARD: EGIN OF LOCAL DATA-----------------------------------------*
DATA L_TABLE_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE cxtab_control.
FIELD-SYMBOLS <TABLE> TYPE STANDARD TABLE.
FIELD-SYMBOLS <WA>.
FIELD-SYMBOLS <MARK_FIELD>.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (P_TC_NAME) TO <TC>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body
ASSIGN (L_TABLE_NAME) TO <TABLE>. "not headerline
*&SPWIZARD: mark all filled lines *
LOOP AT <TABLE> ASSIGNING <WA>.
*&SPWIZARD: access to the component 'FLAG' of the table header *
ASSIGN COMPONENT P_MARK_NAME OF STRUCTURE <WA> TO <MARK_FIELD>.
<MARK_FIELD> = 'X'.
ENDLOOP.
ENDFORM. "fcode_tc_mark_lines
*&---------------------------------------------------------------------*
*& Form FCODE_TC_DEMARK_LINES
*&---------------------------------------------------------------------*
* demarks all TableControl lines
*----------------------------------------------------------------------*
* -->P_TC_NAME name of tablecontrol
*----------------------------------------------------------------------*
FORM FCODE_TC_DEMARK_LINES USING P_TC_NAME
P_TABLE_NAME
P_MARK_NAME .
*&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------*
DATA L_TABLE_NAME LIKE FELD-NAME.
FIELD-SYMBOLS <TC> TYPE cxtab_control.
FIELD-SYMBOLS <TABLE> TYPE STANDARD TABLE.
FIELD-SYMBOLS <WA>.
FIELD-SYMBOLS <MARK_FIELD>.
*&SPWIZARD: END OF LOCAL DATA------------------------------------------*
ASSIGN (P_TC_NAME) TO <TC>.
*&SPWIZARD: get the table, which belongs to the tc *
CONCATENATE P_TABLE_NAME '[]' INTO L_TABLE_NAME. "table body
ASSIGN (L_TABLE_NAME) TO <TABLE>. "not headerline
*&SPWIZARD: demark all filled lines *
LOOP AT <TABLE> ASSIGNING <WA>.
*&SPWIZARD: access to the component 'FLAG' of the table header *
ASSIGN COMPONENT P_MARK_NAME OF STRUCTURE <WA> TO <MARK_FIELD>.
<MARK_FIELD> = SPACE.
ENDLOOP.
ENDFORM. "fcode_tc_mark_lines
*&---------------------------------------------------------------------*
*& Module MOD_SET_STATUS OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE MOD_SET_STATUS OUTPUT.
IF WA_FHD1-ZNUM IS INITIAL.
APPEND 'PRINT' TO it_fcode.
ELSE.
IF it_t_item is not INITIAL. "如无明细,则不能打印不能保存。
CLEAR:it_fcode.
APPEND 'SAVE' TO it_fcode.
"APPEND 'PRINT' TO it_fcode.
ENDIF.
ENDIF.
SET PF-STATUS 'STATUS_9000' EXCLUDING it_fcode.
SET TITLEBAR 'TIT_9000'.
*
* IF STATUS EQ '1'."CREATE
* SET PF-STATUS 'STATUS_9000'.
* ELSEIF STATUS EQ '2'."MODIFY
* SET PF-STATUS 'STATUS_9000M'.
"ENDIF.
ENDMODULE. "MOD_SET_STATUS OUTPUT
*&---------------------------------------------------------------------*
*& Form FRM_GET_NUM
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM FRM_GET_NUM .
DATA:lw_nriv TYPE nriv,
lw_inri TYPE inri,
* DATA:l_datum TYPE sy-datum,
l_ignore_buffer TYPE c.
"数据初始化
lw_inri-object = 'ZV_FHD1'.
lw_inri-nrrangenr = '01'.
lw_inri-quantity = 1.
l_ignore_buffer = 'X'.
"加锁
CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'
EXPORTING
object = lw_inri-object
EXCEPTIONS
foreign_lock = 1
object_not_found = 2
system_failure = 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.
"获取货物运单号流水码
SELECT SINGLE *
INTO lw_nriv
FROM nriv
WHERE object = lw_inri-object
AND nrrangenr = lw_inri-nrrangenr.
IF sy-subrc NE 0.
"MESSAGE e009.
ENDIF.
"获取序列号
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
nr_range_nr = lw_inri-nrrangenr
object = lw_inri-object
quantity = lw_inri-quantity
* subobject =
* toyear =
ignore_buffer = l_ignore_buffer
IMPORTING
number = WA_FHD1-ZNUM
EXCEPTIONS
interval_not_found = 1
number_range_not_intern = 2
object_not_found = 3
quantity_is_0 = 4
quantity_is_not_1 = 5
interval_overflow = 6
buffer_overflow = 7
OTHERS = 8.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
LOOP AT it_t_item INTO wa_s_item.
wa_fhd1-vbeln = wa_s_item-vbeln .
wa_fhd1-posnr = wa_s_item-posnr .
wa_fhd1-matnr = wa_s_item-matnr .
wa_fhd1-arktx = wa_s_item-arktx .
wa_fhd1-kunnr = wa_s_item-kunnr .
wa_fhd1-kunag = wa_s_item-kunag .
wa_fhd1-vkorg = wa_s_item-vkorg .
wa_fhd1-ernam = sy-uname.
wa_fhd1-cpudt = sy-datum.
wa_fhd1-name1 = wa_s_item-name1 .
wa_fhd1-name2 = wa_s_item-name2 .
wa_fhd1-name3 = wa_s_item-name3 .
wa_fhd1-lfimg = wa_s_item-lfimg .
wa_fhd1-MSEHL = wa_s_item-MSEHL .
wa_fhd1-lgort = wa_s_item-lgort .
wa_fhd1-butxt = wa_s_item-butxt .
wa_fhd1-wadat = wa_s_item-wadat .
APPEND wa_fhd1 to tb_fhd1.
ENDLOOP.
CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'
EXPORTING
object = lw_inri-object
EXCEPTIONS
object_not_found = 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.
MODIFY ZSDT_FHINF FROM TABLE tb_fhd1.
IF sy-subrc eq 0.
MESSAGE '保存成功' type 'I'.
ELSE.
MESSAGE '保存不成功' type 'I'.
ENDIF.
ENDFORM. " FRM_GET_NUM
*&---------------------------------------------------------------------*
*& Form FRM_SAVE_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM FRM_SAVE_DATA .
IF wa_fhd1-ZNUM IS INITIAL and it_t_item is NOT INITIAL.
PERFORM FRM_GET_NUM.
ELSE.
MESSAGE E085(ZSD_DEV) .
ENDIF.
ENDFORM. " FRM_SAVE_DATA
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_9000 INPUT.
save_ok = ok_code.
CLEAR:ok_code.
CASE save_ok.
WHEN 'SAVE'.
PERFORM FRM_SAVE_DATA.
WHEN 'PRINT'.
IF wa_fhd1-ZNUM IS NOT INITIAL AND it_t_item IS NOT INITIAL.
PERFORM FRM_PRINT_DATA.
ENDIF.
WHEN 'EXIT'.
FREE IT_T_ITEM.
LEAVE PROGRAM.
WHEN 'BACK' OR 'CANC'.
FREE IT_T_ITEM.
LEAVE TO SCREEN 0.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
ENDMODULE. " USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
*& Form FRM_PRINT_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_PRINT_DATA .
DATA :LTB_ALV TYPE ZSDP_FHD=>GTY_T_OUT,
LST_ALV TYPE ZSDP_FHD=>GTY_S_OUT,
LT_ALV TYPE ZSDP_FHD=>GTY_T_OUT,
LS_ALV TYPE ZSDP_FHD=>GTY_S_OUT,
* LT_LIKP TYPE ZSDP_FHD=>GTY_T_LIKP,
* LS_LIKP TYPE ZSDP_FHD=>GTY_S_LIKP,
* LS_LIPS TYPE ZSDP_FHD=>GTY_S_LIKP,
LT_T006A TYPE ZSDP_FHD=>GTY_T_T006A,
LS_T006A TYPE ZSDP_FHD=>GTY_S_T006A,
LS_ITEM TYPE ZSDT_SOP,
LT_ITEM TYPE STANDARD TABLE OF ZSDT_SOP,
LST_ITEM TYPE ZSDT_SOP,
LTB_ITEM TYPE ZSDTT_SOP.
DATA: LV_TABIX TYPE SY-TABIX,
L_TABIX TYPE SY-TABIX,
L_INDEX TYPE SY-TABIX,
LV_MUM TYPE I,
LV_LINES TYPE I,
LV_LINE TYPE I,
LV_COUNT TYPE I,
LV_MOD7 TYPE I,
NUM_LINE TYPE I,
NOW_COUNT TYPE I,
LV_QUENCE TYPE I VALUE 0,
COUNT TYPE LFIMG,
COUNT_BY TYPE LFIMG,
name4 TYPE txt255,
flag TYPE i,
LV_S TYPE I.
DATA:T_CREATE TYPE STRING.
LOOP AT it_t_item INTO wa_s_item.
LS_ITEM-VBELN = wa_s_item-VBELN.
LS_ITEM-POSNR = wa_s_item-POSNR.
LS_ITEM-MATNR = wa_s_item-MATNR.
LS_ITEM-ARKTX = wa_s_item-ARKTX.
LS_ITEM-LGORT = wa_s_item-LGORT.
LS_ITEM-LFIMG = wa_s_item-LFIMG.
LS_ITEM-MSEHL = wa_s_item-MSEHL.
LS_ITEM-MVGR4 = wa_s_item-MVGR4.
LS_ITEM-BEZEI = wa_s_item-BEZEI.
APPEND LS_ITEM TO LT_ITEM.
AT END OF vbeln .
flag = flag + 1.
IF flag eq 1.
name4 = wa_s_item-VBELN.
ELSE.
CONCATENATE name4 wa_s_item-VBELN into name4
SEPARATED BY '/'.
ENDIF.
ENDAT.
ENDLOOP.
move wa_alv to ls_alv.
ls_alv-item = lt_item.
ls_alv-vbeln = wa_fhd1-znum.
ls_alv-GMZBH = wa_fhd1-txt255.
"ls_alv-name = wa_fhd1-namer.
ls_alv-name4 = name4.
APPEND ls_alv to lt_alv.
FREE:lt_item .
IF P_CB1 EQ 'X' .
COS_LINE = 10.
LOOP AT LT_ALV INTO LS_ALV.
SORT LS_ALV-ITEM BY MVGR4.
move LS_ALV-ITEM TO LT_ITEM.
LOOP AT LS_ALV-ITEM INTO LS_ITEM.
COUNT = COUNT + LS_ITEM-LFIMG.
MOVE LS_ITEM TO LST_ITEM.
COUNT_BY = COUNT_BY + LST_ITEM-LFIMG.
AT END OF MVGR4.
CLEAR LST_ITEM-MATNR.
LST_ITEM-ARKTX = LST_ITEM-BEZEI.
LST_ITEM-LFIMG = COUNT_BY.
CLEAR:count_by.
APPEND LST_ITEM TO LT_ITEM.
CLEAR:LST_ITEM.
ENDAT.
ENDLOOP.
SORT LT_ITEM BY MVGR4.
DESCRIBE TABLE LT_ITEM LINES LV_MUM.
LV_LINES = LV_MUM MOD COS_LINE.
IF LV_LINES NE 0.
LV_LINES = COS_LINE - LV_LINES.
DO LV_LINES TIMES.
APPEND INITIAL LINE TO LT_ITEM.
CLEAR LV_LINES.
CLEAR LV_MUM.
ENDDO.
ENDIF.
LS_ALV-ITEM = LT_ITEM.
LS_ALV-LFIMG = COUNT.
FREE:LT_ITEM.
MODIFY LT_ALV FROM LS_ALV.
CLEAR:LS_ALV,COUNT.
ENDLOOP.
FORM_NAME = 'ZSD_FHD2'.
ELSE.
COS_LINE = 6.
FORM_NAME = 'ZSD_FHD2'.
LOOP AT LT_ALV INTO LS_ALV.
MOVE LS_ALV-ITEM TO LT_ITEM.
DESCRIBE TABLE LS_ALV-ITEM LINES LV_MUM.
LV_LINES = LV_MUM MOD COS_LINE.
IF LV_LINES NE 0.
LV_LINES = COS_LINE - LV_LINES.
DO LV_LINES TIMES.
APPEND INITIAL LINE TO LT_ITEM.
CLEAR LV_LINES.
CLEAR LV_MUM.
ENDDO.
ENDIF.
LS_ALV-ITEM = LT_ITEM.
FREE:LT_ITEM.
MODIFY LT_ALV FROM LS_ALV.
CLEAR:LS_ALV.
ENDLOOP.
ENDIF.
SORT LT_ALV BY VBELN .
LOOP AT LT_ALV INTO LS_ALV.
LV_S = 0.
MOVE LS_ALV TO LST_ALV.
IF LST_ALV-CMGST EQ 'B'.
MESSAGE '交货单信用冻结,请释放交货单再打印!' TYPE 'E'.
ENDIF.
DESCRIBE TABLE LST_ALV-ITEM LINES LV_LINE.
NUM_LINE = LV_LINE / COS_LINE .
WA_OUT-COUNT = NUM_LINE ."总页数
LOOP AT LST_ALV-ITEM INTO LST_ITEM.
LV_COUNT = LV_COUNT + 1.
LV_MOD7 = LV_COUNT MOD COS_LINE.
LV_QUENCE = LV_QUENCE + 1.
COUNT = COUNT + LST_ITEM-LFIMG.
IF LST_ITEM-ARKTX IS INITIAL.
LV_S = LV_S + 1.
IF LV_S EQ 1.
LST_ITEM-ARKTX = '以下空白//'.
ENDIF.
ENDIF.
SHIFT LST_ITEM-MATNR LEFT DELETING LEADING '0'.
LST_ITEM-ZEILI = LV_QUENCE.
APPEND LST_ITEM TO LTB_ITEM.
CLEAR LST_ITEM .
IF LV_MOD7 EQ 0.
NOW_COUNT = NOW_COUNT + 1.
WA_OUT-PAGE = NOW_COUNT.
WA_OUT-VBELN = LST_ALV-VBELN.
WA_OUT-WADAT = LST_ALV-WADAT.
WA_OUT-NAME = LST_ALV-NAME.
WA_OUT-NAME1 = LST_ALV-NAME1.
WA_OUT-NAME2 = LST_ALV-NAME2.
WA_OUT-CMGST = LST_ALV-CMGST.
WA_OUT-VTEXT = LST_ALV-VTEXT.
WA_OUT-BUTXT = LST_ALV-BUTXT.
WA_OUT-ERDAT = LST_ALV-ERDAT.
WA_OUT-NAME3 = LST_ALV-NAME3.
WA_OUT-GMZBH = LST_ALV-GMZBH.
WA_OUT-NAMEX = LST_ALV-NAMEX.
WA_OUT-NAME4 = LST_ALV-NAME4.
WA_OUT-ITEM = LTB_ITEM.
AT END OF VBELN.
WA_OUT-LFIMG = count.
WA_OUT-LFIMG1 = lst_alv-LFIMG.
ENDAT.
APPEND WA_OUT TO TB_OUT.
CLEAR LTB_ITEM.
CLEAR LV_MOD7.
CLEAR :LV_QUENCE,
LV_COUNT.
FREE:LTB_ITEM.
ENDIF.
ENDLOOP.
CLEAR :LV_LINE,
LS_ALV,
NUM_LINE,
NOW_COUNT.
ENDLOOP.
SORT TB_OUT BY VBELN POSNR.
PERFORM FRM_PRINTNAME.
PERFORM FRM_PRINTEXEC.
ENDFORM. " FRM_PRINT_DATA
FORM FRM_PRINTNAME.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
FORMNAME = FORM_NAME
IMPORTING
FM_NAME = G_RS38L_FNAM
EXCEPTIONS
NO_FORM = 1
NO_FUNCTION_MODULE = 2
OTHERS = 3.
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. "PRINTNAME
FORM FRM_PRINTEXEC.
CALL FUNCTION G_RS38L_FNAM
EXPORTING
GT_OUTPUT = TB_OUT
EXCEPTIONS
FORMATTING_ERROR = 1
INTERNAL_ERROR = 2
SEND_ERROR = 3
USER_CANCELED = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
FREE:TB_OUT.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GETZNUM_F4
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_S_ZNUM_LOW text
*----------------------------------------------------------------------*
FORM FRM_GETZNUM_F4 CHANGING FC_S_ZNUM.
DATA: BEGIN OF lt_fhinf OCCURS 0,
ZNUM TYPE zsdt_fhinf-ZNUM,
kunnr TYPE zsdt_fhinf-kunnr,
name1 TYPE zsdt_fhinf-name1,
cpudt TYPE zsdt_fhinf-cpudt,
END OF lt_fhinf ,
lt_fields LIKE help_value OCCURS 1 WITH HEADER LINE,
lp_fhinf LIKE help_info-fldvalue.
IF FC_S_ZNUM IS NOT INITIAL.
SELECT znum kunnr name1 cpudt
INTO TABLE lt_fhinf
FROM zsdt_fhinf
WHERE znum = FC_S_ZNUM AND lovem <> 'X'.
ELSE.
SELECT znum kunnr name1 cpudt
INTO TABLE lt_fhinf
FROM zsdt_fhinf.
ENDIF.
IF sy-subrc <> 0 .
MESSAGE s001 DISPLAY LIKE 'E'.
ENDIF .
DELETE ADJACENT DUPLICATES FROM lt_fhinf COMPARING ALL FIELDS.
"条件里,选择发货单时,倒序排序
SORT lt_fhinf BY znum DESCENDING.
CLEAR lt_fields.
lt_fields-tabname = 'ZSDT_FHINF'.
lt_fields-fieldname = 'ZNUM'.
lt_fields-selectflag = 'X'.
APPEND lt_fields.
lt_fields-tabname = 'ZSDT_FHINF'.
lt_fields-fieldname = 'KUNNR'.
lt_fields-selectflag = ' '.
APPEND lt_fields.
lt_fields-tabname = 'ZSDT_FHINF'.
lt_fields-fieldname = 'NAME1'.
lt_fields-selectflag = ' '.
APPEND lt_fields.
lt_fields-tabname = 'ZSDT_FHINF'.
lt_fields-fieldname = 'CPUDT'.
lt_fields-selectflag = ' '.
APPEND lt_fields.
CALL FUNCTION 'HELP_VALUES_GET_NO_DD_NAME'
EXPORTING
selectfield = 'LT_FHINF-ZNUM'
no_pers_help_select = 'X'
write_selectfield_in_colours = 'X'
reduced_status_only = 'X'
IMPORTING
select_value = lp_fhinf
TABLES
fields = lt_fields
full_table = lt_fhinf
EXCEPTIONS
full_table_empty = 1
no_tablestructure_given = 2
no_tablefields_in_dictionary = 3
more_then_one_selectfield = 4
no_selectfield = 5
OTHERS = 6.
IF sy-subrc EQ 0.
MOVE lp_fhinf TO FC_S_ZNUM.
ENDIF.
FREE:lt_fhinf,lt_fields,lp_fhinf.
ENDFORM. " FRM_GETZNUM_F4
FORM FRM_GET_FHINF .
TYPES:BEGIN OF TY_S1_ITEMSC,
ZNUM TYPE ZSDT_FHINF-ZNUM,
VBELN TYPE LIKP-VBELN,
POSNR TYPE LIPS-POSNR,
MATNR TYPE MARA-MATNR,
arktx TYPE lips-arktx,
lgort TYPE lips-lgort,
LFIMG TYPE LIPS-LFIMG,"交货数量
MSEHL TYPE t006a-MSEHL,"单位
kunnr TYPE kunnr,
kunag TYPE kunnr,
vkorg TYPE vkorg,
ernam TYPE ernam,
mvgr4 TYPE mvgr4,
bezei TYPE bezei,
name1 TYPE name1,
name2 TYPE name1,
name3 TYPE name1,
butxt TYPE butxt,
wadat TYPE likp-wadat,
txt255 TYPE txt255,
LOVEM TYPE ZSDT_FHINF-LOVEM,"删除标识
END OF TY_S1_ITEMSC.
DATA: LT_FHEMSC TYPE TABLE OF TY_S1_ITEMSC,
LS_FHEMSC1 TYPE TY_S1_ITEMSC,
LS_FHEMSC TYPE TY_S1_ITEMSC.
FREE:IT_T_item.
CLEAR:wa_fhd1.
SELECT ZNUM vbeln posnr matnr arktx lfimg lovem MSEHL butxt lgort
vkorg kunnr kunag name1 name2 name3 txt255 wadat ernam
mvgr4 bezei
FROM zsdt_fhinf
INTO CORRESPONDING FIELDS OF TABLE LT_FHEMSC
WHERE znum in s_znum and lovem <> 'X'.
IF LT_FHEMSC IS NOT INITIAL.
LOOP AT LT_FHEMSC INTO LS_FHEMSC.
wa_s_item-vbeln = LS_FHEMSC-vbeln.
wa_s_item-posnr = LS_FHEMSC-posnr.
wa_s_item-matnr = LS_FHEMSC-matnr.
wa_s_item-arktx = LS_FHEMSC-arktx.
wa_s_item-LFIMG = LS_FHEMSC-LFIMG.
wa_s_item-lgort = LS_FHEMSC-lgort.
wa_s_item-mvgr4 = LS_FHEMSC-mvgr4.
wa_s_item-bezei = LS_FHEMSC-bezei.
wa_s_item-vkorg = LS_FHEMSC-vkorg.
wa_s_item-kunnr = LS_FHEMSC-kunnr.
wa_s_item-kunag = LS_FHEMSC-kunag.
wa_s_item-LGORT = LS_FHEMSC-LGORT.
wa_s_item-name1 = LS_FHEMSC-name1.
wa_s_item-name2 = LS_FHEMSC-name2.
wa_s_item-name3 = LS_FHEMSC-txt255.
wa_s_item-wadat = LS_FHEMSC-wadat.
wa_s_item-butxt = LS_FHEMSC-butxt.
wa_s_item-MSEHL = LS_FHEMSC-MSEHL.
MOVE LS_FHEMSC to LS_FHEMSC1.
APPEND wa_s_item to it_t_item.
AT END OF ZNUM.
wa_alv-name1 = LS_FHEMSC1-name1.
wa_alv-name2 = LS_FHEMSC1-name2.
wa_alv-erdat = LS_FHEMSC1-WADAT.
wa_alv-name3 = LS_FHEMSC1-name3.
wa_alv-erdat = LS_FHEMSC1-WADAT.
WA_ALV-BUTXT = LS_FHEMSC1-BUTXT.
wa_fhd1-znum = LS_FHEMSC1-znum.
wa_fhd1-txt255 = LS_FHEMSC1-txt255.
ENDAT.
ENDLOOP.
CALL SCREEN 9000.
ELSE.
MESSAGE E084(ZSD_DEV).
ENDIF.
ENDFORM.
SAP ABAP开发之-Report
一个SAP ERP实施项目,如果没有报表的开发,那几乎就是没有灵魂的,也在于SAP逐步开始把自己的产品线,尤其是报表的强项,转移到BW BI BO等产品线,所以原生态的SAP ERP,本身报表功能并不强大。于是我的实施过程,对报表的开发也就按序展开。以销售明细表为例,源代码Coding如下:
*&---------------------------------------------------------------------
*
*& Form GLOBALS_PUSH
*&---------------------------------------------------------------------
*
* text
*----------------------------------------------------------------------
*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------
*
form globals_push.
data: l_status_set type slis_formname,
l_user_command type slis_formname,
l_top_of_page type slis_formname,
l_top_of_list type slis_formname,
l_end_of_list type slis_formname,
l_end_of_page type slis_formname,
l_subtotal_text type slis_formname,
l_html_top_of_page type slis_formname,
l_data_changed type slis_formname,
l_caller_exit type slis_formname,
l_html_end_of_list type slis_formname,
l_context_menu type slis_formname.
*
insert gt_grid index 1.
clear gt_grid.
clear:
g_parent_grid,
g_parent_html,
g_parent_end.
gt_grid-repid = sy-repid.
perform events_get using l_status_set
l_user_command
l_top_of_page
l_end_of_page
l_subtotal_text
l_html_top_of_page
l_html_end_of_list
l_data_changed
l_caller_exit
l_top_of_list
l_end_of_list
l_context_menu.
gt_grid-r_salv_fullscreen_adapter = ir_salv_fullscreen_adapter.
gt_grid-i_callback_program = i_callback_program.
gt_grid-i_callback_pf_status_set = l_status_set.
gt_grid-i_callback_user_command = l_user_command.
gt_grid-i_callback_top_of_page = l_top_of_page.
gt_grid-i_callback_end_of_page = l_end_of_page.
gt_grid-i_callback_top_of_list = l_top_of_list.
gt_grid-i_callback_end_of_list = l_end_of_list.
gt_grid-i_callback_subtotal_text = l_subtotal_text.
gt_grid-i_callback_caller_exit = l_caller_exit.
gt_grid-i_callback_data_changed = l_data_changed.
gt_grid-i_callback_context_menu = l_context_menu.
if not l_html_top_of_page is initial.
gt_grid-i_callback_html_top_of_page = l_html_top_of_page.
else.
if gt_grid-r_salv_fullscreen_adapter is bound.
if l_top_of_list is initial or
i_grid_settings-top_p_only = 'X'.
gt_grid-flg_no_html = 'X'.
endif.
else.
if l_top_of_page is initial or
i_grid_settings-top_p_only = 'X'.
gt_grid-flg_no_html = 'X'.
endif.
endif.
endif.
gt_grid-s_variant = is_variant.
*>>> new API
if gt_grid-r_salv_fullscreen_adapter is not bound.
*<<< new API
if is_variant-report is initial and not i_save is initial.
gt_grid-s_variant-report = i_callback_program.
endif.
if is_variant-report is initial and i_save is initial.
gt_grid-s_variant_save-report = i_callback_program.
endif.
*>>> new API
endif.
*<<< new API
if not l_html_end_of_list is initial.
gt_grid-i_callback_html_end_of_list = l_html_end_of_list.
else.
if l_end_of_list is initial or
i_grid_settings-eol_p_only = 'X'.
gt_grid-flg_no_html_end = 'X'.
endif.
endif.
gt_grid-s_sel_hide = is_sel_hide.
gt_grid-t_alv_graphics = it_alv_graphics.
data: ls_alv_graphics type dtc_s_tc.
ls_alv_graphics-prop_id = 'FULLSCREEN_MODE'.
ls_alv_graphics-prop_val = abap_true.
append ls_alv_graphics to gt_grid-t_alv_graphics.
endform. " GLOBALS_PUSH
*&---------------------------------------------------------------------
*
*& Form events_get
*&---------------------------------------------------------------------
*
form events_get using r_status_set type slis_formname
r_user_command type slis_formname
r_top_of_page type slis_formname
r_end_of_page type slis_formname
r_subtotal_text type slis_formname
r_html_top_of_page type slis_formname
r_html_end_of_list type slis_formname
r_data_changed type slis_formname
r_caller_exit type slis_formname
r_top_of_list type slis_formname
r_end_of_list type slis_formname
r_context_menu type slis_formname.
data: ls_events type slis_alv_event.
r_status_set = i_callback_pf_status_set.
r_user_command = i_callback_user_command.
r_top_of_page = i_callback_top_of_page.
r_html_top_of_page = i_callback_html_top_of_page.
r_html_end_of_list = i_callback_html_end_of_list.
loop at it_events into ls_events where not form is initial.
case ls_events-name.
when slis_ev_top_of_page.
r_top_of_page = ls_events-form.
when slis_ev_data_changed.
r_data_changed = ls_events-form.
when slis_ev_end_of_page.
r_end_of_page = ls_events-form.
when slis_ev_user_command.
r_user_command = ls_events-form.
when slis_ev_pf_status_set.
r_status_set = ls_events-form.
when slis_ev_subtotal_text.
r_subtotal_text = ls_events-form.
when slis_ev_top_of_list.
r_top_of_list = ls_events-form.
when slis_ev_end_of_list.
r_end_of_list = ls_events-form.
when slis_ev_caller_exit_at_start.
r_caller_exit = ls_events-form.
when slis_ev_context_menu.
r_context_menu = ls_events-form.
endcase.
endloop.
endform. " events_get
*&---------------------------------------------------------------------
*
*& Form REPREP_CHECK
*&---------------------------------------------------------------------
*
form reprep_check.
data: l_subrc type sy-subrc.
if is_layout-reprep = 'X'.
perform reprep_exit_check in program saplkkbl
using l_subrc.
if l_subrc = 0 .
perform reprep_trsti_check in program saplkkbl
using gt_grid-t_fccls
i_callback_program
is_reprep_id
l_subrc.
perform reprep_stack_check in program saplkkbl
using i_callback_program
is_reprep_id
gt_grid-flg_called.
endif.
endif.
endform. " REPREP_CHECK
*---------------------------------------------------------------------*
* FORM REPREP_CHECK_lvc *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
form reprep_check_lvc.
data: l_subrc type sy-subrc.
data: ls_reprep_id type slis_reprep_id.
perform reprep_exit_check in program saplkkbl
using l_subrc.
if l_subrc = 0 .
call function 'LVC_TRANSFER_TO_KKBLO'
exporting
is_reprep_lvc = is_reprep_id_lvc
importing
es_reprep_id_kkblo = ls_reprep_id.
perform reprep_trsti_check in program saplkkbl
using gt_grid-t_fccls
i_callback_program
ls_reprep_id
l_subrc.
perform reprep_stack_check in program saplkkbl
using i_callback_program
ls_reprep_id
gt_grid-flg_called.
endif.
endform. " REPREP_CHECK
*&---------------------------------------------------------------------
*
*& Form TRANSFER_SLIS_TO_LVC
*&---------------------------------------------------------------------
*
form transfer_slis_to_lvc.
data: ls_fieldcat type kkblo_fieldcat.
data: l_tabname type kkblo_tabname. "#EC NEEDED
call function 'REUSE_ALV_TRANSFER_DATA'
exporting
is_print = is_print
it_fieldcat = it_fieldcat
is_layout = is_layout
it_sort = it_sort
it_filter = it_filter
it_excluding = it_excluding
it_special_groups = it_special_groups
it_event_exit = it_event_exit
it_except_qinfo = it_except_qinfo
importing
et_event_exit = gt_grid-t_event_exit
et_fieldcat = gt_grid-t_fieldcat
es_layout = gt_grid-s_layout
et_sort = gt_grid-t_sort
et_filter = gt_grid-t_filter
et_excluding = gt_grid-t_excluding
et_special_groups = gt_grid-t_special_groups
et_except_qinfo = gt_grid-t_qinfo.
loop at gt_grid-t_fieldcat into ls_fieldcat
where not tabname is initial.
l_tabname = ls_fieldcat-tabname.
exit.
endloop.
if sy-subrc ne 0.
l_tabname = '1'.
endif.
call function 'LVC_TRANSFER_FROM_KKBLO'
exporting
i_structure_name = i_structure_name
it_fieldcat_kkblo = gt_grid-t_fieldcat
it_sort_kkblo = gt_grid-t_sort
it_filter_kkblo = gt_grid-t_filter
it_special_groups_kkblo = gt_grid-t_special_groups
is_layout_kkblo = gt_grid-s_layout
it_add_fieldcat = it_add_fieldcat
it_excluding_kkblo = gt_grid-t_excluding[]
it_except_qinfo_kkblo = gt_grid-t_qinfo[]
importing
et_fieldcat_lvc = gt_grid-t_lvc_fieldcat
et_sort_lvc = gt_grid-t_lvc_sort
et_filter_lvc = gt_grid-t_lvc_filter
et_special_groups_lvc = gt_grid-t_lvc_spec
es_layout_lvc = gt_grid-s_lvc_layout
es_print_info_lvc = gt_grid-s_lvc_print
et_excluding_lvc = gt_grid-t_excluding_lvc[]
et_except_qinfo_lvc = gt_grid-t_lvc_qinfo[]
tables
it_data = t_outtab.
gt_grid-s_lvc_layout-no_toolbar = 'X'.
gt_grid-s_lvc_layout-grid_title = i_grid_title.
gt_grid-s_lvc_layout-no_rowmove = 'X'.
gt_grid-t_add_fieldcat = it_add_fieldcat.
gt_grid-t_lvc_hyperlink = it_hyperlink.
*>>> new API
if gt_grid-r_salv_fullscreen_adapter is bound.
call method gt_grid-r_salv_fullscreen_adapter->if_salv_adapter~complete_metadata
changing
t_fieldcatalog = gt_grid-t_lvc_fieldcat
s_layout = gt_grid-s_lvc_layout.
endif.
*<<< new API
endform. " TRANSFER_SLIS_TO_LVC
*---------------------------------------------------------------------*
* FORM TRANSFER_lvc_TO_LVC *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
form transfer_lvc_to_lvc.
call function 'REUSE_ALV_TRANSFER_DATA'
exporting
it_excluding = it_excluding
it_event_exit = it_event_exit
importing
et_event_exit = gt_grid-t_event_exit
et_excluding = gt_grid-t_excluding.
gt_grid-t_lvc_fieldcat = it_fieldcat_lvc.
gt_grid-t_lvc_sort = it_sort_lvc.
gt_grid-t_lvc_filter = it_filter_lvc.
gt_grid-t_lvc_spec = it_special_groups_lvc.
gt_grid-s_lvc_layout = is_layout_lvc.
gt_grid-s_lvc_print = is_print_lvc.
gt_grid-t_lvc_hyperlink = it_hyperlink.
gt_grid-t_lvc_qinfo = it_except_qinfo_lvc.
if not is_layout_lvc-box_fname is initial.
gt_grid-s_lvc_layout-sel_mode = 'A'.
endif.
gt_grid-s_lvc_layout-no_toolbar = 'X'.
gt_grid-s_lvc_layout-grid_title = i_grid_title.
*>>> INSERT BRAUNMI B20K8A0OM8 DRAG AND DROP ROWS
gt_grid-s_lvc_layout-no_rowmove = 'X'.
*<<< INSERT BRAUNMI B20K8A0OM8 DRAG AND DROP ROWS
gt_grid-s_layout-box_fieldname = gt_grid-s_lvc_layout-box_fname.
endform. " TRANSFER_SLIS_TO_LVC
*&---------------------------------------------------------------------
*
*& Form GLOBALS_POP
*&---------------------------------------------------------------------
*
* text
*----------------------------------------------------------------------
*
form globals_pop.
* this read is absolutly necessary to fill the table header
read table gt_grid index 1.
*
delete gt_grid index 1.
endform. " GLOBALS_POP
*&---------------------------------------------------------------------
*
*& Form PBO
*&---------------------------------------------------------------------
*
form pbo.
data: ls_variant type disvariant.
data: ls_reprep_id type lvc_s_rprp.
data: l_i type i value 1,
l_fcat_complete type sap_bool.
data: l_number_rows type i value 1.
*>>> INSERT BRAUNMI RepRep
data: ls_event type slis_alv_event.
*<<< INSERT BRAUNMI RepRep
data: l_html_height_top type i,
l_html_height_end type i.
data: l_height type i.
constants: con_hex02 type x value '02'. " Druckmodus
if gt_grid-s_variant_save-report is initial.
ls_variant = gt_grid-s_variant.
else.
ls_variant = gt_grid-s_variant_save.
endif.
* >>> for object model:
if not gt_grid-r_salv_fullscreen_adapter is initial.
*fieldcatalog is complete
l_fcat_complete = abap_true.
endif.
* <<<<<
if cl_gui_alv_grid=>offline( ) is initial.
if not gt_grid-s_layout-box_fieldname is initial.
set handler gc_event_receiver->handle_before_user_command for
gt_grid-grid.
set handler gc_event_receiver->handle_after_refresh for
gt_grid-grid.
endif.
* create TOP-Document
if gt_grid-flg_no_html is initial and gt_grid-top is initial.
create object gt_grid-top
exporting
style = 'ALV_GRID'.
endif.
* create BOTTOM-Document
if gt_grid-flg_no_html_end is initial and gt_grid-bottom is initial
.
create object gt_grid-bottom
exporting
style = 'ALV_GRID'.
endif.
*
if gt_grid-flg_no_html is initial.
add 1 to l_i.
endif.
if gt_grid-flg_no_html_end is initial.
add 1 to l_i.
endif.
l_number_rows = l_i.
if gt_grid-container is initial.
create object gt_grid-container
exporting
container_name = mycontainer
lifetime = cntl_lifetime_dynpro.
endif.
*
if gt_grid-grid is initial.
if l_number_rows = 1.
"Factory method instead of constructor
if cl_alv_z_params=>get_parameter( cl_alv_z_params=>c_param-alv_gui_instance_builder ) is not initial.
gt_grid-grid = cl_alv_gui_ist_builder_factory=>new_alv_gui_instance_builder( )->create_alv_grid_at_pbo(
exporting
i_appl_events = 'X'
i_parent = gt_grid-container
i_fcat_complete = l_fcat_complete ).
else.
create object gt_grid-grid "Factory
exporting
i_appl_events = 'X'
i_parent = gt_grid-container
i_fcat_complete = l_fcat_complete.
endif.
else.
create object gt_grid-splitter
exporting
parent = gt_grid-container
rows = l_number_rows
columns = 1.
if gt_grid-flg_no_html is initial.
call method gt_grid-splitter->get_container
exporting
row = 1
column = 1
receiving
container = g_parent_html.
call method gt_grid-splitter->get_container
exporting
row = 2
column = 1
receiving
container = g_parent_grid.
else.
call method gt_grid-splitter->get_container
exporting
row = 1
column = 1
receiving
container = g_parent_grid.
endif.
if gt_grid-flg_no_html_end is initial.
if gt_grid-flg_no_html is initial.
call method gt_grid-splitter->get_container
exporting
row = 3
column = 1
receiving
container = g_parent_end.
else.
call method gt_grid-splitter->get_container
exporting
row = 2
column = 1
receiving
container = g_parent_end.
endif.
endif.
if i_grid_settings-coll_top_p eq 'X'.
l_html_height_top = 0.
elseif i_html_height_top is initial.
l_html_height_top = 20.
else.
l_html_height_top = i_html_height_top.
endif.
if i_grid_settings-coll_end_l eq 'X'.
l_html_height_end = 0.
elseif i_html_height_end is initial.
l_html_height_end = 20.
else.
l_html_height_end = i_html_height_end.
endif.
case l_i.
when 2.
if gt_grid-flg_no_html is initial.
call method gt_grid-splitter->set_row_height
exporting
id = 1
height = l_html_height_top.
else.
call method gt_grid-splitter->set_row_height
exporting
id = 2
height = l_html_height_end.
endif.
when 3.
call method gt_grid-splitter->set_row_height
exporting
id = 1
height = l_html_height_top.
call method gt_grid-splitter->set_row_height
exporting
id = 3
height = l_html_height_end.
endcase.
"Factory method instead of constructor
if cl_alv_z_params=>get_parameter( cl_alv_z_params=>c_param-alv_gui_instance_builder ) is not initial.
gt_grid-grid = cl_alv_gui_ist_builder_factory=>new_alv_gui_instance_builder( )->create_alv_grid_at_pbo(
exporting
i_appl_events = 'X'
i_parent = g_parent_grid
i_fcat_complete = l_fcat_complete ).
else.
create object gt_grid-grid "Factory
exporting
i_appl_events = 'X'
i_parent = g_parent_grid
i_fcat_complete = l_fcat_complete. " ).
endif.
endif.
if gt_grid-lvc is initial.
* if cl_salv_test=>on eq 'X'.
* cl_salv_test=>export_data_grid(
* grid = me
* point_in_time_x = CL_SALV_TEST=>X_REUSE_ALV_GRID_DISPLAY
* point_in_time_y = CL_SALV_TEST=>Y_DATA ).
* endif.
perform transfer_slis_to_lvc.
else.
perform transfer_lvc_to_lvc.
endif.
* if cl_salv_veri_run=>on = 'X'.
* perform salv_at_99_2_stack.
* endif.
if gt_grid-s_lvc_layout-edit = 'X'.
call method gt_grid-grid->register_edit_event
exporting
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
endif.
*ENTER on Popupmodus
if i_screen_end_column > 0.
call method gt_grid-grid->register_edit_event
exporting
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
endif.
* put to function module lvc_transfer_from_kkblo, because
* in use of Reuse_alv_grid_layout_info_get/set the sel_mode
* has not the right value when box_fieldname not initial
* css: 416654 2000 / kds
* if not gt_grid-s_layout-box_fieldname is initial.
* if gt_grid-s_lvc_layout-sel_mode <> 'C'.
* gt_grid-s_lvc_layout-sel_mode = 'A'.
* endif.
* endif.
perform event_receiver.
gt_grid-s_lvc_print-no_colwopt = i_grid_settings-no_colwopt.
data: ls_data type slis_data_caller_exit.
if not gt_grid-i_callback_caller_exit is initial.
perform (gt_grid-i_callback_caller_exit)
in program (gt_grid-i_callback_program)
using ls_data.
call method gt_grid-grid->set_header_transport
exporting
i_header_transport = ls_data-callback_header_transport.
endif.
if gt_grid-lvc is initial.
if is_reprep_id is initial.
ls_reprep_id-s_rprp_id-tool = 'RT'.
ls_reprep_id-s_rprp_id-onam = i_callback_program.
else.
ls_reprep_id = is_reprep_id.
endif.
*>>> INSERT BRAUNMI RepRep
read table it_events into ls_event
with key name = slis_ev_reprep_sel_modify.
if sy-subrc eq 0.
ls_reprep_id-cb_repid = ls_reprep_id-s_rprp_id-onam.
ls_reprep_id-cb_frm_mod = ls_event-form.
endif.
*<<< INSERT BRAUNMI RepRep
else.
ls_reprep_id = is_reprep_id_lvc.
endif.
call method gt_grid-grid->activate_reprep_interface
exporting
is_reprep = ls_reprep_id
exceptions
no_sender = 1.
*>>> new API
perform salv_set_selmode changing gt_grid-s_lvc_layout.
*<<< new API
*>>>Mendocino Extraction
* TOP-OF-LIST and END-OF-LIST must processed at first because of
* set screen 0. leave screen. in method set_table_for_first_display
data: l_mode(1).
import l_mode to l_mode from memory id 'ALV_EXTRACT_MODE'.
if l_mode eq 'M'.
perform raise_top_of_list.
perform raise_end_of_list.
endif.
*<<<Mendocino Extraction
call method gt_grid-grid->set_table_for_first_display
exporting
i_consistency_check = i_interface_check
i_bypassing_buffer = i_bypassing_buffer
i_buffer_active = i_buffer_active
i_structure_name = i_structure_name
is_variant = ls_variant
i_save = i_save
i_default = i_default
is_layout = gt_grid-s_lvc_layout
is_print = gt_grid-s_lvc_print
it_special_groups = gt_grid-t_lvc_spec
it_hyperlink = gt_grid-t_lvc_hyperlink
it_toolbar_excluding = gt_grid-t_excluding_lvc
it_except_qinfo = gt_grid-t_lvc_qinfo
ir_salv_adapter = gt_grid-r_salv_fullscreen_adapter
it_alv_graphics = gt_grid-t_alv_graphics
changing
it_fieldcatalog = gt_grid-t_lvc_fieldcat
it_sort = gt_grid-t_lvc_sort
it_filter = gt_grid-t_lvc_filter
it_outtab = t_outtab[].
endif.
*>>> new API : wird 40 Zeilen weiter unten erledigt
* perform salv_set_selections.
*<<< new API
data: lr_content type ref to cl_salv_form_element.
* if not sy-subty o con_hex02.
if cl_gui_alv_grid=>offline( ) is initial. "Batch, Druck
if not gt_grid-top is initial.
call method gt_grid-top->initialize_document.
endif.
if not gt_grid-bottom is initial.
call method gt_grid-bottom->initialize_document.
endif.
*... TOP OF PAGE
*>>> Y3YK043656
data: ls_layout type lvc_s_layo.
gt_grid-grid->get_frontend_layout( importing es_layout = ls_layout ).
if ls_layout-frontend ne cl_alv_bds=>mc_crystal_frontend.
perform raise_top_of_list.
endif.
*<<< Y3YK043656
*... END OF PAGE
if not gt_grid-r_salv_fullscreen_adapter is bound.
call method gt_grid-grid->list_processing_events
exporting
i_event_name = 'END_OF_PAGE'.
endif.
*... END OF LIST
perform raise_end_of_list.
endif.
* create and fill HTML-CONTROL
if gt_grid-flg_no_html is initial.
if gt_grid-r_form_tol is not bound.
perform html.
endif.
*B20K8A0R55 for Excel Inplace HTML Header
call method gt_grid-grid->set_html_header.
endif.
if gt_grid-r_form_eol is not bound.
if gt_grid-flg_no_html_end is initial.
perform html_bottom.
endif.
endif.
*>>> new API
perform salv_set_selections.
*<<< new API
data: lr_focus_container type ref to cl_gui_control,
l_accessibility_mode type abap_bool.
* field-symbols: <t_cntrl> type table.
*<<< Y7AK113139
* call function 'GET_ACCESSIBILITY_MODE'
* importing
* accessibility = l_accessibility_mode
* exceptions
* its_not_available = 0
* others = 0.
* if l_accessibility_mode eq abap_true
* and gt_grid-splitter is bound
* and not gt_grid-splitter->children is initial.
*
* assign gt_grid-splitter->children to <t_cntrl>.
* read table <t_cntrl> index 1 into lr_focus_container.
* else.
* lr_focus_container = gt_grid-grid.
* endif.
*
* if not ( gt_grid-flg_popup eq abap_false
* and l_accessibility_mode eq abap_true ).
* call method cl_gui_control=>set_focus
* exporting
* control = lr_focus_container.
* elseif gt_grid-flg_no_html eq abap_true and
* l_accessibility_mode eq abap_true.
* call method cl_gui_control=>set_focus
* exporting
* control = lr_focus_container.
* endif.
* usability: focus has always to be set to the fullscreen grid,
* idependent of accessibility_mode, popup, HTML-TOP
* <<< Y7AK130495
data: l_view type UI_FUNC.
call method gt_grid-grid->get_actual_view( importing e_view = l_view ).
* focus may only be set to grid container in case of grid view!
if l_view eq '&VGRID'.
lr_focus_container = gt_grid-grid.
call method cl_gui_control=>set_focus
exporting
control = lr_focus_container.
*>>> Y7AK113139
else.
* do nothing in case of Excel or Crystal view!
endif.
*>>> Y7AK130495
if g_form_pf_status_executed eq abap_false.
perform pf_status_set using gt_grid-flg_popup.
endif.
else.
if gt_grid-grid is initial.
"Factory method instead of constructor
if cl_alv_z_params=>get_parameter( cl_alv_z_params=>c_param-alv_gui_instance_builder ) is not initial.
gt_grid-grid = cl_alv_gui_ist_builder_factory=>new_alv_gui_instance_builder( )->create_alv_grid_at_pbo(
exporting
i_appl_events = 'X'
i_parent = g_parent_grid
i_fcat_complete = l_fcat_complete ).
else.
create object gt_grid-grid "Factory
exporting
i_appl_events = 'X'
i_parent = g_parent_grid
i_fcat_complete = l_fcat_complete.
endif.
if gt_grid-lvc is initial.
perform transfer_slis_to_lvc.
else.
perform transfer_lvc_to_lvc.
endif.
if not gt_grid-s_layout-box_fieldname is initial.
gt_grid-s_lvc_layout-sel_mode = 'A'.
endif.
gt_grid-s_lvc_print-no_colwopt = i_grid_settings-no_colwopt.
perform event_receiver.
* if not sy-subty o con_hex02.
if cl_gui_alv_grid=>offline( ) is initial. "Batch, Druck
* create TOP-Document
if gt_grid-flg_no_html is initial and gt_grid-top is initial.
create object gt_grid-top
exporting
style = 'ALV_GRID'.
endif.
* create BOTTOM-Document
if gt_grid-flg_no_html_end is initial and
gt_grid-bottom is initial.
create object gt_grid-bottom
exporting
style = 'ALV_GRID'.
endif.
call method gt_grid-grid->list_processing_events
exporting
i_event_name = 'TOP_OF_PAGE'
i_dyndoc_id = gt_grid-top.
">>>new 13.11.03
call method gt_grid-grid->list_processing_events
exporting
i_event_name = 'END_OF_LIST'
i_dyndoc_id = gt_grid-bottom.
"<<<new
endif.
if not gt_grid-i_callback_caller_exit is initial.
perform (gt_grid-i_callback_caller_exit)
in program (gt_grid-i_callback_program)
using ls_data.
call method gt_grid-grid->set_header_transport
exporting
i_header_transport = ls_data-callback_header_transport.
endif.
if gt_grid-lvc is initial.
if is_reprep_id is initial.
ls_reprep_id-s_rprp_id-tool = 'RT'.
ls_reprep_id-s_rprp_id-onam = i_callback_program.
else.
ls_reprep_id = is_reprep_id.
endif.
*>>> INSERT BRAUNMI RepRep
read table it_events into ls_event
with key name = slis_ev_reprep_sel_modify.
if sy-subrc eq 0.
ls_reprep_id-cb_repid = ls_reprep_id-s_rprp_id-onam.
ls_reprep_id-cb_frm_mod = ls_event-form.
endif.
*<<< INSERT BRAUNMI RepRep
else.
ls_reprep_id = is_reprep_id_lvc.
endif.
call method gt_grid-grid->activate_reprep_interface
exporting
is_reprep = ls_reprep_id
exceptions
no_sender = 1.
call method gt_grid-grid->set_table_for_first_display
exporting
i_consistency_check = i_interface_check
i_buffer_active = i_buffer_active
i_structure_name = i_structure_name
is_variant = ls_variant
i_save = i_save
i_default = i_default
is_layout = gt_grid-s_lvc_layout
is_print = gt_grid-s_lvc_print
it_special_groups = gt_grid-t_lvc_spec
it_hyperlink = gt_grid-t_lvc_hyperlink
it_toolbar_excluding = gt_grid-t_excluding_lvc
it_except_qinfo = gt_grid-t_lvc_qinfo
ir_salv_adapter = gt_grid-r_salv_fullscreen_adapter
it_alv_graphics = gt_grid-t_alv_graphics
changing
it_fieldcatalog = gt_grid-t_lvc_fieldcat
it_sort = gt_grid-t_lvc_sort
it_filter = gt_grid-t_lvc_filter
it_outtab = t_outtab[].
endif.
* create and fill HTML-CONTROL
if gt_grid-flg_no_html is initial.
perform html.
endif.
if gt_grid-flg_no_html_end is initial.
perform html_bottom.
endif.
*>>> new API
perform salv_set_selections.
*<<< new API
if g_form_pf_status_executed eq abap_false.
perform pf_status_set using gt_grid-flg_popup.
endif.
endif.
if gt_grid-flg_first_time eq abap_true.
*... Accessibility Description
data:
l_text type string.
if g_parent_html is bound.
l_text = text-a02.
g_parent_html->set_accdescription( l_text ).
if gt_grid-html_cntrl is bound.
gt_grid-html_cntrl->set_accdescription( l_text ).
endif.
if gt_grid-r_form_tol is bound.
gt_grid-r_form_tol->if_salv_form~set_accdescription( l_text ).
endif.
endif.
if g_parent_end is bound.
l_text = text-a03.
g_parent_end->set_accdescription( l_text ).
if gt_grid-html_cntrl_bottom is bound.
gt_grid-html_cntrl_bottom->set_accdescription( l_text ).
endif.
if gt_grid-r_form_eol is bound.
gt_grid-r_form_eol->if_salv_form~set_accdescription( l_text ).
endif.
endif.
if g_parent_grid is bound.
l_text = text-a01.
g_parent_grid->set_accdescription( l_text ).
if gt_grid-grid is bound.
l_text = text-a04.
gt_grid-grid->set_accdescription( l_text ).
endif.
endif.
endif.
if cl_gui_alv_grid=>offline( ) is initial.
clear gt_grid-flg_first_time.
endif.
g_form_pf_status_executed = abap_false.
endform. " PBO
*&---------------------------------------------------------------------
*
*& Form HTML
*&---------------------------------------------------------------------
*
form html.
data l_length type i.
*
if gt_grid-html_cntrl is initial.
create object gt_grid-html_cntrl
exporting
parent = g_parent_html.
endif.
if my_receiver is initial.
* set handler for change of gui-resources (fonts, colors, ...)
create object my_receiver.
set handler my_receiver->use_new_resources.
endif.
* reuse_alv_grid_commentary_set
call function 'REUSE_ALV_GRID_COMMENTARY_SET'
exporting
document = gt_grid-top
bottom = space
importing
length = l_length.
if l_length > 0 and i_grid_settings-coll_top_p is initial and
gt_grid-i_callback_html_top_of_page is initial and
gt_grid-i_callback_html_end_of_list is initial.
call method gt_grid-splitter->set_row_mode
exporting
mode = cl_gui_splitter_container=>mode_absolute.
call method gt_grid-splitter->set_row_height
exporting
height = l_length
id = 1.
endif.
* get TOP->HTML_TABLE ready
call method gt_grid-top->merge_document.
* set wallpaper
call method gt_grid-top->set_document_background
exporting
picture_id = i_background_id.
* export to Memory for HTML Conversion
export grid_top_html from gt_grid-top->html_table
*** put in next line as soon as 5.0(B20) has cl_dd_area->table_of_pictu
* top_pictures from gt_grid-top->table_of_pictures
to memory id 'TOP_HTML_FOR_ALV'.
* connect TOP document to HTML-Control
gt_grid-top->html_control = gt_grid-html_cntrl.
* display TOP document
call method gt_grid-top->display_document
exporting
reuse_control = 'X'
parent = g_parent_html
exceptions
html_display_error = 1.
if sy-subrc ne 0.
* ??????????
endif.
endform. " HTML
*---------------------------------------------------------------------*
* FORM HTML_BOTTOM *
*---------------------------------------------------------------------*
form html_bottom.
data l_length type i.
*
if gt_grid-html_cntrl_bottom is initial.
create object gt_grid-html_cntrl_bottom
exporting
parent = g_parent_end.
endif.
if my_receiver is initial.
* set handler for change of gui-resources (fonts, colors, ...)
create object my_receiver.
set handler my_receiver->use_new_resources.
endif.
* reuse_alv_grid_commentary_set
call function 'REUSE_ALV_GRID_COMMENTARY_SET'
exporting
document = gt_grid-bottom
bottom = 'X'
importing
length = l_length.
if l_length > 0 and i_grid_settings-coll_end_l is initial and
gt_grid-i_callback_html_top_of_page is initial and
gt_grid-i_callback_html_end_of_list is initial.
call method gt_grid-splitter->set_row_mode
exporting
mode = cl_gui_splitter_container=>mode_absolute.
if gt_grid-flg_no_html is initial.
call method gt_grid-splitter->set_row_height
exporting
height = l_length
id = 3.
else.
call method gt_grid-splitter->set_row_height
exporting
height = l_length
id = 2.
endif.
endif.
* get HTML_TABLE ready
call method gt_grid-bottom->merge_document.
* set wallpaper
call method gt_grid-bottom->set_document_background
exporting
picture_id = i_background_id.
* export to Memory for HTML Conversion
export grid_bottom_html from gt_grid-bottom->html_table
*** put in next line as soon as 5.0(B20) has cl_dd_area->table_of_pictu
* bottom_pictures from gt_grid-bottom->table_of_pictures
to memory id 'BOTTOM_HTML_FOR_ALV'.
* connect BOTTOM document to HTML-Control
gt_grid-bottom->html_control = gt_grid-html_cntrl_bottom.
* display BOTTOM document
call method gt_grid-bottom->display_document
exporting
reuse_control = 'X'
parent = g_parent_end
exceptions
html_display_error = 1.
if sy-subrc ne 0.
* ??????????
endif.
endform. "html_bottom
*&---------------------------------------------------------------------
*
*& Form PF_STATUS_SET
*&---------------------------------------------------------------------
form pf_status_set using r_flg_popup.
data: l_title type sy-title.
data: lt_extab type kkblo_t_extab with header line.
data: lt_extab_ida type kkblo_t_extab with header line.
data: boolean type sap_bool. "ACC
"Take it_excluding every Roundtrip into account - before application gets the control
lt_extab[] = it_excluding.
perform adapt_excluding_tab changing lt_extab[].
*... Set the requested Status
if not gt_grid-s_layout-window_titlebar is initial.
set titlebar '003' of program 'SAPLKKBL' with
gt_grid-s_layout-window_titlebar.
else.
l_title = sy-title.
set titlebar '003' of program 'SAPLKKBL' with l_title.
endif.
if not gt_grid-i_callback_pf_status_set is initial.
"SALV or Application: calls ABAP command SET PF-STATUS....
perform (gt_grid-i_callback_pf_status_set)
in program (i_callback_program)
using lt_extab[] if found.
else.
case gt_grid-s_layout-def_status.
when ' ' or '1'.
if r_flg_popup = 'X'.
if not gt_grid-s_layout-box_fieldname is initial.
set pf-status 'STDPOPBX_FULLSCREEN' excluding lt_extab
of program 'SAPLKKBL'.
else.
set pf-status 'STDPOPUP_FULLSCREEN' excluding lt_extab
of program 'SAPLKKBL'.
endif.
else.
if gt_grid-s_layout-countfname eq space.
boolean = cl_alv_check_third_party=>is_supported(
cl_alv_bds=>mc_crystal_frontend ).
if boolean eq abap_true.
set pf-status 'STANDARD_FULLSCR_CR' excluding lt_extab
of program 'SAPLKKBL'.
else.
set pf-status 'STANDARD_FULLSCREEN' excluding lt_extab
of program 'SAPLKKBL'.
endif.
else.
set pf-status 'STANDARD_FULLSCR_CNT' excluding lt_extab
of program 'SAPLKKBL'.
endif.
endif.
when '2'.
if r_flg_popup = 'X'.
if not gt_grid-s_layout-box_fieldname is initial.
set pf-status 'STDPOPBX_FULLSCREEN' excluding lt_extab
of program 'SAPLKKBL'.
else.
set pf-status 'STDPOPUP_FULLSCREEN' excluding lt_extab
of program 'SAPLKKBL'.
endif.
else.
set pf-status 'STANDARD_FULLSCR_HR' excluding lt_extab
of program 'SAPLKKBL'.
endif.
when '3'.
if r_flg_popup = 'X'.
if not gt_grid-s_layout-box_fieldname is initial.
set pf-status 'STDPOPBX_FS_LIGHT' excluding lt_extab
of program 'SAPLKKBL'.
else.
set pf-status 'STDPOPUP_FS_LIGHT' excluding lt_extab
of program 'SAPLKKBL'.
endif.
else.
set pf-status 'STD_LIGHT_FULLSCREEN' excluding lt_extab
of program 'SAPLKKBL'.
endif.
endcase.
endif.
gt_grid-t_excluding[] = lt_extab[].
g_form_pf_status_executed = abap_true.
endform. " PF_STATUS_SET
*&---------------------------------------------------------------------
*
*& Form GRID
*&---------------------------------------------------------------------
*
form grid using rr_grid type ref to cl_gui_alv_grid. "#EC CALLED
rr_grid = gt_grid-grid.
endform. "grid
*&---------------------------------------------------------------------
*
*& Form USER
*&---------------------------------------------------------------------
*
form user_command using r_ucomm type sy-ucomm
r_refresh
r_exit
rs_stable type lvc_s_stbl.
data: ls_selfield type slis_selfield.
*
check not gt_grid-i_callback_user_command is initial.
check not i_callback_program is initial.
perform selfield_get using ls_selfield.
if r_ucomm is initial.
r_ucomm = '&IC1'.
endif.
perform (gt_grid-i_callback_user_command)
in program (i_callback_program)
using r_ucomm
ls_selfield.
rs_stable-row = ls_selfield-row_stable.
rs_stable-col = ls_selfield-col_stable.
r_refresh = ls_selfield-refresh.
r_exit = ls_selfield-exit.
endform. "user_command
*&---------------------------------------------------------------------
*
*& Form PAI
*&---------------------------------------------------------------------
*
form pai.
class cl_gui_cfw definition load.
data: ls_stable type lvc_s_stbl.
data: l_ucomm type sy-ucomm.
data: lflg_refresh(1) type c.
data: lt_rows type lvc_t_row. "#EC *
data: lflg_exit(1) type c.
data: ls_event_exit type slis_event_exit. "#EC NEEDED
data: l_subrc like sy-subrc.
data: l_okcode type sy-ucomm.
l_okcode = ok_code.
clear ok_code.
check l_okcode ne space.
g_repid = sy-repid.
case l_okcode.
when 'BACK'.
l_okcode = '&F03'.
when 'RW'.
l_okcode = '&F12'.
when '%EX'.
l_okcode = '&F15'.
endcase.
clear g_temp_ok_code.
do 2 times.
check not l_okcode is initial.
l_ucomm = l_okcode.
if not gt_grid-s_layout-f2code is initial and
l_okcode eq '&IC1'.
l_okcode = gt_grid-s_layout-f2code.
endif.
call method gt_grid-grid->set_function_code
changing
c_ucomm = l_okcode.
if l_okcode eq '&F15' or
l_okcode eq '&F03' or
l_okcode eq '&F12'.
read table it_event_exit into ls_event_exit
with key ucomm = l_okcode.
if sy-subrc = 0.
g_before = 'X'.
perform user_command using l_okcode lflg_refresh lflg_exit
ls_stable.
clear g_before.
endif.
endif.
case l_okcode.
when space.
when '&ONT'.
perform user_command using l_okcode lflg_refresh lflg_exit
ls_stable.
clear l_okcode.
perform exit.
when '&F15'.
l_subrc = 0.
if not gt_grid-s_layout-confirmation_prompt is initial.
perform confirmation_prompt using l_subrc.
endif.
if l_subrc eq 0.
es_exit_caused_by_user-exit = 'X'.
clear l_okcode.
perform exit.
endif.
when '&F03'.
l_subrc = 0.
if not gt_grid-s_layout-confirmation_prompt is initial.
perform confirmation_prompt using l_subrc.
endif.
if l_subrc eq 0.
es_exit_caused_by_user-back = 'X'.
clear l_okcode.
perform exit.
endif.
when '&F12'.
l_subrc = 0.
if not gt_grid-s_layout-confirmation_prompt is initial.
perform confirmation_prompt using l_subrc.
endif.
if l_subrc eq 0.
es_exit_caused_by_user-cancel = 'X'.
clear l_okcode.
perform exit.
endif.
when '&AC1'.
l_subrc = 0.
if not gt_grid-s_layout-confirmation_prompt is initial.
perform confirmation_prompt using l_subrc.
endif.
if l_subrc eq 0.
es_exit_caused_by_user-back = 'X'.
clear l_okcode.
perform exit.
endif.
when '&IC1'.
if not gt_grid-s_layout-f2code is initial.
perform method_double_click using l_okcode.
endif.
* when '&EXPORT_ALVXML'.
* perform salv_export_alvxml.
when '&ADM'.
perform memory_download.
when '&ADMB'.
perform download_to_memory.
when '&ADX'.
perform data_download tables t_outtab.
when '&ADXBJ'.
perform data_download_to_java_browser tables t_outtab.
when '&ADXBA'.
perform data_download_to_abap_browser tables t_outtab.
when '&WD_DL'.
perform wd_download tables t_outtab.
when others.
if l_okcode(4) eq '%_GC'.
call method cl_gui_cfw=>dispatch.
l_okcode = g_temp_ok_code. "via double_click
else.
perform user_command using l_okcode lflg_refresh lflg_exit
ls_stable.
if lflg_exit eq 'X'.
e_exit_caused_by_caller = 'X'.
perform exit.
else.
if lflg_refresh is not initial.
*>>> new API
perform salv_get_selections.
*<<< new API
if lflg_refresh = 'X'.
call method gt_grid-grid->refresh_table_display
exporting
is_stable = ls_stable.
elseif lflg_refresh = 'S'.
call method gt_grid-grid->refresh_table_display
exporting
is_stable = ls_stable
i_soft_refresh = 'X'.
endif.
*... TOP OF LIST
perform raise_top_of_list.
*... END OF LIST
perform raise_end_of_list.
endif.
*>>> new API
perform salv_set_selections.
*<<< new API
endif.
endif.
endcase.
if l_ucomm ne l_okcode.
l_ucomm = l_okcode.
else.
clear l_ucomm.
clear l_okcode.
endif.
enddo.
endform. " PAI
*&---------------------------------------------------------------------
*
*& Form SELFIELD_GET
*&---------------------------------------------------------------------
*
form selfield_get using rs_selfield type slis_selfield.
* ...
data: ls_row_id type lvc_s_row.
data: ls_col_id type lvc_s_col.
data: l_value type lvc_s_data-value.
data: ls_selfield type lvc_s_self.
data: ls_fieldcat type slis_fieldcat_alv.
data: ls_fieldcat_lvc type lvc_s_fcat.
call method gt_grid-grid->get_current_cell
importing
es_row_id = ls_row_id
es_col_id = ls_col_id
e_value = l_value.
call method cl_gui_cfw=>flush.
ls_selfield-s_row_id = ls_row_id.
ls_selfield-s_col_id = ls_col_id.
ls_selfield-value = l_value.
call function 'LVC_TRANSFER_TO_KKBLO'
exporting
is_selfield_lvc = ls_selfield
importing
es_selfield_kkblo = rs_selfield.
* if sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
* endif.
if gt_grid-lvc = 'X'.
loop at it_fieldcat_lvc into ls_fieldcat_lvc where tabname ne space
.
move-corresponding ls_fieldcat_lvc to ls_fieldcat.
exit.
endloop.
else.
loop at it_fieldcat into ls_fieldcat where tabname ne space.
exit.
endloop.
endif.
if sy-subrc = 0.
rs_selfield-tabname = ls_fieldcat-tabname.
replace '1' with ls_fieldcat-tabname into rs_selfield-sel_tab_field
.
condense rs_selfield-sel_tab_field no-gaps.
endif.
rs_selfield-before_action = g_before.
rs_selfield-after_action = g_after.
endform. " SELFIELD_GET
*---------------------------------------------------------------------*
* FORM exit *
*&--------------------------------------------------------------------*
form exit.
* <<< YI3K165259
data: lr_salv_adapter type REF TO cl_salv_adapter,
lr_salv_controller type REF TO cl_salv_controller_model,
lt_changelist TYPE standard table of if_salv_controller_changelist=>salv_s_changelist,
ls_changelist type if_salv_controller_changelist=>salv_s_changelist,
valid type abap_bool.
*>>> YI3K165259
perform salv_get_metadata.
perform salv_get_selections.
* endif.
call method gt_grid-container->free.
if gt_grid-r_salv_fullscreen_adapter is bound.
gt_grid-r_salv_fullscreen_adapter->remove_grid( ).
* <<< YI3K165259
*adjust SALV objects, no return to SALV to update settings, function handled only here!
lr_salv_adapter ?= gt_grid-r_salv_fullscreen_adapter.
lr_salv_controller ?= lr_salv_adapter->R_CONTROLLER.
read table lr_salv_controller->t_changelist into ls_changelist
with key method = 'CLOSE_SCREEN' .
if ls_changelist-change eq abap_true.
CALL METHOD LR_SALV_CONTROLLER->CLEAR_CHANGELIST
EXPORTING
METHOD = 'CLOSE_SCREEN'
RECEIVING
BOOLEAN = valid.
else.
"do nothing
endif.
clear lr_salv_adapter->close_screen. " parameter has to be cleared additionally
*>>> YI3K165259
endif.
call method cl_gui_cfw=>flush.
if g_parent_html is bound.
clear g_parent_html.
endif.
if g_parent_grid is bound.
clear g_parent_grid.
endif.
if g_parent_end is bound.
clear g_parent_end.
endif.
set screen 0.
leave screen.
endform. "exit
*&--------------------------------------------------------------------*
*& Form raise_top_of_list
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
form raise_top_of_list.
export alv_form_html from abap_true
to memory id 'ALV_FORM_HTML'.
cl_salv_form_content=>free( ).
g_is_online_event = if_salv_c_bool_sap=>true.
if gt_grid-r_salv_fullscreen_adapter is bound.
call method gt_grid-grid->list_processing_events
exporting
i_event_name = 'TOP_OF_LIST'.
else.
call method gt_grid-grid->list_processing_events
exporting
i_event_name = 'TOP_OF_PAGE'
i_dyndoc_id = gt_grid-top.
endif.
if cl_salv_form_content=>is_active( ) eq abap_true.
if gt_grid-i_callback_html_top_of_page is initial.
perform set_salv_form_content_tol.
endif.
export alv_form_html from abap_false
to memory id 'ALV_FORM_HTML'.
else.
clear g_is_online_event.
endif.
endform. "raise_top_of_list
*&--------------------------------------------------------------------*
*& Form raise_end_of_list
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
form raise_end_of_list.
export alv_form_html from abap_true
to memory id 'ALV_FORM_HTML'.
cl_salv_form_content=>free( ).
g_is_online_event = if_salv_c_bool_sap=>true.
call method gt_grid-grid->list_processing_events
exporting
i_event_name = 'END_OF_LIST'
i_dyndoc_id = gt_grid-bottom.
if cl_salv_form_content=>is_active( ) eq abap_true.
if gt_grid-i_callback_html_end_of_list is initial.
perform set_salv_form_content_eol.
endif.
export alv_form_html from abap_false
to memory id 'ALV_FORM_HTML'.
else.
clear g_is_online_event.
endif.
endform. "raise_end_of_list
*&--------------------------------------------------------------------*
*& Form set_salv_form_content_tol
*&--------------------------------------------------------------------*
* text
*---------------------------------------------------------------------*
form set_salv_form_content_tol.
data:
lr_content type ref to cl_salv_form_element,
l_height type i.
check gt_grid-flg_no_html eq abap_false.
check cl_salv_form_content=>is_active( ) eq abap_true.
lr_content = cl_salv_form_content=>get( ).
if gt_grid-r_form_tol is bound.
check lr_content ne gt_grid-r_form_tol->get_content( ).
endif.
if gt_grid-r_form_tol is not bound.
create object gt_grid-r_form_tol
exporting
r_container = g_parent_html
r_content = lr_content
wallpaper = i_background_id.
endif.
gt_grid-r_form_tol->set_content( lr_content ).
l_height = gt_grid-r_form_tol->get_height( ).
gt_grid-r_form_tol->display( ).
check gt_grid-splitter is not initial.
if i_grid_settings-coll_top_p is initial and
gt_grid-i_callback_html_top_of_page is initial and
gt_grid-i_callback_html_end_of_list is initial.
gt_grid-splitter->set_visible( abap_true ).
call method gt_grid-splitter->set_row_mode
exporting
mode = cl_gui_splitter_container=>mode_absolute.
if i_html_height_top is initial.
* if cl_alv_z_params=>get_parameter(
* cl_alv_z_params=>c_flag-gui_alv_grid_bridge_on ) eq abap_true.
* call method gt_grid-splitter->set_row_height
* exporting
* height = l_height
* id = gs_splitter_id-top_of_list.
* else.
call method gt_grid-splitter->set_row_height
exporting
height = l_height
id = 1.
* endif.
endif.
endif.
endform. "set_salv_form_content_tol
*&---------------------------------------------------------------------*
*& Form set_salv_form_content_eol
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form set_salv_form_content_eol .
data:
lr_content type ref to cl_salv_form_element,
l_height type i.
check gt_grid-flg_no_html_end eq abap_false.
check cl_salv_form_content=>is_active( ) eq abap_true.
lr_content = cl_salv_form_content=>get( ).
if gt_grid-r_form_eol is bound.
check lr_content ne gt_grid-r_form_eol->get_content( ).
endif.
if gt_grid-r_form_eol is not bound.
create object gt_grid-r_form_eol
exporting
r_container = g_parent_end
r_content = lr_content.
endif.
gt_grid-r_form_eol->set_content( lr_content ).
l_height = gt_grid-r_form_eol->get_height( ).
gt_grid-r_form_eol->display( ).
check gt_grid-splitter is not initial.
if i_grid_settings-coll_end_l is initial and
gt_grid-i_callback_html_top_of_page is initial and
gt_grid-i_callback_html_end_of_list is initial.
call method gt_grid-splitter->set_row_mode
exporting
mode = cl_gui_splitter_container=>mode_absolute.
* if cl_alv_z_params=>get_parameter(
* cl_alv_z_params=>c_flag-gui_alv_grid_bridge_on ) eq abap_true.
* call method gt_grid-splitter->set_row_height
* exporting
* height = l_height
* id = gs_splitter_id-end_of_list.
* else.
if gt_grid-flg_no_html is initial.
if i_html_height_end is initial.
call method gt_grid-splitter->set_row_height
exporting
height = l_height
id = 3.
endif.
else.
if i_html_height_end is initial.
call method gt_grid-splitter->set_row_height
exporting
height = l_height
id = 2.
endif.
endif.
* endif. "brigde
endif.
endform. " set_salv_form_content_eol
SAP ABAP开发之-Enhancement增强
SAP有很多功能,是支持去做增强开发的,标准的代码不会让你改,但标准代码之余,系统留下了很多“漏”洞,让你可以写入自己的程序,以卡控销售预收款才可以发货的增强为例,源代码Coding如下:
SAP ABAP开发之-User Exit出口
和增强类似,USER EXIT则是SAP指定的可供人工开发的窗口,以销售VC定价为例,SAP标准的产品批次特性里,就可以放单据的开发语言,自己定义,傻白甜都会做。因为原理就跟你考计算机二级的查询语句一样,源代码Coding如下:
*确定变式价格-SD20170905:
*基础面积计价指定-ZHG_HYF_CPHD玻璃厚度-ZVA0:
$self.ZHG_VARCOND = 'ZMIANJ1' IF $self.ZHG_HYF_CPHD = 6,
$SET_PRICING_FACTOR ($SELF, ZHG_VARCOND, 'ZMIANJ1',
ZHG_HYF_CPMJ ),
$self.ZHG_VARCOND = 'ZMIANJ2' IF $self.ZHG_HYF_CPHD = 8,
$SET_PRICING_FACTOR ($SELF,ZHG_VARCOND, 'ZMIANJ2',
ZHG_HYF_CPMJ ),
$self.ZHG_VARCOND = 'ZMIANJ3' IF $self.ZHG_HYF_CPHD = 10,
$SET_PRICING_FACTOR ($SELF, ZHG_VARCOND, 'ZMIANJ3',
ZHG_HYF_CPMJ ),
*这样做的意思,就是拿ZMIANJ3的价格去*变式CPMJ面积的值
*石基计价指定-ZHG_HYF_SFSJ是否配石基:
$self.ZHG_VARCOND = 'ZSHIJ1' IF $self.ZHG_HYF_SFSJ = '1',
*特殊工艺计价指定-ZHG_HYF_BLGY特殊工艺 :
$self.ZHG_VARCOND = 'ZTSGY001' IF $self.ZHG_HYF_BLGY = '1',
$self.ZHG_VARCOND = 'ZTSGY002' IF $self.ZHG_HYF_BLGY = '2',
$self.ZHG_VARCOND = 'ZTSGY003' IF $self.ZHG_HYF_BLGY = '3',
$self.ZHG_VARCOND = 'ZTSGY004' IF $self.ZHG_HYF_BLGY = '4',
$self.ZHG_VARCOND = 'ZTSGY005' IF $self.ZHG_HYF_BLGY = '5',
*拉手计价指定-ZHG_HYF_HBL1活动玻璃1拉手型号:
$self.ZHG_VARCOND = 'ZLashouA001' IF $self.ZHG_HYF_HBL1 = '1',
$self.ZHG_VARCOND = 'ZLashouA002' IF $self.ZHG_HYF_HBL1 = '2',
$self.ZHG_VARCOND = 'ZLashouA003' IF $self.ZHG_HYF_HBL1 = '3',
$self.ZHG_VARCOND = 'ZLashouA004' IF $self.ZHG_HYF_HBL1 = '4',
$self.ZHG_VARCOND = 'ZLashouA005' IF $self.ZHG_HYF_HBL1 = '5',
*拉手计价指定-ZHG_HYF_HBL2活动玻璃2拉手型号:
$self.ZHG_VARCOND = 'ZLashouB001' IF $self.ZHG_HYF_HBL2 = '1',
$self.ZHG_VARCOND = 'ZLashouB002' IF $self.ZHG_HYF_HBL2 = '2',
$self.ZHG_VARCOND = 'ZLashouB003' IF $self.ZHG_HYF_HBL2 = '3',
$self.ZHG_VARCOND = 'ZLashouB004' IF $self.ZHG_HYF_HBL2 = '4',
$self.ZHG_VARCOND = 'ZLashouB005' IF $self.ZHG_HYF_HBL2 = '5',
*拉手计价指定-ZHG_HYF_HBL3活动玻璃3拉手型号:
$self.ZHG_VARCOND = 'ZLashouC001' IF $self.ZHG_HYF_HBL3 = '1',
$self.ZHG_VARCOND = 'ZLashouC002' IF $self.ZHG_HYF_HBL3 = '2',
$self.ZHG_VARCOND = 'ZLashouC003' IF $self.ZHG_HYF_HBL3 = '3',
$self.ZHG_VARCOND = 'ZLashouC004' IF $self.ZHG_HYF_HBL3 = '4',
$self.ZHG_VARCOND = 'ZLashouC005' IF $self.ZHG_HYF_HBL3 = '5'
SAP ABAP开发之-例程
例程严格说也是USER EXIT,用于定价等的开发,SAP里有个单独的TCODE:VOFM,用来专门新增一个小例程,这个例程,简直就是世外桃源!因为他写好后,还需要前端配置到标准的定价过程里,才可以用,否则就是山外山,人外人,以销售定价开票取订单未税价为例,源代码Coding如下:
FORM FRM_KONDI_WERT_931.
*{ INSERT G4DK900682 1
*---------------------------------------------------------------------*
* PROGRAM ID : RV64A931 *
* APPLICATION NAME : SD *
* AUTHOR : Reed Jiang *
* TRANSACTION : N/A *
* PROGRAM TYPE : Include Program *
* INPUT FILES : N/A *
* OUTPUT FILES : N/A *
* Development class : VKON *
* Message class : N/A *
* DESCRIPTION : Condition Value Routine 931 *
*---------------------------------------------------------------------*
*=====================================================================*
* 000 2022/03/30 G4DK900682 Initial Version *
*---------------------------------------------------------------------*
"Call Custom Routine
CALL FUNCTION 'ZCSD_FUNC_PRICING_VALUE_931'
EXPORTING
iv_xmenge = xmenge
is_komk = komk
is_komp = komp
TABLES
tt_xkomv = xkomv[]
CHANGING
cv_xkwert = xkwert.
*} INSERT
ENDFORM.
SAP ABAP开发之-Function功能
当然,SAP也支持纯粹的功能开发!那就相当于增加一个新功能,和SAP标准的自带的功能平行, 只是要求必须是Z或Y开头命名,即不是SAP亲生的。这样在SAP版本升级时,才不至于被SAP升级抹杀掉。以客户销售合同批导为例,源代码Coding如下:
*&-----------------------------------------------------*
*****************************************************************
* System : 客合同批导
* Module : 合同数据批导
* program ID : ZSD_RP5001
* Author : YPJ
* Date : 2019.10.17
* Description :
*****************************************************************
* Modified Recorder :
* Date C#NO Author Content
*----------------------------------------------------*
*修改日期 C票或变更文档日期 修改者 修改内容
*传输请求号
*****************************************************************
REPORT zsd_rp5002.
*&---------------------------------------------------------------------*
*& Table declaration
*&---------------------------------------------------------------------*
TABLES: sscrfields,kna1.
*&---------------------------------------------------------------------*
*& Type pool declaration
*&---------------------------------------------------------------------*
TYPE-POOLS: icon,slis,truxs.
" Type pool for ALV
*&---------------------------------------------------------------------*
DATA:gs_fieldcat TYPE lvc_s_fcat, "SLIS_FIELDCAT_ALV,
gt_fieldcat TYPE lvc_t_fcat, "SLIS_T_FIELDCAT_ALV,
gs_layout TYPE lvc_s_layo, "SLIS_LAYOUT_ALV,
gt_ex_status TYPE slis_t_extab,
gs_variant_bom TYPE disvariant,
gcl_alv_grid TYPE REF TO cl_gui_alv_grid,
i_title TYPE lvc_title,
i_flg TYPE char1.
DATA: gs_fieldinfo TYPE slis_fieldinfo2,
gt_fieldinfo TYPE TABLE OF slis_fieldinfo2.
DATA: stbl TYPE lvc_s_stbl.
DATA: w_ref_alv TYPE REF TO cl_gui_alv_grid.
DATA: ws_events1 TYPE slis_alv_event,
it_events1 TYPE slis_t_event.
DATA: str_msg TYPE string.
DATA: functxt TYPE smp_dyntxt.
*--------定义下载模板相关---------
DATA:ls_key LIKE wwwdatatab,
p_fd LIKE rlgrap-filename,
stripped_name TYPE rlgrap-filename,
file_path TYPE rlgrap-filename,
ld_filename TYPE string,
ld_path TYPE string,
ld_fullpath TYPE string,
ld_result TYPE i.
*DATA functxt TYPE smp_dyntxt.
DATA ok_code LIKE sy-ucomm.
DATA p_file TYPE rlgrap-filename.
DATA: l_serno TYPE i,
s_serno TYPE string.
*&---------------------------------------------------------------------*
*& Bapi Type declaration
*&---------------------------------------------------------------------*
DATA:ls_main TYPE cmds_ei_main,
ls_main1 TYPE cmds_ei_main,
ls_main2 TYPE cmds_ei_main,
ls_mesg TYPE cvis_message,
ls_mesg1 TYPE cvis_message,
lt_msg TYPE bapiret2_t,
lwa_msg TYPE bapiret2,
lt_cust TYPE cmds_ei_extern_t,
lwa_cust TYPE cmds_ei_extern,
lt_bankn TYPE cvis_ei_bankdetail_t,
ls_bank TYPE cvis_ei_cvi_bankdetail,
lwa_sale TYPE cmds_ei_sales,
lt_sale TYPE cmds_ei_sales_t,
lt_functions TYPE cmds_ei_functions_t,
lwa_functions TYPE cmds_ei_functions,
lt_company TYPE cmds_ei_company_t,
lt_text TYPE cvis_ei_text_t,
lwa_text TYPE cvis_ei_text,
lt_content TYPE tline_tab,
lwa_content TYPE tline,
lwa_tax TYPE cmds_ei_tax_ind,
lt_tax TYPE cmds_ei_tax_ind_t,
lt_remark TYPE cvis_ei_rem_t,
lwa_remark TYPE cvis_ei_rem,
lt_tel TYPE cvis_ei_tlx_t,
lwa_tel TYPE cvis_ei_tlx_str,
lt_fax TYPE cvis_ei_fax_t,
lwa_fax TYPE cvis_ei_fax_str,
lt_mail TYPE cvis_ei_smtp_t,
lwa_mail TYPE cvis_ei_smtp_str,
lt_tel01 TYPE cvis_ei_ttx_t,
lwa_tel01 TYPE cvis_ei_ttx_str,
lt_contact TYPE cmds_ei_contacts_t,
lwa_contact TYPE cmds_ei_contacts,
lt_version TYPE cvi_ei_version_type1_t,
lwa_version TYPE cvi_ei_version_type1,
lt_phone TYPE cvis_ei_phone_t,
lwa_phone TYPE cvis_ei_phone_str,
lt_phone1 TYPE cvis_ei_phone_t,
lwa_phone1 TYPE cvis_ei_phone_str,
lwa_company TYPE cmds_ei_company.
*&---------------------------------------------------------------------*
*& Type declaration
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_upload,
vkorg TYPE knvv-vkorg,
vtweg TYPE knvv-vtweg,
spart TYPE knvv-spart,
kunnr TYPE kna1-kunnr,
parvw TYPE vbpa-parvw,
saleman TYPE vbpa-kunnr,
END OF ty_upload.
DATA: gt_upload TYPE TABLE OF ty_upload,
gs_upload TYPE ty_upload.
TYPES:BEGIN OF ty_bapi,
kunnr TYPE vbak-kunnr,
lt_item LIKE gt_upload.
TYPES END OF ty_bapi.
DATA:gt_bapi TYPE TABLE OF ty_bapi,
gs_bapi TYPE ty_bapi.
DATA:BEGIN OF gs_alv,
mark TYPE char1,
zicon TYPE icon-id,
message TYPE char200.
* name1 TYPE kna1-name1.
INCLUDE TYPE ty_upload.
DATA:END OF gs_alv.
DATA:gt_alv LIKE TABLE OF gs_alv.
*屏幕条件
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-002.
PARAMETER: file_up LIKE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN: FUNCTION KEY 1,
FUNCTION KEY 2.
*----------------------------------------------------------------------*
* INITIALIZATION *
*----------------------------------------------------------------------*
INITIALIZATION.
functxt-icon_text = '下载数据模板'.
functxt-icon_id = icon_xxl.
sscrfields-functxt_01 = functxt .
AT SELECTION-SCREEN.
CASE sy-ucomm.
WHEN 'FC01'.
PERFORM frm_select_file.
WHEN 'ONLI'.
IF file_up IS INITIAL.
MESSAGE e000(zpub_msg) WITH '请选择上载文件数据' DISPLAY LIKE 'W'.
ENDIF.
WHEN OTHERS.
ENDCASE.
*----------------------------------------------------------------------*
* AT SELECTION-SCREEN on value-request for *
*----------------------------------------------------------------------*
*选择文件路径
AT SELECTION-SCREEN ON VALUE-REQUEST FOR file_up.
PERFORM file_find_up.
START-OF-SELECTION.
PERFORM frm_upload_excel.
* 数据合法性检查
PERFORM frm_check_get_bapi.
PERFORM frm_show_alv.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form FRM_SELECT_FILE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_select_file .
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = '下载模板'
default_extension = 'XLSX'
default_file_name = '泽强合同批导数据模板.XLSX'
initial_directory = 'c:\temp\'
CHANGING
filename = ld_filename
path = ld_path
fullpath = ld_fullpath
user_action = ld_result
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
SET CURSOR FIELD 'FILE_UP'.
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
RETURN.
ENDIF.
IF ld_result = 0.
p_fd = ld_fullpath.
ENDIF.
CLEAR ls_key.
ls_key-relid = 'MI'.
ls_key-objid = 'ZSD_RP5002'.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = ls_key
destination = p_fd.
* CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH' "对文件进行存在检查
* EXPORTING
* full_name = p_fd
* IMPORTING
* stripped_name = stripped_name
* file_path = file_path.
* IF sy-subrc = 0.
* CALL FUNCTION 'GUI_RUN' "启动一个文件或者程序
* EXPORTING
* command = 'EXCEL'
* parameter = stripped_name
* cd = file_path.
* ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FILE_FIND_UP
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM file_find_up .
CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
EXPORTING
mask = '.XLS'
static = 'X'
CHANGING
file_name = file_up
EXCEPTIONS
mask_too_long = 1.
IF sy-subrc <> 0.
MESSAGE '路徑不正確或選擇文件錯誤' TYPE 'E'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_EXCEL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_upload_excel .
DATA: ls_line TYPE i,
ls_subrc TYPE sy-subrc.
DATA: ls_mseg TYPE string.
DATA:lt_itab TYPE TABLE OF zalsmex_tabline WITH HEADER LINE.
FIELD-SYMBOLS: <fs_up>.
CLEAR:gt_upload.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
text = '数据处理中,请等待...'.
"EXCEL转换成内表数据
CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = file_up
i_begin_col = 2
i_begin_row = 6
i_end_col = 14
i_end_row = 9999
TABLES
intern = lt_itab[]
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT lt_itab.
ASSIGN COMPONENT lt_itab-col OF STRUCTURE gs_upload TO <fs_up>. "动态方法将值传到相应的内表
<fs_up> = lt_itab-value.
AT END OF row.
APPEND gs_upload TO gt_upload.
CLEAR gs_upload.
ENDAT.
ENDLOOP.
IF gt_upload IS INITIAL.
MESSAGE '无效的上载数据,请检查' TYPE 'E'.
STOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_GET_BAPI
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_check_get_bapi .
DATA:ls_message TYPE char100.
DATA:ls_subrc TYPE sy-subrc.
DATA:BEGIN OF gs_kna1,
kunnr TYPE kna1-kunnr,
name1 TYPE kna1-name1,
END OF gs_kna1.
DATA:gt_kna1 LIKE TABLE OF gs_kna1.
LOOP AT gt_upload INTO gs_upload .
gs_alv = CORRESPONDING #( gs_upload ).
IF gs_upload-kunnr IS INITIAL.
ls_message = '客户编码为必填/'.
ENDIF.
IF gs_upload-parvw IS INITIAL.
ls_message = '类型为必填/'.
ENDIF.
IF gs_upload-saleman IS INITIAL.
ls_message = '业务员编码为必填/'.
ENDIF.
IF NOT ls_message IS INITIAL.
gs_alv-zicon = '@5C@'.
gs_alv-message = ls_message.
ELSE.
gs_alv-zicon = '@5B@'.
ENDIF.
APPEND gs_alv TO gt_alv.
CLEAR:gs_alv,ls_message,gs_upload.
ENDLOOP.
SORT gt_alv BY zicon.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_DATE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_<FS_UPLOAD> text
* <--P_LS_SUBRC text
*----------------------------------------------------------------------*
FORM frm_check_date USING p_field
CHANGING p_subrc TYPE sy-subrc.
CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
EXPORTING
date = p_field
EXCEPTIONS
plausibility_check_failed = 1
OTHERS = 2.
IF sy-subrc NE 0. "如果返回非0,则日期不合法
p_subrc = 1.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DEAL_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_deal_data .
SORT gt_alv BY kunnr.
LOOP AT gt_alv INTO gs_alv.
READ TABLE gt_bapi ASSIGNING FIELD-SYMBOL(<fs_bapi>) WITH KEY kunnr = gs_alv-kunnr.
IF sy-subrc = 0.
CLEAR: gs_upload.
MOVE-CORRESPONDING gs_alv TO gs_upload.
APPEND gs_upload TO <fs_bapi>-lt_item.
ELSE.
CLEAR: gs_bapi.
gs_bapi-kunnr = gs_alv-kunnr.
CLEAR: gs_upload.
MOVE-CORRESPONDING gs_alv TO gs_upload.
APPEND gs_upload TO gs_bapi-lt_item.
APPEND gs_bapi TO gt_bapi.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SHOW_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_show_alv .
*&---------------------------------------------------------------------*
* EVENTS CATALOG FOR GRID DISPLAY
*&---------------------------------------------------------------------*
PERFORM events_catalog.
*&---------------------------------------------------------------------*
* FIELD CATALOG FOR GRID DISPLAY
*&---------------------------------------------------------------------*
PERFORM field_catalog.
*&---------------------------------------------------------------------*
* FOR LAYOUT FOR FIRST GRID DISPLAY
*&---------------------------------------------------------------------*
PERFORM set_layout.
*&---------------------------------------------------------------------*
* FOR VARIANT FOR FIRST GRID DISPLAY
*&---------------------------------------------------------------------*
PERFORM set_variant.
*&---------------------------------------------------------------------*
* DISPLAY RECORDS IN ALV GRID FOR FIRST GRID DISPLAY
*&---------------------------------------------------------------------*
PERFORM alv_display.
ENDFORM.
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM events_catalog .
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = it_events1.
READ TABLE it_events1 WITH KEY name = 'TOP_OF_PAGE'
INTO ws_events1.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FIELD_CATALOG
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM field_catalog .
"动态字段名称赋值
DATA: lo_tabdescr TYPE REF TO cl_abap_structdescr.
DATA: ls_field_in TYPE dfies,
lt_dfies TYPE ddfields.
lo_tabdescr ?= cl_abap_structdescr=>describe_by_data( gs_alv ).
CALL METHOD cl_salv_data_descr=>read_structdescr
EXPORTING
r_structdescr = lo_tabdescr
RECEIVING
t_dfies = lt_dfies.
PERFORM frm_get_tabname TABLES lt_dfies USING 'GT_ALV'.
LOOP AT lt_dfies INTO ls_field_in.
CLEAR: gs_fieldcat.
MOVE-CORRESPONDING ls_field_in TO gs_fieldcat.
gs_fieldcat-ref_table = ls_field_in-reftable. "参照类型的表,搜索帮助,域控制
gs_fieldcat-ref_field = ls_field_in-reffield. "参照类型字段
IF gs_fieldcat-coltext IS INITIAL. "当COLTEXT不存在显示FILEDTEXT,如字段没域,只有手工描述的情况
gs_fieldcat-coltext = ls_field_in-fieldtext.
ENDIF.
CASE ls_field_in-fieldname.
WHEN 'MARK'.
CONTINUE.
WHEN 'ZICON'.gs_fieldcat-coltext = '状态标识'.
WHEN 'MESSAGE'.gs_fieldcat-coltext = '返回消息'.
WHEN 'KUNNR'.gs_fieldcat-coltext = '客户编码'.
* WHEN 'NAME1'.gs_fieldcat-coltext = '客户名称'.
WHEN 'SALEMAN'.gs_fieldcat-coltext = '业务员编码'.
ENDCASE.
APPEND gs_fieldcat TO gt_fieldcat.
ENDLOOP.
ENDFORM.
FORM frm_get_tabname TABLES t_dfies TYPE ddfields USING tabname TYPE tfdir-funcname.
" source container
DATA: BEGIN OF ls_abap_source,
line TYPE char300,
END OF ls_abap_source,
lt_abap_source LIKE TABLE OF ls_abap_source.
DATA: lt_fieldinfo_old LIKE fieldinfo OCCURS 10 WITH HEADER LINE.
CLASS cx_sy_read_src_line_too_long DEFINITION LOAD.
DATA: ex_too_long TYPE REF TO cx_sy_read_src_line_too_long.
TRY.
READ REPORT sy-repid INTO lt_abap_source.
CATCH cx_sy_read_src_line_too_long INTO ex_too_long.
MESSAGE '一行代码超过300个字符' TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.
CALL FUNCTION 'ABAP_SCAN_DATA_DESCRIPTION'
EXPORTING
structure_name = tabname
main_program_name = sy-cprog
i_context = 'X'
TABLES
abap_source = lt_abap_source
ddic_fieldinfo = lt_fieldinfo_old
ddic_fieldinfo2 = gt_fieldinfo
EXCEPTIONS
source_not_accepted = 0
OTHERS = 0.
LOOP AT t_dfies ASSIGNING FIELD-SYMBOL(<lfs_dfies>).
IF <lfs_dfies>-reftable IS INITIAL. "auto set tablename
READ TABLE gt_fieldinfo INTO gs_fieldinfo WITH KEY fieldname = <lfs_dfies>-fieldname.
IF sy-subrc = 0.
SPLIT gs_fieldinfo-name AT '-' INTO <lfs_dfies>-reftable <lfs_dfies>-reffield.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM set_layout .
* 自动调整列宽
gs_layout-cwidth_opt = 'X'.
* 变换行颜色
gs_layout-zebra = 'X'.
gs_layout-box_fname = 'MARK'.
ENDFORM.
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM set_variant .
* 设置variant
CLEAR: gs_variant_bom.
gs_variant_bom-report = sy-repid.
ENDFORM.
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM alv_display .
*Call function RESUE_ALV_GRID_DISPLAY_LVC
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'FRM_SET_STATUS'
i_callback_user_command = 'FRM_USER_COMMAND'
is_layout_lvc = gs_layout
i_save = 'A'
i_grid_title = i_title
is_variant = gs_variant_bom "gs_variant
it_fieldcat_lvc = gt_fieldcat[]
it_events = it_events1
TABLES
t_outtab = gt_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SUB_USER_COMMAND
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_set_status USING rt_extab TYPE slis_t_extab . "#EC *
SET PF-STATUS 'STANDARD'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SUB_USER_COMMAND
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM frm_user_command USING s_ucomm TYPE sy-ucomm
rs_selfield TYPE slis_selfield.
DATA:ls_check TYPE char1.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = w_ref_alv.
CALL METHOD w_ref_alv->check_changed_data.
rs_selfield-refresh = 'X'.
rs_selfield-col_stable = 'X'.
rs_selfield-row_stable = 'X'.
CASE s_ucomm.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
SET SCREEN 0.
WHEN 'SUBMT'.
* 更新数据
LOOP AT gt_alv TRANSPORTING NO FIELDS WHERE zicon = '@5C@'.
ENDLOOP.
IF sy-subrc = 0.
ls_check = 'X'.
MESSAGE s001(00) WITH '请检查数据正确性...' DISPLAY LIKE 'E'.
ENDIF.
CHECK ls_check IS INITIAL.
*汇总bapi数据
PERFORM frm_deal_data.
PERFORM generate_customer_bapi.
WHEN OTHERS.
ENDCASE.
ENDFORM. "SUB_USER_COMMAND
*&---------------------------------------------------------------------*
*& Form GENERATE_CUSTOMER_BAPI
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM generate_customer_bapi .
DATA:lv_subrc TYPE bapiret2-type.
DATA:ls_msg TYPE char100.
DATA:lv_percentage TYPE string.
DESCRIBE TABLE gt_bapi LINES l_serno.
CLEAR gs_bapi.
LOOP AT gt_bapi INTO gs_bapi.
CLEAR: lv_subrc,ls_msg.
* 处理状态
lv_percentage = sy-tabix / l_serno * 100.
PERFORM process_indcator USING lv_percentage.
PERFORM frm_create_sls TABLES gs_bapi-lt_item[] CHANGING lv_subrc ls_msg .
LOOP AT gt_alv INTO gs_alv WHERE kunnr = gs_bapi-kunnr.
IF lv_subrc = 'S'.
gs_alv-zicon = '@5B@'.
ELSE.
gs_alv-zicon = '@5C@'.
ENDIF.
gs_alv-message = ls_msg.
MODIFY gt_alv FROM gs_alv.
ENDLOOP.
ENDLOOP.
CLEAR:gt_bapi,l_serno.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_SLS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_GS_BAPI_ITEM[] text
* <--P_LV_SUBRC text
*----------------------------------------------------------------------*
FORM frm_create_sls TABLES pt_bapi_item LIKE gt_upload
CHANGING pv_subrc TYPE bapiret2-type
ps_msg TYPE char100.
DATA: l_parza TYPE knvp-parza.
DATA:l_line TYPE i.
LOOP AT pt_bapi_item ASSIGNING FIELD-SYMBOL(<fs_bapi_item>).
l_line = l_line + 1.
AT NEW kunnr.
* Customer number (in case of external creating of numbers)
lwa_cust-header-object_instance-kunnr = |{ <fs_bapi_item>-kunnr ALPHA = IN }|."客户编码.
* Mark Change
lwa_cust-header-object_task = 'U'.
SELECT MAX( parza )
FROM knvp INTO l_parza
WHERE kunnr = lwa_cust-header-object_instance-kunnr
AND vkorg = <fs_bapi_item>-vkorg
AND vtweg = <fs_bapi_item>-vtweg
AND spart = <fs_bapi_item>-spart
AND parvw = <fs_bapi_item>-parvw.
ENDAT.
* items_in
lwa_sale-task = 'U'.
lwa_sale-data_key-vkorg = <fs_bapi_item>-vkorg.
lwa_sale-data_key-vtweg = <fs_bapi_item>-vtweg.
lwa_sale-data_key-spart = <fs_bapi_item>-spart.
l_parza = l_parza + 1.
IF <fs_bapi_item>-saleman IS NOT INITIAL.
lwa_functions-task = 'M'.
lwa_functions-data_key-parvw = <fs_bapi_item>-parvw.
lwa_functions-data_key-parza = l_parza.
* lwa_functions-data-defpa = 'X'.
lwa_functions-data-partner = |{ <fs_bapi_item>-saleman ALPHA = IN }|."业务员编码
lwa_functions-datax-partner = 'X'.
* lwa_functions-datax-defpa = 'X'.
APPEND lwa_functions TO lt_functions.
CLEAR lwa_functions.
ENDIF.
ENDLOOP.
lwa_sale-functions-functions = lt_functions.
APPEND lwa_sale TO lt_sale.
lwa_cust-sales_data-sales = lt_sale.
APPEND lwa_cust TO lt_cust.
ls_main-customers = lt_cust.
* FREE:cmd_ei_api=>gt_global_kna1_old.
CALL METHOD cmd_ei_api=>maintain_bapi
EXPORTING
* iv_test_run = p_test
iv_collect_messages = 'X'
is_master_data = ls_main
IMPORTING
es_master_data_correct = ls_main1
es_message_correct = ls_mesg1
es_master_data_defective = ls_main2
es_message_defective = ls_mesg.
DELETE ls_mesg-messages WHERE type = 'S'.
DELETE ls_mesg-messages WHERE type = 'W'.
LOOP AT ls_mesg-messages TRANSPORTING NO FIELDS WHERE type CA 'AEX'.
ENDLOOP.
IF sy-subrc <> 0 .
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
pv_subrc = 'S'.
ps_msg = '业务员更新成功'.
WAIT UP TO '0.1' SECONDS.
ELSE.
READ TABLE ls_mesg-messages INTO DATA(ls_msg) INDEX 1.
pv_subrc = 'E'.
CONCATENATE ps_msg ls_msg-message INTO ps_msg SEPARATED BY '/'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
FREE ls_main.
CLEAR: lwa_sale,ls_main1,ls_mesg1,ls_main2,ls_mesg,l_parza.
REFRESH: lt_functions,lt_sale,lt_cust.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form PROCESS_INDCATOR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_TEXT_T01 text
* -->P_LV_PERCENTAGE text
*----------------------------------------------------------------------*
FORM process_indcator USING p_index TYPE string.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = p_index
text = '数据处理中,请等待...'.
ENDFORM.
SAP ABAP开发之-接口interface
几乎每个SAP系统的实施,都会伴随与外围系统接口,我最近的一个SAP项目,同时和18个外围系统做接口,有泛微OA,金税接口,报关系统,SRM,MES,友云采,出口退税,报销,海波龙合并报表等众多平台,以OA接口为例,源代码Coding如下:
*******************************************************************
* System-defined Include-files. *
*******************************************************************
INCLUDE LSLVC_FULLSCREENTOP. " Global Data
INCLUDE LSLVC_FULLSCREENUXX. " Global Data
*******************************************************************
* User-defined Include-files (if necessary). *
*******************************************************************
INCLUDE LSLVC_FULLSCREENO01.
INCLUDE LSLVC_FULLSCREENI01.
INCLUDE LSLVC_FULLSCREENF01.
INCLUDE LSLVC_FULLSCREENF02.
INCLUDE LSLVC_FULLSCREENF03.
INCLUDE LSLVC_FULLSCREENF04.
INCLUDE LSLVC_FULLSCREENO02.
INCLUDE LSLVC_FULLSCREENI02.
INCL
INCLUDE LSLVC_FULLSCREENF06.
INCLUDE LSLVC_FULLSCREENF07.
INCLUDE LSLVC_FULLSCREENF08.
INCLUDE LSLVC_FULLSCREENF09.
INCLUDE LSLVC_FULLSCREENF10.
INCLUDE LSLVC_FULLSCREENF11.
INCLUDE LSLVC_FULLSCREENF12.
INCLUDE LSLVC_FULLSCREENF13.
INCLUDE LSLVC_FULLSCREENF14.
INCLUDE LSLVC_FULLSCREENF15.
*INCLUDE LSLVC_FULLSCREENFBO.
INCLUDE LSLVC_FULLSCREENF16.
(由于每个INCLUDE下内容太多,不一一列出,需要的可以私信我)
总结,SAP的ABAP开发,虽然没有JAVA,安卓,网页XML PHP等大众化,属于一个管理软件小偏课,但随着企业信息化的深入,原来越多的企业都开始借助传统商品化的ERP,逐步打造自己公司的特性平台。所以,无论时外部实施咨询乙方顾问,还是企业甲方内部顾问,都开始作为一个职位的标准技能要求具备。所以,有兴趣的童鞋,可以顺带研究下。不难的。