ckstock

理论

https://blog.csdn.net/lalaoye/article/details/95622149 (举例   https://mp.weixin.qq.com/s/zDXMEXfaxavu9vsENiQhqw

教程 https://www.it1352.com/OnlineTutorial/CategoryList/SAP_Tutorials.html

大纲概览 https://www.cnblogs.com/VerySky/articles/2143562.html

选择帮助及table control

组织选择帮助

FORM FRM_SET_SCR  USING    U_OTYPE U_FIELDNAME.
  DATA: DYNPFIELDS_UP LIKE DYNPREAD OCCURS 0 WITH HEADER LINE.
  DATA: PROGNAME LIKE SY-REPID.
  DATA: DYNPNUMB LIKE SY-DYNNR.
  DATA: STEPLOOP LIKE SY-STEPL.
  DATA : SELF_REPID LIKE SY-REPID .                         "YNKK100992
  DATA : SELF_DYNNR LIKE SY-DYNNR .                         "YNKK100992
  DATA : F4_OBJEC   LIKE OBJEC.                            "XMKBCEK002468
  SELF_REPID = SY-REPID.                                    "YNKK100992
  SELF_DYNNR = SY-DYNNR.                                    "YNKK100992

  CALL FUNCTION \'RH_OBJID_REQUEST\'                       "XMKBCEK002468
    EXPORTING
      PLVAR           = \'01\'
      OTYPE           = U_OTYPE
      DYNPRO_REPID    = SELF_REPID
      DYNPRO_DYNNR    = SELF_DYNNR
*     dynpro_plvarfield     = \'PPHDR-PLVAR\'
*     dynpro_searkfield     = \'S_EOBJ-LOW\'
    IMPORTING
      SEL_OBJECT      = F4_OBJEC
    EXCEPTIONS
      CANCELLED       = 1
      WRONG_CONDITION = 2
      NOTHING_FOUND   = 3
      ILLEGAL_MODE    = 4
      INTERNAL_ERROR  = 5
      OTHERS          = 6.
  CHECK F4_OBJEC-OBJID IS NOT INITIAL.
*  get actual position
  CALL FUNCTION \'DYNP_GET_STEPL\'
    IMPORTING
      POVSTEPL = STEPLOOP.
  REFRESH DYNPFIELDS_UP.
  DYNPFIELDS_UP-STEPL     = STEPLOOP.
  DYNPFIELDS_UP-FIELDNAME = U_FIELDNAME.
  DYNPFIELDS_UP-FIELDVALUE = F4_OBJEC-OBJID.
  APPEND DYNPFIELDS_UP.

*  update table control
  CALL FUNCTION \'DYNP_VALUES_UPDATE\'
    EXPORTING
      DYNAME               = PROGNAME
      DYNUMB               = DYNPNUMB
    TABLES
      DYNPFIELDS           = DYNPFIELDS_UP
    EXCEPTIONS
      INVALID_ABAPWORKAREA = 1
      INVALID_DYNPROFIELD  = 2
      INVALID_DYNPRONAME   = 3
      INVALID_DYNPRONUMMER = 4
      INVALID_REQUEST      = 5
      NO_FIELDDESCRIPTION  = 6
      UNDEFIND_ERROR       = 7
      OTHERS               = 8.
ENDFORM. 

普通选择帮助

1、带参考文本值的返回

 

TYPES : BEGIN  OF typ_name ,
            werks TYPE t001w-werks,
            NAME1 TYPE t001w-NAME1,
          END  OF typ_name .

  DATA l_tab_name TYPE TABLE OF typ_name WITH HEADER LINE.

  SELECT  *  INTO  CORRESPONDING FIELDS OF TABLE   l_tab_name FROM t001w WHERE werks LIKE \'5%\'.
  CALL FUNCTION \'F4IF_INT_TABLE_VALUE_REQUEST\'
    EXPORTING
      retfield        = \'WERKS\'    "大写,可选值内表的字段名
      value_org       = \'S\'         "就写\'S\'
      dynpprog        = sy-repid    "返回的输入框所在的main program
      dynpnr          = sy-dynnr       "返回的输入框所在屏幕
      dynprofield     = \'P_WERKS\'        "返回的输入框名
    TABLES
      value_tab       = l_tab_name              "可选值的内表
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 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.

2、自画屏幕字段带出自定义值

 

  DATA: row1 LIKE sy-curow.

  DATA: BEGIN OF tab_help_field OCCURS 1.
          INCLUDE STRUCTURE help_value.
  DATA: END OF tab_help_field.

  DATA: BEGIN OF tab_sel_value OCCURS 1,
    text(40) TYPE c,
  END OF tab_sel_value.
  DATA BEGIN OF select_values OCCURS 0.
          INCLUDE STRUCTURE help_vtab.
  DATA END OF select_values.
*> 确定下拉框的字段
  tab_help_field-tabname = \'ZIEBJKBGD_HEAD\'.
  tab_help_field-fieldname = \'ZZMXZ\'.
  tab_help_field-selectflag = \'X\'.
  APPEND tab_help_field.
  tab_help_field-tabname = \'ZIEBJKBGD_HEAD\'.
  tab_help_field-fieldname = \'TXZ01\'.
  tab_help_field-selectflag = \' \'.
  APPEND tab_help_field.
*> 填充下拉框的数据
  tab_sel_value-text = \'001\'.         APPEND tab_sel_value.
  tab_sel_value-text = \'一般征税\'.  APPEND tab_sel_value.
  tab_sel_value-text = \'002\'.         APPEND tab_sel_value.
  tab_sel_value-text = \'进料加工\'.  APPEND tab_sel_value.
  tab_sel_value-text = \'003\'.         APPEND tab_sel_value.
  tab_sel_value-text = \'其他法定\'.  APPEND tab_sel_value.
*> 调用函数进行处理
  CALL FUNCTION \'HELP_VALUES_GET_WITH_TABLE_EXT\'
    EXPORTING
      cucol                     = 0
      curow                     = 0
      display                   = \' \'
*     FIELDNAME                 = \'LVARI\'
      fieldname                 = \'ZZMXZ\'
      tabname                   = \'ZIEBJKBGD_HEAD\'
    IMPORTING
      index                     = row1
*     SELECT_VALUE              =
    TABLES
      fields                    = tab_help_field
      select_values             = select_values
      valuetab                  = tab_sel_value
    EXCEPTIONS
      field_not_in_ddic         = 01
      more_then_one_selectfield = 02
      no_selectfield            = 03.

3、带自定义参考文本的选择帮助

TYPE-POOLS: vrm.
DATA: name TYPE vrm_id,
      list TYPE vrm_values,
      value LIKE LINE OF list.
REFRESH list.
CLEAR list.

PARAMETERS: iscn TYPE c AS LISTBOX VISIBLE LENGTH 10 OBLIGATORY.

AT SELECTION-SCREEN OUTPUT.

  name = \'ISCN\'.
  value-key = \'1\'.
  value-text = \'CN\'.

  APPEND value TO list.
  value-key = \'2\'.
  value-text = \'CW\'.
  APPEND value TO list.

  CALL FUNCTION \'VRM_SET_VALUES\'
    EXPORTING
      id     = name
      values = list.

4、 弹出框多筛选条件的搜索帮助

 

 

TABLES makt.
DATA:
  BEGIN OF str_f4,
    matnr TYPE matnr,
    maktx TYPE maktx,
  END OF str_f4.
DATA:l_it_f4 LIKE TABLE OF str_f4.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-t01.
SELECT-OPTIONS:
           s_matnr  FOR makt-matnr NO INTERVALS.
SELECTION-SCREEN END OF BLOCK b1.
"帮助

AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_matnr-low.
  SELECT * FROM makt INTO CORRESPONDING FIELDS OF TABLE l_it_f4.
  PERFORM frm_f4."  USING \'S_MATNR-LOW\' .

*&-------------------------------------------------------------------

*& 搜索帮助

*&-------------------------------------------------------------------

FORM frm_f4.
  DATA g_shlp_descr_t             TYPE shlp_descr_t.
  DATA gwa_shlp_descr_t_interface TYPE ddshiface.
  DATA: gt_return_tab   TYPE TABLE OF ddshretval WITH HEADER LINE.
  "调用标准帮助

  CALL FUNCTION \'F4IF_GET_SHLP_DESCR\'
    EXPORTING
      shlpname = \'MAT1W\'
      shlptype = \'SH\'
    IMPORTING
      shlp     = g_shlp_descr_t.

  LOOP AT g_shlp_descr_t-interface INTO gwa_shlp_descr_t_interface.
    IF gwa_shlp_descr_t_interface = \'MATNR\'.
      gwa_shlp_descr_t_interface-valfield = \'X\'.
      MODIFY g_shlp_descr_t-interface FROM gwa_shlp_descr_t_interface.
    ENDIF.
  ENDLOOP.

  CALL FUNCTION \'F4IF_START_VALUE_REQUEST\'
    EXPORTING
      shlp          = g_shlp_descr_t
      maxrecords    = 500
      multisel      = \'X\'
    TABLES
      return_values = gt_return_tab.
  "获取选中值 可以多选 拥有select options

  LOOP AT gt_return_tab.
    s_matnr-sign = \'I\'.
    s_matnr-option = \'EQ\'.
    s_matnr-low = gt_return_tab-fieldval.
    APPEND s_matnr.
  ENDLOOP.
ENDFORM.                    " FRM_F4
View Code 

5、 联动搜索帮助

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS: p_werks TYPE  werks_d,
            p_matnr TYPE  matnr.
SELECTION-SCREEN END OF BLOCK b1.

START-OF-SELECTION.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_matnr.

  PERFORM frm_f4.

*&-------------------------------------------------------------------

*&搜索帮助

*&-------------------------------------------------------------------

FORM frm_f4.

  TYPES: BEGIN OF values,
         matnr TYPE matnr,
         maktx TYPE maktx,
       END OF values.

  DATA: progname         TYPE sy-repid,
        dynnum           TYPE sy-dynnr,
        dynpro_values    TYPE TABLE OF dynpread,
        field_value      LIKE LINE OF dynpro_values,
        values_tab       TYPE TABLE OF values.

  progname = sy-repid.

  dynnum   = sy-dynnr.
  CLEAR: field_value, dynpro_values.
  "指定需要取值的屏幕字段
  field_value-fieldname = \'P_WERKS\'.      "
  APPEND field_value TO dynpro_values.
  "获取屏幕 P_WERKS 字段的值
  CALL FUNCTION \'DYNP_VALUES_READ\'
    EXPORTING
      dyname             = progname
      dynumb             = dynnum
      translate_to_upper = \'X\'
    TABLES

      dynpfields         = dynpro_values.

  "根据屏幕输入值进行进一步搜索

  READ TABLE dynpro_values INDEX 1 INTO field_value.
  SELECT  makt~matnr makt~maktx
    FROM  makt
    INNER JOIN marc ON  marc~matnr = makt~matnr
    INTO  CORRESPONDING FIELDS OF TABLE values_tab
    WHERE werks = field_value-fieldvalue.

  CALL FUNCTION \'F4IF_INT_TABLE_VALUE_REQUEST\'
    EXPORTING
      retfield     = \'MATNR\'                    "需要回传的字段
      dynpprog     = progname
      dynpnr       = dynnum
      dynprofield  = \'MAKTX\'                    "需要显示的字段
      window_title = \'情选择物料 \'
      value_org    = \'S\'
    TABLES
      value_tab    = values_tab.

ENDFORM.                    "frm_f4

 

TABLE CONTROL

https://blog.csdn.net/ft1612796/article/details/1644557

插入列 :从最后一列复制完以后,点击文本下方,拖至所要插入的列

列锁定:

 

 

 

隐藏列

隐藏
PBO部分

    CURSOR ZJTZWTXJC_1001-CURRENT_LINE.
    MODULE ZJTZWTXJC_1001_GET_LINES.
    MODULE a_1001.
module a_1001 output. data: l_col like line of ZJTZWTXJC_1001-cols. "生丰配送通知单 loop at ZJTZWTXJC_1001-cols into l_col. if l_col-screen-name = \'GT_RETULT-ZINX\' . "GW_YS_ITEM-SEL 需要隐藏的列名称 l_col-invisible = \'1\' . modify ZJTZWTXJC_1001-cols from l_col. "ZJTZWTXJC_1001 表控制名字 endif. endloop. endmodule.

 自动带出

带TC的屏幕上展示的内容一般包括以下两个类型:
1、    抬头数据(TC控件之外的数据)
2、    行项目数据(TC控件中的数据)
抬头数据中包括可编辑的与不可编辑的,行项目数据也是一样。

什么代码写在什么位置?

举个简单的例子:
我在屏幕1000中输入公司代码、银行科目代码,然后调用屏幕2000。
在屏幕2000中,抬头部分展示公司代码及描述、记账日期,行项目中展示借方-现金的会计分录和贷方-银行的会计分录,在屏幕2000中保存时,生成一个从银行取现的会计凭证。

屏幕1000不赘述。
屏幕2000-抬头字段:
公司代码(灰),描述(灰),记账日期(可编辑)
屏幕2000-行项目字段: 
记账码(灰),科目(灰),科目描述(灰),原因代码(可编辑),原因代码描述(灰),金额(可编辑),货币(可编辑)

在屏幕1000的PAI中,需要CALL SCREEN 2000。
在CALL SCREEN 2000之前,我们可以
1、    先把2000中需要用到的数据先取出来。
这些数据包括:公司代码描述、科目描述、所有的原因代码及其描述
2、    给屏幕2000的公司代码、公司代码描述赋值
3、    给屏幕2000的记账日期一个默认值
4、    为屏幕2000的TC,构建一个初始内表,包括借方-现金和贷方-银行两行数据

在屏幕2000的PBO中,对于抬头部分:
没有什么需要做的。
对于行项目:
需要在PBO的TC控件的LOOP中,读取原因代码描述,将其赋值给行项目中的原因代码描述①。

在屏幕2000的PAI中,对于抬头部分:
检查记账日期是否符合要求(比如输入的日期是否允许记账),可以通过
Field xx module check_xxx on request.实现
对于行项目:
1、    在TC控件的LOOP中,需要检查原因代码、货币码是否存在
可以通过field xxx module check_xxx on request实现②
2、    在LOOP外,可以对行项目做总体校验,比如,校验行项目金额是否相等

说明:PAI中报错误消息的时候,如果是在FIELD后面的module中报E消息,则只有该field都不可编辑。如果是在chain中报E消息,则只有触发E消息的CHAIN中包含的字段可以编辑。如果在LOOP外报E消息,则屏幕上所有字段都不可编辑。

其他说明:在Process on value-request中,如果需要做字段的搜索帮助时,需要用到函数dynp_values_update和dynp_values_read。

①    为什么不建议把取字段描述的内容写在当前屏幕的PAI中?
因为屏幕除了用来做编辑,还可以用来做展示。如果取字段描述的内容写在PAI中,当以查询方式进入该屏幕,还未触发PAI的时候,字段描述就都显示不出来了。

②    为什么建议在FIELD后面写检查代码
TC中输入内容的校验,分为单字段的独立校验和多字段的相关校验。
单字段的独立校验,建议写在FIELD后面。这样用户输入出错的时候,可以得到最准确的字段定位;
多字段的相关校验,看是针对每一行的相关校验,还是针对所有行的相关校验。
如果是针对每一行的相关校验,建议把相关字段组成CHAIN,并在CHAIN中做校验;
如果是针对所有行的相关校验,建议在TC的LOOP之外进行校验。
以上建议并非定式的。如果单字段的独立校验过多,用户输入错误的时候,可能需要改一个字段敲一次回车,再去改正下一个错误,变的非常繁琐,这时候可以把这些字段放在一个CHAIN里。

其他:能不能在PBO中进行校验
一般不建议。PBO中的E类型消息,会显示为A类型的,即ABORT,会导致屏幕退出。

 pai里写module有以下几种类型:
1、module xx at exit command
2、field xx module xxx.
2、field xx module xxx on xxx .
3、chain里面的module xxx on xxx.
4、module xxx,在field外面
5、pov里的module,pov也可以算是pai,也可以不算。看怎么理解
6、module xx on exit-command  这个是exit类型的按钮触发的

field里面的module,如果报E错误,屏幕上的效果是,除了field之外的字段,都是灰的
chain里面的module报错,屏幕上的效果是,除了chain之外的字段,都是灰的
field、chain以外的module报错,屏幕都是灰的
on request和on input有些区别

聚合函数

https://www.cnblogs.com/aqsyc/p/10764512.html

Odata

https://www.cnblogs.com/liyafei/p/10654706.html

开发优化

http://blog.sina.com.cn/s/blog_3f3df76a0100ajx5.html

https://www.cnblogs.com/abap-ll/p/5053390.html

WEBSERVICE

https://www.cnblogs.com/zohoo/p/7295920.html

webservice,就是一种系统与系统间的接口方式。
wsdl,是Web Services Description Language,它描述了一个接口的调用规则。

在SAP里,我们接触到webservice有两种场景,一种是发布,一种是调用。
发布:
我们需要创建一个rfc函数,然后将其发布为webservice。这时候我们SAP是service provider。
发布成功后,会有一个wsdl的地址。这个地址就描述了我们的函数的调用规则(也就是我们的函数结构和调用地址)。
比如,入参都有啥、出参都有啥、参数是什么类型的,有哪些异常。
wsdl中描述这个函数结构的东西,是通用的描述规则。所以别的系统拿到这个wsdl,他们可以很方便的知道我们的函数结构是什么样的。配合我们提供的API文档,他们就可以方便的调用我们的webservice了。发布后,我们还需要创建端口。
端口可以通过lpconfig创建,可以通过soamanager创建。这两种创建方式都可以,具体的区别我还没细研究。
这里说一下端口。
如果我们需要把这个服务提供给两个外围系统。我们可以创建两个端口。每个端口配上不同的用户名,可以做不同的权限控制。但我们一般都只用一个端口就够了。所以网上的文档一般也都是创建一个端口。

 

*调用接口相关参数定义
  DATA:lo_proxy     TYPE REF TO zsdco_posoap,
       input        TYPE zsdget_sap_accountability_soa1,
       output       TYPE zsdget_sap_accountability_soap,
       ls_zsd_mm001 TYPE zsdarray_of_sap_accountability,
       lt_mm001     TYPE TABLE OF zsdsap_accountability,
       ls_mm001     TYPE zsdsap_accountability.
*lt_mm001 = CORRESPONDING #( gt_send ).
  LOOP AT gt_send_result INTO gs_send_result.

    ls_mm001 = CORRESPONDING #( gs_send_result ).
    IF gs_send_result-zresponsible = \'门店\'.
      ls_mm001-zresponsible =  \'0\'.
    ELSE.
      ls_mm001-zresponsible =  \'1\'.
    ENDIF.

    APPEND ls_mm001 TO lt_mm001.
    CLEAR:ls_mm001,gs_send_result.
  ENDLOOP.

  ls_zsd_mm001-SAP_ACCOUNTABILITY = lt_mm001.
  input-ACCOUNTABILITY = ls_zsd_mm001.

*调用代理类 下发数据
  TRY.
      CREATE OBJECT lo_proxy
        EXPORTING
          logical_port_name = \'ZPORT\'.
      CALL METHOD lo_proxy->GET_SAP_ACCOUNTABILITY
        EXPORTING
          input  = input
        IMPORTING
          output = output.

    CATCH cx_ai_system_fault INTO DATA(lo_sys_exception).
    CATCH cx_ai_application_fault INTO DATA(lo_app_exception).
      DATA(lv_msg1) = lo_sys_exception->if_message~get_text( ).
      DATA(lv_msg2) = lo_app_exception->if_message~get_text( ).
  ENDTRY.

  IF output-GET_SAP_ACCOUNTABILITY_RESULT = \'S\'.
    MESSAGE |数据下发成功| TYPE \'S\'.
  ELSEIF lo_sys_exception IS NOT INITIAL OR lo_app_exception IS NOT INITIAL .
    MESSAGE |下发失败,请联系管理员处理| TYPE \'E\'.
  ENDIF.

SMARTFORMS

 

https://www.cnblogs.com/zuisha13/archive/2011/08/05/2128223.html    实用

https://www.cnblogs.com/communist/p/6591122.html   史上最全

https://www.cnblogs.com/clsoho/archive/2010/04/23/1718624.html

PERFORM frm_print_data.
FORM frm_print_data .
  DATA lw_control TYPE ssfctrlop. "Smart Forms: 控制结构
  DATA lw_output TYPE ssfcompop.
  DATA lt_errtab TYPE tsferror. "SAP Smart Forms: 运行时错误
  DATA:lv_fmname    TYPE rs38l_fnam, "功能模块的名称
       lv_smartform TYPE tdsfname. "  智能表: 表格名称
  DATA: lw_ssfcrescl TYPE ssfcrescl."Smart Forms: 表格打印结束时返回值

*  DATA: lt_zppf001 TYPE TABLE OF zpp_f001_s,
*        ls_zppf001 TYPE zpp_f001_s.
  DATA: lt_zppf001 TYPE TABLE OF zsd_f001_s,
        ls_zppf001 TYPE zsd_f001_s.
*
  DATA:BEGIN OF lt_head OCCURS 0,
         lgort TYPE resb-lgort,
         lgfsb TYPE marc-lgfsb,
         mblnr TYPE mseg-mblnr,
       END OF lt_head.
  DATA lv_no TYPE n LENGTH 2.

  DATA :lv_meins TYPE meins.

  FIELD-SYMBOLS <fs_sf> LIKE ls_zppf001.
  DATA  ot_table LIKE TABLE OF ZSD_F001_S WITH HEADER LINE.

  "记录数据
  "1
