SAP中PS项目预算导入程序

自己写的一个使用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(10VALUE '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.          "填数位置


DATABEGIN OF itab_tmp OCCURS 0,
  pspid like proj-pspid,     "项目定义
  posid1 like prps-posid,    "WBS元素
  wlp00(10type c,          "预算
  end of itab_tmp.

*---------------------------------------------------------------------*
*                        定义存放错误的内表                           *
*---------------------------------------------------------------------*
*&---------------------- 存放error的信息
DATABEGIN OF itab_log OCCURS 0,
        index TYPE i,            "记录序号
        status(20TYPE c,       "导入状态
        pspid like prps-posid,   "项目定义

      END OF itab_log.

*&---------------------- 存放屏幕输出的error信息
DATABEGIN 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(10TYPE c VALUE '2007-6-1',    "固定值'2007-6-1'
      tmp_endda(10TYPE 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(20TYPE 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(20VALUE '日期',
              tmp_time(20VALUE '时间',
              tmp_index(20VALUE '序号',
              tmp_pnum(30VALUE '项目号',
*              tmp_pnum(30) VALUE '员工号',
              tmp_log(70VALUE '记录执行信息'.

  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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值