要求
中间表结构
基于成本中心的组织维护
*&---------------------------------------------------------------------*
*& REPORT ZRPT_PP_CSSC
*&
*&---------------------------------------------------------------------*
*&DATE:20220228
*&AUTHOR:gavin
*&TITLE:上传成本中心及其描述信息
*&---------------------------------------------------------------------*
REPORT ZRPT_PP_CSSC.
TABLES:ZPPCOSTMDATA,SSCRFIELDS.
*
*定义内表类型
*
TYPES: W_ITAB like ZPPCOSTMDATA.
FIELD-SYMBOLS: <FS>.
DATA:
FILETAB TYPE FILETABLE WITH HEADER LINE,
RC TYPE I,
G_FILE TYPE RLGRAP-FILENAME,
ITAB TYPE TABLE OF ALSMEX_TABLINE WITH HEADER LINE.
DATA: WTAB TYPE TABLE OF W_ITAB WITH HEADER LINE.
Data: count type i.
DATA:STDATUM LIKE SY-DATUM,
STUZEIT LIKE SY-UZEIT.
DATA:L_FILENAME TYPE STRING,L_MUBAN TYPE STRING.
DATA:GV_FULLPATH TYPE STRING,GV_PATH TYPE STRING,GV_NAME TYPE STRING.
*&---------------------------------------------------------------------*
*& 选择界面
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TXT1 .
SELECT-OPTIONS:S_KOSTL FOR ZPPCOSTMDATA-KOSTL,"工厂
S_ZDEPT1 FOR ZPPCOSTMDATA-ZDEPT1,"一级部门
S_ZDEPT2 FOR ZPPCOSTMDATA-ZDEPT2,"一级部门
S_ZDEPT3 FOR ZPPCOSTMDATA-ZDEPT3,"一级部门
S_ZDEPT4 FOR ZPPCOSTMDATA-ZDEPT4,"一级部门
S_ZDEPT5 FOR ZPPCOSTMDATA-ZDEPT5."一级部门
PARAMETER: P_FILE TYPE STRING.
PARAMETER:DELFLG AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK BLK1.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN PUSHBUTTON 5(60) but1 USER-COMMAND bt1.
SELECTION-SCREEN PUSHBUTTON 70(20) but2 USER-COMMAND bt2.
SELECTION-SCREEN END OF LINE.
INITIALIZATION.
TXT1 = '请输入条件'.
CALL FUNCTION 'ICON_CREATE'
EXPORTING
name = ICON_BW_REF_STRUCTURE_SAP
TEXT = 'SM30维护 视图 ZPPCOSTMDATA'
INFO = 'SM30维护 视图 ZPPCOSTMDATA'
IMPORTING
result = but1
EXCEPTIONS
icon_not_found = 1
outputfield_too_short = 2
OTHERS = 3.
CALL FUNCTION 'ICON_CREATE'
EXPORTING
name = ICON_BW_REF_STRUCTURE_SAP
TEXT = '下载维护模板'
INFO = '下载维护模板'
IMPORTING
result = but2
EXCEPTIONS
icon_not_found = 1
outputfield_too_short = 2
OTHERS = 3.
*&---------------------------------------------------------------------
AT SELECTION-SCREEN.
CASE SSCRFIELDS-UCOMM.
WHEN 'BT1'.
PERFORM CALLSM30.
WHEN 'BT2'.
PERFORM DOWNLOAD_DATA.
ENDCASE.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
DEFAULT_FILENAME = P_FILE
CHANGING
RC = RC
FILE_TABLE = FILETAB[].
READ TABLE FILETAB INDEX 1.
IF SY-SUBRC EQ 0.
P_FILE = FILETAB-FILENAME.
ENDIF.
START-OF-SELECTION.
STDATUM = SY-DATUM.
STUZEIT = SY-UZEIT.
if p_file <> ''.
PERFORM GETEXCEL."EXCEL数据获取
else.
perform getdata."获取版本描述表中数据
endif.
PERFORM WRITERPTRUNRECORD.
PERFORM DISPLAY."数据ALV输出
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form WRITERPTRUNRECORD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM WRITERPTRUNRECORD.
get time.
CALL FUNCTION 'ZSYS_RPT_RUNRECORD'
EXPORTING
TCODE = SY-TCODE
PROGRAMM = SY-CPROG
DATUMRST = STDATUM
UZEITRST = STUZEIT
BATCH = SY-BATCH
DATUMREND = SY-datum
UZEITREND = sy-UZEIT
DATUMC = '20220228'
RUNNER = SY-UNAME
RPTSRC = '邱海云'.
ENDFORM. "WRITERPTRUNRECORD
*&---------------------------------------------------------------------*
*& FORM DISPLAY
*&---------------------------------------------------------------------*
* TEXT 数据展示
*----------------------------------------------------------------------*
* --> P1 TEXT
* <-- P2 TEXT
*----------------------------------------------------------------------*
FORM DISPLAY .
DATA: IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
IS_VARIANT LIKE DISVARIANT,
IT_EVENTS TYPE SLIS_T_EVENT,
IS_LAYOUT TYPE SLIS_LAYOUT_ALV,
TITLE TYPE LVC_TITLE,
I_CALLBACK_PROGRAM TYPE SY-REPID,
IT_SORT TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE
.
PERFORM FIELDCAT_INIT USING IT_FIELDCAT.
PERFORM LAYOUT_INIT USING IS_LAYOUT.
I_CALLBACK_PROGRAM = SY-REPID.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = I_CALLBACK_PROGRAM
I_GRID_TITLE = TITLE
IS_LAYOUT = IS_LAYOUT
I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS'
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
IT_FIELDCAT = IT_FIELDCAT
IT_EVENTS = IT_EVENTS
TABLES
T_OUTTAB = WTAB[]
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
ENDIF.
ENDFORM. " DISPLAY
*&--------------------------------------------------------------------- *
*& Form g_status_form 调用自定义屏幕
*&---------------------------------------------------------------------
FORM SET_PF_STATUS USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD' EXCLUDING rt_extab.
ENDFORM. "SET_PF_STATUS
*&---------------------------------------------------------------------*
*& FORM FIELDCAT_INIT
*&---------------------------------------------------------------------*
* TEXT 定义输出项
*----------------------------------------------------------------------*
* -->P_IT_FIELDCAT TEXT
*----------------------------------------------------------------------*
FORM FIELDCAT_INIT USING IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
DATA: LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
DATA:LOC_REPID LIKE SY-REPID.
LOC_REPID = SY-REPID.
LS_FIELDCAT-FIELDNAME = 'KOSTL'.
LS_FIELDCAT-REPTEXT_DDIC = '成本中心代码'.
APPEND LS_FIELDCAT TO IT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-FIELDNAME = 'KOSTLT'.
LS_FIELDCAT-REPTEXT_DDIC = '成本中心描述'.
APPEND LS_FIELDCAT TO IT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-FIELDNAME = 'ZDEPT5'.
LS_FIELDCAT-REPTEXT_DDIC = '五级部门'.
APPEND LS_FIELDCAT TO IT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-FIELDNAME = 'ZDEPT4'.
LS_FIELDCAT-REPTEXT_DDIC = '四级部门'.
APPEND LS_FIELDCAT TO IT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-FIELDNAME = 'ZDEPT3'.
LS_FIELDCAT-REPTEXT_DDIC = '三级部门'.
APPEND LS_FIELDCAT TO IT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-FIELDNAME = 'ZDEPT2'.
LS_FIELDCAT-REPTEXT_DDIC = '二级部门'.
APPEND LS_FIELDCAT TO IT_FIELDCAT.
CLEAR LS_FIELDCAT.
LS_FIELDCAT-FIELDNAME = 'ZDEPT1'.
LS_FIELDCAT-REPTEXT_DDIC = '一级部门'.
APPEND LS_FIELDCAT TO IT_FIELDCAT.
CLEAR LS_FIELDCAT.
ENDFORM. "FIELDCAT_INIT
" FIELDCAT_INIT
*&---------------------------------------------------------------------*
*& FORM LAYOUT_INIT
*&---------------------------------------------------------------------*
* TEXT LAYOUT属性设置,双击响应字段设置
*----------------------------------------------------------------------*
* -->P_IS_LAYOUT TEXT
*----------------------------------------------------------------------*
FORM LAYOUT_INIT USING IS_LAYOUT TYPE SLIS_LAYOUT_ALV.
IS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
ENDFORM. " LAYOUT_INIT
**&--------------------------------------------------------------------*
**& FORM USER_COMMAND
**&--------------------------------------------------------------------*
** TEXT
**---------------------------------------------------------------------*
** -->RF_UCOMM TEXT
** -->RS_SELFIELDTEXT
**---------------------------------------------------------------------*
FORM USER_COMMAND USING RF_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD. "#EC CALLED
CASE RF_UCOMM.
WHEN '&PRT'.
*****插入数据
IF DELFLG = 'X'.
DELETE FROM ZPPCOSTMDATA.
INSERT ZPPCOSTMDATA FROM TABLE WTAB.
ELSE.
INSERT ZPPCOSTMDATA FROM TABLE WTAB ACCEPTING DUPLICATE KEYS.
ENDIF.
DESCRIBE TABLE WTAB LINES COUNT.
MESSAGE S001(00) WITH '成功上传' COUNT '条'.
ENDCASE.
ENDFORM. "USER_COMMAND
*&---------------------------------------------------------------------*
*& FORM GETEXCEL
*&---------------------------------------------------------------------*
* TEXT 获取上传EXCEL文件内相关数据
*----------------------------------------------------------------------*
* --> P1 TEXT
* <-- P2 TEXT
*----------------------------------------------------------------------*
FORM GETEXCEL .
G_FILE = P_FILE. "注意两个文件用于不同的函数,所以类型不同
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
FILENAME = G_FILE
I_BEGIN_COL = 1
I_BEGIN_ROW = 1
I_END_COL = 10
I_END_ROW = 5000
TABLES
INTERN = ITAB[].
DELETE ITAB WHERE ROW = 1. "删除字段名行
LOOP AT ITAB.
ON CHANGE OF ITAB-ROW.
IF SY-TABIX NE 1.
APPEND WTAB.
CLEAR WTAB.
ENDIF.
ENDON.
ASSIGN COMPONENT ITAB-COL OF STRUCTURE WTAB TO <FS>. "动态方法将值传到相应的内表
<FS> = ITAB-VALUE.
ENDLOOP.
APPEND WTAB. "这句不要忘记,要把最后一条APPEND到内表中
sort wtab by KOSTL.
ENDFORM. " GETEXCEL
*&---------------------------------------------------------------------*
*& Form GETDATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM GETDATA .
SELECT *
INTO CORRESPONDING FIELDS OF TABLE WTAB
FROM ZPPCOSTMDATA
WHERE KOSTL IN S_KOSTL AND
ZDEPT1 IN S_ZDEPT1 AND
ZDEPT2 IN S_ZDEPT2 AND
ZDEPT3 IN S_ZDEPT3 AND
ZDEPT4 IN S_ZDEPT4 AND
ZDEPT5 IN S_ZDEPT5.
SORT WTAB BY KOSTL.
ENDFORM. " GETDATA
*&---------------------------------------------------------------------*
*& Form CALLSM30
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM CALLSM30 .
CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
EXPORTING
action = 'U' " S = Display U = Change T = Transport
view_name = 'ZPPCOSTMDATA' "读取的表
no_warning_for_clientindep = 'X'
EXCEPTIONS
client_reference = 1
foreign_lock = 2
invalid_action = 3
no_clientindependent_auth = 4
no_database_function = 5
no_editor_function = 6
no_show_auth = 7
no_tvdir_entry = 8
no_upd_auth = 9
only_show_allowed = 10
system_failure = 11
unknown_field_in_dba_sellist = 12
view_not_found = 13
OTHERS = 14.
ENDFORM. " CALLSM30
*&---------------------------------------------------------------------*
*& Form DOWNLOAD_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM DOWNLOAD_DATA .
l_filename = 'ZKSSC.xlsx'.
l_muban = 'ZKSSC'.
*&---下载模板
PERFORM frm_get_fullpath CHANGING gv_fullpath gv_path gv_name.
*&---路径为空则退出
IF gv_fullpath IS INITIAL.
MESSAGE '用户取消操作' TYPE 'S'.
RETURN.
ENDIF.
PERFORM frm_down USING gv_fullpath.
ENDFORM. " DOWNLOAD_DATA
*&---------------------------------------------------------------------*
*& Form FRM_GET_FULLPATH
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_GV_FULLPATH text
* <--P_GV_PATH text
* <--P_GV_NAME text
*----------------------------------------------------------------------*
FORM frm_get_fullpath CHANGING pv_fullpath TYPE string
pv_path TYPE string
pv_name TYPE string.
DATA: lv_init_path TYPE string,
lv_init_fname TYPE string,
lv_path TYPE string,
lv_filename TYPE string,
lv_fullpath TYPE string.
*&---初始名称(输出的文件名称)
* concatenate 'Material_Doc_' SY-DATUM '.xslx' into L_INIT_FNAME.
lv_init_fname = l_filename.
* 获取桌面路径
CALL METHOD cl_gui_frontend_services=>get_desktop_directory
CHANGING
desktop_directory = lv_init_path
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
EXIT.
ENDIF.
*&---用户选择名称、路径
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
* window_title = '指定保存文件名'
* default_extension = 'DOC'
default_file_name = lv_init_fname
* FILE_FILTER = CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL
* FILE_FILTER = CL_GUI_FRONTEND_SERVICES=>FILETYPE_WORD
initial_directory = lv_init_path
prompt_on_overwrite = 'X'
CHANGING
filename = lv_filename
path = lv_path
fullpath = lv_fullpath
* USER_ACTION =
* FILE_ENCODING =
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc = 0.
pv_fullpath = lv_fullpath.
pv_path = lv_path.
ENDIF.
ENDFORM. " FRM_GET_FULLPATH
*--------------------------------------------------------------------*
* 下载文件
*--------------------------------------------------------------------*
FORM frm_down USING pr_filename.
DATA: lv_objdata LIKE wwwdatatab,
lv_mime LIKE w3mime,
lv_destination LIKE rlgrap-filename,
lv_objnam TYPE string,
lv_rc LIKE sy-subrc,
lv_errtxt TYPE string.
DATA: lv_filename TYPE string,
lv_result,
lv_subrc TYPE sy-subrc.
DATA: lv_objid TYPE wwwdatatab-objid .
lv_objid = l_muban. "上传的模版名称
*&---查找文件是否存在。
SELECT SINGLE relid objid
FROM wwwdata
INTO CORRESPONDING FIELDS OF lv_objdata
WHERE srtf2 = 0
AND relid = 'MI'
AND objid = lv_objid.
*&---判断模版不存在则报错
IF sy-subrc NE 0 OR lv_objdata-objid EQ space.
CONCATENATE '模板文件:' lv_objid '不存在,请用TCODE:SMW0进行加载'
INTO lv_errtxt.
MESSAGE lv_errtxt TYPE 'E'.
ENDIF.
lv_filename = pr_filename.
"判断本地地址是否已经存在此文件。
CALL METHOD cl_gui_frontend_services=>file_exist
EXPORTING
file = lv_filename
RECEIVING
result = lv_result
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
wrong_parameter = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc <> 0.
CASE sy-subrc.
WHEN 1.
WHEN 2.
WHEN OTHERS.
ENDCASE.
ENDIF.
IF lv_result EQ 'X'. "如果存在则删除原始文件,重新覆盖
CALL METHOD cl_gui_frontend_services=>file_delete
EXPORTING
filename = lv_filename
CHANGING
rc = lv_subrc
EXCEPTIONS
file_delete_failed = 1
cntl_error = 2
error_no_gui = 3
file_not_found = 4
access_denied = 5
unknown_error = 6
not_supported_by_gui = 7
wrong_parameter = 8
OTHERS = 9.
IF sy-subrc <> 0.
CASE sy-subrc.
WHEN 1.
WHEN 2.
WHEN OTHERS.
ENDCASE.
ENDIF.
IF lv_subrc <> 0. "如果删除失败,则报错。
CONCATENATE '同名EXCEL文件已打开' '请关闭该EXCEL后重试。'
INTO lv_errtxt.
MESSAGE lv_errtxt TYPE 'E'.
ENDIF.
ENDIF.
lv_destination = pr_filename.
*&---下载模版。
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
KEY = lv_objdata
destination = lv_destination
IMPORTING
rc = lv_rc.
IF lv_rc NE 0.
CONCATENATE '模板文件' '下载失败' INTO lv_errtxt.
MESSAGE lv_errtxt TYPE 'E'.
ENDIF.
ENDFORM. "frm_down
实际推送中间库
*&---------------------------------------------------------------------*
*& Report ZDBCO_SD_DATA2TMPDB
*&
*&---------------------------------------------------------------------*
*& 生产成本中心实际成本到209 *
*& DATE:20220228 *
*& AUTHOR: gavin
*& Tcode:ZPPCOREL
*&---------------------------------------------------------------------*
REPORT ZDBCO_PP_COSTREL2TMPDB.
TABLES:ZPPCOSTMDATA,COSS,BKPF,CSKU.
*----------------------------------------------------------------------*
* 数据声明 - 开始
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* DESC:定义内表结构
*----------------------------------------------------------------------*
TYPES:BEGIN OF W_ITAB,
GJAHR LIKE BKPF-GJAHR,"组代码
PMONTH LIKE BKPF-MONAT,"客户代码
KSTAR LIKE COSS-KSTAR,"成本要素
KOSTL LIKE ZPPCOSTMDATA-KOSTL,
MCOD1 LIKE CSKT-KTEXT,"成本中心描述
MCTXT LIKE CSKU-LTEXT,"成本要素描述
COSTR LIKE COSS-WKG007,"值
DEPT1 LIKE ZPPCOSTMDATA-ZDEPT1,"部门1
DEPT2 LIKE ZPPCOSTMDATA-ZDEPT2,"部门2
DEPT3 LIKE ZPPCOSTMDATA-ZDEPT3,"部门3
DEPT4 LIKE ZPPCOSTMDATA-ZDEPT4,"部门4
DEPT5 LIKE ZPPCOSTMDATA-ZDEPT5,"部门5
END OF W_ITAB.
*----------------------------------------------------------------------*
* DESC:定义所需要的内表
*----------------------------------------------------------------------*
DATA: ITAB TYPE TABLE OF W_ITAB WITH HEADER LINE." WITH KEY KUNNR BUKRS.
DATA: COUNT TYPE I.
DATA:STDATUM LIKE SY-DATUM,
STUZEIT LIKE SY-UZEIT,
GT_FIELDCAT TYPE LVC_T_FCAT,
GS_FIELDCAT TYPE LVC_S_FCAT,
GS_LAYOUT TYPE LVC_S_LAYO.
*----------------------------------------------------------------------*
* 数据定义结束
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* DESC:定义选择屏幕
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TXT1. "客户号
PARAMETERS:PGJAHR LIKE BKPF-GJAHR DEFAULT SY-DATUM+0(4)."年度
PARAMETERS:PMONAT LIKE BKPF-MONAT DEFAULT SY-DATUM+4(2)."月度
SELECT-OPTIONS:S_KOSTL FOR ZPPCOSTMDATA-KOSTL,"工厂
S_ZDEPT1 FOR ZPPCOSTMDATA-ZDEPT1,"一级部门
S_ZDEPT2 FOR ZPPCOSTMDATA-ZDEPT2,"二级部门
S_ZDEPT3 FOR ZPPCOSTMDATA-ZDEPT3,"三级部门
S_ZDEPT4 FOR ZPPCOSTMDATA-ZDEPT4,"四级部门
S_ZDEPT5 FOR ZPPCOSTMDATA-ZDEPT5."五级部门.
SELECT-OPTIONS:S_KSTAR FOR COSS-KSTAR.
SELECTION-SCREEN END OF BLOCK B1 .
SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TXT2.
PARAMETERS: PCONME1 LIKE DBCON-CON_NAME DEFAULT 'ORA_209MES'.
SELECTION-SCREEN END OF BLOCK B2 .
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(8) TEXT-001.
SELECTION-SCREEN END OF LINE.
*----------------------------------------------------------------------*
* DESC:INITIALIZATION事件
*----------------------------------------------------------------------*
INITIALIZATION.
TXT1 = '请输入选择条件'.
TXT2 = '目标数据库'.
S_KSTAR-SIGN = 'I'.
S_KSTAR-option = 'EQ'.
S_KSTAR-LOW = '0041050500'. "制造费用-机物料-直接费用
APPEND S_KSTAR.
S_KSTAR-LOW = '0041050501'. "制造费用-机物料-柴油费
APPEND S_KSTAR.
S_KSTAR-LOW = '0041050503'. "制造费用-机物料-油漆费
APPEND S_KSTAR.
S_KSTAR-LOW = '0041050504'."制造费用-机物料-维修费用
APPEND S_KSTAR.
S_KSTAR-LOW = '0041050505'."制造费用-机物料-投资费用
APPEND S_KSTAR.
S_KSTAR-LOW = '0041050506'."制造费用-机物料-间接费用
APPEND S_KSTAR.
S_KSTAR-LOW = '0041050804'."制造费用-办公费-环保排污费
APPEND S_KSTAR.
S_KSTAR-LOW = '0041050805'."制造费用-办公费-安全费
APPEND S_KSTAR.
AT SELECTION-SCREEN.
*----------------------------------------------------------------------*
* DESC:START-OF-SELECTION事件
*----------------------------------------------------------------------*
START-OF-SELECTION.
STDATUM = SY-DATUM.
STUZEIT = SY-UZEIT.
* 获取数据
PERFORM GETDATA.
* 数据条数
DESCRIBE TABLE ITAB LINES COUNT.
PERFORM WRITERPTRUNRECORD.
IF PCONME1 IS NOT INITIAL AND PCONME1 <> SPACE.
PERFORM UPLOAD2DEST USING PCONME1 COUNT.
ELSE.
"ALV展示
PERFORM display.
ENDIF.
*&---------------------------------------------------------------------*
*& Form UPLOAD2DEST
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_DBNAME text
* -->CNT text
*----------------------------------------------------------------------*
form UPLOAD2DEST USING P_DBNAME LIKE DBCON-CON_NAME CNT TYPE I.
DATA:lcnt TYPE I .
DATA: lcx_error TYPE REF TO cx_root.
DATA: err_text TYPE C LENGTH 1000.
TRY.
PERFORM GETCON USING P_DBNAME.
lcnt = 0.
LOOP AT ITAB.
lcnt = lcnt + 1.
EXEC SQL.
DELETE FROM SAP_FICO_REALCOST_3611_KOSTL
WHERE GJAHR = :ITAB-gjahr AND PMONTH = :itab-pmonth AND KSTAR = :itab-kstar AND kostl = :itab-KOSTL
ENDEXEC.
EXEC SQL.
INSERT INTO SAP_FICO_REALCOST_3611_KOSTL
(GJAHR,PMONTH,KSTAR,KOSTL,MCOD1,MCTXT,COSTR,DEPT1,DEPT2,DEPT3,DEPT4,DEPT5)
VALUES
(:ITAB-gjahr,:ITAB-pmonth,:ITAB-kstar,:ITAB-kostl,:ITAB-MCOD1,
:ITAB-MCTXT,:ITAB-COSTR,:ITAB-DEPT1,:ITAB-DEPT2,:ITAB-DEPT3,:ITAB-DEPT4,
:ITAB-DEPT5)
ENDEXEC.
ENDLOOP.
PERFORM CLOSECON USING P_DBNAME.
CATCH cx_sy_open_sql_db CX_SY_NATIVE_SQL_ERROR INTO lcx_error.
err_text = lcx_error->get_text( ). "得到错误信息
WRITE:/ SY-VLINE, '上传数据到',P_DBNAME,'失败,原因:',err_text , SY-VLINE.
ENDTRY.
WRITE:/ SY-VLINE, '上传数据',lcnt,'/',CNT,'到',P_DBNAME,'成功', SY-VLINE.
WRITE:/ SY-ULINE.
ENDFORM. "UPLOAD2DEST
*&---------------------------------------------------------------------*
*& Form display
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM DISPLAY.
PERFORM BUILD_FIELDCAT USING 'GJAHR' '' '' '' '' '' '' '年度' 'X'.
PERFORM BUILD_FIELDCAT USING 'PMONTH' '' '' '' '' '' '' '月份' 'X'.
PERFORM BUILD_FIELDCAT USING 'KSTAR' '' '' '' '' '' '' '成本要素' 'X'.
PERFORM BUILD_FIELDCAT USING 'KOSTL' '' '' '' '' '' '' '成本中心' 'X'.
PERFORM BUILD_FIELDCAT USING 'MCOD1' '' '' '' '' '' '' '成本中心描述' ''.
PERFORM BUILD_FIELDCAT USING 'MCTXT' '' '' '' '' '' '' '成本要素描述' 'X'.
PERFORM BUILD_FIELDCAT USING 'COSTR' '' '' '' '' '' '' '实际成本' 'X'.
PERFORM BUILD_FIELDCAT USING 'DEPT1' '' '' '' '' '' '' '一级部门' ''.
PERFORM BUILD_FIELDCAT USING 'DEPT1' '' '' '' '' '' '' '二级部门' ''.
PERFORM BUILD_FIELDCAT USING 'DEPT1' '' '' '' '' '' '' '三级部门' ''.
PERFORM BUILD_FIELDCAT USING 'DEPT1' '' '' '' '' '' '' '四级部门' ''.
PERFORM BUILD_FIELDCAT USING 'DEPT1' '' '' '' '' '' '' '五级部门' ''.
gs_layout-cwidth_opt = 'X'.
gs_layout-zebra = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
" I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_ALV'
I_CALLBACK_USER_COMMAND = 'USER_COMMAND_ALV'
IT_FIELDCAT_LVC = GT_FIELDCAT
IS_LAYOUT_LVC = GS_LAYOUT
I_DEFAULT = 'X'
I_SAVE = 'A'
TABLES
T_OUTTAB = ITAB
EXCEPTIONS
OTHERS = 1.
ENDFORM. "display
*&---------------------------------------------------------------------*
*& FORM GETCON
*&---------------------------------------------------------------------*
* TEXT 调用外部数据库
*----------------------------------------------------------------------*
FORM GETCON USING P_DBNAME LIKE DBCON-CON_NAME.
EXEC SQL.
CONNECT TO :P_DBNAME
ENDEXEC.
IF SY-SUBRC NE 0.
WRITE:/ '连接数据库失败'.
ENDIF.
EXEC SQL.
SET CONNECTION :P_DBNAME
ENDEXEC.
ENDFORM. "GETCON
*&---------------------------------------------------------------------*
*& FORM CLOSECON
*&---------------------------------------------------------------------*
* TEXT 关闭外部数据库
*----------------------------------------------------------------------*
FORM CLOSECON USING P_DBNAME LIKE DBCON-CON_NAME.
COMMIT CONNECTION (P_DBNAME).
EXEC SQL.
DISCONNECT :P_DBNAME
ENDEXEC.
ENDFORM. "CLOSECON
*&---------------------------------------------------------------------*
*& Form BUILD_FIELDCAT
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
FORM BUILD_FIELDCAT USING P_FIELDNAME TYPE FIELDNAME
P_QFIELDNAME TYPE LVC_QFNAME
P_CFIELDNAME TYPE LVC_CFNAME
P_REF_TABLE TYPE LVC_RTNAME
P_REF_FIELD TYPE LVC_RFNAME
P_CONVEXIT TYPE CONVEXIT
P_EMPHASIZE TYPE LVC_EMPHSZ
P_SCRTEXT_L TYPE SCRTEXT_L
P_NO_ZERO TYPE XFLAG.
GS_FIELDCAT-FIELDNAME = P_FIELDNAME.
GS_FIELDCAT-QFIELDNAME = P_QFIELDNAME.
GS_FIELDCAT-CFIELDNAME = P_CFIELDNAME.
GS_FIELDCAT-REF_TABLE = P_REF_TABLE.
GS_FIELDCAT-REF_FIELD = P_REF_FIELD.
GS_FIELDCAT-CONVEXIT = P_CONVEXIT.
GS_FIELDCAT-EMPHASIZE = P_EMPHASIZE.
GS_FIELDCAT-SCRTEXT_L = P_SCRTEXT_L.
GS_FIELDCAT-NO_ZERO = P_NO_ZERO.
GS_FIELDCAT-COLDDICTXT = 'L'.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
CLEAR: GS_FIELDCAT.
ENDFORM. "BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*& Form GETDATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM GETDATA.
"1先获取组织
"2再获取成本要素
"2成本中心 X 成本要素 + 3611实际
data:lorg like ZPPCOSTMDATA OCCURS 0 WITH HEADER LINE.
SELECT * FROM ZPPCOSTMDATA INTO TABLE LORG
WHERE KOSTL IN S_KOSTL AND
ZDEPT1 IN S_ZDEPT1 AND
ZDEPT2 IN S_ZDEPT2 AND
ZDEPT3 IN S_ZDEPT3 AND
ZDEPT4 IN S_ZDEPT4 AND
ZDEPT5 IN S_ZDEPT5.
data:lcsku like csku OCCURS 0 WITH HEADER LINE.
SELECT * FROM CSKU INTO TABLE LCSKU
WHERE KSTAR IN S_KSTAR AND SPRAS = 1 AND KTOPL = 'T001'.
LOOP AT LCSKU.
LOOP AT LORG.
ITAB-GJAHR = PGJAHR.
ITAB-PMONTH = PMONAT.
ITAB-KOSTL = LORG-KOSTL.
ITAB-MCOD1 = LORG-KOSTLT.
ITAB-KSTAR = LCSKU-KSTAR.
ITAB-MCTXT = LCSKU-MCTXT.
ITAB-DEPT1 = LORG-ZDEPT1.
ITAB-DEPT2 = LORG-ZDEPT2.
ITAB-DEPT3 = LORG-ZDEPT3.
ITAB-DEPT4 = LORG-ZDEPT4.
ITAB-DEPT5 = LORG-ZDEPT5.
PERFORM GETREALCOSTREF3611 USING ITAB-KSTAR ITAB-KOSTL ITAB-GJAHR ITAB-PMONTH CHANGING ITAB-COSTR.
APPEND ITAB.
ENDLOOP.
ENDLOOP.
ENDFORM. "GETDATA
*&---------------------------------------------------------------------*
*& Form WRITERPTRUNRECORD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM WRITERPTRUNRECORD.
DATA:l_werks LIKE t001 OCCURS 0 WITH HEADER LINE.
GET TIME.
CALL FUNCTION 'ZSYS_RPT_RUNRECORD'
EXPORTING
TCODE = SY-TCODE
PROGRAMM = SY-CPROG
* bukrs = l_werks-bukrs
"werks = werks
DATUMRST = STDATUM
UZEITRST = STUZEIT
BATCH = SY-BATCH
DATUMREND = SY-datum
UZEITREND = sy-UZEIT
DATUMC = '20220228'
RUNNER = SY-UNAME
RPTSRC = 'PPCO'.
ENDFORM. "WRITERPTRUNRECORD
*&---------------------------------------------------------------------*
*& Form getrealcostref3611
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->KSTAR text
* -->PKOSTL text
* -->PGJAHR text
* -->PMONTH text
* -->P2 text
*----------------------------------------------------------------------*
FORM getrealcostref3611 USING KSTAR LIKE cOSP-KSTAR pKOSTL LIKE ONRKS-KOSTL pgjahr like bkpf-gjahr pmonth like bkpf-monat
CHANGING p2 LIKE cosp-WTG001.
DATA:pobjnr LIKE ONRKS OCCURS 0 WITH HEADER LINE.
DATA:pcosp2 LIKE cosp OCCURS 0 WITH HEADER LINE.
DATA:CNT TYPE I.
"第一步 依据成本中心获取成本对象号
SELECT OBJNR INTO POBJNR-OBJNR FROM ONRKS
WHERE KOSTL = pKOSTL.
APPEND POBJNR.
ENDSELECT.
SELECT OBJNR INTO POBJNR-OBJNR FROM ONRKL
WHERE KOSTL = pKOSTL.
APPEND POBJNR.
ENDSELECT.
LOOP AT POBJNR.
"COSP 取数实际 按月 案期间的
SELECT WTG001 WTG002 WTG003 WTG004 WTG005 WTG006 WTG007 WTG008 WTG009 WTG010 WTG011 WTG012
INTO (PCOSP2-WTG001,PCOSP2-WTG002,PCOSP2-WTG003,PCOSP2-WTG004,PCOSP2-WTG005,PCOSP2-WTG006,
PCOSP2-WTG007,PCOSP2-WTG008,PCOSP2-WTG009,PCOSP2-WTG010,PCOSP2-WTG011,PCOSP2-WTG012 )
FROM COSP WHERE
GJAHR = pgjahr AND
OBJNR = POBJNR-OBJNR AND
KSTAR EQ KSTAR AND
WRTTP = '04' AND
VERSN = '000' AND LEDNR = '00'.
COLLECT PCOSP2.
ENDSELECT.
ENDLOOP.
DESCRIBE TABLE PCOSP2 LINES CNT.
IF CNT > 0.
READ TABLE PCOSP2 INTO PCOSP2 INDEX 1.
CASE pmonth.
WHEN '01'.
p2 = PCOSP2-WTG001.
WHEN '02'.
p2 = PCOSP2-WTG002.
WHEN '03'.
p2 = PCOSP2-WTG003.
WHEN '04'.
p2 = PCOSP2-WTG004.
WHEN '05'.
p2 = PCOSP2-WTG005.
WHEN '06'.
p2 = PCOSP2-WTG006.
WHEN '07'.
p2 = PCOSP2-WTG007.
WHEN '08'.
p2 = PCOSP2-WTG008.
WHEN '09'.
p2 = PCOSP2-WTG009.
WHEN '10'.
p2 = PCOSP2-WTG010.
WHEN '11'.
p2 = PCOSP2-WTG011.
WHEN '12'.
p2 = PCOSP2-WTG012.
ENDCASE.
ENDIF.
ENDFORM. "getrealcostref3611