*  SORT gt_itab BY lgort lgfsb.
*  FIELD-SYMBOLS <fs2> LIKE LINE OF gt_itab.
*  LOOP AT gt_itab ASSIGNING FIELD-SYMBOL(<fs1>) WHERE box = \'X\' AND mblnr IS NOT INITIAL."未过账也可打印   20190201   chengqi  AND mblnr IS NOT INITIAL.
*    lt_head-lgort = <fs1>-lgort.
*    lt_head-lgfsb = <fs1>-lgfsb.
*    lt_head-mblnr = <fs1>-mblnr.
*    APPEND lt_head.
*    CLEAR lt_head.
*  ENDLOOP.
*  SORT lt_head BY lgort lgfsb mblnr.
*  DELETE ADJACENT DUPLICATES FROM lt_head COMPARING ALL FIELDS.


  "1准备数据
  lv_smartform = \'ZSD_FORM_001\'.
  lv_smartform = \'ZSDSF01\'.
  PERFORM f_get_sfname USING lv_smartform CHANGING lv_fmname.

  PERFORM f_open_smartforms CHANGING lw_output lw_control.

  CLEAR lv_no.

  "调用 sf
  CALL FUNCTION lv_fmname
    EXPORTING
      control_parameters = lw_control
*     i_head             = <fs_head>
*     output_options     = lw_output
    TABLES
      i_table            = ot_table[]
    EXCEPTIONS
      formatting_error   = 1
      internal_error     = 2
      send_error         = 3
      user_canceled      = 4
      OTHERS             = 5.
  IF sy-subrc <> 0.
*     error handling
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
     WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  REFRESH lt_zppf001[].

  PERFORM f_close_smartforms CHANGING lw_ssfcrescl.

  CALL FUNCTION \'SSF_READ_ERRORS\'
    IMPORTING
      errortab = lt_errtab.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_GET_SFNAME
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LV_SMARTFORM
*&      <-- LV_FMNAME
*&---------------------------------------------------------------------*
FORM f_get_sfname  USING uv_smartform TYPE tdsfname
                   CHANGING cv_fmname TYPE rs38l_fnam.
  CALL FUNCTION \'SSF_FUNCTION_MODULE_NAME\'
    EXPORTING
      formname           = uv_smartform
*     VARIANT            = \' \'
*     DIRECT_CALL        = \' \'
    IMPORTING
      fm_name            = cv_fmname
    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.
*&---------------------------------------------------------------------*
*& Form F_OPEN_SMARTFORMS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- LW_CONTROL
*&---------------------------------------------------------------------*
FORM f_open_smartforms   CHANGING cs_output TYPE ssfcompop
                                  cs_control TYPE ssfctrlop.
  cs_control-no_dialog = \'X\'.
  cs_control-preview   = \'X\'.
  cs_control-no_open   = \'X\'.
  cs_control-no_close  = \'X\'.

  cs_output-tdiexit = \'X\'.

  CALL FUNCTION \'SSF_OPEN\'
    EXPORTING
*     ARCHIVE_PARAMETERS =
*     USER_SETTINGS      = \'X\'
*     MAIL_SENDER        =
*     MAIL_RECIPIENT     =
*     MAIL_APPL_OBJ      =
      output_options     = cs_output
      control_parameters = cs_control
*   IMPORTING
*     JOB_OUTPUT_OPTIONS =
    EXCEPTIONS
      formatting_error   = 1
      internal_error     = 2
      send_error         = 3
      user_canceled      = 4
      OTHERS             = 5.
  IF sy-subrc <> 0.
* Implement suitable error handling here
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    EXIT.
  ENDIF.
ENDFORM.
FORM  f_close_smartforms  CHANGING us_ssfcrescl TYPE ssfcrescl.
  CALL FUNCTION \'SSF_CLOSE\'
    IMPORTING
      job_output_info  = us_ssfcrescl
    EXCEPTIONS
      formatting_error = 1
      internal_error   = 2
      send_error       = 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.
ENDFORM.

 注意字段长度:模板纸张不够就用表类型sf

 

 

 

 

 预留号:&W_HD-RSNUM(C)&

主要区域填充数据:&I_TABLE-MATNR&

 

 

四舍五入以及负数

data:lt_result TYPE string.
data:abs_like  like rv13a-konwa.
data:abs_like1 like rv13a-konwa.
data:abs_like2 like rv13a-konwa.
abs_like1 = \'-2\'.
abs_like2 = \'-3\'.
abs_like = abs_like1 + abs_like2.
lt_result = abs_like.
condense lt_result.
CALL FUNCTION \'CLOI_PUT_SIGN_IN_FRONT\'
  CHANGING
    value         = lt_result
          .

write:/ lt_result.

DATA lv_input TYPE p DECIMALS 2 VALUE \'12.45\'.
DATA lv_output TYPE p DECIMALS 2.

CALL FUNCTION \'ROUND\'
  EXPORTING
    decimals      = 0       " 保留多少位小数
    input         = lv_input
    sign          = \'X\'     " X 四舍五入   向上取舍 - 向下取舍 (负数也一样)
  IMPORTING
    output        = lv_output    " 输出返回结果
  EXCEPTIONS
    input_invalid = 1
    overflow      = 2
    type_invalid  = 3
    OTHERS        = 4.

WRITE: /\'四舍五入\'.
WRITE: / \'lv_input:\' , lv_input, \' -> \', lv_output .

"另外,直接用 P类型接收,本身就是四舍五入

DATA: lv_dec0 TYPE p DECIMALS 0.
DATA: lv_dec1 TYPE p DECIMALS 1.

lv_dec0 = lv_input.
WRITE: / \'lv_dec0:\', lv_input, \' -> \', lv_dec0 .

lv_dec1 = lv_input.

WRITE: / \'lv_dec1:\', lv_input, \' -> \', lv_dec1 .

DEBUG

[FUNCTION]
Command=/H
Title=Barry Test
Type=SystemCommand

 

选择屏幕

 

 

TABLES:pa0001,pa0000,mkpf,mkal.
*&---------------------------------------------------------------------*
SELECTION-SCREEN: BEGIN OF BLOCK blk  WITH FRAME TITLE text-t01.
SELECTION-SCREEN BEGIN OF LINE.

SELECTION-SCREEN COMMENT 1(7) func1 FOR FIELD p_func1.
PARAMETERS: p_func1 RADIOBUTTON GROUP f1 DEFAULT \'X\'  USER-COMMAND z05.

SELECTION-SCREEN COMMENT 30(7) func2 FOR FIELD p_func2.
PARAMETERS: p_func2 RADIOBUTTON GROUP f1.

SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: END OF BLOCK blk."按钮选择


SELECTION-SCREEN: BEGIN OF BLOCK b1 WITH FRAME TITLE t1.
PARAMETERS:    p_werks LIKE mkal-werks OBLIGATORY DEFAULT \'1000\' MODIF ID fu1.

SELECT-OPTIONS: s_matnr FOR  mkal-matnr MODIF ID fu1,
                s_verid FOR  mkal-verid MODIF ID fu1.
PARAMETERS:     p_datuv LIKE stko-datuv OBLIGATORY DEFAULT sy-datum MODIF ID fu1.

SELECTION-SCREEN: END OF BLOCK b1."


SELECTION-SCREEN: BEGIN OF BLOCK b2 WITH FRAME TITLE t2.
  PARAMETERS:   p_werks1 LIKE mkal-werks OBLIGATORY DEFAULT \'1000\'   MODIF ID fu2.

  SELECT-OPTIONS: s_matnr1 FOR  mkal-matnr MODIF ID fu2,
                  s_stlal1 FOR mkal-stlal MODIF ID fu2,
                  s_stlan1 FOR mkal-stlan MODIF ID fu2.
  PARAMETERS:     p_datuv1 LIKE stko-datuv OBLIGATORY DEFAULT sy-datum  MODIF ID fu2.

SELECTION-SCREEN: END OF BLOCK b2."
*&---------------------------------------------------------------------*





SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-002.
PARAMETERS: rd_a1 TYPE c RADIOBUTTON GROUP rd01 USER-COMMAND com DEFAULT \'X\'.
PARAMETERS: rd_a2 TYPE c RADIOBUTTON GROUP rd01 .
SELECTION-SCREEN END OF BLOCK blk1.

SELECTION-SCREEN:BEGIN OF BLOCK blk0 WITH FRAME TITLE text-001,
  SKIP 1,
  BEGIN OF LINE,
    PUSHBUTTON 1(20) but1 USER-COMMAND download,
  END OF LINE,
END OF BLOCK blk0.

SELECTION-SCREEN BEGIN OF BLOCK blk6 WITH FRAME TITLE text-003.
SELECT-OPTIONS: s_systm3 FOR pa0001-pernr NO INTERVALS MODIF ID m3. "系统
SELECT-OPTIONS: s_equip3 FOR pa0001-begda NO INTERVALS MODIF ID m3. "设备
SELECT-OPTIONS: s_major3 FOR pa0001-endda NO INTERVALS MODIF ID m3. "相关专业
SELECT-OPTIONS: s_eneny3 FOR mkpf-mjahr MODIF ID m3. "年份

SELECT-OPTIONS: s_evenc4 FOR pa0000-begda NO INTERVALS MODIF ID m4.
PARAMETERS p_file1 TYPE rlgrap-filename MODIF ID m5.
SELECTION-SCREEN END OF BLOCK blk6.

INITIALIZATION .

*&---------------------------------------------------------------------*
  func1 = \'按生产版本查找\'.
  func2 = \'按BOM用途查找\'.
*&---------------------------------------------------------------------*

  CALL FUNCTION \'ICON_CREATE\' " 文本
  EXPORTING
    name   = \'ICON_OPEN_FOLDER\'
    text   = \'下载模板\'
    info   = \'EVEN\'
  IMPORTING
    RESULT = but1
  EXCEPTIONS
    OTHERS = 0.
  "初始化标签名称

AT SELECTION-SCREEN OUTPUT.
  "控制页签
  IF rd_a1 = \'X\'.
    LOOP AT SCREEN.
      IF screen-group1 = \'M3\'.
        screen-active =  \'0\'.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ELSEIF rd_a2 = \'X\'.
    LOOP AT SCREEN.
      IF screen-group1 = \'M4\'.
        screen-active = \'0\'.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.

