自己写的一个使用BDC进行项目预算导入,但有个问题还没办法解决:屏幕的分辩率不一样,屏幕每页的输入字段也会不一样。
这个程序是假定屏幕分辩率为1600*900,每页可输入18个WBS元素的预算。
不知道有没有高手,可以指导一下有关如何获取分辩率下,每页的WBS元素个数,以及该如何判断输入位置。
代码如下:
REPORT ZTEST18 NO STANDARD PAGE HEADING
LINE-SIZE 255
MESSAGE-ID zhr.
*---------------------------------------------------------------------*
* Tables: *
*---------------------------------------------------------------------*
TABLES: proj,prps,coas,jest,rpsco.
*---------------------------------------------------------------------*
* Constants: 设置TRANSACTION CODE、显示和更新的模式 *
*---------------------------------------------------------------------*
CONSTANTS: tmp_tc(10) VALUE 'CJ30', " Transaction Code
tmp_info TYPE string VALUE '2003', " 信息类型
* SUB_INFO TYPE STRING VALUE '1', " 子信息类型
dismod VALUE 'N', " Display Mode E:只有在出现错误时才显示屏幕
*'N'完全在后台跑;'A'显示;'S';
upmod VALUE 'S'.
*---------------------------------------------------------------------*
* Data: 建BDC内表及Work Internal Table *
*---------------------------------------------------------------------*
DATA: itab_bdc LIKE STANDARD TABLE OF bdcdata
INITIAL SIZE 30 WITH HEADER LINE.
data page type i value '0'. "翻页标志
data position type i. "填数位置
DATA: BEGIN OF itab_tmp OCCURS 0,
pspid like proj-pspid, "项目定义
posid1 like prps-posid, "WBS元素
wlp00(10) type c, "预算
end of itab_tmp.
*---------------------------------------------------------------------*
* 定义存放错误的内表 *
*---------------------------------------------------------------------*
*&---------------------- 存放error的信息
DATA: BEGIN OF itab_log OCCURS 0,
index TYPE i, "记录序号
status(20) TYPE c, "导入状态
pspid like prps-posid, "项目定义
END OF itab_log.
*&---------------------- 存放屏幕输出的error信息
DATA: BEGIN OF itab_screenlog OCCURS 0,
logdate TYPE sy-datum, "日志时间
logtime TYPE sy-uzeit,
recno TYPE i, "记录序号
recmsg(30) TYPE c, "记录描述(如:员工号、名称等)
errmsg(100) TYPE c, "信息描述(如:错误,状态信息)
END OF itab_screenlog.
*----------------------------------------------------------------------*
* 导入文件 *
*----------------------------------------------------------------------*
* 定义本地日志文件
DATA: logfile TYPE string VALUE 'C:/Documents and Settings/liuyanlin/桌面/2010_dat.txt'.
DATA: tmp_index TYPE i VALUE 1, "导入数据的序号
tmp_slcheck TYPE i,
tmp_upcheck TYPE i,
tmp_fcheck TYPE c, "判断文件存在标志位
tmp_begda(10) TYPE c VALUE '2007-6-1', "固定值'2007-6-1'
tmp_endda(10) TYPE c VALUE '9999-12-31'. "固定值'9999-12-31'
*---------------------------------------------------------------------*
* 选择文件: *
*---------------------------------------------------------------------*
DATA: infile TYPE string . "导入文件
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECTION-SCREEN SKIP 1.
PARAMETERS t_infile LIKE rlgrap-filename MEMORY ID pth
DEFAULT 'C:/Documents and Settings/liuyanlin/桌面/t-2020预算.txt' OBLIGATORY.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN END OF BLOCK b1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR t_infile.
PERFORM frm_select_file USING t_infile tmp_slcheck.
INITIALIZATION.
*********************************************************
*---------------------------------------------------------------------*
* Main Program: *
*---------------------------------------------------------------------*
START-OF-SELECTION.
infile = t_infile.
tmp_fcheck = cl_gui_frontend_services=>file_exist( infile ).
IF tmp_fcheck IS INITIAL.
PERFORM frm_append_log USING
'' '' '输入文件出错,请选择正确的文件或输入正确的路径及文件名!'.
ELSE.
PERFORM frm_upload USING tmp_upcheck.
PERFORM frm_process.
ENDIF.
PERFORM frm_write_error.
PERFORM frm_write_log. "写屏幕日志
END-OF-SELECTION.
*---------------------------------------------------------------------*
* FORM FRM_SELECT_FILE *
*---------------------------------------------------------------------*
* 说明: 选择本地文件 *
*---------------------------------------------------------------------*
* P : TMP_FLIE *
* P_SLCHECK 选择成功标志位 *
* T : 无 *
*---------------------------------------------------------------------*
FORM frm_select_file USING tmp_file p_slcheck.
p_slcheck = -1.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
mask = ',*.*,*.*. '
mode = 'O'
IMPORTING
filename = tmp_file
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc <> 0 .
PERFORM frm_append_log USING '' '' '选择文件出错,导入中止!'.
p_slcheck = -1.
ELSE.
p_slcheck = 0.
ENDIF.
ENDFORM. "FRM_SELECT_FILE
*---------------------------------------------------------------------*
* FORM FRM_UPLOAD *
*---------------------------------------------------------------------*
* 说明:从本地打开文本格式文件 *
*---------------------------------------------------------------------*
* P : P_UPCHECK 上载成功标志位 *
* T : 无 *
*---------------------------------------------------------------------*
FORM frm_upload CHANGING p_upcheck.
p_upcheck = -1.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = infile
filetype = 'ASC'
has_field_separator = '0'
READ_BY_LINE = 'X'
TABLES
data_tab = itab_tmp
EXCEPTIONS
file_open_error = 1
file_read_error = 2.
IF sy-subrc <> 0.
PERFORM frm_append_log USING '' '' '上载数据出错,导入中止!'.
p_upcheck = -1.
ELSE.
p_upcheck = 0.
ENDIF.
"删除标题行
delete itab_tmp INDEX 1 .
ENDFORM. "FRM_UPLOAD
*---------------------------------------------------------------------*
* FORM FRM_CALL_TRANSACTION *
*---------------------------------------------------------------------*
* 说明: 调用TCode去添加地址信息 *
*---------------------------------------------------------------------*
* P : 无 *
* T : 无 *
*---------------------------------------------------------------------*
FORM frm_call_transaction.
DATA: tmp_str TYPE string,
tmpstr(100) TYPE c, "记录出错信息
tmpperno(20) TYPE c. "记录员工编号
*执行批量输入
CALL TRANSACTION tmp_tc
USING itab_bdc
MODE dismod
UPDATE upmod.
itab_log-index = tmp_index.
IF sy-subrc <> 0.
*& --------- log文件的相关信息
tmp_str = sy-subrc.
CONCATENATE 'ERROR,SUBRC= ' tmp_str INTO itab_log-status .
*& --------- screenlog的相关信息
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
INTO tmpstr.
CONCATENATE '错误信息: ' tmpstr INTO tmpstr.
ELSE.
itab_log-status = 'OK'.
tmpstr = '导入成功.'.
ENDIF.
* CONCATENATE '员工号: ' ITAB_TMP-PERNR INTO TmpPerNO.
tmpperno = itab_tmp-pspid.
PERFORM frm_append_log USING tmp_index tmpperno tmpstr.
tmp_index = tmp_index + 1.
CLEAR sy-subrc.
ENDFORM. "FRM_CALL_TRANSACTION
*---------------------------------------------------------------------*
* FORM PRM_PROCESS *
*---------------------------------------------------------------------*
* 说明: 数据处理过程 *
*---------------------------------------------------------------------*
FORM frm_process.
DATA: wa_idx TYPE i,wa_tot TYPE i,wa_i(6),wa_t(6),wa_txt(50). "add
DELETE itab_tmp WHERE pspid = space. "add
DESCRIBE TABLE itab_tmp LINES wa_tot. "add
wa_t = wa_tot. "add
LOOP AT itab_tmp.
wa_idx = wa_idx + 1. "add
wa_i = wa_idx. "add
*& --------- 将记录填入log表
ITAB_LOG-PSPID = itab_tmp-pspid.
* itab_log-pernr = itab_tmp-pernr. "人员编号
*& --------- 对日期进行格式化
* PERFORM frm_change_date USING itab_tmp-begda.
PERFORM frm_fill_bdc_tab.
PERFORM frm_call_transaction.
CONCATENATE 'BDC处理进度:' wa_i '/' wa_t INTO wa_txt. "add
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' "add
EXPORTING "add
text = wa_txt. "add
APPEND itab_log.
ENDLOOP.
PERFORM frm_append_log USING '' '' '处理完成.'.
ENDFORM. "FRM_PROCESS
*---------------------------------------------------------------------*
* FORM FRM_FILL_BDC_TAB *
*---------------------------------------------------------------------*
* 说明: 新增数据到BDC表中 *
*---------------------------------------------------------------------*
* P : 无 *
* T : 无 *
*---------------------------------------------------------------------*
FORM frm_fill_bdc_tab.
REFRESH itab_bdc.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPMKBUD' '0200',
'' 'BDC_OKCODE' '/EEOKS',
'1' 'SAPLSPO4' '0300',
'' 'SVALD-VALUE(01)' '1000',
'' 'BDC_OKCODE' '=FURT',
'1' 'SAPMKBUD' '0200',
'' 'PROJ-PSPID' itab_tmp-pspid,
'' 'BDC_OKCODE' '=EINO'.
loop at itab_tmp.
page = page + 1.
position = ( sy-tabix - 1 ) mod 18 + 1 . "计算出输入数在屏幕的行位置
if position = 1.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(01)' itab_tmp-wlp00.
"分隔符
elseif position = 2.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(02)' itab_tmp-wlp00.
"分隔符
elseif position = 3.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(03)' itab_tmp-wlp00.
"分隔符
elseif position = 4.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(04)' itab_tmp-wlp00.
"分隔符
elseif position = 5.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(05)' itab_tmp-wlp00.
"分隔符
elseif position = 6.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(06)' itab_tmp-wlp00.
"分隔符
elseif position = 7.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(07)' itab_tmp-wlp00.
"分隔符
elseif position = 8.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(08)' itab_tmp-wlp00.
"分隔符
elseif position = 9.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(09)' itab_tmp-wlp00.
"分隔符
elseif position = 10.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(10)' itab_tmp-wlp00.
"分隔符
elseif position = 11.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(11)' itab_tmp-wlp00.
"分隔符
elseif position = 12.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(12)' itab_tmp-wlp00.
"分隔符
elseif position = 13.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(13)' itab_tmp-wlp00.
"分隔符
elseif position = 14.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(14)' itab_tmp-wlp00.
"分隔符
elseif position = 15.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(15)' itab_tmp-wlp00.
"分隔符
elseif position = 16.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(16)' itab_tmp-wlp00.
"分隔符
elseif position = 17.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(17)' itab_tmp-wlp00.
"分隔符
elseif position = 18.
PERFORM frm_popular_bdc_tab using:
'1' 'SAPLKBPP' '0320',
'' 'BPDY-WERT1(18)' itab_tmp-wlp00,
'' 'BDC_OKCODE' '=P+'.
"分隔符
endif.
endloop.
PERFORM frm_popular_bdc_tab using:
'' 'BDC_OKCODE' '=POST'.
ENDFORM. "FRM_FILL_BDC_TAB
*---------------------------------------------------------------------*
* FORM FRM_POPULAR_BDC_TAB *
*---------------------------------------------------------------------*
* 说明: 增加BDC字段数据 *
*---------------------------------------------------------------------*
* P : VAR1, *
* VAR2, *
* FLAG: 标志位 ‘1':屏幕,’’:字段 *
* T : 无 *
*---------------------------------------------------------------------*
FORM frm_popular_bdc_tab USING flag var1 var2.
CLEAR itab_bdc.
IF flag = '1'.
CASE var2.
WHEN ''.
WHEN OTHERS.
itab_bdc-program = var1. "所调用的程序名
itab_bdc-dynpro = var2. "启动的screen编号
itab_bdc-dynbegin = 'X'. "在程序调用的开始,是否调用新屏幕(X是 ,''不是)
ENDCASE.
ELSE.
CASE var2.
WHEN ''.
WHEN OTHERS.
itab_bdc-fnam = var1. "屏幕的字段名
itab_bdc-fval = var2. "屏幕的字段值
ENDCASE.
ENDIF.
APPEND itab_bdc.
ENDFORM. "FRM_POPULAR_BDC_TAB
*---------------------------------------------------------------------*
* FORM FRM_WRITE_ERROR *
*---------------------------------------------------------------------*
* 说明:说明:将error信息写入本地文本格式文件 *
*---------------------------------------------------------------------*
FORM frm_write_error.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = logfile
filetype = 'ASC'
append = ' '
write_field_separator = 'X'
TABLES
data_tab = itab_log
EXCEPTIONS
file_write_error = 1
unknown_error = 6.
ENDFORM. "FRM_WRITE_ERROR
*---------------------------------------------------------------------*
* FORM FRM_APPEND_LOG *
*---------------------------------------------------------------------*
* 说明 生成屏幕日志记录 *
*---------------------------------------------------------------------*
* P : P_IDX 日志标识: 0/1/2 空行/标题行/日志行 *
* P_RecMsg 记录描述 *
* P_ErrMsg 信息描述: 如错误信息、状态信息 *
* T : *
*---------------------------------------------------------------------*
FORM frm_append_log USING p_idx p_recmsg p_errmsg.
itab_screenlog-logdate = sy-datum.
itab_screenlog-logtime = sy-uzeit.
itab_screenlog-recno = p_idx.
itab_screenlog-recmsg = p_recmsg.
itab_screenlog-errmsg = p_errmsg.
APPEND itab_screenlog.
ENDFORM. "FRM_APPEND_LOG
*---------------------------------------------------------------------*
* FORM FRM_WRITE_LOG *
*---------------------------------------------------------------------*
* 说明 生成屏幕日志 *
*---------------------------------------------------------------------*
* P : *
* T : *
*---------------------------------------------------------------------*
FORM frm_write_log.
CONSTANTS: tmp_date(20) VALUE '日期',
tmp_time(20) VALUE '时间',
tmp_index(20) VALUE '序号',
tmp_pnum(30) VALUE '项目号',
* tmp_pnum(30) VALUE '员工号',
tmp_log(70) VALUE '记录执行信息'.
WRITE: / '用户: ', sy-uname,
/ '日志: ', sy-datum,
sy-uzeit USING EDIT MASK '__:__:__',
/ '事务: ', tmp_tc, '信息类型: ', tmp_info,
/ '文件: ', infile.
ULINE.
WRITE /.
WRITE: tmp_date COLOR 1,
15 tmp_time COLOR 1,
30 tmp_index COLOR 1,
45 tmp_pnum COLOR 1,
65 tmp_log COLOR 1.
WRITE /.
LOOP AT itab_screenlog.
* SEARCH '错误信息' FOR ITAB_SCREENLOG-ERRMSG.
FIND '错' IN itab_screenlog-errmsg.
IF sy-subrc = 0.
FORMAT COLOR COL_NEGATIVE INTENSIFIED OFF INVERSE OFF.
ELSE.
FORMAT COLOR COL_KEY INTENSIFIED OFF INVERSE OFF.
ENDIF.
WRITE: / itab_screenlog-logdate UNDER tmp_date,
itab_screenlog-logtime USING EDIT MASK '__:__:__' UNDER
tmp_time,
itab_screenlog-recmsg UNDER tmp_pnum,
itab_screenlog-errmsg UNDER tmp_log.
IF itab_screenlog-recno <> 0.
WRITE: itab_screenlog-recno LEFT-JUSTIFIED UNDER tmp_index.
ENDIF.
ENDLOOP.
ENDFORM.