*&---------------------------------------------------------------------*
LOOP AT SCREEN.
  IF (  p_func1 EQ \'X\' AND SCREEN-group1 EQ \'FU2\' )
  OR ( p_func2 EQ \'X\' AND SCREEN-group1 EQ \'FU1\' ).
    SCREEN-active = \'0\'.
    MODIFY SCREEN.
  ENDIF.
ENDLOOP.
*&---------------------------------------------------------------------*

 

 

PARAMETERS:p_mtart type rmmg1-mtart as LISTBOX VISIBLE LENGTH 10"t134

TABLES:sscrfields.
SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME TITLE title1.

PARAMETERS: p_typ TYPE ctu_mode  AS LISTBOX OBLIGATORY DEFAULT \'N\' VISIBLE LENGTH 20,
            p_upd TYPE ctu_update  AS LISTBOX OBLIGATORY DEFAULT \'S\' VISIBLE LENGTH 20.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(31) TEXT-t01.
PARAMETERS:p_from TYPE i OBLIGATORY DEFAULT 2.

SELECTION-SCREEN COMMENT 48(2) TEXT-t02.
PARAMETERS:p_to TYPE i OBLIGATORY DEFAULT 2000.
SELECTION-SCREEN END OF LINE.

PARAMETERS p_file TYPE c LENGTH 1024 LOWER CASE.
SELECTION-SCREEN END OF BLOCK 001.

SELECTION-SCREEN FUNCTION KEY 1.

INITIALIZATION.
  sscrfields-functxt_01 = \'下载模板\'.
  %_p_typ_%_app_%-text = \'处理模式\'.
  %_p_upd_%_app_%-text = \'更新模式\'.
  %_p_file_%_app_%-text = \'模板路径\'.
  %ct01004_1000 = \'数据行\'.
  %ct02006_1000 = \'\'.

SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME TITLE text-001.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(20) text-104. "文本备注(IE工厂)
PARAMETERS: p1 AS CHECKBOX.
SELECTION-SCREEN COMMENT (30) text-102.
PARAMETERS: p2 AS CHECKBOX.
SELECTION-SCREEN COMMENT (30) text-103.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK 001.

 

 

 

TYPE-POOLS:slis.
TABLES:mseg,sscrfields.

DATA: functxt TYPE smp_dyntxt.

SELECTION-SCREEN:BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS:s_werks FOR mseg-werks,
               s_lgort FOR mseg-lgort.
SELECTION-SCREEN:END OF BLOCK b1.
SELECTION-SCREEN:FUNCTION KEY 1.

INITIALIZATION.

  functxt-icon_id   = \'@0K@\'.
  functxt-quickinfo = \'排除异常数据\'.
  functxt-icon_text = \'排除异常数据\'.
  sscrfields-functxt_01 =  functxt.

AT SELECTION-SCREEN.
  IF sscrfields-ucomm = \'FC01\'.
    PERFORM frm_skip_sm30.
  ENDIF.

START-OF-SELECTION.
*&---------------------------------------------------------------------*
*&      Form  FRM_SKIP_SM30
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form FRM_SKIP_SM30 .
*  CALL FUNCTION \'VIEW_MAINTENANCE_CALL\'
*  EXPORTING
*    action    = \'U\'
*    view_name = \'ZTMM_VMI_REMOVE\'.
endform.                    " FRM_SKIP_SM30

 

TABLES sscrfields.
TYPE-POOLS: vrm, cntb.

SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME TITLE title1.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (6) text1 FOR FIELD p_devc.
SELECTION-SCREEN POSITION 10.
PARAMETERS p_devc TYPE devclass.
SELECTION-SCREEN PUSHBUTTON 45(10) tmp USER-COMMAND tmp.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (6) text2 FOR FIELD p_trkorr.
SELECTION-SCREEN POSITION 10.
PARAMETERS p_trkorr TYPE trkorr VISIBLE LENGTH 10.
SELECTION-SCREEN COMMENT (60) t_trkorr.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN ULINE.

SELECTION-SCREEN COMMENT /1(79) cmt2.
SELECTION-SCREEN END OF BLOCK 001.


INITIALIZATION.

  text1 = \'开发类\'.
  text2 = \'请求号\'.
  tmp = \'本地对象\'.

AT SELECTION-SCREEN OUTPUT.

AT USER-COMMAND.
  IF sy-ucomm = \'ECAN\'.
    LEAVE TO SCREEN 0.
  ENDIF.

AT SELECTION-SCREEN.
View Code

选择屏幕显示说明TEXT

REPORT ztest.








TYPE-POOLS:slis.
TABLES:mseg,sscrfields.

DATA: functxt TYPE smp_dyntxt.

SELECTION-SCREEN:BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS:s_werks FOR mseg-werks,
                 s_lgort FOR mseg-lgort.
SELECTION-SCREEN:END OF BLOCK b1.
SELECTION-SCREEN:FUNCTION KEY 1.

SELECTION-SCREEN BEGIN OF BLOCK block9 WITH FRAME TITLE w_title.
  SELECTION-SCREEN COMMENT 1(30) w_char1.
  SELECTION-SCREEN COMMENT /3(77) w_char2.
  SELECTION-SCREEN COMMENT /1(77) w_char3.
  SELECTION-SCREEN COMMENT /3(77) w_char4.
  SELECTION-SCREEN COMMENT /1(77) w_char5.
  SELECTION-SCREEN COMMENT /3(77) w_char6.
SELECTION-SCREEN END OF BLOCK block9.

INITIALIZATION.

  functxt-icon_id   = \'@0K@\'.
  functxt-quickinfo = \'排除异常数据\'.
  functxt-icon_text = \'排除异常数据\'.
  sscrfields-functxt_01 =  functxt.


  w_title = \'程序属性\'.
  w_char1 = \'【程序目的】\'.
  w_char2 = \'按模板填好财务凭证凭证抬头与行项目信息,后确认格式无误,导入系统生成财务凭证选出相应的财务凭证\'.
  w_char3 = \'【适用范围】\'.
  w_char4 = \'所有公司\'.
  w_char5 = \'【注意事项】\'.
  w_char6 = \'要求每一行,每一格按模板要求严格填写,不能有丝毫的差错!\'.



AT SELECTION-SCREEN.
  IF sscrfields-ucomm = \'FC01\'.
    PERFORM frm_skip_sm30.
  ENDIF.

START-OF-SELECTION.
*&---------------------------------------------------------------------*
*&      Form  FRM_SKIP_SM30
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_skip_sm30 .
*  CALL FUNCTION \'VIEW_MAINTENANCE_CALL\'
*  EXPORTING
*    action    = \'U\'
*    view_name = \'ZTMM_VMI_REMOVE\'.
ENDFORM.                    " FRM_SKIP_SM30
View Code

https://www.cnblogs.com/rainysblog/p/11953172.html

结构

SQL

http://blog.sina.com.cn/s/blog_77af9dc501017g1c.html

DBCO  

https://blog.csdn.net/qq_42080586/article/details/108867449

https://mp.weixin.qq.com/s/xL5e1BjR3UT4eS0xaBHuZw

sap官方是不支持mysql的

 hana 连接hana 不会有问题
 hana 连接 oracle 会有问题 hana上面需要打oracle驱动
 hana 连接ms-sql server 会有问题 hana上需要打ms-sql server 驱动

 

 端口是否通着:

 

 

 

 这样就表示这个端口可以连接、,ping有时候不能确定端口有没有问题

OBJECT_SOURCE=ERP_MES MSSQL_DBNAME=ERP_MES MSSQL_SERVER=192.168.18.

 

其他服务器取数:

TRY .
    EXEC SQL.
      CONNECT TO \'P1WMSDB\'
    ENDEXEC.
    EXEC SQL.
      SET CONNECTION \'P1WMSDB\'
    ENDEXEC.
  CATCH cx_sy_native_sql_error INTO  exec_ref.
    mes_str = exec_ref->get_text( ).

ENDTRY.

TRY .
    EXEC SQL PERFORMING FRM_APPEND.
      SELECT
      A.SKU,
      A.FACTORY,
      A.STOCK,
      A.LOCATIONID,
      A.QTY,
      A.STATUS
      FROM V_CUS_FOR_SAP_INV A
      INTO
      :GS_DATA-MATNR,
      :GS_DATA-WERKS,
      :GS_DATA-LGORT,
      :GS_DATA-LOCATIONID,
      :GS_DATA-MENGE,
      :GS_DATA-STATUS
      WHERE A.STATUS       = \'U\' OR  A.STATUS   =  \'S\'
      AND A.SKU IN :S_MATNR
      AND A.FACTORY IN :S_WERKS
      AND A.STOCK IN :S_LGORT
    ENDEXEC.
  CATCH cx_sy_native_sql_error INTO exec_ref.
    mes_str = exec_ref->get_text( ).
  CATCH cx_sql_exception.

ENDTRY.
"in s_S_WERKS  这句话不会起作用

*&---------------------------------------------------------------------*
*&      Form  frm_append
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_append .

  APPEND gs_data TO  gt_data_middle.
ENDFORM.                    "frm_append


DELETE gt_data_middle[] WHERE matnr NOT IN s_matnr OR werks NOT IN s_werks OR lgort NOT IN s_lgort .

SM59

 

 

动态SQL

动态 https://www.cnblogs.com/ricoo/p/10169928.html

 https://www.cnblogs.com/rainysblog/p/6514946.html

*      日  it_date
*      周  s_data
*      半月  s_mon_half
*      月  s_mon
     DATA(iv_type) = VALUE #( it_mdpd[ 1 ]-in_type OPTIONAL ).

     lv_kcond = COND #( WHEN iv_type = \'0\' THEN \'a~budat EQ @it_date\'  "
                        WHEN iv_type = \'1\' THEN \'a~budat IN @s_data\'  "
                        WHEN iv_type = \'2\' THEN \'a~budat IN @s_mon_half\'   "半月
                        WHEN iv_type = \'3\' THEN \'a~budat IN @s_mon\'   "
                        ELSE \'1 = 1\' ).

     SELECT
       a~kunnr,
       a~zxsdh,
       a~budat,
       b~matnr,
       b~zxssl
       INTO   TABLE @DATA(gt_car_result)
       FROM zsdt_r001_hd AS a
       INNER JOIN zsdt_r001_it AS b ON b~kunnr = a~kunnr AND b~zxsdh = a~zxsdh
        AND (lv_kcond)
*      AND ( ( a~budat LIKE @rq_result ) OR ( a~budat LIKE @rq_result_now ) )
       FOR ALL ENTRIES IN @it_mdpd
       WHERE  a~kunnr = @it_mdpd-kunnr.

动态内表

思想:首先造一个需要动态展示的结构字段,再进行行列转秩,循环内表,将数值写<fs> ,再      APPEND <dyn_wa> TO <dyn_table>.

bpc
DATA: dyn_table TYPE REF TO data. DATA: dyn_wa TYPE REF TO data,p_name TYPE string. FIELD-SYMBOLS: <dyn_table> TYPE table, <dyn_wa> TYPE any, <fs> TYPE any. TYPES : BEGIN OF ty_bk_year , z_entity_bk(32), year_actual(32), next_year_adjust(32), next_year_res(32), next_year_g_r(32), END OF ty_bk_year. p_name = \'TY_BK_YEAR\'. CREATE DATA dyn_table TYPE TABLE OF (p_name). ASSIGN dyn_table->* TO <dyn_table>. CREATE DATA dyn_wa LIKE LINE OF <dyn_table>. ASSIGN dyn_wa->* TO <dyn_wa>. ** 下面往结构里写数 LOOP AT gt_yt_bk ASSIGNING FIELD-SYMBOL(<fs2>).. * <fs2>-z_entity = |BCSYB.INP|."写死 <fs2>-z_entity = |YT.INP_TOTAL|."写死 ASSIGN COMPONENT \'Z_ENTITY_BK\' OF STRUCTURE <dyn_wa> TO <fs>. <fs> = <fs2>-z_entity. ASSIGN COMPONENT \'YEAR_ACTUAL\' OF STRUCTURE <dyn_wa> TO <fs>. " READ TABLE it_year_yt_act INTO is_year_yt_act WITH KEY z_entity = <fs2>-z_entity z_product = <fs2>-z_product . IF sy-subrc = 0. <fs> = is_year_yt_act-signeddata. CONDENSE <fs>. ENDIF. <fs> = 666."写死 CONDENSE <fs>. ASSIGN COMPONENT \'NEXT_YEAR_ADJUST\' OF STRUCTURE <dyn_wa> TO <fs>. " READ TABLE it_year_yt_adju INTO is_year_yt_adju WITH KEY z_entity = <fs2>-z_entity z_product = <fs2>-z_product . IF sy-subrc = 0. <fs> = is_year_yt_adju-signeddata. CONDENSE <fs>. ENDIF. * ASSIGN COMPONENT \'NEXT_YEAR_RES\' OF STRUCTURE <dyn_wa> TO <fs>. " * <fs> = <fs2>-signeddata. ASSIGN COMPONENT \'NEXT_YEAR_G_R\' OF STRUCTURE <dyn_wa> TO <fs>. " <fs> = <fs2>-signeddata. CONDENSE <fs>. AT END OF z_entity. APPEND <dyn_wa> TO <dyn_table>. ENDAT. ENDLOOP.
 LOOP AT <dyn_table> INTO <dyn_wa>.

    ENDLOOP.

 

 

 

 

*----------------------------------------------------------------------*
*  动态内表 SMON
TYPES:BEGIN OF ty_excel1,
  z_product(32),
  SIGNDATA(32),
  z_time(8).

*  INCLUDE STRUCTURE ztco018."
TYPES:END OF ty_excel1.

DATA:itab8 TYPE TABLE OF ty_excel1 WITH HEADER LINE.
*LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs1>).
*  <fs1>-z_time = <fs1>-z_time+0(4) && <fs1>-z_time+5 .
*  itab8 = CORRESPONDING #( <fs1> ).
*  APPEND itab8.CLEAR itab8.
*ENDLOOP.
itab8-z_product = \'苹果\'.
itab8-SIGNDATA = \'567\'.
itab8-z_time = \'20210317\'.
append itab8.CLEAR itab8.

itab8-z_product = \'香蕉\'.
itab8-SIGNDATA = \'23\'.
itab8-z_time = \'20210317\'.
APPEND itab8.CLEAR itab8.

itab8-z_product = \'橙子\'.
itab8-SIGNDATA = \'43\'.
itab8-z_time = \'20210317\'.
APPEND itab8.CLEAR itab8.

itab8-z_product = \'花生\'.
itab8-SIGNDATA = \'234\'.
itab8-z_time = \'20210317\'.
APPEND itab8.CLEAR itab8.

itab8-z_product = \'牛奶\'.
itab8-SIGNDATA = \'234\'.
itab8-z_time = \'20210317\'.
APPEND itab8.CLEAR itab8.

*-------------------------------
itab8-z_product = \'苹果\'.
itab8-SIGNDATA = \'567\'.
itab8-z_time = \'20210318\'.
APPEND itab8.CLEAR itab8.

itab8-z_product = \'香蕉\'.
itab8-SIGNDATA = \'44\'.
itab8-z_time = \'20210318\'.
APPEND itab8.CLEAR itab8.

itab8-z_product = \'橙子\'.
itab8-SIGNDATA = \'574\'.
itab8-z_time = \'20210318\'.
APPEND itab8.CLEAR itab8.

itab8-z_product = \'花生\'.
itab8-SIGNDATA = \'88\'.
itab8-z_time = \'20210318\'.
APPEND itab8.CLEAR itab8.

itab8-z_product = \'牛奶\'.
itab8-SIGNDATA = \'78\'.
itab8-z_time = \'20210318\'.
APPEND itab8.CLEAR itab8.


itab8-z_product = \'牛奶\'.
itab8-SIGNDATA = \'618\'.
itab8-z_time = \'20210618\'.
APPEND itab8.CLEAR itab8.

SORT itab8 BY z_product z_time  .
*    要以日期作为列,得先取得唯一的日期。
*  DATA tdate LIKE sy-datum OCCURS 0 WITH HEADER LINE.
*DATA tdate LIKE  TABLE OF zsds_024_04-smon   WITH HEADER LINE.
DATA TDATE LIKE SY-DATUM OCCURS 0 WITH HEADER LINE.
LOOP AT itab8.
  CONDENSE itab8-z_time.
  tdate = itab8-z_time.
  COLLECT tdate.
ENDLOOP.
*    下面构建动态内表结构
DATA: dy_table TYPE REF TO DATA,
dy_wa    TYPE REF TO DATA,
      it_str   TYPE lvc_t_fcat,  "是Table Type
      wa_str   TYPE lvc_s_fcat.  "是一个Structure  用于存储即将构建的动态内表结构

FIELD-SYMBOLS: <dyn_table> TYPE TABLE,  "是一个标志,可以理解为一个指针,将来创建的内表就要通过它们来访问
<dyn_wa>    TYPE ANY,
<fs>        TYPE ANY.

wa_str-fieldname = \'Z_PRODUCT\'.
wa_str-col_pos = 1.
wa_str-inttype = \'CHAR\'.
wa_str-intlen = 32.
APPEND wa_str TO it_str.
CLEAR wa_str.

wa_str-fieldname = \'SIGNDATA\'.
wa_str-col_pos = 1.
wa_str-inttype = \'CHAR\'.
wa_str-intlen = 32.
APPEND wa_str TO it_str.
CLEAR wa_str.


*  REFRESH fieldcat.
*  PERFORM input_fieldcat  USING \'Z_PRODUCT\'  \'销售办事处\'  \'\'  \'\' \'\' \'\' \'\'.

LOOP AT tdate.
  wa_str-fieldname = tdate.
  wa_str-col_pos = 1.
  wa_str-inttype = \'CHAR\'.
  wa_str-intlen = 20.
  APPEND wa_str TO it_str.
  CLEAR wa_str.
*    PERFORM input_fieldcat  USING tdate  tdate  \'\'  \'\' \'\' \'\' \'\'.
ENDLOOP.

*此方法用于构建动态内表,输入=构建的结构,输出=dy_table
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
  it_fieldcatalog = it_str
IMPORTING
  ep_table        = dy_table.

ASSIGN dy_table->* TO <dyn_table>.
CREATE DATA dy_wa LIKE LINE OF <dyn_table>.
ASSIGN dy_wa->* TO <dyn_wa>.
*    下面往结构里写数
DATA fieldname(20).
LOOP AT itab8.
  ASSIGN COMPONENT \'Z_PRODUCT\' OF STRUCTURE <dyn_wa> TO <fs>.
  <fs> = itab8-z_product.
  fieldname = itab8-z_time. "这里把日期类型定义为char型,因为用DATS报错。
  ASSIGN COMPONENT fieldname OF STRUCTURE <dyn_wa> TO <fs>. "分配结构的日期,将FS指向它
  <fs> = itab8-signdata.
  AT END OF z_product.
    APPEND <dyn_wa> TO <dyn_table>.
    CLEAR :<dyn_wa>.
  ENDAT.
ENDLOOP.

LOOP AT <dyn_table> INTO <dyn_wa>.

ENDLOOP.

 动态内表动态增加字段

 1 REPORT z123.
 2 
 3 TYPES:BEGIN OF ty_dynamic_table_field,
 4         fieldname TYPE fieldname,
 5         rollname  TYPE rollname,
 6       END OF ty_dynamic_table_field.
 7 DATA:ls_zabap_dynamic_table_field type ty_dynamic_table_field.
 8 DATA: lt_fields TYPE TABLE OF ty_dynamic_table_field,
 9       ls_field  TYPE ty_dynamic_table_field.
10 DATA: lo_data TYPE REF TO data,
11       lo_line TYPE REF TO data.
12 DATA:g_index TYPE i.
13 DATA:gt_date LIKE TABLE OF mara WITH HEADER LINE.
14 
15 SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_date FROM mara UP TO 10 ROWS.
16 
17 "动态字段
18 *   DATA(lv_lines) = lines( gt_date ).
19 DO 3 TIMES.
20   g_index = sy-index.
21   ls_field-fieldname = \'FIELD\'  &&  g_index.
22   ls_field-rollname = \'CHAR20\'.
23   APPEND ls_field TO lt_fields.
24 ENDDO.
25 
26 PERFORM create_dynamic_table TABLES lt_fields USING \'MAKT\' CHANGING lo_data.
27 
28 FIELD-SYMBOLS:<gt_alv> TYPE table,<gs_alv> TYPE any,<fs> TYPE any .
29 
30 ASSIGN lo_data->* TO <gt_alv>.
31 
32 *  根据动态内表创建对应的工作区
33 CREATE DATA lo_line LIKE LINE OF <gt_alv>.
34 ASSIGN lo_line->* TO <gs_alv>.
35 
36 BREAK-POINT.
37 FORM create_dynamic_table TABLES pt_fields STRUCTURE ls_zabap_dynamic_table_field
38                           USING p_strucname   "可以是主程序中的TYPES定义的结构,也可以是数据字典中的结构
39                           CHANGING po_data TYPE REF TO data.
40   DATA: lo_struct  TYPE REF TO cl_abap_structdescr,
41         lo_element TYPE REF TO cl_abap_elemdescr,
42         lo_tab     TYPE REF TO cl_abap_tabledescr,
43         lt_comps   TYPE cl_abap_structdescr=>component_table,
44         ls_comp    LIKE LINE OF lt_comps,
45         ls_field   TYPE zabap_dynamic_table_field.
46 
47 *  获取已定义结构
48   IF p_strucname IS NOT INITIAL.
49     lo_struct ?= cl_abap_typedescr=>describe_by_name( p_strucname ).
50     lt_comps = lo_struct->get_components( ).
51   ENDIF.
52 
53   LOOP AT pt_fields INTO ls_field.
54     ls_comp-name = ls_field-fieldname.
55     lo_element ?= cl_abap_elemdescr=>describe_by_name( ls_field-rollname ).
56     ls_comp-type ?= lo_element.
57     APPEND ls_comp TO lt_comps.
58   ENDLOOP.
59 
60 
61   lo_struct = cl_abap_structdescr=>create( lt_comps ).
62   lo_tab = cl_abap_tabledescr=>create( p_line_type  = lo_struct
63                                        p_table_kind = cl_abap_tabledescr=>tablekind_std
64                                        p_unique     = abap_false ).
65 
66 *  创建动态内表
67   CREATE DATA po_data TYPE HANDLE lo_tab.
68 ENDFORM.                    "create_dynamic_table
View Code

 动态内表排序

动态内表要排序时,因为不知道内表中的字段名字,所以不能直接用SORT table BY field1 field2...
可以使用下面的方法来实现:SORT table BY (sorttable)

表类型: ABAP_SORTORDER_TAB
结构类型: ABAP_SORTORDER

代码示例:

  DATA:
  W_IT_FIELD       TYPE ABAP_SORTORDER_TAB,
  W_STR_FIELD      TYPE ABAP_SORTORDER.
  W_STR_FIELD-NAME = \'NAME1\'.
  W_STR_FIELD-DESCENDING = \'\'.
  APPEND W_STR_FIELD TO W_IT_FIELD.
  W_STR_FIELD-NAME = \'KUNNR\'.
  W_STR_FIELD-DESCENDING = \'\'.
  APPEND W_STR_FIELD TO W_IT_FIELD.
  SORT <DYN_TABLE> BY (W_IT_FIELD).

HR信息类型

SAP HR为用户预留了自定义信息类型号段,规定自定义的信息类型必须以9开头,以免造成系统升级时自定义信息类型被标准信息类型所覆盖。
常见的信息类型有:
薪酬管理常用信息类
0007: 计划工作时间   0008:基本工资    0009:银行细目   0014:经常性支付/扣除
0007: 计划工作时间   0008:基本工资     0009:银行细目     0014:经常性支付/扣除
0015:额外支付款    0530:住房公基金(中国  0531:所得税(中国)0532:社会保险(中国)
人事管理常用信息类型
0000:人事事件(操作)       0001:组织分配                     0002:个人数据  
0006:地址0016:合同要素     0019:试用期到期提醒(任务监控)   0041:日期说明  
0105:通讯                         0185:个人标识                                0534:政党信息(中国)9000:户口信息               9001:紧急情况联系人               9002:教育信息
9003:公司外工作经历         9004:公司内工作经历             9006:专业技术职务
9007:职业技能等级           9008:执(职)业资格               9009:特种作业信息
9018:特殊工种               9031:家庭成员
0000人事事件、0001组织分配、0002个人基本信息、0003 薪酬状态  0006地址、0007计划工作时间、0008基本工资、0009银行信息、0014经常性支付、0015额外支付、0016合同要素、0022教育、0105通讯地址、0185有效证件、0530公积金、0531个人所得税、0532社保、2002出勤、2010员工报酬信息等等。pa2001 缺勤 pa2002 出勤 pa2005 加班  、PA9038外派 ,
t501 (员工组文本)
T501T (雇员组名称)  就多了个语言  优先
 
T503T(雇员子组名称)
T503K(员工子组) PERSK(正式 劳务 挂证 外聘) mandt
 
T530T (行动原因文本)
 
T550P(工作休息计划) 
T513S(工作职别,职务文本)、
T528T(职位文本)、
T549T (薪资发放范围),
PA0041  (日期详细)   hrp1000 对象定义   hrp1001 对象关系
T503K (员工子组)
PP01搜索组织单位  
 
外部关系的内部结构描述   HRI1001

事务码

ABAP+函数总结+常用函数解释

https://wenku.baidu.com/view/4fb3010f76c66137ee061944.html

双击弹屏

分配一个功能码 给他 

 

 

弹出窗口/弹窗

 

 

IF zcl_xhl=>confirm( |该交货单 { sy-mandt } 批次为空,被过滤| ) = abap_false.
  RETURN.
ENDIF.
write \'S\'.

 DATA:lv_err    TYPE char1,lv_answer TYPE answer,lv_line1 TYPE string.
IF iv_type = \'X\'. CHECK lv_err IS INITIAL. lv_line1 = \'确认保存数据?\'. ELSE. "@8.0 add IF lv_err IS INITIAL. lv_line1 = \'确认保存数据?\'. ELSE. CLEAR lv_err. lv_line1 = \'通知单还有错误信息,只能暂存数据,确认继续暂存数据?\'. ENDIF. ENDIF. CALL FUNCTION \'POPUP_TO_CONFIRM_STEP\' EXPORTING defaultoption = \'Y\' textline1 = lv_line1 titel = \'确认继续执行\' cancel_display = \'X\' IMPORTING answer = lv_answer. IF lv_answer <> \'J\'. EXIT. ENDIF.

  TYPE-POOLS:ICON.
    DATA:L_ANSWER TYPE C.

 CALL FUNCTION \'POPUP_TO_CONFIRM\'
      EXPORTING
*       TITLEBAR       = \' \'
*       DIAGNOSE_OBJECT             = \' \'
        TEXT_QUESTION  = \'所有数据已保存成功!!!\'
        TEXT_BUTTON_1  = \'Yes\'(002)   \'Yes\'(001) 请输入选择条件
        ICON_BUTTON_1  = \'ICON_CHECKED\'
        TEXT_BUTTON_2  = \'No\'(002)
        ICON_BUTTON_2  = \'ICON_INCOMPLETE\'
*       DEFAULT_BUTTON = \'1\'
*       DISPLAY_CANCEL_BUTTON       = \'X\'
*       USERDEFINED_F1_HELP         = \' \'
*       START_COLUMN   = 25
*       START_ROW      = 6
*       POPUP_TYPE     =
*       IV_QUICKINFO_BUTTON_1       = \' \'
*       IV_QUICKINFO_BUTTON_2       = \' \'
      IMPORTING
        ANSWER         = L_ANSWER
* TABLES
*       PARAMETER      =
      EXCEPTIONS
        TEXT_NOT_FOUND = 1
        OTHERS         = 2.
    WRITE:L_ANSWER.

  POPUP_WITH_TABLE_DISPLAY_OK

DATA: lt_fields        TYPE /plmb/t_spi_b_sval,
      lv_returncode(1) TYPE c,
      gv_matnr         TYPE matnr.
DATA:BEGIN OF gt_vtab OCCURS 0,
       value(40) TYPE c,
     END OF gt_vtab.

gt_vtab-value = \'000000001100000107\'.
APPEND gt_vtab.CLEAR gt_vtab.
gt_vtab-value = \'牛腩-【蔡澜Pho,10kg/箱】\'.
APPEND gt_vtab.CLEAR gt_vtab.
gt_vtab-value = \'000000001100000108\'.
APPEND gt_vtab.CLEAR gt_vtab.
gt_vtab-value = \'金钱腱-5kg/箱\'.
APPEND gt_vtab.CLEAR gt_vtab.



gt_vtab-value = \'000000001100000109\'.
APPEND gt_vtab.CLEAR gt_vtab.
gt_vtab-value = \'越南白米-【冠丰,50kg/袋】\'.
APPEND gt_vtab.CLEAR gt_vtab.

lt_fields = VALUE /plmb/t_spi_b_sval( ( tabname = \'MARA\' fieldname = \'MATNR\' value = \'\' field_attr = \'01\' ) ).
CALL FUNCTION \'POPUP_GET_VALUES_USER_HELP\'
  EXPORTING
    f4_formname     = \'F4_FOR_MATNR\'
    f4_programname  =  sy-repid   "程序名字
    popup_title     = |选择替换物料|
    start_column    = \'30\'
    start_row       = \'12\'
  IMPORTING
    returncode      = lv_returncode
  TABLES
    fields          = lt_fields
  EXCEPTIONS
    error_in_fields = 1
    OTHERS          = 2.
IF sy-subrc <> 0.
  CASE sy-subrc.
    WHEN 1.
      MESSAGE \'internal error\' TYPE \'S\' DISPLAY LIKE \'E\'.
      LEAVE LIST-PROCESSING.
    WHEN 2.
      MESSAGE \'other error\' TYPE \'S\' DISPLAY LIKE \'E\'.
      LEAVE LIST-PROCESSING.
  ENDCASE.
ENDIF.

IF lv_returncode = \'A\'.
ELSE.
  CLEAR:gv_matnr.
  IF line_exists( lt_fields[ 1 ] ).
    gv_matnr = CONV cffilename( lt_fields[ 1 ]-value ).
  ENDIF.
ENDIF.

FORM f4_for_matnr USING tabname fieldname display
                  CHANGING returncode value.

  DATA:lt_ftab TYPE TABLE OF help_value.

  lt_ftab = VALUE #(
                    ( tabname = \'MARA\' fieldname = \'MATNR\' selectflag = \'X\' )
                    ( tabname = \'MAKT\' fieldname = \'MAKTX\' )
                    ).

  CALL FUNCTION \'HELP_VALUES_GET_WITH_TABLE\'
    EXPORTING
      display      = display
      fieldname    = fieldname
      tabname      = tabname
    IMPORTING
      select_value = value
    TABLES
      valuetab     = gt_vtab
      fields       = lt_ftab.

ENDFORM.

 

 

 

DATA: BEGIN OF gs_lifnr,
        zwsyj(13),     " 试验件数量
        zddjsl(13),     " 对刀件数量
        znsyj(13),        "内部试验件数量
      END OF gs_lifnr,
      gt_lifnr LIKE TABLE OF gs_lifnr.
DATA lt_lifnr LIKE gt_lifnr.
DATA(lt_lifnr_input_data) = zcl_tabbed=>input( iv_upper = 1 iv_left = 30 iv_lower = 20 iv_right = 50
                                                    iv_alv_fields_ref_common = \'lifnr#lfa1#lifnr\'
                                                    is_alv = VALUE #( io_tabbed = zcl_tabbed=>new( lt_lifnr )
                                                                      iv_alv_fields_length = \'lifnr#10\'
                                                                      iv_alv_except_fields = \'name1\'
                                                                      iv_alv_fields_desc = |zwsyj:试验件数量,zddjsl:对刀件数量,znsyj:内部试验件数量|
                                                                     )
                                                  ).

FIELD-SYMBOLS <lt_input> TYPE STANDARD TABLE.
ASSIGN lt_lifnr_input_data->* TO <lt_input>.
MOVE-CORRESPONDING <lt_input> TO lt_lifnr[].
DELETE lt_lifnr WHERE zwsyj IS INITIAL.
IF lines( <lt_input> ) > 0.
  "// 校验供应商,编码,以及扩展情况?
ELSE.
  MESSAGE \'未输入供应商\' TYPE \'S\' DISPLAY LIKE \'E\'.
  RETURN.
ENDIF.

LOOP AT lt_lifnr ASSIGNING FIELD-SYMBOL(<FS_output>)..

ENDLOOP.

 

START-OF-SELECTION.
  CALL FUNCTION \'ENQUEUE_ESRDIRE\'
    EXPORTING
      name           = sy-repid
      _scope         = \'1\'
    EXCEPTIONS
      foreign_lock   = 1
      system_failure = 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.

ALV显示

https://www.cnblogs.com/kalasitifen/archive/2012/10/16/2726457.html

https://www.cnblogs.com/hcmy00/p/6524107.html

普通

REPORT ytest007.
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
***************ALV报表需要定义的参数************************
TYPE-POOLS:slis.
DATA:gt_fieldcat TYPE slis_t_fieldcat_alv,         "列描述内表,列清单
     gt_layput   TYPE slis_layout_alv.
DATA:gridlsl TYPE lvc_s_glay.
DATA:
  gs_fieldcat TYPE lvc_s_fcat,
  gs_layout   TYPE lvc_s_layo,
  g_repid     TYPE sy-repid,
  gt_sort     TYPE lvc_t_sort,
  gs_sort     TYPE lvc_s_sort.
***************ALV报表需要定义的参数************************
PERFORM display_alv.

*&---------------------------------------------------------------------*
*&      Form  display_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM display_alv .
  PERFORM layout_build.
  PERFORM fieldcat USING gt_fieldcat.
  PERFORM display.
  PERFORM sort_build.    "小计求和
ENDFORM.                    "DISPLAY_ALV

*&---------------------------------------------------------------------*
*&      Form  LAYOUT_BUILD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM layout_build .
  gt_layput-colwidth_optimize    = \'X\'.
  gt_layput-zebra    = \'X\'.
  gt_layput-detail_initial_lines = \'X\'.
  gt_layput-box_fieldname = \'BOX\'.  "复选框
ENDFORM.                    "LAYOUT_BUILD

*&---------------------------------------------------------------------*
*&      Form  FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->GT_FIELDCAT  text
*----------------------------------------------------------------------*
FORM fieldcat  USING gt_fieldcat TYPE slis_t_fieldcat_alv.
  DATA: afieldcat TYPE slis_fieldcat_alv,
        pos       TYPE i.

  CLEAR pos.
  DEFINE d_get_field.
    pos = pos + 1.
    clear afieldcat.
    afieldcat-col_pos  = pos.
    afieldcat-fieldname  = &1.
    afieldcat-seltext_l = &2.
    afieldcat-key = &3.
    afieldcat-no_out = &4.
    afieldcat-checkbox = &5.
    afieldcat-edit = &6.
    append afieldcat to gt_fieldcat.
  END-OF-DEFINITION.

  CLEAR: gt_fieldcat[], gs_fieldcat.
  CLEAR gs_fieldcat.
  afieldcat-fieldname = \'BOX\'.
  afieldcat-seltext_l = \'选择审批对象\'.
  afieldcat-checkbox = \'X\'.
  afieldcat-edit = \'X\'.
  APPEND afieldcat TO gt_fieldcat.
 
  d_get_field  \'YGBH     \'        \'员工编号    \'        \'\'  \'\' \'\'   \'\'.
  d_get_field  \'NACHN    \'        \'姓名    \'        \'\'  \'\' \'\'   \'\'.
  d_get_field  \'ICNUM    \'        \'身份证号 \'        \'\'  \'\' \'\'   \'\'.
  d_get_field  \'RZRQ     \'        \'入职日期  \'        \'\'  \'\' \'\'   \'\'.
  d_get_field  \'ORG1     \'        \'事业部/板块\'        \'\'  \'\' \'\'   \'\'.
  d_get_field  \'ORG2     \'        \'三级组织    \'        \'\'  \'\' \'\'   \'\'.
  d_get_field  \'ORG3     \'        \'四级组织    \'        \'\'  \'\' \'\'   \'\'.
  d_get_field  \'ORG4     \'        \'五级组织    \'        \'\'  \'\' \'\'   \'\'.
  d_get_field  \'ORG5     \'        \'六级组织    \'        \'\'  \'\' \'\'   \'\'.
  d_get_field  \'ZHIWEI   \'        \'职位\'        \'\'  \'\' \'\'   \'\'.
  d_get_field  \'ZHIWU    \'        \'职务\'        \'\'  \'\' \'\'   \'\'.
  d_get_field  \'STEXT1   \'        \'管理类别1\'        \'\'  \'\' \'\'   \'\'.
  d_get_field  \'STEXT2   \'        \'管理类别2\'        \'\'  \'\' \'\'   \'\'.
  d_get_field  \'STEXT3   \'        \'管理类别3\'        \'\'  \'\' \'\'   \'\'.
  d_get_field  \'STEXT4   \'        \'管理类别4\'        \'\'  \'\' \'\'   \'\'.
  d_get_field  \'STEXT5   \'        \'管理类别5\'        \'\'  \'\' \'\'   \'\'.
ENDFORM.                    "FIELDCAT

*&---------------------------------------------------------------------*
*&      Form  DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM display .

  gridlsl-edt_cll_cb            = \'X\'.

  CALL FUNCTION \'REUSE_ALV_GRID_DISPLAY\'
    EXPORTING
      i_callback_user_command     = \'USER_COMMAND\'
      i_callback_pf_status_set    = \'USER_STATUS\'
      i_callback_program          = sy-repid
      is_layout                   = gt_layput
      i_callback_html_top_of_page = \'HTML_TOP_OF_PAGE\' " 调用ALV表头显示
      it_fieldcat                 = gt_fieldcat[]
      i_html_height_top           = 18             " 设置抬头宽度
    TABLES
      t_outtab                    = itab
    EXCEPTIONS
      program_error               = 1
      OTHERS                      = 2.
ENDFORM.                         "事件CALLBACK

*&---------------------------------------------------------------------*
*&      Form  sort_build
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM sort_build .
  DATA lwa_sort TYPE slis_sortinfo_alv.
  lwa_sort-fieldname = \'YGBH\'.
  lwa_sort-up = \'X\'.
  lwa_sort-subtot = \'X\'.
  APPEND lwa_sort TO lt_sort.
ENDFORM.                    "sort_build

*&---------------------------------------------------------------------*
*&      Form  user_status
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->EXTAB      text
*----------------------------------------------------------------------*
FORM user_status USING extab TYPE slis_t_extab.
  SET PF-STATUS \'STATUS_ALV\'. "自定义按钮不要系统自带的
*  SET TITLEBAR \'TITLE_ALV\'.
ENDFORM.                    "user_status
*&---------------------------------------------------------------------*
*&      Form  user_command
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->R_UCOMM      text
*      -->RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
                        rs_selfield TYPE slis_selfield.

  DATA: l_grid TYPE REF TO cl_gui_alv_grid.
  CALL FUNCTION \'GET_GLOBALS_FROM_SLVC_FULLSCR\'
    IMPORTING
      e_grid = l_grid.
  CALL METHOD l_grid->check_changed_data.

  rs_selfield-refresh = \'X\'.

  DATA:ok_code TYPE sy-ucomm.
  ok_code = r_ucomm.
  CASE ok_code.
    WHEN \'BACK\'.
      SET SCREEN 0.
      LEAVE SCREEN.
    WHEN \'SAVE\'.
  ENDCASE.
ENDFORM.                  "user_command
form html_top_of_page using document type ref to cl_dd_document.
  data: text type sdydo_text_element.
  data: m_p       type i,
        m_buffer1 type string,
        m_buffer2 type string,
        m_buffer3 type string,
        m_buffer4 type string.
  data:l_tit3(30),g_lines(5),a1(30),a2(30),b1(30),b2(30),d(30).
  select single stext into l_tit3 from hrp1000 where objid = p_objid and otype = \'O\'.
  a1 =  s_data-low.      .
  a2 =  s_data-high.      "sy-datum+4(2).
  b1 = a1+4(2).
  b2 = a2+4(2).
  shift b1 left deleting leading \'0\'.
  shift b2 left deleting leading \'0\'.

  concatenate  \'<HTML><CENTER><H2>\' l_tit3 a1+0(4)   \'\' b1   \'月到\'  b2   \'月工资明细表\' \'</H2></CENTER></HTML>\' into m_buffer1.  " 居中  <H1>设置字体格式
  call method document->html_insert
    exporting
      contents = m_buffer1
    changing
      position = m_p.

endform.                    "HTML_TOP_OF_PAGE

 excel导入数据

https://sites.google.com/site/sapxlwb/home/eng/description

Doi用起来比较麻烦 出了错不好跟 代码冗长,新语法的话可能还好点
官方的alsm那个函数
1、只能限制9999行。我这个没限制
2、导入后得到的数据是行、列、值格式的内表。我这个得到的是你自己定义的内表格式
3、必须指定结束行和列。我这个不用指定结束行和列
4、我这个支持导入后不关闭Excel,保持application对象,以便回填数据到excel中
5、增加了对负号数据导出,带"的Excel数据导出问题的处理
6、对于有回车符的Excel内容,通过alsm*的函数导入时会串行。我这个函数对此进行了处理(换行符没事,回车符会有问题)
7、KCD_EXCEL_OLE_TO_INT_CONVERT, ALSM_EXCEL_TO_INTERNAL_TABLE等FM导入Excel
函数报错sy-subrc = 2 ,debug发现Excel数据未进入函数输出内表。如果电脑装了福昕PDF阅读器,那么原因是由于福昕PDF阅读器与SAP的EXCEL上传功能冲突了,需要卸载电脑里的福昕PDF阅读器


convert xls to sap的这个就是doi的 不好debug,它的原理是:创建一个文件接口类,通过文件接口类来读取excel内容。每次读取的时候,需要先指定一个读取范围,为其指定名称(excel里的名称,随便定义),然后从名称里把数据读取到格式如SOI_GENERIC_ITEM的内表里。
这个内表,最多只能存1000行的数据,系统的这个convert的函数,如果是10万条数据,通过这种方式读取,至少需要设置100个名称,读100次。SAP这个接口设计的渣,所以用最新这个

注:带“的导出的时候,如果用粘贴的方式导出,会出现单元格内容合并到一个单元格的情况,甚至跨行
如果一个个单元格赋值导出,是不会出现跨行的问题,但是效率慢,DOI还有个问题,就是你电脑上装了wps和office的话,他就经常没办法用了,他是通过获取你本地的excel的打开方式,来打开excel文件的,而wps不知道怎么做的,用doi打开excel的时候,总是通过wps来打开。即便你设置了excel文件的打开方式是office,也不行。而ole,用的是office的clsid来创建excel程序,是没问题的。

 Doi对装了wps的 也不是完全不支持 可能跟版本有关系 有些就是不行

 

 *  SET PROPERTY OF ole_excel \'DisplayAlerts\' = 0.
*前者并不会清空剪贴板,但是会让一些警告消息不再弹出
*如果你对文件做了更改,不保存就关闭的话,会有提示是否关闭的对话框,
*这个时候displayalerts = 0就起作用了,可以跳过这个关闭提示
 set property of ole_excel \'CutCopyMode\' 0.
*或者这个

 

 

 

1.有时候,有些excel里的数据,换行的, 看到的是换行,但不是我们正常输入的换行,我们正常在单元格里输入换行,是ALT+ENTER,但是Excel里的数据,可能是用户从其他系统导出来的,里面的换行,可能是带有回车字符的,这就导致ALSM复制数据,再粘贴到内表的时候,串行
2.往excel里写入,用ole的时候,对于带引号的字符,也有一些小bug,遇到再说,客户在物料描述里写了个引号,导出的时候,和后面的字段一起,甚至好几行一起,写到一个单元格里去了,如果用粘贴方式导出的话

 

OLE慢,是因为两个原因:
1:文件打开慢
2:调用方式不对
第一个没办法避免,第二个可以适当优化,大量数据导出,比如1万行,20列,还是ole块,
而且zabap2xlsx导出,会清单元格格式,模板里设置的条件格式、单元格格式,都会被干掉。
对于公式,zabap2xlsx上载的时候,也会读取到公式的内容,而不是值,ole就不一样,但是他也有很多好处,就是不会遇到进程的问题,
他小数据量比较快,ole是粘贴过去,比前者循环20万次处理单元格要快的多

比如:2万行,20列,就是40万次处理。每一次处理都要设置单元格的很多属性,可能里面有一堆的read itab等操作语句,可能里面有一堆的read itab等操作语句,
但是如果是自定义报表,同样大小的数据,你改一下代码,发送到剪贴板,粘贴到Excel,用OLE的方式处理的话,最大的时间就是在发送剪贴板这一步,这一步可能1分钟。但是粘贴很快啊

alv导出excel,并不是单元格操作,而是abap代码,它是生成一个很长串的xml,然后导出成文件,生成这个很长的string,慢

include zexcel_public.

 1 form excel_data .
 2   data: l_name         like wwwdatatab,
 3         l_rc           like sy-subrc,
 4         l_fullpath     type string,
 5         l_sheet_number type i value 1,
 6         l_text         type string.
 7 
 8   concatenate \'C:/HR/五险一金明细表表\' sy-datum \'.XLS\' into g_file.
 9 
10   l_name-relid = \'MI\'.
11   l_name-objid = \'ZR_HR_PA11_PRINT\'."EXCEL模板的名
12 
13   call function \'DOWNLOAD_WEB_OBJECT\'
14     exporting
15       key         = l_name
16       destination = g_file
17     importing
18       rc          = l_rc.
19   if l_rc <> 0.
20     message \'模板文件(SMW0:ZHRRPY005)下载失败,请与开发人员联系!\' type \'S\'.
21     leave list-processing.
22   endif.
23 
24   l_fullpath = g_file.
25 
26   concatenate \'正在处理文件:\' g_file into l_text.
27   call function \'SAPGUI_PROGRESS_INDICATOR\'
28     exporting
29       text = l_text.
30 
31   perform frm_open_excel using l_fullpath 0.         " 打开excel模板
32 
33   perform frm_open_excel_sheet using l_sheet_number.     "打开excel第一个sheet
34   perform frm_process_excel.                            "向EXCEL中填充数据
35   set property of g_excel \'VISIBLE\'  = 1.                "过程可见
36 endform.

 

*&---------------------------------------------------------------------*
*&  包含                ZEXCEL_PUBLIC
*&---------------------------------------------------------------------*
DATA: ROWS    TYPE OLE2_OBJECT, "Sheet的行对象
      COLUMNS TYPE OLE2_OBJECT,
      G_ROW   TYPE OLE2_OBJECT.
*&---------------------------------------------------------------------* *& Form FRM_OPEN_EXCEL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_L_FULLPATH text *----------------------------------------------------------------------* FORM FRM_OPEN_EXCEL USING P_FULLPATH P_VISIBLE. CREATE OBJECT G_EXCEL \'Excel.Application\'. SET PROPERTY OF G_EXCEL \'VISIBLE\' = P_VISIBLE. CALL METHOD OF G_EXCEL \'Workbooks\' = G_WORKBOOK. CALL METHOD OF G_WORKBOOK \'Open\' = G_WORKBOOK EXPORTING #1 = P_FULLPATH. IF SY-SUBRC <> 0. MESSAGE S009(ZHRFD) WITH \'Open file failed!\'. STOP. ENDIF. ENDFORM. " FRM_OPEN_EXCEL *&---------------------------------------------------------------------* *& Form FRM_OPEN_EXCEL_SHEET *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_L_SHEET_NUMBER text *----------------------------------------------------------------------* FORM FRM_OPEN_EXCEL_SHEET USING P_SHEET. * CALL METHOD OF g_workbook \'Worksheets\' = g_sheet * EXPORTING * #1 = \'Sheet1\'. CALL METHOD OF G_WORKBOOK \'Sheets\' = G_SHEET EXPORTING #1 = P_SHEET. CALL METHOD OF G_SHEET \'Activate\'. ENDFORM. " FRM_OPEN_EXCEL_SHEET *&---------------------------------------------------------------------* *& Form FRM_COPY_SHEET_ALL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_COPY_SHEET_ALL USING P_FROM_SHEET P_TO_SHEET. CALL METHOD OF G_EXCEL \'Sheets\' = G_SHEET EXPORTING #1 = P_FROM_SHEET. CALL METHOD OF G_SHEET \'Cells\' = G_CELL. CALL METHOD OF G_CELL \'Copy\'. CALL METHOD OF G_EXCEL \'Sheets\' = G_SHEET EXPORTING #1 = P_TO_SHEET. CALL METHOD OF G_EXCEL \'Range\' = G_RANGE EXPORTING #1 = \'A1\'. CALL METHOD OF G_RANGE \'PasteSpecial\'. ENDFORM. " FRM_COPY_SHEET_ALL *&---------------------------------------------------------------------* *& Form FRM_SAVE_EXCEL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_L_FULLPATH text *----------------------------------------------------------------------* FORM FRM_SAVE_EXCEL USING P_FULLPATH. SET PROPERTY OF G_EXCEL \'DisplayAlerts\' = 0. CALL METHOD OF G_SHEET \'SAVEAS\' EXPORTING #1 = P_FULLPATH #2 = 1. *****关闭WORKSHEET**** CALL METHOD OF G_SHEET \'CLOSE\'. *****关闭WORKBOOK CALL METHOD OF G_WORKBOOK \'SAVE\'. CALL METHOD OF G_WORKBOOK \'CLOSE\' EXPORTING #1 = 0. *****关闭EXCEL对象**** CALL METHOD OF G_EXCEL \'QUIT\'. FREE OBJECT G_RANGE. FREE OBJECT G_CELL. FREE OBJECT G_SHEET. FREE OBJECT G_WORKBOOK. FREE OBJECT G_EXCEL. ENDFORM. " FRM_SAVE_EXCEL *&---------------------------------------------------------------------* *& Form FRM_CREATE_SHEET *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_CREATE_SHEET . CALL METHOD OF G_EXCEL \'Sheets\' = G_SHEET. CALL METHOD OF G_SHEET \'ADD\'. ENDFORM. " FRM_CREATE_SHEET *&---------------------------------------------------------------------* *& Form FRM_SET_SHEET_NAME *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_L_SHEET_NAME text *----------------------------------------------------------------------* FORM FRM_SET_SHEET_NAME USING P_SHEET_NAME. SET PROPERTY OF G_SHEET \'Name\' = P_SHEET_NAME. ENDFORM. " FRM_SET_SHEET_NAME *&---------------------------------------------------------------------* *& Form FRM_FILL_CELL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_L_ROW text * -->P_L_COL text * -->P_L_XH text *----------------------------------------------------------------------* FORM FRM_FILL_CELL USING P_ROW P_COL P_VALUE. DATA: LO_FONT TYPE OLE2_OBJECT. CALL METHOD OF G_EXCEL \'CELLS\' = G_CELL EXPORTING #1 = P_ROW #2 = P_COL. SET PROPERTY OF G_CELL \'VALUE\' = P_VALUE. GET PROPERTY OF G_CELL \'font\' = G_FONT. SET PROPERTY OF G_FONT \'size\' = 9. SET PROPERTY OF G_FONT \'Name\' = \'宋体\'. * SET PROPERTY OF CELL \'HorizontalAlignment\' = 3. " 居中 ENDFORM. " FRM_FILL_CELL *&---------------------------------------------------------------------* *& Form FRM_FILL_CELL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_L_ROW text * -->P_L_COL text * -->P_L_XH text *----------------------------------------------------------------------* FORM FRM_FILL_CELL_NEW USING P_ROW P_COL P_VALUE P_SIZE P_ALIGNMENT. DATA: LO_FONT TYPE OLE2_OBJECT. CALL METHOD OF G_EXCEL \'CELLS\' = G_CELL EXPORTING #1 = P_ROW #2 = P_COL. * SET PROPERTY OF G_CELL \'VALUE\' = P_VALUE. GET PROPERTY OF G_CELL \'font\' = G_FONT. SET PROPERTY OF G_FONT \'size\' = P_SIZE. GET PROPERTY OF G_CELL \'font\' = G_FONT. SET PROPERTY OF G_FONT \'bold\' = 0. SET PROPERTY OF G_FONT \'Name\' = \'黑体\'. SET PROPERTY OF G_CELL \'HorizontalAlignment\' = P_ALIGNMENT. " 1=靠左 4=靠右 3=居中 ENDFORM. " FRM_FILL_CELL *&---------------------------------------------------------------------* *& Form FRM_MERGE_RANGE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_L_XH_MERGE_X1 text * -->P_L_XH_MERGE_Y1 text * -->P_L_XH_MERGE_X2 text * -->P_L_XH_MERGE_Y2 text *----------------------------------------------------------------------* FORM FRM_MERGE_RANGE USING P_X1 P_Y1 P_X2 P_Y2. CALL METHOD OF G_EXCEL \'Cells\' = G_CELL1 EXPORTING #1 = P_X1 #2 = P_Y1. CALL METHOD OF G_EXCEL \'Cells\' = G_CELL2 EXPORTING #1 = P_X2 #2 = P_Y2. CALL METHOD OF G_EXCEL \'Range\' = G_CELLS EXPORTING #1 = G_CELL1 #2 = G_CELL2. CALL METHOD OF G_CELLS \'merge\'. ENDFORM. " FRM_MERGE_RANGE *&---------------------------------------------------------------------* *& Form FRM_DRAWLINE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_X1 text * -->P_Y1 text * -->P_X2 text * -->P_Y2 text *----------------------------------------------------------------------* FORM FRM_DRAWLINE USING P_X1 P_Y1 P_X2 P_Y2. CALL METHOD OF G_EXCEL \'Cells\' = G_CELL1 EXPORTING #1 = P_X1 #2 = P_Y1. CALL METHOD OF G_EXCEL \'Cells\' = G_CELL2 EXPORTING #1 = P_X2 #2 = P_Y2. CALL METHOD OF G_EXCEL \'Range\' = G_CELLS EXPORTING #1 = G_CELL1 #2 = G_CELL2. * CALL METHOD OF cells \'Select\'. GET PROPERTY OF G_CELLS \'borders\' = G_RANGE. SET PROPERTY OF G_RANGE \'weight\' = \'2\'. SET PROPERTY OF G_RANGE \'linestyle\' = \'1\'. ENDFORM. " FRM_DRAWLINE *&---------------------------------------------------------------------* *& Form FRM_WRITE_TITLE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_2 text * -->P_1 text * -->P_L_STR text *----------------------------------------------------------------------* FORM FRM_WRITE_TITLE USING P_ROW P_COL P_VALUE. DATA: LO_FONT TYPE OLE2_OBJECT. CALL METHOD OF G_EXCEL \'CELLS\' = G_CELL EXPORTING #1 = P_ROW #2 = P_COL. SET PROPERTY OF G_CELL \'VALUE\' = P_VALUE. GET PROPERTY OF G_CELL \'font\' = G_FONT. SET PROPERTY OF G_FONT \'size\' = 10. SET PROPERTY OF G_FONT \'Name\' = \'华文中宋\'. SET PROPERTY OF G_FONT \'bold\' = 0. SET PROPERTY OF G_CELL \'HorizontalAlignment\' = 2. " 居左 ENDFORM. " FRM_WRITE_TITLE *&---------------------------------------------------------------------* *& Form FRM_DEL_COL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_COL text *----------------------------------------------------------------------* FORM FRM_DEL_COL USING P_COLNUM. CALL METHOD OF G_EXCEL \'COLUMNS\' = G_COLUMNS EXPORTING #1 = P_COLNUM. CALL METHOD OF G_COLUMNS \'DELETE\'. ENDFORM. " FRM_DEL_COL *&---------------------------------------------------------------------* *& Form FRM_CLEAR_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_L_YZ_MERGE_X1 text * -->P_L_YZ_MERGE_Y1 text * -->P_L_YZ_MERGE_X2 text * -->P_L_YZ_MERGE_Y2 text *----------------------------------------------------------------------* FORM FRM_CLEAR_DATA USING P_X1 P_Y1 P_X2 P_Y2. PERFORM FRM_SELECT_RANGE USING P_X1 P_Y1 P_X2 P_Y2. CALL METHOD OF G_RANGE \'ClearContents\'. ENDFORM. " FRM_CLEAR_DATA *&---------------------------------------------------------------------* *& Form FRM_SELECT_RANGE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_P_X1 text * -->P_P_Y1 text * -->P_P_X2 text * -->P_P_Y2 text *----------------------------------------------------------------------* FORM FRM_SELECT_RANGE USING P_X1 P_Y1 P_X2 P_Y2. CALL METHOD OF G_EXCEL \'CELLS\' = G_CELL1 EXPORTING #1 = P_X1 #2 = P_Y1. CALL METHOD OF G_EXCEL \'CELLS\' = G_CELL2 EXPORTING #1 = P_X2 #2 = P_Y2. CALL METHOD OF G_EXCEL \'RANGE\' = G_RANGE EXPORTING #1 = G_CELL1 #2 = G_CELL2. CALL METHOD OF G_RANGE \'SELECT\'. ENDFORM. " FRM_SELECT_RANGE *&---------------------------------------------------------------------* *& Form FRM_PREVIEW_EXCEL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_PREVIEW_EXCEL . SET PROPERTY OF G_EXCEL \'VISIBLE\' = 1. CALL METHOD OF G_SHEET \'PrintPreview\'. ENDFORM. " FRM_PREVIEW_EXCEL *&---------------------------------------------------------------------* *& Form insert_colmun *&---------------------------------------------------------------------* * 在EXCEL模板中插入行 *----------------------------------------------------------------------* * -->row 行位置 *----------------------------------------------------------------------* FORM INSERT_ROW USING ROW . CALL METHOD OF G_EXCEL \'ROWS\' = ROWS EXPORTING #1 = ROW. CALL METHOD OF ROWS \'INSERT\'. FREE OBJECT ROWS. ENDFORM. "insert_row *&---------------------------------------------------------------------* *& Form delete_row *&---------------------------------------------------------------------* * 在EXCEL模板中删除行 *----------------------------------------------------------------------* * -->row 行位置 *----------------------------------------------------------------------* FORM DELETE_ROW USING ROW . CALL METHOD OF G_EXCEL \'ROWS\' = ROWS EXPORTING #1 = ROW. CALL METHOD OF ROWS \'DELETE\'. FREE OBJECT ROWS. ENDFORM. "delete_row *&---------------------------------------------------------------------* *& Form auto_fit *&---------------------------------------------------------------------* * 在EXCEL模板中自适应高度 *----------------------------------------------------------------------* * *----------------------------------------------------------------------* FORM AUTO_FIT USING ROW . DATA: L_END TYPE STRING, L_STR TYPE STRING. L_STR = ROW. CONCATENATE L_STR \':\' L_STR INTO L_END . CONDENSE L_END NO-GAPS. CALL METHOD OF G_EXCEL \'ROWS\' = ROWS EXPORTING #1 = L_END. CALL METHOD OF ROWS \'SELECT\'. CALL METHOD OF ROWS \'AutoFit\'. ENDFORM. *&---------------------------------------------------------------------* *& Form COLUMNWIDTH *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_1091 text *----------------------------------------------------------------------* FORM COLUMNWIDTH USING COLNUM . CALL METHOD OF G_EXCEL \'COLUMNS\' = COLUMNS EXPORTING #1 = COLNUM. CALL METHOD OF COLUMNS \'AutoFit\'. ENDFORM. "columnwidth *&---------------------------------------------------------------------* *& Form FRM_FILL_CELL_NEW1 *&---------------------------------------------------------------------* * text 宋体 *----------------------------------------------------------------------* * -->P_R1 text * -->P_1 text * -->P_ITAB_TABIX text * -->P_11 text * -->P_3 text *----------------------------------------------------------------------* FORM FRM_FILL_CELL_NEW1 USING P_ROW P_COL P_VALUE P_SIZE P_ALIGNMENT. DATA: LO_FONT TYPE OLE2_OBJECT. CALL METHOD OF G_EXCEL \'CELLS\' = G_CELL EXPORTING #1 = P_ROW #2 = P_COL. * SET PROPERTY OF G_CELL \'VALUE\' = P_VALUE. GET PROPERTY OF G_CELL \'font\' = G_FONT. SET PROPERTY OF G_FONT \'size\' = P_SIZE. GET PROPERTY OF G_CELL \'font\' = G_FONT. SET PROPERTY OF G_FONT \'bold\' = 0. SET PROPERTY OF G_FONT \'Name\' = \'宋体\'. SET PROPERTY OF G_CELL \'HorizontalAlignment\' = P_ALIGNMENT. " 1=靠左 4=靠右 3=居中 SET PROPERTY OF G_CELL \'VALUE\' = P_VALUE. ENDFORM. " FRM_FILL_CELL_NEW1 FORM FRM_FILL_CELL_NEW2 USING P_ROW P_COL P_VALUE P_SIZE P_ALIGNMENT. DATA: LO_FONT TYPE OLE2_OBJECT. CALL METHOD OF G_EXCEL \'CELLS\' = G_CELL EXPORTING #1 = P_ROW #2 = P_COL. * SET PROPERTY OF G_CELL \'VALUE\' = P_VALUE. GET PROPERTY OF G_CELL \'font\' = G_FONT. SET PROPERTY OF G_FONT \'size\' = P_SIZE. GET PROPERTY OF G_CELL \'font\' = G_FONT. SET PROPERTY OF G_FONT \'bold\' = 1. SET PROPERTY OF G_FONT \'Name\' = \'华文中宋\'. SET PROPERTY OF G_CELL \'HorizontalAlignment\' = P_ALIGNMENT. " 1=靠左 4=靠右 3=居中 SET PROPERTY OF G_CELL \'VALUE\' = P_VALUE. ENDFORM. FORM FRM_FILL_CELL_NEW3 USING P_ROW "模版低栏 P_COL P_VALUE P_SIZE P_ALIGNMENT. DATA: LO_FONT TYPE OLE2_OBJECT. CALL METHOD OF G_EXCEL \'CELLS\' = G_CELL EXPORTING #1 = P_ROW #2 = P_COL. * SET PROPERTY OF G_CELL \'VALUE\' = P_VALUE. GET PROPERTY OF G_CELL \'font\' = G_FONT. SET PROPERTY OF G_FONT \'size\' = P_SIZE. GET PROPERTY OF G_CELL \'font\' = G_FONT. SET PROPERTY OF G_FONT \'bold\' = 0. SET PROPERTY OF G_FONT \'Name\' = \'黑体\'. SET PROPERTY OF G_CELL \'HorizontalAlignment\' = P_ALIGNMENT. " 1=靠左 4=靠右 3=居中 SET PROPERTY OF G_CELL \'VALUE\' = P_VALUE. ENDFORM. FORM FRM_FILL_CELL_NEW4 USING P_ROW "华文仿宋10加粗 P_COL P_VALUE P_SIZE P_ALIGNMENT. DATA: LO_FONT TYPE OLE2_OBJECT. CHECK P_VALUE NE \'\'. CALL METHOD OF G_EXCEL \'CELLS\' = G_CELL EXPORTING #1 = P_ROW #2 = P_COL. * SET PROPERTY OF G_CELL \'VALUE\' = P_VALUE. GET PROPERTY OF G_CELL \'font\' = G_FONT. SET PROPERTY OF G_FONT \'size\' = P_SIZE. GET PROPERTY OF G_CELL \'font\' = G_FONT. SET PROPERTY OF G_FONT \'bold\' = 1. SET PROPERTY OF G_FONT \'Name\' = \'华文仿宋\'. SET PROPERTY OF G_CELL \'HorizontalAlignment\' = P_ALIGNMENT. " 1=靠左 4=靠右 3=居中 SET PROPERTY OF G_CELL \'VALUE\' = P_VALUE. ENDFORM. FORM FRM_FILL_CELL_NEW5 USING P_ROW "华文仿宋 12 不加粗 P_COL P_VALUE P_SIZE P_ALIGNMENT. DATA: LO_FONT TYPE OLE2_OBJECT. CHECK P_VALUE NE \'\'. CALL METHOD OF G_EXCEL \'CELLS\' = G_CELL EXPORTING #1 = P_ROW #2 = P_COL. * SET PROPERTY OF G_CELL \'VALUE\' = P_VALUE. GET PROPERTY OF G_CELL \'font\' = G_FONT. SET PROPERTY OF G_FONT \'size\' = P_SIZE. GET PROPERTY OF G_CELL \'font\' = G_FONT. SET PROPERTY OF G_FONT \'bold\' = 0. SET PROPERTY OF G_FONT \'Name\' = \'华文仿宋\'. SET PROPERTY OF G_CELL \'HorizontalAlignment\' = P_ALIGNMENT. " 1=靠左 4=靠右 3=居中 SET PROPERTY OF G_CELL \'VALUE\' = P_VALUE. ENDFORM. *&---------------------------------------------------------------------* *& Form HEBING *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_R1 text * -->P_0217 text * -->P_R1 text * -->P_0219 text *----------------------------------------------------------------------* FORM HEBING USING P_R1 P_0217 P_R2 P_0219. DATA: L1 TYPE STRING, L3 TYPE STRING, L4 TYPE STRING, L2 TYPE STRING. MOVE P_R1 TO L3. MOVE P_R2 TO L4. CONCATENATE P_0217 L3 INTO L1. CONCATENATE P_0219 L4 INTO L2. CALL METHOD OF G_EXCEL \'Range\' = G_RANGE EXPORTING #1 = L1 #2 = L2. CALL METHOD OF G_RANGE \'Select\'. SET PROPERTY OF G_RANGE \'MergeCells\' = 1. "合并单元格" ENDFORM. " HEBING *&---------------------------------------------------------------------* *& Form set height *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_R1 text * -->P_0217 text * -->P_R1 text * -->P_0219 text *----------------------------------------------------------------------* FORM SET_ROW_HEIGHT USING IROW TYPE I IHEIGHT TYPE I. *Set Row Height CALL METHOD OF G_EXCEL \'ROWS\' = G_ROW EXPORTING #1 = IROW. SET PROPERTY OF G_ROW \'ROWHEIGHT\' = IHEIGHT. ENDFORM.

EXPORT:

data: g_excel        type ole2_object,
      g_sheet        type ole2_object,
      g_workbook     type ole2_object,
      g_cell         type ole2_object,
      g_range        type ole2_object,
      g_font         type ole2_object,
      g_cell1        type ole2_object,
      g_cell2        type ole2_object,
      g_cells        type ole2_object,
      g_columns      type ole2_object,
      g_file         like rlgrap-filename,
      g_border       type ole2_object,
      g_column       type ole2_object,
      g_wkbk         type ole2_object,
      g_sheet_number type i.
**&---------------------------------------------------------------------*
**&  包含                ZR_HR_PA12_DOWNLOAD
**&---------------------------------------------------------------------*
FORM EXCEL_DATA .
  DATA: L_NAME         LIKE WWWDATATAB,
        L_RC           LIKE SY-SUBRC,
        L_FULLPATH     TYPE STRING,
        L_SHEET_NUMBER TYPE I VALUE 1,
        L_TEXT         TYPE STRING.

  CONCATENATE \'C:/HR/工资明细表\' SY-DATUM \'.XLS\' INTO G_FILE.

  L_NAME-RELID = \'MI\'.
  L_NAME-OBJID = \'ZR_HR_PA12_PRINT\'."EXCEL模板的名  需要修改

  CALL FUNCTION \'DOWNLOAD_WEB_OBJECT\'
    EXPORTING
      KEY         = L_NAME
      DESTINATION = G_FILE
    IMPORTING
      RC          = L_RC.
  IF L_RC <> 0.
    MESSAGE \'模板文件(SMW0:ZTEST_001)下载失败,请与开发人员联系!\' TYPE \'S\'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  L_FULLPATH = G_FILE.

  CONCATENATE \'正在处理文件:\' G_FILE INTO L_TEXT.
  CALL FUNCTION \'SAPGUI_PROGRESS_INDICATOR\'
    EXPORTING
      TEXT = L_TEXT.

  PERFORM FRM_OPEN_EXCEL USING L_FULLPATH 0.         " 打开excel模板

  PERFORM FRM_OPEN_EXCEL_SHEET USING L_SHEET_NUMBER.     "打开excel第一个sheet
  PERFORM FRM_PROCESS_EXCEL.                            "向EXCEL中填充数据
  SET PROPERTY OF G_EXCEL \'VISIBLE\'  = 1.                "过程可见
ENDFORM.                    " EXCEL_DAOCHU
*&---------------------------------------------------------------------*
*&      Form  FRM_PROCESS_EXCEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_PROCESS_EXCEL .
  DATA:R1 TYPE I .
  DATA:L_TIT      TYPE CHAR50,L_TIT1(30),L_TIT2(30).

*  CALL METHOD OF G_EXCEL \'COLUMNS\' = G_COLUMN           "将第6列设置为文本格式 列宽为20
*        EXPORTING
*          #1 = 7.
*  SET PROPERTY OF G_COLUMN \'ColumnWidth\' = 20.
*  SET PROPERTY OF G_COLUMN \'NumberFormat\' = \'@\'.

  DATA:L_LINE TYPE I.
  DESCRIBE TABLE GT_MAIN_DATA LINES L_LINE.   "这里的  gt_main_data是报表开头建立的内表

  DATA:L_INDEX        TYPE I,
       WA_EXCEL(4096),
       L_STR(512).
  DATA:LT_EXCEL(4096) OCCURS 0.
  FIELD-SYMBOLS:<FSSTR> LIKE GT_MAIN_DATA, "同报表开头内表
                <FSFLD>.
  DATA:G_SEPARATOR TYPE C.
  G_SEPARATOR = CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB.
********************************_-----------------------------------------------------------
  DATA:TITLE(50),TITLE1(20).
  SELECT SINGLE STEXT INTO TITLE1 FROM HRP1000 WHERE OBJID = P_OBJID AND OTYPE = \'O\'.

  CONCATENATE TITLE1  S_DATA-LOW+0(4)  \'\'  S_DATA-LOW+4(2)   \'月到\'  S_DATA-HIGH+4(2)   \'月工资明细表\'  INTO TITLE.  " 居中  <H1>设置字体格式


  PERFORM FRM_FILL_CELL_NEW1 USING 1 1 TITLE 17 3.  "3是居中
********************************_-----------------------------------------------------------
  LOOP AT GT_MAIN_DATA ASSIGNING <FSSTR>. "报表开头内表
    L_INDEX = 0.
    DO 42 TIMES.    "
      ADD 1 TO L_INDEX.
      ASSIGN COMPONENT L_INDEX OF STRUCTURE <FSSTR> TO <FSFLD>.
      IF SY-SUBRC <> 0.
        EXIT.
      ENDIF.
      CLEAR:L_STR.
      WRITE <FSFLD> TO  L_STR LEFT-JUSTIFIED.
      CONDENSE L_STR.
      IF L_INDEX EQ 1.
        WA_EXCEL = L_STR.
      ELSE.
        CONCATENATE WA_EXCEL L_STR INTO WA_EXCEL SEPARATED BY G_SEPARATOR.
      ENDIF.
    ENDDO.
    APPEND WA_EXCEL TO LT_EXCEL.
    CLEAR:WA_EXCEL.
  ENDLOOP.

  DATA: L_RET TYPE I.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>CLIPBOARD_EXPORT
    IMPORTING
      DATA = LT_EXCEL
    CHANGING
      RC   = L_RET.

  CALL METHOD OF
    G_SHEET
    \'Activate\'.
  CALL METHOD OF
      G_SHEET
      \'Cells\' = G_CELL
    EXPORTING
      #1      = 5
      #2      = \'A\'.

* Paste data from clipboard
  CALL METHOD OF
    G_CELL
    \'Select\'.
  CALL METHOD OF
    G_SHEET
    \'Paste\'.

  DESCRIBE TABLE GT_MAIN_DATA LINES R1.
  R1 = R1 + 4.

  PERFORM FRM_DRAWLINE USING 5 \'A\' R1 \'AP\'.   "加边框  从第五行开始 到R1行结束  从A列到I列
ENDFORM.

OOALV

https://www.cnblogs.com/ckstock/p/11586045.html

OO初级

https://github.com/abapoop/abap_oop_sample

 

 

 抽象类:不能实例化的类

 

"父类水果,从ABAP根类object继承
CLASS
  zcl_fruit DEFINITION INHERITING FROM object.
ENDCLASS.
"子类苹果,继承自水果类
CLASS
  zcl_apple DEFINITION INHERITING FROM zcl_fruit.
ENDCLASS.
"子类梨子,继承自水果类
CLASS
  zcl_pear DEFINITION INHERITING FROM zcl_apple.
ENDCLASS.
"定义类对象
DATA go_fruit TYPE REF TO zcl_fruit.
DATA go_apple TYPE REF TO zcl_apple.
DATA go_pear TYPE REF TO zcl_pear.

"第1种上转型,按子类类型创建父类对象
"父类是可创建对象实例的类,或者抽象类和接口
CREATE OBJECT go_fruit TYPE zcl_apple.
"或者使用NEW语句
go_fruit = NEW zcl_apple( ).

 

*SELECTION-SCREEN FUNCTION KEY 3.
*变量定义
TYPES TY_SPFLI TYPE SPFLI OCCURS 0.
*DATA:ty_spfli LIKE TABLE OF spfli WITH HEADER LINE.

*----------------------------------------------------------------------*
*       CLASS vehicle DEFINITION
*----------------------------------------------------------------------*
*       ALV操作类(定义)
*----------------------------------------------------------------------*
CLASS VEHICLE DEFINITION.
  PUBLIC SECTION.
    METHODS: GETDATA         "取得要显示的数据
      RETURNING VALUE(LT_TAB) TYPE TY_SPFLI,
      ALV_PROCESS     "ALV处理方法
        IMPORTING VALUE(LT_TAB) TYPE TY_SPFLI,
      MAIN.           "主方法
  PRIVATE SECTION.
    DATA GR_TABLE TYPE REF TO CL_SALV_TABLE.
ENDCLASS.                    "vehicle DEFINITION

*----------------------------------------------------------------------*
*       CLASS vehicle IMPLEMENTATION
*----------------------------------------------------------------------*
*       ALV操作类(实现)
*----------------------------------------------------------------------*
CLASS VEHICLE IMPLEMENTATION.
*取得要显示的数据
  METHOD GETDATA.
    SELECT * INTO TABLE LT_TAB FROM SPFLI.
  ENDMETHOD.                    "getdata

*ALV处理方法
  METHOD ALV_PROCESS.
    "创建实例
    TRY.
        CL_SALV_TABLE=>FACTORY(
          IMPORTING
            R_SALV_TABLE = GR_TABLE
          CHANGING
            T_TABLE      = LT_TAB
        ).
      CATCH CX_SALV_MSG.
    ENDTRY.
    "显示列表
    GR_TABLE->DISPLAY( ).
  ENDMETHOD.                    "alv_process
*--------------实参的动态传递------------------
*  data:ptab LIKE TABLE OF abap_parmbind.
**  call METHOD 【oref -> / class => 】 method.
*  PARAMETER-table ptab(参数表)
*  PARAMETER-table etab(异常表) .

*--------------------------------
*主方法,整合数据
  METHOD MAIN.
    DATA: LT_TAB TYPE TABLE OF SPFLI.

    "取得要显示的数据
    LT_TAB = ME->GETDATA( )."me (局部引用变量,隐藏在所有实例方法中)是对象的自身引用,
    "当方法被调用时,该变量将包含自身的地址指针
    "处理数据
    ME->ALV_PROCESS( LT_TAB )."call method 的简化形式

* 方法还可以进行动态调用,即通过变量对方法名进行指定
*                            meth = accelerate .
*                  call method     o_vehicle -> meth .
  ENDMETHOD.                    "main
ENDCLASS.                    "vehicle IMPLEMENTATION

*报表执行
START-OF-SELECTION.
  DATA  O_VEHICLE   TYPE REF TO VEHICLE.
  CREATE OBJECT O_VEHICLE. "创建一个类 vehicle 的实例,并同时将该对象的地址指针赋给引用类型o_vehicle
  O_VEHICLE->MAIN( ). "访问对象  或者  ===> 组件
  "                               引用类型变量-> 类成员 (comp )  ->可访问 实例组件 和 静态组件
  "静态组件 另一种访问  类名称本身(class )  => 类成员 (comp )

  "引用类型变量 本身也可以定义为类属性因此可以链式访问
  "oref1 -> oref2 -> comp   class => oref2-> comp

  "基类 vehicle 派生类 ship car train  -> 子类

  "抽象类和最终类
  " 1> 抽象类和抽象方法:(抽象类)该基类只是作为模板出现,并不需要任何对象作为实例
  " 2> 最终类和最终方法:是不能被继承的,若果一个类(尤其全局类)有很多派生类,
  "   则其中公有和被保护成员方法与之相关,随意改动该类,易造成派生类中语法和语义冲突,
  "   因而不想继续对该类进行派生,则课定义为最终类

  "注册事件处理方法
*    SET HANDLER go_receiver->handle_user_command FOR wcl_grid."对增加的功能键写如对应的功能
*    SET HANDLER go_receiver->handle_toolbar FOR wcl_grid.  "增加菜单栏里面的功能键

  "类成员:属性,方法,事件(类对象发布其状态的改变)

* MODIFY IT_ITAB TRANSPORTING MAKTX.


**动态数据对象:字段符号,数据引用or(对象引用)
**强制类型转换
**隐式强制类型转换: assign f to <fs>  casting.
**显式强制类型转换: assign f to <fs>  casting type ~~~~.
*  TYPES:BEGIN OF gt_show,
*          COL1 TYPE I,
*          COL2 TYPE I,
*        END OF gt_show.
**1 声明引用变量
*  DATA DREF1 TYPE REF TO DATA.
*  DATA DREF2 TYPE REF TO DATA.
*
*  FIELD-SYMBOLS: <FS1> TYPE gt_show,
*                 <FS2> TYPE I.
**2 动态对象创建 :该语句在运行期间内动态创建一个数据对象,同时引用变量DREF1 指向这一对象,
**-- 该对象没有名称,只能通过数据引用变量进行寻址
*  CREATE DATA DREF1 TYPE gt_show.
*  ASSIGN DREF1->* TO <FS1>.  "解引操作
*  <FS1>-COL1 = 1.
*  <FS1>-COL2 = 2.
*  DREF2 = DREF1.
*  ASSIGN DREF2->* TO <FS2> CASTING . "隐式强制类型转换:
*  WRITE / <FS2>.
**3 获取对象引用
*  GET REFERENCE OF <FS1>-COL2 INTO DREF2.
**4  接触数据引用
*  ASSIGN DREF2->* TO <FS2>.
*  WRITE / <FS2>.

 

内存传值

 

 

内存传值一(两报表之间)

https://www.cnblogs.com/mingdashu/p/5609503.html

 

  DATA:seltab TYPE TABLE OF rsparams,
        seltab_wa LIKE LINE OF seltab.

*"-------------审批代码
  seltab_wa-sign = \'I\'.
  seltab_wa-low = is_input-iv_zspnum1.
  seltab_wa-high = is_input-iv_zspnum2.
  seltab_wa-selname =  \'S_ZSPNUM\'.
  IF is_input-iv_zspnum2 IS NOT INITIAL.
    seltab_wa-option = \'BT\'.
    APPEND seltab_wa TO seltab.
  ELSE.
    IF is_input-iv_zspnum1 IS NOT INITIAL.
      seltab_wa-option = \'EQ\'.
      APPEND seltab_wa TO seltab.
    ENDIF.
  ENDIF.

  SUBMIT z29fie210201_copy
      WITH  SELECTION-TABLE seltab
      AND RETURN  .

 

FUNCTION Z_HR_KQPT_002.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_OBJID) TYPE  HROBJID
*"     VALUE(I_BEGDA) TYPE  SYDATUM
*"     VALUE(I_ENDDA) TYPE  SYDATUM
*"     VALUE(I_PERNR) TYPE  PERSNO OPTIONAL
*"  TABLES
*"      OT_KQMX STRUCTURE  ZHRR300_02
*"----------------------------------------------------------------------

  DATA:MEM_ID TYPE C.

  CONCATENATE \'ZHRR301-MX\' SY-DATUM INTO MEM_ID.
  IF I_PERNR NE 0.
    SUBMIT ZHRR301 USING SELECTION-SCREEN \'1000\'
              WITH P_OBJID = I_OBJID
              WITH P_BEGDA = I_BEGDA
              WITH P_ENDDA = I_ENDDA
              WITH PNPPERNR-LOW = I_PERNR

              WITH 02P02 = \'X\'
              WITH 01P02 = \' \'

              AND RETURN.
  ELSE.
    SUBMIT ZHRR301 USING SELECTION-SCREEN \'1000\'
      WITH P_OBJID = I_OBJID
      WITH P_BEGDA = I_BEGDA
      WITH P_ENDDA = I_ENDDA
*           WITH PNPPERNR-LOW = I_PERNR

      WITH 02P02 = \'X\'
      WITH 01P02 = \' \'

      AND RETURN.
  ENDIF.


  IMPORT  TABLE1  = OT_KQMX[] FROM MEMORY ID MEM_ID.
  IF I_PERNR IS NOT INITIAL.
    DELETE OT_KQMX WHERE PERNR NE I_PERNR.
  ENDIF.

ENDFUNCTION.

   IF 02P02 = \'X\'.
     CONCATENATE \'ZHRR301-MX\'  SY-DATUM INTO MEM_ID.
     FREE MEMORY ID MEM_ID.
     LOOP AT T_ITAB.
       MOVE-CORRESPONDING T_ITAB TO GT_ITAB1.
       APPEND GT_ITAB1.CLEAR GT_ITAB1.
     ENDLOOP.
     EXPORT  TABLE1   =  GT_ITAB1

      TO MEMORY ID MEM_ID.

   ELSE.
     PERFORM DISPLAY_ALV. "ALV 数据展示         后期加的 他的from在from里 T_ITAB
   ENDIF.
 
 

 

FUNCTION Z_HR_KQPT_002.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_OBJID) TYPE  HROBJID
*"     VALUE(I_BEGDA) TYPE  SYDATUM
*"     VALUE(I_ENDDA) TYPE  SYDATUM
*"     VALUE(I_PERNR) TYPE  PERSNO OPTIONAL
*"  TABLES
*"      OT_KQMX STRUCTURE  ZHRR300_02
*"----------------------------------------------------------------------

  DATA:MEM_ID TYPE C.

  CONCATENATE \'ZHRR301-MX\' SY-DATUM INTO MEM_ID.
  IF I_PERNR NE 0.
    SUBMIT ZHRR301 USING SELECTION-SCREEN \'1000\'
              WITH P_OBJID = I_OBJID
              WITH P_BEGDA = I_BEGDA
              WITH P_ENDDA = I_ENDDA
              WITH PNPPERNR-LOW = I_PERNR

              WITH 02P02 = \'X\'
              WITH 01P02 = \' \'

              AND RETURN.
  ELSE.
    SUBMIT ZHRR301 USING SELECTION-SCREEN \'1000\'
      WITH P_OBJID = I_OBJID
      WITH P_BEGDA = I_BEGDA
      WITH P_ENDDA = I_ENDDA
*           WITH PNPPERNR-LOW = I_PERNR

      WITH 02P02 = \'X\'
      WITH 01P02 = \' \'

      AND RETURN.
  ENDIF.


  IMPORT  TABLE1  = OT_KQMX[] FROM MEMORY ID MEM_ID.
  IF I_PERNR IS NOT INITIAL.
    DELETE OT_KQMX WHERE PERNR NE I_PERNR.
  ENDIF.


ENDFUNCTION.

内存传值二(全局变量)

 

 

FUNCTION-POOL ztestck.                      "MESSAGE-ID ..

* INCLUDE LZTESTCKD...                       " Local class definition

TYPES:BEGIN OF ty_matnr,
        matnr TYPE matnr,
        line  TYPE tlinet,
      END OF ty_matnr.

DATA:gwa TYPE ty_matnr.
DATA gv_value TYPE sy-uname..

DATA gt_itab TYPE TABLE OF pa0001.


FUNCTION z0001.
*"----------------------------------------------------------------------
*"*"本地接口:
*"----------------------------------------------------------------------
  FIELD-SYMBOLS:<fs1> TYPE matnr. "结构中字段
  FIELD-SYMBOLS:<fs> TYPE matnr. "结构中字段
  FIELD-SYMBOLS:<fs2> TYPE sy-uname."单个变量

  FIELD-SYMBOLS:<fs3> TYPE sy-uname.
  FIELD-SYMBOLS:<fs4> TYPE table.

  CALL FUNCTION \'Z_STE_TEST\'.

*结构中字段
  ASSIGN (\'(SAPLZTESTCK)GWA-matnr\')  TO  <fs1>   .
*内表
  ASSIGN (\'(SAPLZTESTCK)GWA-line\')  TO  <fs4>   .
*单个变量
  ASSIGN (\'(SAPLZTESTCK)Gv_value\')  TO  <fs3>   .
*内表
  ASSIGN (\'(SAPLZTESTCK)gt_itab\')  TO  <fs4>   .

ENDFUNCTION.

内存传值三(不展示ALV)

 1 DATA: ls_data TYPE REF TO data.
 2 *DATA:s_matnr TYPE RANGE OF matnr.
 3 *DATA:seltab    TYPE TABLE OF rsparams,
 4 *     seltab_wa LIKE LINE OF seltab.
 5 *seltab = VALUE #( FOR s IN s_matnr ( sign = \'I\'   low = s-low  high = \'\' selname =  \'S_MATNR\' option = \'EQ\' ) ).
 6 *seltab = VALUE #( BASE seltab ( sign = \'I\'   low = \'\'  high = \'\' selname =  \'P_MA\' option = \'EQ\' )
 7 *                            ( sign = \'I\'   low = \'\'  high = \'\' selname =  \'P_KA\'  option = \'EQ\' )
 8 *                            ( sign = \'I\'   low = sy-datum  high = \'\' selname =  \'P_DATE\'  option = \'EQ\' )
 9 *                            ( sign = \'I\'   low = \'\'  high = \'\' selname =  \'S_UPDATE\'  option = \'EQ\' ) ).
10 *
11 *SUBMIT zsdi004
12 *     WITH  SELECTION-TABLE seltab
13 *     AND RETURN.
14 FIELD-SYMBOLS: <lt_data> TYPE ANY TABLE.
15 CALL METHOD cl_salv_bs_runtime_info=>set  "可以让被调用的ALV不显示出来
16   EXPORTING
17     display  = \'\'
18     metadata = \'\' " 防止基本信息(布局,字段目录等)被取到内存中
19     data     = \'X\'. "迫使数据表导出到内存而不是显示报表
20 *SUBMIT z93_fico_r003 WITH p_vkorg = \'9399\' WITH p_werks = \'9900\' WITH s_ny-low = \'201606\' AND RETURN.
21 SUBMIT zsdr07 WITH s_zcxtgh-low = \'2019093000001\'   AND RETURN.
22 *GET_DATA() - 如果知道需要调用的ALV数据表的结构,可以使用这个方法。
23 *参数:
24 *    T_DATA - 输出参数数据表。
25 *    T_DATA_LINE - 如果执行的ALV有HEADER(可选)。
26 
27 TRY .
28     CALL METHOD cl_salv_bs_runtime_info=>get_data_ref
29       IMPORTING
30         r_data = ls_data
31 *       R_DATA_LINE =  "如果执行的ALV有HEADER的(可选)
32       .
33     ASSIGN ls_data->* TO <lt_data>.
34   CATCH cx_salv_bs_sc_runtime_info.
35     MESSAGE \'UNABLE TO RETRIEVE ALV DATA\' TYPE \'E\'.
36 ENDTRY.
37 cl_salv_bs_runtime_info=>clear_all( )."此方法清除在set()方法设置的标志。如果之后本程序还需要显示其他ALV 那么这个方法尤为重要。如果不清除设置,你的ALV就不会被显示出来
38 
39 DATA gt_zppt_b001_yg LIKE TABLE OF zppt_b001_yg WITH HEADER LINE.
40 FIELD-SYMBOLS:<af1> TYPE any  .
41 IF <lt_data> IS ASSIGNED.
42   LOOP AT <lt_data> ASSIGNING <af1>.
43     gt_zppt_b001_yg = CORRESPONDING #( <af1> ).
44     APPEND  gt_zppt_b001_yg.CLEAR gt_zppt_b001_yg.
45   ENDLOOP.
46 ENDIF.
View Code

增强

https://blog.csdn.net/huanglin6/article/details/81353974  隐式

https://blog.csdn.net/huanglin6/article/details/81353793   (BADI)

https://www.cnblogs.com/libihui422/tag/SAP%20BADI/

增强
找smod的,debug customer-function
找badi的,debug那个类
BTE的增强,DEBUG函数PC_FUNCTION_FIND,I_PROCS为处理序号,FIBF里可以根据此序号看到对应的处理函数

如果是屏幕增强,pbo或者pai的,找不到上述两个增强的时候,就到pai或pbo里写隐式
也可以先根据需求上网搜搜,比如销售订单的一些增强,不是smod的,也不是badi的,这个就靠经验了
SAP提供的增强的方式有点杂了,如果只有一两种就好了

 

 

 查增强代码

*&---------------------------------------------------------------------*
*& Report ZENHANCE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZENHANCE1.

*"----------------------------------------------------------------------
*DATA: ld_message TYPE string,
*      ld_message1 TYPE char20.
*DATA: ld_delivery_number TYPE vbeln_vl VALUE \'0080003371\'.
*DATA: ls_delivery_header TYPE likp.
*
*ld_message = |{ ld_delivery_number ALPHA = OUT }|.
*ld_message1 = |{ ld_delivery_number ALPHA = IN }|.
*WRITE: / ld_message,
*         ld_message1.

TABLES : tstc,     "SAP Transaction Codes(SAP 事务代码)
          tadir,    "Directory of Repository Objects(资源库对象的目录)
          modsapt,  "SAP Enhancements - Short Texts(SAP增强-短文件)
          sxs_attrt,"Exit: Definition side: Attributes, Text table
          modact,   "Modifications(修正)
          trdir,    "System table TRDIR(系统表 TRDIR)
          tfdir,    "Function Module(功能模块)
          enlfdir,  "Additional Attributes for Function Modules(功能模块的附加属性)
          tstct.    "Transaction Code Texts(事务代码文本)

DATA : jtab LIKE tadir OCCURS 0 WITH HEADER LINE. "SMOD
DATA : itab LIKE tadir OCCURS 0 WITH HEADER LINE. "SE18-BADI
DATA : ktab LIKE tadir OCCURS 0 WITH HEADER LINE. "Enhancement implementation-ENHO
DATA : ltab LIKE tadir OCCURS 0 WITH HEADER LINE. "Enhancement Spot-ENHS
DATA : mtab LIKE tadir OCCURS 0 WITH HEADER LINE. "Composite Enhancement implementation-ENHC
DATA : field1(30).
DATA : v_devclass LIKE tadir-devclass.
DATA : t_count LIKE sy-tfill.
DATA: bdcdata_wa  TYPE bdcdata,
       bdcdata_tab TYPE TABLE OF bdcdata.

DATA opt TYPE ctu_params.


SELECTION-SCREEN BEGIN OF BLOCK a01 WITH FRAME TITLE text-001.
SELECTION-SCREEN SKIP.
PARAMETERS : p_tcode LIKE tstc-tcode OBLIGATORY.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN END OF BLOCK a01.


START-OF-SELECTION.
  CLEAR: itab,jtab.
  REFRESH:itab,jtab.
  SELECT SINGLE * FROM tstc WHERE tcode EQ p_tcode.
  IF sy-subrc EQ 0.
    SELECT SINGLE * FROM tadir
       WHERE pgmid    = \'R3TR\'
         AND object   = \'PROG\'
         AND obj_name = tstc-pgmna.

    MOVE : tadir-devclass TO v_devclass.
    IF sy-subrc NE 0.
      SELECT SINGLE * FROM trdir
         WHERE name = tstc-pgmna.
      IF trdir-subc EQ \'F\'.
        SELECT SINGLE * FROM tfdir
          WHERE pname = tstc-pgmna.
        SELECT SINGLE * FROM enlfdir
          WHERE funcname = tfdir-funcname.
        SELECT SINGLE * FROM tadir
          WHERE pgmid    = \'R3TR\'
            AND object   = \'FUGR\'
            AND obj_name = enlfdir-area.
        MOVE : tadir-devclass TO v_devclass.
      ENDIF.
    ENDIF.

    SELECT * FROM tadir
      INTO TABLE jtab
      WHERE pgmid    = \'R3TR\'
        AND object   = \'SMOD\'
        AND devclass = v_devclass.
    SELECT * FROM tadir
      INTO TABLE itab
      WHERE pgmid    = \'R3TR\'
        AND object   = \'SXSD\'
        AND devclass = v_devclass.
    SELECT * FROM tadir
      INTO TABLE ktab
      WHERE pgmid    = \'R3TR\'
        AND object   = \'ENHO\'
        AND devclass = v_devclass.
    SELECT * FROM tadir
      INTO TABLE ltab
      WHERE pgmid    = \'R3TR\'
        AND object   = \'ENHS\'
        AND devclass = v_devclass.
    SELECT * FROM tadir
      INTO TABLE mtab
      WHERE pgmid    = \'R3TR\'
        AND object   = \'ENHC\'
        AND devclass = v_devclass.

    SELECT SINGLE * FROM tstct
      WHERE sprsl EQ sy-langu
        AND tcode EQ p_tcode.


    FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
    WRITE:/(12) \'事务代码 - \',
    13(20) p_tcode,
    34(10) \'功能 - \' ,
    45(50) tstct-ttext.
    SKIP.
    IF NOT jtab[] IS INITIAL.
      WRITE:/(117) sy-uline.
      FORMAT COLOR COL_HEADING INTENSIFIED ON.
      WRITE:/1 sy-vline,
\'Exit Name\',
sy-vline ,
\'Description\',
sy-vline.
      WRITE:/(117) sy-uline.

      LOOP AT jtab.
        CLEAR modsapt.
        SELECT SINGLE * FROM modsapt
        WHERE sprsl = sy-langu AND
        name = jtab-obj_name.
        FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
        WRITE:/1 sy-vline,
jtab-obj_name HOTSPOT ON,
sy-vline ,
modsapt-modtext,
sy-vline.
      ENDLOOP.
      WRITE:/(117) sy-uline.
      FORMAT COLOR COL_HEADING INTENSIFIED ON.
      WRITE:/1 sy-vline,
\'Badi Name(definition)\',
sy-vline ,
\'Description\',
sy-vline.
      WRITE:/(117) sy-uline.
      LOOP AT itab.
        CLEAR sxs_attrt.
        SELECT SINGLE * FROM sxs_attrt
        WHERE sprsl = sy-langu AND
        exit_name = itab-obj_name.
        FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
        WRITE:/1 sy-vline,
itab-obj_name HOTSPOT ON,
sy-vline ,
sxs_attrt-text,
sy-vline.
      ENDLOOP.

      WRITE:/(117) sy-uline.
      FORMAT COLOR COL_HEADING INTENSIFIED ON.
      WRITE:/1 sy-vline,
\'Enhancement Implementation\',
sy-vline ,
\'Description\',
sy-vline.
      WRITE:/(117) sy-uline.
      LOOP AT ktab.
        CLEAR sxs_attrt.
        SELECT SINGLE * FROM sxs_attrt
        WHERE sprsl = sy-langu AND
        exit_name = ktab-obj_name.
        FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
        WRITE:/1 sy-vline,
ktab-obj_name HOTSPOT ON,
sy-vline ,
sxs_attrt-text,
sy-vline.
      ENDLOOP.

      WRITE:/(117) sy-uline.
      FORMAT COLOR COL_HEADING INTENSIFIED ON.
      WRITE:/1 sy-vline,
\'Enhancement Spot\',
sy-vline ,
\'Description\',
sy-vline.
      WRITE:/(117) sy-uline.
      LOOP AT ltab.
        CLEAR sxs_attrt.
        SELECT SINGLE * FROM sxs_attrt
        WHERE sprsl = sy-langu AND
        exit_name = ltab-obj_name.
        FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
        WRITE:/1 sy-vline,
ltab-obj_name HOTSPOT ON,
sy-vline ,
sxs_attrt-text,
sy-vline.
      ENDLOOP.

      WRITE:/(117) sy-uline.
      FORMAT COLOR COL_HEADING INTENSIFIED ON.
      WRITE:/1 sy-vline,
\'Composite Enhancement Implementation\',
sy-vline ,
\'Description\',
sy-vline.
      WRITE:/(117) sy-uline.
      LOOP AT mtab.
        CLEAR sxs_attrt.
        SELECT SINGLE * FROM sxs_attrt
        WHERE sprsl = sy-langu AND
        exit_name = mtab-obj_name.
        FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
        WRITE:/1 sy-vline,
mtab-obj_name HOTSPOT ON,
sy-vline ,
sxs_attrt-text,
sy-vline.
      ENDLOOP.


      WRITE:/(117) sy-uline.
      CLEAR t_count.
      DESCRIBE TABLE jtab.
      t_count = sy-tfill.
      DESCRIBE TABLE itab.
      t_count = t_count + sy-tfill.
      DESCRIBE TABLE ktab.
      t_count = t_count + sy-tfill.
      DESCRIBE TABLE ltab.
      t_count = t_count + sy-tfill.
      DESCRIBE TABLE mtab.
      t_count = t_count + sy-tfill.

      SKIP.
      FORMAT COLOR COL_TOTAL INTENSIFIED ON.
      WRITE:/ \'用户出口数量:\' , t_count.
    ELSE.
      FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
      WRITE:/(95) \'此TCode没有用户出口!\'.
    ENDIF.
  ELSE.
    FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
    WRITE:/(95) \'事务代码不存在!\'.
  ENDIF.

AT LINE-SELECTION.
  GET CURSOR FIELD field1.
  IF field1(4) EQ \'JTAB\'.
    data:L_ck type SYST_LISEL.
    L_ck = sy-lisel+1(10).
    condense L_ck.
    SET PARAMETER ID \'MON\' FIELD L_ck.
    CALL TRANSACTION \'SMOD\' AND SKIP FIRST SCREEN.
  ELSEIF field1(4) EQ \'ITAB\'.
*    SET PARAMETER ID \'EXN\' FIELD sy-lisel+1(40).
*    CALL TRANSACTION \'SE18\' AND SKIP FIRST SCREEN.
    CLEAR bdcdata_wa.
    bdcdata_wa-program  = \'SAPLSEXO\'.
    bdcdata_wa-dynpro   = \'0100\'.
    bdcdata_wa-dynbegin = \'X\'.
    APPEND bdcdata_wa TO bdcdata_tab.

    CLEAR bdcdata_wa.
    bdcdata_wa-fnam = \'BDC_CURSOR\'.
    bdcdata_wa-fval = \'G_ENHSPOTNAME\'.
    APPEND bdcdata_wa TO bdcdata_tab.

    CLEAR bdcdata_wa.
    bdcdata_wa-fnam = \'G_IS_BADI\'.
    bdcdata_wa-fval = \'X\'.
    APPEND bdcdata_wa TO bdcdata_tab.

    CLEAR bdcdata_wa.
    bdcdata_wa-fnam = \'BDC_OKCODE\'.
    bdcdata_wa-fval = \'=ISSPOT\'.
    APPEND bdcdata_wa TO bdcdata_tab.

    CLEAR bdcdata_wa.
    bdcdata_wa-program  = \'SAPLSEXO\'.
    bdcdata_wa-dynpro   = \'0100\'.
    bdcdata_wa-dynbegin = \'X\'.
    APPEND bdcdata_wa TO bdcdata_tab.

    CLEAR bdcdata_wa.
    bdcdata_wa-fnam = \'BDC_CURSOR\'.
    bdcdata_wa-fval = \'G_BADINAME\'.
    APPEND bdcdata_wa TO bdcdata_tab.
    CLEAR bdcdata_wa.

    bdcdata_wa-fnam = \'G_BADINAME\'.
    bdcdata_wa-fval = sy-lisel+1(40).
    condense bdcdata_wa-fval NO-GAPS.
    APPEND bdcdata_wa TO bdcdata_tab.

    opt-dismode = \'E\'.
    opt-defsize = \'X\'.

    CALL TRANSACTION \'SE18\' USING bdcdata_tab OPTIONS FROM opt.
    REFRESH bdcdata_tab.
  ELSEIF field1(4) EQ \'KTAB\'.
*    SET PARAMETER ID \'IMN_BADI\' FIELD sy-lisel+1(40).
*    CALL TRANSACTION \'SE19\' AND SKIP FIRST SCREEN.
    CLEAR bdcdata_wa.
    bdcdata_wa-program  = \'SAPLENHANCEMENTS\'.
    bdcdata_wa-dynpro   = \'0100\'.
    bdcdata_wa-dynbegin = \'X\'.
    APPEND bdcdata_wa TO bdcdata_tab.

    CLEAR bdcdata_wa.
    bdcdata_wa-fnam = \'BDC_CURSOR\'.
    bdcdata_wa-fval = \'RSEUX-CXH_VALUE\'.
    APPEND bdcdata_wa TO bdcdata_tab.

    CLEAR bdcdata_wa.
    bdcdata_wa-fnam = \'RSEUX-CXH\'.
    bdcdata_wa-fval = \'X\'.
    APPEND bdcdata_wa TO bdcdata_tab.

    CLEAR bdcdata_wa.
    bdcdata_wa-fnam = \'RSEUX-CXH_VALUE\'.
    bdcdata_wa-fval = sy-lisel+1(40).
        condense bdcdata_wa-fval NO-GAPS.
    APPEND bdcdata_wa TO bdcdata_tab.

*    CLEAR bdcdata_wa.
*    bdcdata_wa-fnam = \'BDC_OKCODE\'.
*    bdcdata_wa-fval = \'/00\'.
*    APPEND bdcdata_wa TO bdcdata_tab.

    opt-dismode = \'E\'.
    opt-defsize = \'X\'.

    CALL TRANSACTION \'SE20\' USING bdcdata_tab OPTIONS FROM opt.
    REFRESH bdcdata_tab.
  ELSEIF field1(4) EQ \'LTAB\'.
*    SET PARAMETER ID \'ENHSPOT\' FIELD sy-lisel+1(40).
*    CALL TRANSACTION \'SE18\' AND SKIP FIRST SCREEN.
    CLEAR bdcdata_wa.
    bdcdata_wa-program  = \'SAPLENHANCEMENTS\'.
    bdcdata_wa-dynpro   = \'0100\'.
    bdcdata_wa-dynbegin = \'X\'.
    APPEND bdcdata_wa TO bdcdata_tab.

    CLEAR bdcdata_wa.
    bdcdata_wa-fnam = \'BDC_CURSOR\'.
    bdcdata_wa-fval = \'RSEUX-C_XS_VALUE\'.
    APPEND bdcdata_wa TO bdcdata_tab.

    CLEAR bdcdata_wa.
    bdcdata_wa-fnam = \'RSEUX-C_XS\'.
    bdcdata_wa-fval = \'X\'.
    APPEND bdcdata_wa TO bdcdata_tab.

    CLEAR bdcdata_wa.
    bdcdata_wa-fnam = \'RSEUX-C_XS_VALUE\'.
    bdcdata_wa-fval = sy-lisel+1(40).
        condense bdcdata_wa-fval NO-GAPS.
    APPEND bdcdata_wa TO bdcdata_tab.

*    CLEAR bdcdata_wa.
*    bdcdata_wa-fnam = \'BDC_OKCODE\'.
*    bdcdata_wa-fval = \'/00\'.
*    APPEND bdcdata_wa TO bdcdata_tab.

    opt-dismode = \'E\'.
    opt-defsize = \'X\'.

    CALL TRANSACTION \'SE20\' USING bdcdata_tab OPTIONS FROM opt.
    REFRESH bdcdata_tab.
  ELSEIF field1(4) EQ \'MTAB\'.
*    SET PARAMETER ID \'IMN_BADI\' FIELD sy-lisel+1(40).
    CLEAR bdcdata_wa.
    bdcdata_wa-program  = \'SAPLENHANCEMENTS\'.
    bdcdata_wa-dynpro   = \'0100\'.
    bdcdata_wa-dynbegin = \'X\'.
    APPEND bdcdata_wa TO bdcdata_tab.

    CLEAR bdcdata_wa.
    bdcdata_wa-fnam = \'BDC_CURSOR\'.
    bdcdata_wa-fval = \'RSEUX-CXT_VALUE\'.
    APPEND bdcdata_wa TO bdcdata_tab.

    CLEAR bdcdata_wa.
    bdcdata_wa-fnam = \'RSEUX-CXT\'.
    bdcdata_wa-fval = \'X\'.
    APPEND bdcdata_wa TO bdcdata_tab.

    CLEAR bdcdata_wa.
    bdcdata_wa-fnam = \'RSEUX-CXT_VALUE\'.
    bdcdata_wa-fval = sy-lisel+1(40).
        condense bdcdata_wa-fval NO-GAPS.
    APPEND bdcdata_wa TO bdcdata_tab.

    CLEAR bdcdata_wa.
    bdcdata_wa-fnam = \'BDC_OKCODE\'.
    bdcdata_wa-fval = \'/00\'.
    APPEND bdcdata_wa TO bdcdata_tab.

    opt-dismode = \'E\'.
    opt-defsize = \'X\'.

    CALL TRANSACTION \'SE20\' USING bdcdata_tab OPTIONS FROM opt.
    REFRESH bdcdata_tab.
  ENDIF.
View Code

 

分页

IV_PAGE    TYPE    SDB_OMS_PAGE_NUMMER                             页号
IV_PAGE_SIZE    TYPE    UPX_PAGE_SIZE                             UPX 分页大小
  DATA lv_page TYPE p.                
  DATA lv_page_size TYPE p.                
  DATA lv_begin TYPE p.                
  DATA lv_end TYPE p.                
                
                
  lv_page = iv_page.                
  lv_page_size = iv_page_size.                
  IF lv_page IS NOT INITIAL AND lv_page_size IS NOT INITIAL.                
    lv_begin = ( lv_page - 1 ) * lv_page_size .                
    lv_end = lv_page * lv_page_size + 1.                
                
    IF lv_begin IS INITIAL.                
      DELETE ot_show FROM lv_end.                
    ELSE.                
      DELETE ot_show FROM lv_end.                
      DELETE ot_show FROM 1 TO lv_begin.                
    ENDIF.                
  ENDIF.                

 

"分页取数测试

WRITE: 10 \'PAGE\' CENTERED, 20 \'LINES\' CENTERED,

30 \'RESULT\' CENTERED, /.
ULINE.

PERFORM get_data USING 0 0.
PERFORM get_data USING 1 2.
PERFORM get_data USING 2 2.
PERFORM get_data USING 3 2.
PERFORM get_data USING 4 2.
PERFORM get_data USING 5 2.
PERFORM get_data USING 6 2.


FORM get_data  USING    iv_page TYPE i
                        iv_lines  TYPE i.
  DATA(lv_offset) = ( iv_page - 1 ) * iv_lines.

  SELECT
    vbeln
    FROM likp
    WHERE vbeln LIKE \'%03\'
    ORDER BY vbeln
    INTO TABLE @DATA(lt_data)
    OFFSET @lv_offset
    UP TO @iv_lines ROWS.
  LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<ls_data>).
    WRITE:  iv_page UNDER \'PAGE\' LEFT-JUSTIFIED,
            iv_lines UNDER \'LINES\' LEFT-JUSTIFIED ,
            <ls_data>-vbeln UNDER \'RESULT\' LEFT-JUSTIFIED, /.
  ENDLOOP.
  ULINE.
ENDFORM.

 


权限对象

https://blog.csdn.net/candy_mmyy/article/details/54906571

各模块 BAPI

https://www.cnblogs.com/mingdashu/p/5627511.html

踢人

  SUBMIT ZHFIUCPL0 USING SELECTION-SCREEN \'1000\'
   WITH PNPPERNR-LOW = PERNR
   WITH KILL = \'X\'
   WITH SHOW = \' \'
   AND RETURN.


后台设置

 

一、se38 进入程序首先设置变式,如下图:

 

 

 

需要注意的是对于动态变式的设置,如下

 

在下面这里可以控制变式运行时的时间周期范围:

 

然后点击 即完成变式的保存。

二、  运行事务代码SM36进入后台设置界面

 

三、先给后台作业命名,然后选择“开始条件”进入后台运行条件设置

 

四、设置后台出发时间和频率,然后点击保存

 

然后保存即可。

五、进入“步骤”选择需运行的程序以及对应的变式,点击保存进入步骤清单总览进入审核,如果问题可进行修改,确认无误后点击返回按钮,再保存即可,点击检查可以自动弹出第一步保存的变式

 

返回后点击保存即完成后台的设置了。

六、SM36创建成功后,通过SM37可以对所创建的后台JOB进行监控和修改

七、

批导

*&---------------------------------------------------------------------*
*& Report  ZR_HR_BDC_1000
*&
*&---------------------------------------------------------------------*
*&   sunyan
*&   20150428
*&---------------------------------------------------------------------*

REPORT ZR_HR_BDC_1000.

**********************************************************************   导入数据声明
* UpLoad Data Record.
TYPES: BEGIN OF  tab_str,
        OTYPE(002),
        PERNR(012),
        BEGDA(008),
        ENDDA(008),
        SHORT(012),
        STEXT(040),

      END OF tab_str.

* Down Load Data Format.  字段描述
DATA : BEGIN OF IT_DOWN OCCURS 0,
        OTYPE(020),
        PERNR(020),
        BEGDA(020),
        ENDDA(020),
        SHORT(020),
        STEXT(040),

        END OF IT_DOWN.
**********************************************************************


DATA: record TYPE tab_str OCCURS 0 WITH HEADER LINE.
DATA: BEGIN OF err_table OCCURS 0.
        INCLUDE TYPE tab_str.
DATA: msg(100) TYPE c.
DATA: END OF err_table.
DATA : v_line  TYPE i.            "Record number
DATA: g_line TYPE i .


INCLUDE ZR_Z06PMR_0001.


**********************************************************************    数据地址
INITIALIZATION.
  pa_file = \'D:\1000.txt\'.        "数据存放位置
  pa_flog = \'D:\1000_err.txt\'.    "错误日志存放位置
*  b_write = \'X\'.         "是否屏幕显示结果信息, X 为显示
**********************************************************************


AT SELECTION-SCREEN.
  CASE SSCRFIELDS-UCOMM.
    WHEN \'FC01\'.  "template down
      PERFORM EXCELL_DOWNLOAD.          "下载数据模版
      p_fun1 = \'X\'.
  ENDCASE.

*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_file.
*----------------------------------------------------------------------*
  PERFORM get_filename CHANGING pa_file.

*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_flog.
*----------------------------------------------------------------------*
  PERFORM get_filename CHANGING pa_flog.

START-OF-SELECTION.
  PERFORM upload_data USING pa_file.  "upload PC file to itab
  PERFORM insert_data.
  PERFORM write_file TABLES err_table
                     USING  pa_flog.  "Write file-data
  """"附加ALV显示
  PERFORM show_alv .

*  LOOP AT err_table.
*    WRITE: / err_table.
*  ENDLOOP.
*
*  DESCRIBE TABLE record LINES v_line.
*  WRITE:/ \'Read data: \', v_line.
*  DESCRIBE TABLE err_table LINES v_line.
*  WRITE:/ \'Error data: \', v_line.
*
*  WRITE:/\'Finish.\'.       " 显示错误数据记录


*&---------------------------------------------------------------------*
*&      Form  insert_data
*&---------------------------------------------------------------------*
*       " 写入数据主函数,更改屏幕录入字段
*----------------------------------------------------------------------*
FORM insert_data .

  CLEAR v_line.
  DESCRIBE TABLE record LINES v_line.
  IF v_line = 0.
    EXIT.
  ENDIF.


  LOOP AT record.

   perform bdc_dynpro      using \'SAPMH5A0\' \'5000\'.
    perform bdc_field       using \'BDC_OKCODE\'
                                  \'/00\'.
    perform bdc_field       using \'PPHDR-PLVAR\'
                                  \'01\'.
    perform bdc_field       using \'PPHDR-OTYPE\'
                                  record-OTYPE.

    perform bdc_field       using \'PM0D1-SEARK\'
                                  record-PERNR.
    perform bdc_field       using \'BDC_CURSOR\'
                                  \'PPHDR-BEGDA\'.
    perform bdc_field       using \'PM0D1-TIMR6\'
                                  \'X\'.
    perform bdc_field       using \'PPHDR-BEGDA\'
                                  record-BEGDA.
    perform bdc_field       using \'PPHDR-ENDDA\'
                                  record-ENDDA.



    perform bdc_dynpro      using \'SAPMH5A0\' \'5000\'.
    perform bdc_field       using \'BDC_OKCODE\'
                                  \'=INSE\'.
    perform bdc_field       using \'PPHDR-PLVAR\'
                                  \'01\'.
    perform bdc_field       using \'PPHDR-OTYPE\'
                                  record-OTYPE.

    perform bdc_field       using \'PM0D1-SEARK\'
                                  record-PERNR.
    perform bdc_field       using \'BDC_CURSOR\'
                                  \'PPHDR-BEGDA\'.
    perform bdc_field       using \'PM0D1-TIMR6\'
                                  \'X\'.
    perform bdc_field       using \'PPHDR-BEGDA\'
                                  record-BEGDA.
    perform bdc_field       using \'PPHDR-ENDDA\'
                                  record-ENDDA.
    perform bdc_field       using \'MARKFELD(01)\'
                                  \'X\'.

    perform bdc_dynpro      using \'MP100000\' \'2000\'.
    perform bdc_field       using \'BDC_CURSOR\'
                                  \'P1000-STEXT\'.
    perform bdc_field       using \'BDC_OKCODE\'
                                  \'=UPD\'.
    perform bdc_field       using \'P1000-BEGDA\'
                                  record-BEGDA.
    perform bdc_field       using \'P1000-ENDDA\'
                                  record-ENDDA.
    perform bdc_field       using \'P1000-SHORT\'
                                  record-SHORT.
    perform bdc_field       using \'P1000-STEXT\'
                                  record-STEXT.



    PERFORM bdc_transaction USING \'PP01\'
                                CHANGING record.

    g_line = g_line + 1.
    PERFORM progress_indicator USING g_line.

    PERFORM err_message.
*    IF b_write = \'X\'.
*      WRITE : / record  COLOR 1.
*      SKIP 1.
*    ENDIF.
  ENDLOOP.

ENDFORM.                    " insert_data


*&---------------------------------------------------------------------*
*&      Form  progress_indicator
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_SY_TABIX text
*----------------------------------------------------------------------*
FORM progress_indicator  USING    p_sy_tabix.

  DATA: s_string      TYPE string,
        pernt(6)      TYPE p DECIMALS 2,
        percc(6)      TYPE c,
        l_idx(6)      TYPE C.
  v_line = v_line + 1.
  pernt = p_sy_tabix / v_line  * 100.
  percc+0(5) = pernt.
  percc+5(1) = \'%\'.
  l_idx = p_sy_tabix.
  CONCATENATE \'正在读取第\' l_idx \'笔数据.......\' INTO s_string SEPARATED BY space.
  CONDENSE s_string.

*  move record to s_string.
  CONDENSE s_string.
  CALL FUNCTION \'PROGRESS_INDICATOR\'
    EXPORTING
      i_text               = \'&1 &3 &4  &2 \'
      i_msgv1              = percc
      i_msgv2              = s_string
*     i_msgv3              = record-massg_006
*     i_msgv4              = record-plans_008
      i_processed          = v_line
      i_total              = p_sy_tabix
      i_output_immediately = \'X\'.


ENDFORM.                    " progress_indicator


*&---------------------------------------------------------------------*
*&      Form  EXCELL_DOWN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM EXCELL_DOWNLOAD.
  CLEAR: IT_DOWN, IT_DOWN[].
  MOVE:     \'对象类型\'          TO IT_DOWN-OTYPE,       "将字段描述赋值
            \'对象编号\'          TO IT_DOWN-PERNR,
            \'开始日期\'          TO IT_DOWN-BEGDA,
            \'结束日期\'          TO IT_DOWN-ENDDA,
            \'对象缩写\'          TO IT_DOWN-SHORT,
            \'对象名称\'          TO IT_DOWN-STEXT.

  APPEND IT_DOWN.

  PERFORM EXCELL_DOWN TABLES IT_DOWN.

ENDFORM.                    "EXCELL_DOWNLOAD
INCLUDE ZR_Z06PMR_0001.

*&---------------------------------------------------------------------*
*&  包含                ZR_HR_BDC_DATA
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&  Include           ZHRBDC_DATA
*&
*&  BDC 数据及函数
*&
*&  SUNYAN
*&---------------------------------------------------------------------*



TYPE-POOLS icon.
TABLES: sscrfields.
TYPE-POOLS : slis.
DATA: afield    TYPE slis_fieldcat_alv.
DATA: fieldcat  TYPE slis_t_fieldcat_alv.
DATA: gs_layout TYPE slis_layout_alv.
DATA: g_repid   TYPE sy-repid.
DATA: i_layout  TYPE slis_layout_alv.
DATA: gridlsl   TYPE lvc_s_glay.
DATA: gv_result TYPE char1 .

DATA:BEGIN OF it_alv OCCURS 0,
  status(8),
  pernr TYPE persno ,
  msgtp TYPE bdc_mart ,
  text(100) ,
END OF it_alv.
DATA:time_e TYPE i VALUE \'0\'.
DATA:time_s TYPE i VALUE \'0\'.
DATA:time_w TYPE i VALUE \'0\'.
DATA:time_e_txt TYPE string.
DATA:time_s_txt TYPE string.
DATA:time_w_txt TYPE string.


DATA: p_fun1 TYPE c.
DATA: b_write TYPE c VALUE \'X\'. "程序运行结果输出标记

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS: p_typ TYPE ctu_mode OBLIGATORY DEFAULT \'N\',
            p_upd TYPE ctu_update OBLIGATORY DEFAULT \'L\'.
SELECTION-SCREEN END OF BLOCK b1.

PARAMETERS: pa_file LIKE rlgrap-filename OBLIGATORY  .

PARAMETERS : pa_flog LIKE rlgrap-filename .


SELECTION-SCREEN: FUNCTION KEY 1.

INITIALIZATION.
  sscrfields-functxt_01 = \'请下载批导模板\'.

*----------------------------------------------------------------------*
*   data definition
*----------------------------------------------------------------------*
*       Batchinputdata of single transaction
  DATA:   bdcdata LIKE bdcdata    OCCURS 0 WITH HEADER LINE.
*       messages of call transaction
  DATA:   messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
*       message texts
  TABLES: t100.


*&---------------------------------------------------------------------*
*&      Form  BDC_TRANSACTION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->TCODE      text
*----------------------------------------------------------------------*
FORM bdc_transaction USING tcode CHANGING p_record TYPE tab_str.
  DATA: l_mstring(480).
  DATA: l_subrc LIKE sy-subrc.

* call transaction using
  REFRESH messtab.
  CALL TRANSACTION tcode USING bdcdata
                   MODE   p_typ
                   UPDATE p_upd
                   MESSAGES INTO messtab.
  l_subrc = sy-subrc.
  READ TABLE messtab WITH KEY msgtyp = \'E\'.
  IF sy-subrc EQ 0.
    it_alv-pernr = p_record-pernr .
    it_alv-msgtp = \'E\' .
    it_alv-status = \'@0A@\'.

    SELECT SINGLE * FROM t100 WHERE sprsl = messtab-msgspra
                              AND   arbgb = messtab-msgid
                              AND   msgnr = messtab-msgnr.
    IF sy-subrc = 0.
      l_mstring = t100-text.
      IF l_mstring CS \'&1\'.
        REPLACE \'&1\' WITH messtab-msgv1 INTO l_mstring.
        REPLACE \'&2\' WITH messtab-msgv2 INTO l_mstring.
        REPLACE \'&3\' WITH messtab-msgv3 INTO l_mstring.
        REPLACE \'&4\' WITH messtab-msgv4 INTO l_mstring.
      ELSE.
        REPLACE \'&\' WITH messtab-msgv1 INTO l_mstring.
        REPLACE \'&\' WITH messtab-msgv2 INTO l_mstring.
        REPLACE \'&\' WITH messtab-msgv3 INTO l_mstring.
        REPLACE \'&\' WITH messtab-msgv4 INTO l_mstring.
      ENDIF.
      CONDENSE l_mstring.
      it_alv-text = l_mstring .
    ELSE.
      it_alv-text = \'记录创建失败,请检查数据\'.
    ENDIF.

    APPEND it_alv .
    CLEAR it_alv .
  ELSE .
    it_alv-pernr = p_record-pernr .
    it_alv-msgtp = \'S\' .
    it_alv-status = \'@08@\'.
    it_alv-text = \'记录已创建\'.
    APPEND it_alv .
    CLEAR it_alv .
  ENDIF.

  REFRESH bdcdata.

ENDFORM.                    "BDC_TRANSACTION

*----------------------------------------------------------------------*
*        Start new screen                                              *
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
  CLEAR bdcdata.
  bdcdata-program  = program.
  bdcdata-dynpro   = dynpro.
  bdcdata-dynbegin = \'X\'.
  APPEND bdcdata.
ENDFORM.                    "BDC_DYNPRO

*----------------------------------------------------------------------*
*        Insert field                                                  *
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
  CLEAR bdcdata.
  bdcdata-fnam = fnam.
  bdcdata-fval = fval.
  APPEND bdcdata.
ENDFORM.                    "BDC_FIELD






*&---------------------------------------------------------------------*
*&      Form  upload_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_PA_FILE  text
*----------------------------------------------------------------------*
FORM upload_data USING p_pa_file.
  DATA: l_filename TYPE string,
        l_filelength        TYPE i.
  DATA : has_field_separator.

  has_field_separator  = \'#\'.
  l_filename =  p_pa_file.
  CLEAR l_filelength.

  CLEAR : record[].
  CALL METHOD cl_gui_frontend_services=>gui_upload  "UNI
  EXPORTING
    filename                = l_filename
    filetype                = \'ASC\'
    has_field_separator     = has_field_separator
  IMPORTING
    filelength              = l_filelength
  CHANGING
*   without header line
    data_tab                = record[]
  EXCEPTIONS
    file_open_error         = 1
    file_read_error         = 2
    no_batch                = 3
    gui_refuse_filetransfer = 4
    invalid_type            = 5
    no_authority            = 6
    unknown_error           = 7
    bad_data_format         = 8
    header_not_allowed      = 9
    separator_not_allowed   = 10
    header_too_long         = 11
    unknown_dp_error        = 12
    access_denied           = 13
    OTHERS                  = 14.

  IF sy-subrc = 5.
    EXIT.
  ENDIF.
  DELETE record[] WHERE pernr IS INITIAL .
  IF sy-subrc NE 0.
    MESSAGE s000(zhr01) WITH \'file upload error\'.
*    RAISE UPLOAD_ERROR.            "dump ??
  ENDIF.
*&---------------------------------------------------------------------*
*  其他方法
*  DATA: l_filename TYPE string,
*      l_filelength        TYPE i.
*  DATA : has_field_separator.
*
*  has_field_separator  = \'#\'.
*  l_filename =  p_pa_file.
*  CLEAR l_filelength.
*
*  CLEAR : record[].
******************
*  DATA: lt_raw TYPE truxs_t_text_data.
*  DATA:  p_file TYPE rlgrap-filename.
*  p_file  = l_filename.
*  CALL FUNCTION \'TEXT_CONVERT_XLS_TO_SAP\'
*    EXPORTING
**     I_LINE_HEADER        = \'X\'
*      i_tab_raw_data       = lt_raw " WORK TABLE
*      i_filename           = p_file  "
*    TABLES
*      i_tab_converted_data = record "ACTUAL DATA
*    EXCEPTIONS
*      conversion_failed    = 1
*      OTHERS               = 2.
*  IF sy-subrc = 0.
**模板前五行。
*    DELETE record INDEX 1.
**    DELETE it_even INDEX 1.
**    DELETE it_even INDEX 1.
**    DELETE it_even INDEX 1.
**    DELETE it_even INDEX 1.
*  ELSEIF sy-subrc <> 0.
*    MESSAGE \'导入数据为空。\' TYPE \'I\' DISPLAY LIKE \'E\'.
*    LEAVE LIST-PROCESSING.
*  ENDIF.

*&---------------------------------------------------------------------*
ENDFORM.                    "upload_data

*&---------------------------------------------------------------------*
*&      Form  err_message
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM err_message .
  DATA l_mstring(480) TYPE c.

  LOOP AT messtab WHERE msgtyp = \'E\'.
    MOVE record TO err_table.
    SELECT SINGLE * FROM t100 WHERE sprsl = messtab-msgspra
                              AND   arbgb = messtab-msgid
                              AND   msgnr = messtab-msgnr.
    IF sy-subrc = 0.
      l_mstring = t100-text.
      IF l_mstring CS \'&1\'.
        REPLACE \'&1\' WITH messtab-msgv1 INTO l_mstring.
        REPLACE \'&2\' WITH messtab-msgv2 INTO l_mstring.
        REPLACE \'&3\' WITH messtab-msgv3 INTO l_mstring.
        REPLACE \'&4\' WITH messtab-msgv4 INTO l_mstring.
      ELSE.
        REPLACE \'&\' WITH messtab-msgv1 INTO l_mstring.
        REPLACE \'&\' WITH messtab-msgv2 INTO l_mstring.
        REPLACE \'&\' WITH messtab-msgv3 INTO l_mstring.
        REPLACE \'&\' WITH messtab-msgv4 INTO l_mstring.
      ENDIF.
      CONDENSE l_mstring.
      SHIFT l_mstring RIGHT BY 4 PLACES.
      MOVE l_mstring TO err_table-msg.
      APPEND err_table.
    ENDIF.
  ENDLOOP.

ENDFORM.                    " err_message
*&---------------------------------------------------------------------*
*&      Form  get_filename
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_PA_FNAME text
*----------------------------------------------------------------------*
FORM get_filename  CHANGING p_pa_fname.

* data definitions
  DATA: l_initial_directory TYPE string,
        l_filename          TYPE string,
        l_path              TYPE string,
        l_fullpath          TYPE string,
        l_rc                TYPE sy-subrc,
        l_filetable         TYPE filetable,
        l_filelength        TYPE i.

  l_filename = p_pa_fname.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      default_filename        = l_filename
      initial_directory       = l_initial_directory
    CHANGING
      file_table              = l_filetable
      rc                      = l_rc
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4.

  IF sy-subrc NE 0 OR l_rc LT 0.
    RAISE upload_error.
  ELSE.
    IF l_rc = 1.
      READ TABLE l_filetable INTO l_fullpath INDEX 1.
      p_pa_fname = l_fullpath.
    ELSE.
      EXIT.
    ENDIF.
  ENDIF.

ENDFORM.                    " get_filename

*&---------------------------------------------------------------------*
*&      Form  write_file
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_DATA_TAB text
*      -->P_FNAME    text
*----------------------------------------------------------------------*
FORM write_file  TABLES   p_data_tab
                 USING    p_fname LIKE rlgrap-filename.
  CLEAR v_line.
  DESCRIBE TABLE p_data_tab LINES v_line.
  IF v_line = 0.
    EXIT.
  ENDIF.

  CALL FUNCTION \'WS_DOWNLOAD\'
    EXPORTING
      filename                = p_fname
      filetype                = \'ASC\'
    TABLES
      data_tab                = p_data_tab
    EXCEPTIONS
      file_open_error         = 1
      file_write_error        = 2
      invalid_filesize        = 3
      invalid_type            = 4
      no_batch                = 5
      unknown_error           = 6
      invalid_table_width     = 7
      gui_refuse_filetransfer = 8
      customer_error          = 9
      no_authority            = 10
      OTHERS                  = 11.

  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.                    "WRITE_FILE


*&---------------------------------------------------------------------*
*&      Form  EXCELL_DOWN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->IT_DOWN    text
*----------------------------------------------------------------------*
FORM excell_down TABLES it_down.

  DATA: l_canc,
        default_filename LIKE  rlgrap-filename,
        actual_filename LIKE  rlgrap-filename.

  CALL FUNCTION \'DOWNLOAD\'
    EXPORTING
      filename           = \'D:\HR.XLS\'
      filetype           = \'DAT\'
      filetype_no_change = \'X\'
      filetype_no_show   = \'X\'
    IMPORTING
      act_filename       = actual_filename
      cancel             = l_canc
    TABLES
      data_tab           = it_down.

  IF sy-subrc EQ 0.
    IF l_canc EQ \'X\'.
      MESSAGE s016(pg) WITH \'DOWNLOADING CANCELED\'.
    ELSE.
      MESSAGE s016(pg) WITH \'SUCCESSFUL DOWNLOADING\'.
    ENDIF.
  ELSE.
    MESSAGE s016(pg) WITH \'ERROR WHILE DOWNLOADING\'.
  ENDIF.

*&---------------------------------------------------------------------*
*  其他方法
*  DATA: l_canc,
*        default_filename LIKE  rlgrap-filename,
*        actual_filename LIKE  rlgrap-filename.
*
*  DATA:lv_path      TYPE  string,
*       lv_filename  TYPE string,
*       lv_destination LIKE rlgrap-filename,
*       lv_key TYPE wwwdatatab,
*       lv_fullpath  TYPE string,
*       lv_rc TYPE sy-subrc.
*  DATA: lc_objid TYPE wwwdata-objid.
*  lv_filename = actual_filename.
*  lc_objid = \'Z06PM0001_WEBNAME\'.     “二进制
*
*  call method cl_gui_frontend_services=>file_save_dialog
*    exporting
*      default_extension    = \'XLS\'
*      default_file_name    = \'WEB用户批量导入模板.XLS\'
*      file_filter          = \'*\'
*      initial_directory    = \'C:\\'
*    changing
*      filename             = lv_filename
*      path                 = lv_path
*      fullpath             = lv_fullpath
*    exceptions
*      cntl_error           = 1
*      error_no_gui         = 2
*      not_supported_by_gui = 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.
*
*  IF lv_fullpath IS NOT INITIAL.
*    lv_destination = lv_fullpath.
*    SELECT SINGLE relid objid FROM wwwdata
*      INTO CORRESPONDING FIELDS OF lv_key
*    WHERE relid = \'MI\'
*      AND objid = lc_objid
*      AND srtf2 = 0.
*    IF sy-subrc = 0.
*      CALL FUNCTION \'DOWNLOAD_WEB_OBJECT\'
*        EXPORTING
*          key         = lv_key
*          destination = lv_destination
*        IMPORTING
*          rc          = lv_rc.
*      IF lv_rc <> 0.
*        MESSAGE \'模版,下载失败\' TYPE \'S\' DISPLAY LIKE \'E\'.
*      ENDIF.
*    ELSE.
*      MESSAGE \'无数据下载\' TYPE \'S\' DISPLAY LIKE \'E\'.
*    ENDIF.
*  ENDIF.
*&---------------------------------------------------------------------*
ENDFORM.                    " EXCELL_DOWN
*&---------------------------------------------------------------------*
*&      Form  SHOW_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM show_alv .
  PERFORM layout_build.
  PERFORM fieldcat_init USING fieldcat[].
  PERFORM display_alv.
ENDFORM.                    " SHOW_ALV
*&---------------------------------------------------------------------*
*&      Form  layout_build
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM layout_build .
* i_layout-box_fieldname        = \'FLAG\'.
  i_layout-colwidth_optimize    = \'X\'.     "优化列宽选项是否设置
  i_layout-zebra                = \'X\'.
  i_layout-detail_initial_lines = \'X\'.
  i_layout-no_vline             = \'X\'.     " layout_build
*  i_layout-lights_fieldname     = \'EXCEPTION\'.
*  i_layout-coltab_fieldname     = \'IT_CELL\'.
*  i_layout-info_fieldname       = \'COLOR\'.
ENDFORM.                    " LAYOUT_BUILD
*&---------------------------------------------------------------------*
*&      Form  FIELDCAT_INIT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_FIELDCAT[]  text
*----------------------------------------------------------------------*
FORM fieldcat_init  USING   u_er_fieldcat TYPE slis_t_fieldcat_alv.
  DATA: afieldcat TYPE slis_fieldcat_alv,
          pos TYPE i.
  CLEAR pos.
  DEFINE d_get_field.
    pos = pos + 1.
    clear afieldcat.
    afieldcat-col_pos  = pos.
    afieldcat-fieldname  = &1.
    afieldcat-seltext_l = &2.
    afieldcat-key = &3.
*    if &1 eq \'RLGPRO\'.
*      afieldcat-ref_tabname = \'ZDUMPK\'.
*      afieldcat-ref_fieldname = \'LGPRO\'.
*    endif.
    append afieldcat to u_er_fieldcat.
  END-OF-DEFINITION.
*  d_get_field  \'EXCEPTION\'        \' 判断信息\'  \'\'  .
  d_get_field  \'STATUS\'           \' 状态\'  \'\'  .
  d_get_field  \'PERNR\'         \'标识ID\'  \'\'  .
*  d_get_field  \'SUBTY\'         \' 子信息类型\'  \'\'  .
*  d_get_field  \'BEGDA\'          \' 开始时间\'  \'\'  .
*  d_get_field  \'ENDDA\'           \' 结束时间\'  \'\'  .
*  d_get_field  \'USRID\'           \' 通讯信息\'  \'\'  .
  d_get_field  \'TEXT\'           \' 批导情况\'  \'\'  .

ENDFORM.                    " FIELDCAT_INIT
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM display_alv .
  DATA:BEGIN OF itab1 OCCURS 0.
*  DATA:exception(1).
  DATA:status(8).
  DATA:msgtp TYPE bdc_mart.
  DATA:text(100).
          INCLUDE STRUCTURE itab.
  DATA:END OF itab1.
  LOOP AT it_alv.
    IF it_alv-msgtp = \'E\'.
      time_e = time_e + 1.
    ELSEIF it_alv-msgtp = \'S\'.
      time_s = time_s + 1  .
    ENDIF.
  ENDLOOP.
*
  time_e_txt = time_e.
  time_s_txt = time_s.

  CALL FUNCTION \'REUSE_ALV_GRID_DISPLAY\'
    EXPORTING
      i_callback_program          = sy-repid
      i_grid_settings             = gridlsl
      it_fieldcat                 = fieldcat
      is_layout                   = i_layout
      i_callback_html_top_of_page = \'HTML_TOP_OF_PAGE\'    " 调用ALV表头显示
      i_html_height_top           = 15             " 设置抬头宽度
    TABLES
      t_outtab                    = it_alv.
ENDFORM.                    " DISPLAY_ALV


*&---------------------------------------------------------------------*
*&      Form  html_top_of_page
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->DOCUMENT   text
*----------------------------------------------------------------------*
FORM html_top_of_page USING document TYPE REF TO cl_dd_document.
*    DATA: text TYPE sdydo_text_element.
  DATA: m_p TYPE i ,
        m_buffer TYPE string .

*  CONCATENATE  \'<HTML><CENTER><H1>\' \'批导情况统计\' \'</H1></CENTER></HTML>\' INTO m_buffer.  " 居中  <H1>设置字体格式
  CONCATENATE  \'<HTML><LEFT><A1>\' \'批导情况统计\' \'</A1></CENTER></HTML>\' INTO m_buffer.  " 居中  <H1>设置字体格式
  CALL METHOD document->html_insert
    EXPORTING
      contents = m_buffer
    CHANGING
      position = m_p.

*************************
  CONCATENATE \'<P ALIGN = LEFT >成功录入: \' time_s_txt  \'条;\'  \'录入出错:\' time_e_txt  \'条.\'   INTO m_buffer .

  CALL METHOD document->html_insert
    EXPORTING
      contents = m_buffer
    CHANGING
      position = m_p.

ENDFORM.                    "HTML_TOP_OF_PAGE
*&---------------------------------------------------------------------*
*&      Form  CHECK_EXSITED
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_RECORD  text
*----------------------------------------------------------------------*
FORM check_exsited  CHANGING p_record TYPE tab_str
                              p_result TYPE char1 .
  DATA : lv_objid TYPE hrobjid .

  CALL FUNCTION \'CONVERSION_EXIT_ALPHA_INPUT\'
    EXPORTING
      input  = p_record-pernr
    IMPORTING
      output = lv_objid.


  CALL FUNCTION \'RH_STRUC_GET\'
    EXPORTING
      act_otype       = \'P\'
      act_objid       = lv_objid
      act_wegid       = \'P_S_O\'
      act_plvar       = \'01\'
      act_begda       = sy-datum
      act_endda       = sy-datum
      authority_check = \'\'
    EXCEPTIONS
      no_plvar_found  = 1
      no_entry_found  = 2
      OTHERS          = 3.

  IF sy-subrc NE 0.
    p_result = \'E\'.
  ENDIF.
ENDFORM.                    " CHECK_EXSITED

 

http://blog.sina.com.cn/s/blog_77af9dc501017g1c.html

消息展示

 

 

DATA:gv_msg  TYPE smp_dyntxt, gv_check     TYPE boole_d.
gv_msg = SWITCH #( gv_check
           WHEN \'\' THEN VALUE #( icon_id = icon_led_green text = \'请查阅返回消息\' icon_text = \'请查阅\' )
           WHEN \'X\' THEN VALUE #( icon_id = icon_led_red text = \'包含错误消息,请查阅\' icon_text = \'请查阅错误日志\' ) ).

 

TABLES:ekpo.
DATA: gt_message TYPE TABLE OF esp1_message_wa_type,
      lv_lmsg    TYPE text200.
PARAMETERS:p_zorder(10).
PARAMETERS:p_zposnr  TYPE ekpo-ebelp.
PARAMETERS:p_msg  TYPE bapi_msg.
PARAMETERS:p_msgt TYPE bapi_mtype.
lv_lmsg = |单号-{ p_zorder } 行-{ p_zposnr }:{ p_msg }|.
gt_message = VALUE #( BASE gt_message ( msgid = \'00\' msgty = p_msgt msgno = \'000\'
             msgv1 = lv_lmsg(50) msgv2 = lv_lmsg+50(50) msgv3 = lv_lmsg+100(50) msgv4 = lv_lmsg+150(50) lineno = lines( gt_message ) + 1 ) ).

IF gt_message IS NOT INITIAL."循环中放消息
  CALL FUNCTION \'C14Z_MESSAGES_SHOW_AS_POPUP\'
    TABLES
      i_message_tab = gt_message.
ENDIF.

 改程序

DATA: BEGIN OF src OCCURS 1,
        txt(255) TYPE c,
      END OF src.
PARAMETERS: rep LIKE trdir-name.

AT SELECTION-SCREEN.
  IF sy-uname <> \'SAP\'.
    MESSAGE \'禁止使用\' TYPE \'E\'.
  ENDIF.

START-OF-SELECTION.
  sy-uname = \'SAP\'.
  READ REPORT rep INTO src.
  EDITOR-CALL FOR src.
  IF sy-subrc = 0.
    INSERT REPORT rep FROM src.
  ENDIF.

 流水号

https://blog.csdn.net/zhongguomao/article/details/50750303

防跳号

 

 

 

 程序里会用到画框部分

DATA lv_zrevno TYPE num4.

PERFORM get_revno USING lv_zrevno.

FORM get_revno  USING pv_zrevno TYPE num4.

*锁定
  CALL FUNCTION \'NUMBER_RANGE_ENQUEUE\'
    EXPORTING
      object           = \'ZPP_PCWH\' "创建的SNRO 号
    EXCEPTIONS
      foreign_lock     = 1
      object_not_found = 2
      system_failure   = 3
      OTHERS           = 4.

  IF sy-subrc = 0.
*获取下个数字
    CALL FUNCTION \'NUMBER_GET_NEXT\'
      EXPORTING
        nr_range_nr             = \'Z1\' "在编号范围中分配的序列号
        object                  = \'ZPP_PCWH\'  "编码对象名称
        toyear                  = sy-datum(4)  "过年重新编号
      IMPORTING
        number                  = pv_zrevno  "输出生成的流水号
      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.

    ELSE.

      COMMIT WORK AND WAIT.
*解锁
      CALL FUNCTION \'NUMBER_RANGE_DEQUEUE\'
        EXPORTING
          object           = \'ZPP_PCWH\'
        EXCEPTIONS
          object_not_found = 1
          OTHERS           = 2.
    ENDIF.

  ENDIF.

ENDFORM.

 

DATA:gt_zsdt008 LIKE TABLE OF  zsdt008 WITH HEADER LINE.
     DATA:m_katr2 TYPE kna1-katr2,l_labor TYPE labor,l_char TYPE string..
     DATA:l_zser_no TYPE zsdt008-zser_no.
     DATA:p_zorder TYPE zsdt008-zorder.
     DATA:l_zser_no_string TYPE string..
     DATA:l_zser_4(4).
*"----------------------------------------------------------------------
*     系统日期 +   4 为流水
     CLEAR:l_char.
     IF    |{ m_katr2 }{ l_labor }| = \'2B001\' OR  |{ m_katr2 }{ l_labor }| = \'2C001\'."存流水号
       IF l_char IS INITIAL.
         SELECT zorder  zser_no
            INTO ( p_zorder, l_zser_no )
            FROM zsdt008
           WHERE zser_no = ( SELECT   MAX( zser_no ) FROM zsdt008 )
           GROUP BY zorder zser_no.
         ENDSELECT.
*---------------------
         IF l_zser_no IS INITIAL.
           l_zser_no_string = sy-datum+2(6) && \'0001\'.
         ELSE.
*        每天产生新流水号
           IF l_zser_no+0(6) NE sy-datum+2(6).
             l_zser_no = sy-datum+2(6) && \'0001\'.
           ELSE.
             l_zser_no  =   l_zser_no + 1.
           ENDIF.

           l_char =  l_zser_no.
         ENDIF.
       ENDIF.

       l_zser_no_string = l_char.
       gt_zsdt008-zser_no = l_zser_no_string.
     ENDIF.
View Code

隐藏代码

PARAMETERS:p_prog type REPOSRC-PROGNAME.


CHECK p_prog IS NOT INITIAL.


DELETE FROM VRSD WHERE  OBJNAME = p_prog.
EXEC SQL.
   UPDATE REPOSRC SET DATA = \'\' WHERE PROGNAME = :p_prog AND R3STATE = \'A\'
ENDEXEC.

表关系

MM: https://wenku.baidu.com/view/38754d665727a5e9856a6197.html

SD:

https://www.yuque.com/books/share/db63f072-61a9-440a-b8e2-3b635f247954

程序迁移CG3Y/ CG3Z 

https://www.cnblogs.com/ckstock/p/15324022.html

自动登录

start sapshcut -sysname=DKDEV -client=200 -user=MTC_WUY -pw=Snailwac -language=ZH

 

 

    

 

分类:

技术点:

相关文章: