最帅的人

理论

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

https://blogs.sap.com/

scn.sap.com

断点

https://www.cnblogs.com/wh-cnblogs/p/16709842.html

ABAP-BASIS基本操作

SM12 锁定对象
用户总是会时不时的因为某种原因(如断线,程序出错等等)而锁定一个对象。所有被锁定的老的对象均要被分析,更正。
出错分析
ST22出错分析
当一个报表或事务因为严重的错误而停止工作时,ABAP/4开发工作台就会发出一个“突然出错”(short dump)。系统在系统日志中记录错误信息,并在表SNAP中记录程序终止时的出错信息。管理员需要每天检查是否有short dump 出现,如果有则分析并试图解决问题。

系统日志
SM21系统日日志
R/3服务器在系统日志中记录系统的事件和问题。所有的警告和错误信息应被分析和解决。此程序应包括将问题及其解决方案做成文档。

数据库
DB13 定义DATABASE相关的日常后台job,如:
数据库备份,CHECK DATABASE ,OBTIMIZER STATISTICS UPDATE等等,
也可查看DATABASE相关后台作业的LOG.

DB12 SAPDBA日志
检查夜间备份是否成功。
检查日志目录的剩余空间。

DB02 存储管理
监控数据库的扩长。
监控表和索引的扩长及碎片的情况。
如有必要监控数据库的优化统计。

ST02 监控SAP R/3 BUFFER状况
每天监控SAP R/3各种 BUFFER 的命中率,比如: ROLL MEMORY ,EXTEND MEMORY,HEAP MEMORY,TABLE BUFFER,ABAP PROGRAM BUFFER 等等。

ST04 数据库性能监控
每天监控数据库的性能统计值以观察数据库是否处于良好的运行状态。
每天监控对数据库逻辑上和物理上的读,以追踪数据库负载的发展情况。如:DATA BUFFER 命中率,SHARE MEMORY 命中率等等和数据库性能密切相关的重要
参数值。

ST06 监控操作系统资源状况
每天察看ST06用以掌握系统运行过程中整个操作系统资源状况,如:
CPU 使用率,内存使用率,PAGE SPACE 使用率等等。

AL02数据库警报监视
所有的警告均需被分析,修正和记录在案。
操作系统
OS06 操作系统监视
所有的警告均需被分析,修正和记录在案。

AL16 操作系统警报监视
所有的警告均需被分析,修正和记录在案。

网络
ST09/ST08 网络警报监视
所有的警告均需被分析,修正和记录在案。

工作定时系统

SM37 工作日志查看
管理员应该检查所有被取消的工作,如有必要分析并修正这些工作。问题及其解决方案需记录在案。
管理器应该检查所有的日志,包括输出列表

 

SM20 安全审计日志分析


RZ01 图形化的工作监视

打印系统
SP01 打印需求查看
失败的打印任务可以从新启动。这些打印任务的失败往往是用户端的问题(如PC上的SAPLPD程序被关闭了)。由于R/3 系统仅跟踪打印任务到目标队列中,输出控制器中的已经完成的状态并不能表明实际打印成功,因此那些比较重要和大量的打印任务在被从TemSe中删除前必须先确认是否完成。

搜索帮助(含屏幕)及table control

HR模块-组织选择帮助

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、自定义值的F4

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

PARAMETERS: iscn TYPE char2 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.

View Code

4、 多值勾选的F4

 

 

View Code

5、 联动搜索帮助

  搜索8100工厂下的物料

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
View Code

6、 搜索帮助的出口

https://www.cnblogs.com/ckstock/p/18153094

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有些区别

ALV

标准函数弹出alv

FUNCTION zmc_alv_popup.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     VALUE(I_STRNM) TYPE  DD02L-TABNAME
*"     VALUE(I_COL_S) DEFAULT '88'
*"     VALUE(I_COL_E) DEFAULT '165'
*"     VALUE(I_ROW_S) DEFAULT '5'
*"     VALUE(I_ROW_E) DEFAULT '25'
*"     VALUE(IM_TOOLBAR) OPTIONAL
*"  TABLES
*"      IT_DATA
*"      IT_FCAT TYPE  LVC_T_FCAT OPTIONAL
*"----------------------------------------------------------------------
  TYPE-POOLS:slis.
  DATA  i_callback_pf_status_set  TYPE  slis_formname .
  DATA: ls_layo TYPE lvc_s_layo,
        ls_fcat TYPE lvc_s_fcat,
        lt_fcat TYPE lvc_t_fcat,
        extab   TYPE slis_t_extab,
        lt_extb TYPE slis_t_extab.

  IF it_fcat[] IS INITIAL.
    CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
      EXPORTING
        i_structure_name       = i_strnm
      CHANGING
        ct_fieldcat            = lt_fcat
      EXCEPTIONS
        inconsistent_interface = 1
        program_error          = 2
        OTHERS                 = 3.
  ELSE.
    lt_fcat[] = it_fcat[].
  ENDIF.

  ls_layo-cwidth_opt = 'X'.
  ls_layo-totals_bef = 'X'.
  ls_layo-zebra      = 'X'.
  ls_layo-sel_mode = 'D'.

  IF im_toolbar <> 'X'.
    APPEND '&OUP' TO lt_extb." 正序
    APPEND '&ODN' TO lt_extb." 倒序
    APPEND '&ILT' TO lt_extb." 过滤
    APPEND '&ILD' TO lt_extb." 删滤
    APPEND '&RNT' TO lt_extb." 打印
    APPEND '&ELP' TO lt_extb." 帮助
    APPEND '%SC'  TO lt_extb." 搜索
  ELSE.
    i_callback_pf_status_set =  'PFSTATUS_POPUP'.
  ENDIF.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
*     i_grid_title             = conv lvc_title( | 共{ LINES( it_data ) }条数据 |  )
      is_layout_lvc            = ls_layo
      it_fieldcat_lvc          = lt_fcat
      i_save                   = 'A'
      it_excluding             = lt_extb
      i_screen_start_column    = i_col_s
      i_screen_start_line      = i_row_s
      i_screen_end_column      = i_col_e
      i_screen_end_line        = i_row_e
*     i_callback_pf_status_set = COND #( WHEN im_toolbar IS NOT INITIAL THEN 'PFSTATUS_POPUP' ELSE '' )
      i_callback_pf_status_set = i_callback_pf_status_set
    TABLES
      t_outtab                 = it_data
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.

ENDFUNCTION.

*&---------------------------------------------------------------------*
*&      Form  pfstatus_popup
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->LT_EXTB    text
*----------------------------------------------------------------------*
FORM pfstatus_popup USING  lt_extb TYPE slis_t_extab.
  SET PF-STATUS 'PFSTATUS_POPUP' EXCLUDING lt_extb.
ENDFORM.                    "SET_PFSTATUS
*  CALL SELECTION-SCREEN 9101 STARTING AT  10  50 ENDING AT 200 70.
*  i_col_s = 10.
*  i_row_s = 50.
*  i_col_e = 200.
*  i_row_e = 70.
View Code

聚合函数

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

选择屏幕

 

 

TYPE-POOLS: vrm.
DATA: name TYPE vrm_id,
      list TYPE vrm_values,
      VALUE LIKE LINE OF list.

SELECTION-SCREEN BEGIN OF LINE.
  SELECTION-SCREEN POSITION 33."
  PARAMETERS:p_mblx TYPE zmct_zx-zmc_mblx DEFAULT 'C' MODIF ID lx.
  SELECTION-SCREEN COMMENT 39(6) mblx.

  SELECTION-SCREEN POSITION 47."日
  PARAMETERS: p_smon TYPE char2 AS LISTBOX VISIBLE LENGTH 10  .

  SELECTION-SCREEN COMMENT 01(10) c_text1 FOR FIELD p_smon MODIF ID lx."目标类型
SELECTION-SCREEN END OF LINE.

INITIALIZATION.

  c_text1 = '目标类型'.

  AT SELECTION-SCREEN OUTPUT.
  PERFORM screen_control.

  START-OF-SELECTION.
*&---------------------------------------------------------------------*
*&      Form  SCREEN_CONTROL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form SCREEN_CONTROL .

  mblx = '季度'.
  FREE list.
  IF p_mblx = 'C'..
    name = 'P_SMON'.
    VALUE-KEY = '01'.  VALUE-TEXT = '一月'. APPEND VALUE TO list.
    VALUE-KEY = '02'.  VALUE-TEXT = '二月'. APPEND VALUE TO list.
    VALUE-KEY = '03'.  VALUE-TEXT = '三月'. APPEND VALUE TO list.
    VALUE-KEY = '04'.  VALUE-TEXT = '四月'. APPEND VALUE TO list.
    VALUE-KEY = '05'.  VALUE-TEXT = '五月'. APPEND VALUE TO list.
    VALUE-KEY = '06'.  VALUE-TEXT = '六月'. APPEND VALUE TO list.
    VALUE-KEY = '07'.  VALUE-TEXT = '七月'. APPEND VALUE TO list.
    VALUE-KEY = '08'.  VALUE-TEXT = '八月'. APPEND VALUE TO list.
    VALUE-KEY = '09'.  VALUE-TEXT = '九月'. APPEND VALUE TO list.
    VALUE-KEY = '10'. VALUE-TEXT = '十月'. APPEND VALUE TO list.
    VALUE-KEY = '11'. VALUE-TEXT = '十一月'. APPEND VALUE TO list.
    VALUE-KEY = '12'. VALUE-TEXT = '十二月'. APPEND VALUE TO list.
  ENDIF.

  IF p_mblx = 'B'..
    name = 'P_SMON'.
    VALUE-KEY = '01'.  VALUE-TEXT = '一季度'. APPEND VALUE TO list.
    VALUE-KEY = '02'.  VALUE-TEXT = '二季度'. APPEND VALUE TO list.
    VALUE-KEY = '03'.  VALUE-TEXT = '三季度'. APPEND VALUE TO list.
    VALUE-KEY = '03'.  VALUE-TEXT = '四季度'. APPEND VALUE TO list.
  ENDIF.
  CALL FUNCTION 'VRM_SET_VALUES'
  EXPORTING
    ID     = name
    values = list.
endform.                    " SCREEN_CONTROL
View Code

 

TABLES:bkpf .
 
SELECTION-SCREEN BEGIN OF LINE.

SELECTION-SCREEN POSITION 33."
PARAMETERS: p_monat TYPE bkpf-monat DEFAULT  01  MODIF ID lx.
SELECTION-SCREEN COMMENT 01(10) c_text1 FOR FIELD p_monat MODIF ID bl1.

SELECTION-SCREEN POSITION 40."
PARAMETERS:p_mblx TYPE bkpf-monat DEFAULT 02  MODIF ID lx."目标类型
SELECTION-SCREEN COMMENT 44(10) mblx.

SELECTION-SCREEN END OF LINE.

INITIALIZATION.
  c_text1 = '目标类型'.
  mblx = '月度/季度'.
View Code

REPORT 1.

TABLES:sscrfields.
TYPE-POOLS:sydb0,abap.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE ms.
PARAMETERS: rd_t1 TYPE c RADIOBUTTON GROUP rd01  USER-COMMAND com ." DEFAULT 'X'  .
PARAMETERS: rd_t2 TYPE c RADIOBUTTON GROUP rd01   DEFAULT 'X' .

SELECTION-SCREEN BEGIN  OF LINE.
SELECTION-SCREEN COMMENT 6(30) descr1  MODIF ID hz.
SELECTION-SCREEN POSITION 4.
PARAMETERS:p_1 AS CHECKBOX     MODIF ID hz   .
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN  OF LINE.
SELECTION-SCREEN COMMENT 6(30) descr2  MODIF ID hz.
SELECTION-SCREEN POSITION 4.
PARAMETERS:p_2 AS CHECKBOX     MODIF ID hz   .
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN FUNCTION KEY 1.

"//---------------------------------------------------
"// 文本备注
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE bz.
SELECTION-SCREEN COMMENT  /02(70)  c01.
SELECTION-SCREEN COMMENT  /02(70)  c02.
SELECTION-SCREEN COMMENT  /02(70)  c03.
SELECTION-SCREEN COMMENT  /02(70)  c04.
SELECTION-SCREEN END OF BLOCK b3.

INITIALIZATION .
  sscrfields-functxt_01 = '下载模板'.
  ms = '类型选择' .
  descr1 = '@CL@ 材料类别1' .
  descr2 = '@9B@ 材料类别2' .

  %_rd_t1_%_app_%-text = '@B_LIST@ 明细' .
  %_rd_t2_%_app_%-text = '@B_SUMP@ 汇总' .
* @B_LIFE@  @B_CUST@

  bz = '提示 ..' .
  c01 = '@1V@本部机构填写规则:'.
  c02 = '1. 四川米兰(含高新店)请用6100'.
  c03 = '2. 晶肤事业部请用6200:'.
  c04 = '3. 其他机构请用自身机构代码'.

AT SELECTION-SCREEN OUTPUT.

*---------------------------------------------------------------------*
* 隐藏 function-key
*---------------------------------------------------------------------*
*  DATA: current_screen TYPE string VALUE '(RSDBRUNT)CURRENT_SCREEN'.
*  FIELD-SYMBOLS: <current_screen> TYPE sydb0_screen.
*  ASSIGN (current_screen) TO <current_screen>.
*  IF sy-subrc EQ 0.
*    <current_screen>-func_keys(1) = rd_t1.
*  ENDIF.
*
*
*  DATA: current_scr TYPE string VALUE'(RSDBRUNT)CURRENT_SCR'.
*  FIELD-SYMBOLS: <current_scr> TYPE sydb0_scr_stack_line.
*  ASSIGN (current_scr) TO <current_scr>.
*  IF sy-subrc EQ 0.
*    IF rd_t1 EQ abap_true.
*      DELETE <current_scr>-excl WHERE fcode EQ 'FC01'.
*    ELSE.
*      READ TABLE <current_scr>-excl WITH KEY fcode = 'FC01' TRANSPORTING NO FIELDS.
*      IF sy-subrc NE 0.
*        APPEND 'FC01' TO <current_scr>-excl.
*      ENDIF.
*    ENDIF.
*  ENDIF.

  DATA:lt_ucomm TYPE STANDARD TABLE OF sy-ucomm.
  DATA:ls_ucomm like  sy-ucomm.
  IF rd_t1 = 'X'..
    CLEAR:lt_ucomm[],lt_ucomm.
  ELSE.
    ls_ucomm  = 'FC01'.
   APPEND ls_ucomm TO  lt_ucomm.CLEAR ls_ucomm.
  ENDIF.

  CALL FUNCTION 'RS_SET_SELSCREEN_STATUS'
    EXPORTING
      p_status        = sy-pfkey
*   P_PROGRAM       = ' '
    TABLES
      p_exclude       = lt_ucomm
            .

  "控制页签
  IF rd_t1 = 'X'.
    LOOP AT SCREEN.
      IF screen-group1 = 'HZ'.
        screen-active =  '0'.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ELSEIF rd_t2 = 'X'.
    LOOP AT SCREEN.
      IF screen-group1 = 'SUM'.
        screen-active = '0'.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.
View Code

 

SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE TEXT-t00.

  SELECTION-SCREEN BEGIN OF LINE.
    PARAMETERS:
    pa_t1 RADIOBUTTON GROUP gp1 DEFAULT 'X' USER-COMMAND gp1.
    SELECTION-SCREEN COMMENT 4(20) pa_t1t FOR FIELD pa_t1.
*
  SELECTION-SCREEN END OF LINE.


  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 7.
    PARAMETERS:
    pa_t11 RADIOBUTTON GROUP gp2 DEFAULT 'X' USER-COMMAND gp2.
    SELECTION-SCREEN COMMENT 8(20) pa_t11T FOR FIELD pa_t11.
  SELECTION-SCREEN END OF LINE.
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 7.
    PARAMETERS:
    pa_t12 RADIOBUTTON GROUP gp2 .
    SELECTION-SCREEN COMMENT 8(20) pa_t12t FOR FIELD pa_t12.
  SELECTION-SCREEN END OF LINE.
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 7.
    PARAMETERS:
    pa_t13 RADIOBUTTON GROUP gp2 .
    SELECTION-SCREEN COMMENT 8(20) pa_t13t FOR FIELD pa_t13.
  SELECTION-SCREEN END OF LINE.

  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 7.
    PARAMETERS:
    pa_t14 RADIOBUTTON GROUP gp2 .
    SELECTION-SCREEN COMMENT 8(20) pa_t14t FOR FIELD pa_t14.
  SELECTION-SCREEN END OF LINE.
*
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 7.
    PARAMETERS:
    pa_t15 RADIOBUTTON GROUP gp2 .
    SELECTION-SCREEN COMMENT 8(20) pa_t15t FOR FIELD pa_t15.
  SELECTION-SCREEN END OF LINE.


  SELECTION-SCREEN BEGIN OF LINE.
    PARAMETERS:
    pa_t2 RADIOBUTTON GROUP gp1 .
    SELECTION-SCREEN COMMENT 4(20) pa_t2t FOR FIELD pa_t2.
  SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK b02.

INITIALIZATION.
*  %__%_app_%-text = '医生'.
pa_t1t  = '岗位选择'.
pa_t11T = '医生'.
pa_t12t = '咨询'.
View Code

 

 

SELECTION-SCREEN: BEGIN OF BLOCK btx   WITH FRAME TITLE format.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_djg AS CHECKBOX DEFAULT   'X'..
SELECTION-SCREEN COMMENT 3(20)   djgt .

PARAMETERS: p_total AS CHECKBOX   ."朗姿总体
SELECTION-SCREEN COMMENT 26(8)  totalt  .

SELECTION-SCREEN POSITION  45.
PARAMETERS: p_jf AS CHECKBOX    .
SELECTION-SCREEN COMMENT 47(8)  jft ."

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

INITIALIZATION.
  format = '模式选择'.
  djgt = '单机构'.
  totalt = '朗姿总体'.
  jft = '晶肤合计'.
View Code

 

 

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'.

  SELECTION-SCREEN BEGIN  OF LINE.
    SELECTION-SCREEN COMMENT 4(10) lb_tstic .
    SELECTION-SCREEN POSITION 14.
    PARAMETERS:
    p_new AS CHECKBOX      .
  SELECTION-SCREEN END OF LINE.

  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 .
  %_p_new_%_app_%-text = '新物料'.
*&---------------------------------------------------------------------*
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.
*&---------------------------------------------------------------------*
View Code

 

 

 

TABLES:pa0001,pa0000,mkpf,mkal.

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


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.
View Code

 

 

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 = '到'.
View Code

 

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
View Code

 

 
TABLES:sscrfields.
TYPE-POOLS:icon.
SELECTION-SCREEN: BEGIN OF BLOCK blk_note WITH FRAME TITLE text-002.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN PUSHBUTTON 1(8) btn1 USER-COMMAND sall.
SELECTION-SCREEN PUSHBUTTON 9(12) btn2 USER-COMMAND dall.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS:  p_bpm01 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd01. " 基金中心主数据
SELECTION-SCREEN: COMMENT 5(20) text-b01.
PARAMETERS:  p_bpm02 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd02. " 物料组
SELECTION-SCREEN: COMMENT 30(20) text-b02.
PARAMETERS:  p_bpm03 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd03. " 工厂数据
SELECTION-SCREEN: COMMENT 55(20) text-b03.
SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS:  p_bpm04 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd04. "承诺项目数据
SELECTION-SCREEN: COMMENT 5(20) text-b04.
PARAMETERS:  p_bpm05 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd05. "成本中心数据
SELECTION-SCREEN: COMMENT 30(20) text-b05.
PARAMETERS:  p_bpm06 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd06. "公司代码
SELECTION-SCREEN: COMMENT 55(20) text-b06.
SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS:  p_bpm07 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd07. "会计科目主数据
SELECTION-SCREEN: COMMENT 5(20) text-b07.
PARAMETERS:  p_bpm08 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd08. "内部订单主数据
SELECTION-SCREEN: COMMENT 30(20) text-b08.
PARAMETERS:  p_bpm09 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd09. "现金流量原因
SELECTION-SCREEN: COMMENT 55(20) text-b09.
SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS:  p_bpm10 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd10. "计量单位
SELECTION-SCREEN: COMMENT 5(20) text-b10.
PARAMETERS:  p_bpm11 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd11. "货币-汇率
SELECTION-SCREEN: COMMENT 30(20) text-b11.
PARAMETERS:  p_bpm12 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd12. "物料类型
SELECTION-SCREEN: COMMENT 55(20) text-b12.
SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS:  p_bpm13 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd13. "资产主数据
SELECTION-SCREEN: COMMENT 5(20) text-b13.
PARAMETERS:  p_bpm14 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd14. "资材分类
SELECTION-SCREEN: COMMENT 30(20) text-b14.
PARAMETERS:  p_bpm15 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd15. "基金中心与成本中心
SELECTION-SCREEN: COMMENT 55(20) text-b15.
SELECTION-SCREEN: END OF LINE.

SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS:  p_bpm16 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd16. "基金中心与内部订单
SELECTION-SCREEN: COMMENT 5(20) text-b16.
PARAMETERS:  p_bpm17 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd17. "会计科目与承诺项目
SELECTION-SCREEN: COMMENT 30(20) text-b17.
PARAMETERS:  p_bpm18 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd18. "物料类型
SELECTION-SCREEN: COMMENT 55(20) text-b18.
SELECTION-SCREEN: END OF LINE.


SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS:  p_bpm22 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd22. "内部订单和会计科目推导承诺项目
SELECTION-SCREEN: COMMENT 5(20) text-b22.
PARAMETERS:  p_bpm23 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd23. "公司代码和资产编号推导基金中心
SELECTION-SCREEN: COMMENT 30(20) text-b23.
PARAMETERS:  p_bpm24 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd24. "物料类型
SELECTION-SCREEN: COMMENT 55(20) text-b24.
SELECTION-SCREEN: END OF LINE.


SELECTION-SCREEN: BEGIN OF LINE.
PARAMETERS:  p_bpm25 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd25. "库存地点
SELECTION-SCREEN: COMMENT 5(20) text-b19.

PARAMETERS:  p_hr01 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd25. " 利润中心
SELECTION-SCREEN: COMMENT 30(20) text-h01.
PARAMETERS:  p_hr02 AS CHECKBOX DEFAULT 'X' USER-COMMAND cmd26. "成本要素
SELECTION-SCREEN: COMMENT 55(20) text-h02.
* costa.du 20180604 add end

SELECTION-SCREEN: END OF LINE.



SELECTION-SCREEN: END OF BLOCK blk_note.

INITIALIZATION.
  GET TIME.
*&---------------------------------------------------------------------*
* AT SELECTION-SCREEN
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
* 初始化选择屏幕
  PERFORM frm_init_scr.

AT SELECTION-SCREEN.

  PERFORM frm_sel_scr.
*&---------------------------------------------------------------------*
*&      Form  FRM_INIT_SCR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_init_scr .

* 创建屏幕按钮
  "全选
  CALL FUNCTION 'ICON_CREATE'
    EXPORTING
      name   = icon_select_all
      info   = '全选'
    IMPORTING
      RESULT = btn1.
  "取消全选
  CALL FUNCTION 'ICON_CREATE'
    EXPORTING
      name   = icon_deselect_all
      info   = '取消全选'
    IMPORTING
      RESULT = btn2.
ENDFORM.                    "FRM_INIT_SCR

*&---------------------------------------------------------------------*
*&      Form  FRM_SEL_SCR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_sel_scr .
  CASE sscrfields-ucomm.
    WHEN 'SALL'.
      p_bpm01 = 'X'.
      p_bpm02 = 'X'.
      p_bpm03 = 'X'.
      p_bpm04 = 'X'.
      p_bpm05 = 'X'.
      p_bpm06 = 'X'.
      p_bpm07 = 'X'.
      p_bpm08 = 'X'.
      p_bpm09 = 'X'.
      p_bpm10 = 'X'.
      p_bpm11 = 'X'.
      p_bpm12 = 'X'.
      p_bpm13 = 'X'.
      p_bpm14 = 'X'.
      p_bpm15 = 'X'.
      p_bpm16 = 'X'.
      p_bpm17 = 'X'.
      p_bpm18 = 'X'.
      p_bpm25 = 'X'.
      p_bpm22 = 'X'.
      p_bpm23 = 'X'.
      p_bpm24 = 'X'.
* costa.du 20180604 add start
      p_hr01  = 'X'.
      p_hr02  = 'X'.
* costa.du 20180604 add end
    WHEN 'DALL'.
      CLEAR: p_bpm01,
      p_bpm02,
      p_bpm03,
      p_bpm04,
      p_bpm05,
      p_bpm06,
      p_bpm07,
      p_bpm08,
      p_bpm09,
      p_bpm10,
      p_bpm11,
      p_bpm12,
      p_bpm13,
      p_bpm14,
      p_bpm15,
      p_bpm16,
      p_bpm17,
      p_bpm22,
      p_bpm23,
      p_bpm24,
      p_bpm18,
      p_bpm25.
* costa.du 20180604 add start
      CLEAR: p_hr01,
      p_hr02.
* costa.du 20180604 add end
    WHEN OTHERS.
  ENDCASE.
ENDFORM.                    " FRM_SEL_SCR
View Code

 

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

选择屏幕勾选后某字段设置必输(看着是必输入)

AT SELECTION-SCREEN OUTPUT .
  PERFORM frm_set_screen.

*&---------------------------------------------------------------------*
*&      Form  frm_set_screen
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_set_screen .

  IF p_new = 'X'.
    LOOP AT SCREEN.
      IF  screen-group1 = 'CB'  ..
        IF screen-name =  'S_MA_CB-LOW'.  ..
          screen-required = '2'.
          MODIFY SCREEN.
        ENDIF.

      ENDIF.

    ENDLOOP.
  ENDIF.

ENDFORM.                    "frm_set_screen
View Code

选择屏幕隐藏屏幕

 

 

REPORT 1.


TYPE-POOLS: abap,ICON,slis,vrm.

TABLES: but000.


DATA: gv_bemon TYPE char2,
      gv_enmon TYPE char2.

DATA: gv_bedat TYPE char2,
      gv_endat TYPE char2.

DATA: g_vrmid TYPE vrm_id,
      gt_vrmv TYPE vrm_values,
      gs_vrmv LIKE LINE OF gt_vrmv.

SELECTION-SCREEN BEGIN OF BLOCK b0 WITH FRAME TITLE TEXT-t00.

  SELECTION-SCREEN SKIP.

  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN PUSHBUTTON 1(4) but1 USER-COMMAND but1 VISIBLE LENGTH 2.
    SELECTION-SCREEN COMMENT 5(20) com1.
  SELECTION-SCREEN END OF LINE.

  SELECT-OPTIONS: s_kunr FOR but000-partner MODIF ID bl1.


  "//---------------------可以控制位置------------------------------
  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 33."月
    PARAMETERS: p_frcsy TYPE numc2 AS LISTBOX VISIBLE LENGTH 10 MODIF ID bl1.
    SELECTION-SCREEN COMMENT 01(20) c_text1 FOR FIELD p_frcsy MODIF ID bl1.

    SELECTION-SCREEN POSITION 46."日
    PARAMETERS: p_frcsr TYPE numc2 AS LISTBOX VISIBLE LENGTH 8 MODIF ID bl1.
  SELECTION-SCREEN END OF LINE.

  SELECTION-SCREEN BEGIN OF LINE.
    SELECTION-SCREEN POSITION 33."月
    PARAMETERS: p_tocsy TYPE numc2 AS LISTBOX VISIBLE LENGTH 10 MODIF ID bl1.
    SELECTION-SCREEN COMMENT 01(20) c_text2 FOR FIELD p_tocsy MODIF ID bl1.

    SELECTION-SCREEN POSITION 46."日
    PARAMETERS: p_tocsr TYPE numc2 AS LISTBOX VISIBLE LENGTH 8 MODIF ID bl1.
  SELECTION-SCREEN END OF LINE.


SELECTION-SCREEN END OF BLOCK b0.

INITIALIZATION.
%_s_kunr_%_app_%-TEXT = '客户'.

PERFORM frm_data_initial.


AT SELECTION-SCREEN.

PERFORM frm_at_selectscr.

AT SELECTION-SCREEN OUTPUT.
PERFORM frm_screen_output.
PERFORM frm_fill_listbox.

*&---------------------------------------------------------------------*
*&      Form  frm_data_initial
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_data_initial.

  WRITE icon_data_area_expand AS ICON TO but1 .

*  com1 = TEXT-t01.
  com1 =  '基本信息'..

ENDFORM.                    " FRM_DATA_INITIAL
*&---------------------------------------------------------------------*
*&      Form  FRM_SCREEN_OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_screen_output .

  LOOP AT SCREEN.

    IF but1 = '@K2@' AND SCREEN-group1 = 'BL1'.
      SCREEN-active = 0.
    ENDIF.

*    IF but2 = '@K2@' AND SCREEN-group1 = 'BL2'.
*      SCREEN-active = 0.
*    ENDIF.
    MODIFY SCREEN.

  ENDLOOP.

ENDFORM.                    " FRM_SCREEN_OUTPUT
*&---------------------------------------------------------------------*
*&      Form  FRM_AT_SELECTSCR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_at_selectscr .
  CASE sy-ucomm.

  WHEN 'BUT1'.
    IF but1 = '@K1@'.
      WRITE icon_data_area_collapse AS ICON TO but1.
    ELSE.
      WRITE icon_data_area_expand AS ICON TO but1.
    ENDIF.
  WHEN 'BUT2'.
*      IF but2 = '@K1@'.
*        WRITE icon_data_area_collapse AS ICON TO but2.
*      ELSE.
*        WRITE icon_data_area_expand AS ICON TO but2.
*      ENDIF.
  WHEN OTHERS.

  ENDCASE.

ENDFORM.                    " FRM_AT_SELECTSCR
*&---------------------------------------------------------------------*
*&      Form  FRM_FILL_LISTBOX
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_fill_listbox .
  DEFINE m_set_listbox.
    CLEAR gs_vrmv.
    gs_vrmv-KEY = &1.
    gs_vrmv-TEXT = &2.
    COLLECT gs_vrmv INTO gt_vrmv.
  END-OF-DEFINITION.

  DEFINE m_set_values.
    CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      ID     = &1
      values = gt_vrmv.
  END-OF-DEFINITION.

  c_text1 = '生日开始月日'.
  c_text2 = '生日截止月日'.

  DATA: l_text1 TYPE numc2,
        l_text2 TYPE char4.

  REFRESH: gt_vrmv.

  DO 12 TIMES.
    ADD 1 TO l_text1.
    CONCATENATE l_text1 '月' INTO l_text2.
    m_set_listbox l_text1 l_text2.
  ENDDO.

  m_set_values 'P_FRCSY'.
  m_set_values 'P_TOCSY'.

  REFRESH: gt_vrmv.

  CLEAR: l_text1,l_text2.

  DO 31 TIMES.
    ADD 1 TO l_text1.
    CONCATENATE l_text1 '日' INTO l_text2.
    m_set_listbox l_text1 l_text2.
  ENDDO.

  m_set_values 'P_FRCSR'.
  m_set_values 'P_TOCSR'.
ENDFORM.                    " FRM_FILL_LISTBOX
View Code

结构

SQL

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

动态SQL

REPORT 1.

TABLES: spfli.
DATA: ls_line(80) OCCURS 0 WITH HEADER LINE.
DATA:ls_spfli  TYPE spfli.
CONCATENATE 'carrid in (''AA'','  '''AZ'')' INTO ls_line. APPEND ls_line.
CONCATENATE ' or carrid in (''LH'','  '''AZ'')' INTO ls_line.  APPEND ls_line.CLEAR ls_line.


SELECT  *    INTO TABLE @DATA(lt_spfli) FROM spfli.


*---------------------------------------------------------------------*
* Marcus
*---------------------------------------------------------------------*
DATA:itab1 TYPE TABLE OF t001,
     itab2 TYPE TABLE OF t001.
DATA:wa1 LIKE LINE OF  itab1.
DATA:wa2 LIKE LINE OF  itab2.
FIELD-SYMBOLS:<fs_itab> TYPE STANDARD TABLE.
FIELD-SYMBOLS:<fs_wa> TYPE any.
DATA:lv_tabname TYPE char30.
DATA(lv_wa) = 'WA1'.


DATA(lv_where) = 'bukrs = 0001 '.

lv_tabname = 'ITAB1'.
ASSIGN (lv_tabname) TO <fs_itab>.
ASSIGN (lv_wa) TO <fs_wa>.

READ TABLE <fs_itab> INTO <fs_wa> WITH KEY lv_where.
READ TABLE ITAB1 INTO <fs_wa> WITH KEY lv_where.

LOOP AT <fs_itab> INTO <fs_wa> WHERE (lv_where) .

ENDLOOP.
View Code

DBCO  

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

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

sap链接mysql https://www.cnblogs.com/ckstock/p/16077749.html

 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.

 native sql:游标每打开一次就要关闭一次,update 时候不能 set = 主键

 

其他服务器取数:

 

游标取数时候,需要每次进行开启 并关闭。

更新对方数据库表时候 : 如果对方数据库主键 SAP不需要传值,对方要把他们的数据库表设置为主键自动递增,  SAP端 不需要传此字段即可

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.

动态内表

 最全demo演示

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

https://www.cnblogs.com/ckstock/p/17488243.html#_label1_0

*&---------------------------------------------------------------------*
*& Report YSL01
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ysl01.

INCLUDE zabap_dynamic_table.

TYPES:BEGIN OF ty_base,
        num   TYPE n LENGTH 5,
        maktx TYPE maktx,
      END OF ty_base.
TYPES:BEGIN OF ty_item,
        num   TYPE n LENGTH 5,
        lifnr TYPE lifnr,
        unit  TYPE c LENGTH 3,
        value TYPE i,
      END OF ty_item.
DATA: gt_base TYPE TABLE OF ty_base.
DATA: gt_item TYPE TABLE OF ty_item.

START-OF-SELECTION.

  APPEND VALUE #( num = 1 maktx = '物料1' ) TO gt_base.
  APPEND VALUE #( num = '2' maktx = '物料2' ) TO gt_base.
  APPEND VALUE #( num = '3' maktx = '物料3' ) TO gt_base.

  APPEND VALUE #( num = '1' lifnr = 'A01' unit = '个' value = '100' ) TO gt_item.
  APPEND VALUE #( num = '1' lifnr = 'A02' unit = '个' value = '200' ) TO gt_item.
  APPEND VALUE #( num = '1' lifnr = 'A03' unit = '个' value = '300' ) TO gt_item.
  APPEND VALUE #( num = '2' lifnr = 'A01' unit = '只' value = '400' ) TO gt_item.
  APPEND VALUE #( num = '2' lifnr = 'A02' unit = '只' value = '500' ) TO gt_item.
  APPEND VALUE #( num = '2' lifnr = 'A03' unit = 'KG' value = '600' ) TO gt_item.
  APPEND VALUE #( num = '3' lifnr = 'A01' unit = 'KM' value = '700' ) TO gt_item.
  APPEND VALUE #( num = '3' lifnr = 'A03' unit = 'XX' value = '900' ) TO gt_item.

  DATA(lt_lifnr) = gt_item.
  SORT lt_lifnr BY lifnr.
  DELETE ADJACENT DUPLICATES FROM lt_lifnr COMPARING lifnr.

  DATA: go_data TYPE REF TO data.
  FIELD-SYMBOLS: <gt_data> TYPE STANDARD TABLE.
  DATA: lt_fields TYPE TABLE OF zabap_dynamic_table_field.
  DO lines( lt_lifnr ) TIMES.
    DATA(lv_num) = CONV numc3( sy-index ).
    APPEND VALUE #( fieldname = |UNIT{ lv_num }| rollname = 'MEINS' ) TO lt_fields.
    APPEND VALUE #( fieldname = |VALUE{ lv_num }| rollname = 'WERT8' ) TO lt_fields.
  ENDDO.

  PERFORM create_dynamic_table TABLES lt_fields USING 'TY_BASE' CHANGING go_data.
  ASSIGN go_data->* TO <gt_data>.

  <gt_data> = CORRESPONDING #( gt_base ).

  SORT gt_item BY num lifnr.
  LOOP AT <gt_data> ASSIGNING FIELD-SYMBOL(<ls_data>).
    ASSIGN COMPONENT 'NUM' OF STRUCTURE <ls_data> TO FIELD-SYMBOL(<lv_num>). "取序号

    LOOP AT lt_lifnr ASSIGNING FIELD-SYMBOL(<ls_lifnr>).
      lv_num = sy-tabix.
      DATA(lv_fname_unit) = |UNIT{ lv_num }|.
      DATA(lv_fname_value) = |VALUE{ lv_num }|.
      READ TABLE gt_item ASSIGNING FIELD-SYMBOL(<ls_item>) WITH KEY num = <lv_num> lifnr = <ls_lifnr>-lifnr BINARY SEARCH.
      IF sy-subrc = 0.
        ASSIGN COMPONENT lv_fname_unit OF STRUCTURE <ls_data> TO FIELD-SYMBOL(<lv_unit>).
        ASSIGN COMPONENT lv_fname_value OF STRUCTURE <ls_data> TO FIELD-SYMBOL(<lv_value>).
        <lv_unit> = <ls_item>-unit.
        <lv_value> = <ls_item>-value.

      ENDIF.

    ENDLOOP.
  ENDLOOP.


*"--- 动态内表数据计算,不在前面直接计算是因为:有的数据缺失,错行赋值很容易出问题   - ---
*CLEAR:lv_fname_zxyjje,lv_fname_ksrg,lv_fname_rate.
*
*LOOP AT <gt_data> ASSIGNING <ls_data>.
*  DO  gv_jgbm_count TIMES.
*    lv_num_c =  sy-INDEX.
*    CONCATENATE 'ZXYJJE' lv_num_c INTO lv_fname_zxyjje.
*    CONCATENATE 'KSRG' lv_num_c INTO lv_fname_ksrg.
*    CONCATENATE 'RATE' lv_num_c INTO lv_fname_rate.
*    ASSIGN COMPONENT lv_fname_zxyjje OF STRUCTURE <ls_data> TO <lv_zxyjje>.
*    ASSIGN COMPONENT lv_fname_ksrg OF STRUCTURE <ls_data> TO <lv_ksrg>.
*    ASSIGN COMPONENT lv_fname_rate OF STRUCTURE <ls_data> TO <lv_rate>.
*    IF <lv_zxyjje> NE 0.
*      <lv_rate> = <lv_ksrg> / <lv_zxyjje>.
*    ENDIF.
*  ENDDO.
*
*ENDLOOP.

  DATA: lt_fieldcat TYPE lvc_t_fcat.
  PERFORM alv_build_fieldcat IN PROGRAM zabap_sedi_forms TABLES lt_fieldcat USING:
*  FIELD   KEY REF_T REF_F CFIELD  QFIELD  CHK HOT NO0 JUS COLOR  CONV    LEN EDT F4  NCHK DESCRIPTION
        'NUM'   'X' ''    ''    '     ' '     ' ' ' ' ' ' ' ' ' '    ' '     ' 10  ' ' ' ' ' '  '序号',
        'MAKTX' 'X' ''    ''    '     ' '     ' ' ' ' ' ' ' ' ' '    ' '     ' 10  ' ' ' ' ' '  '描述'.


  DATA(lv_color1) = 'C300'.
  DATA(lv_color2) = 'C500'.
  DATA: lv_color TYPE c LENGTH 4.
  DO lines( lt_lifnr ) TIMES.
    lv_num = CONV numc3( sy-index ).
    lv_fname_unit = |UNIT{ lv_num }|.
    lv_fname_value = |VALUE{ lv_num }|.
    DATA(lv_str) = |{ lt_lifnr[ lv_num ]-lifnr }单位|.
    IF lv_num MOD 2 = 0.
      lv_color = lv_color1.
    ELSE.
      lv_color = lv_color2.
    ENDIF.
    PERFORM alv_build_fieldcat IN PROGRAM zabap_sedi_forms TABLES lt_fieldcat USING:
*  FIELD          KEY REF_T REF_F CFIELD  QFIELD  CHK HOT NO0 JUS COLOR    CONV    LEN EDT F4  NCHK DESCRIPTION
          lv_fname_unit  ' ' ''    ''    '     ' '     ' ' ' ' ' ' ' ' ' lv_color '     ' 10  ' ' ' ' ' '  lv_str,
          lv_fname_value ' ' ''    ''    '     ' '     ' ' ' ' ' ' ' ' ' lv_color '     ' 10  ' ' ' ' ' '  '金额'.
  ENDDO.


  DATA: ls_layout   TYPE lvc_s_layo.
  ls_layout-cwidth_opt = 'X'.
  ls_layout-sel_mode = 'D'.
  ls_layout-smalltitle = 'X'.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_grid_title    = CONV lvc_title( |共{ lines( <gt_data> ) }条数据| )
      is_layout_lvc   = ls_layout
      it_fieldcat_lvc = lt_fieldcat
      i_default       = 'X'
      i_save          = 'A'
    TABLES
      t_outtab        = <gt_data>
    EXCEPTIONS
      OTHERS          = 1.
View Code

 

 

 

*----------------------------------------------------------------------*
*  动态内表 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.
View Code

 动态内表动态增加字段

 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

 动态内表排序

https://blog.csdn.net/u012232542/article/details/105444179

动态内表要排序时,因为不知道内表中的字段名字,所以不能直接用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).

    SORT <ft_tab> STABLE BY ('JGBM') .

 传递动态内表数据

REPORT zdynamic_transfer.
DATA et_return TYPE TABLE OF bapiret2.
DATA gt_alv TYPE TABLE OF makt WITH HEADER LINE .

*https://www.cnblogs.com/ricoo/p/13882973.html
START-OF-SELECTION.
  SELECT *
  FROM makt
  INTO TABLE @DATA(it_makt) UP TO 10 ROWS .
  CALL FUNCTION 'ZFGTR_17_BILL_DETAIL'
    TABLES
      et_return     = et_return
*     IT_ANY_TAB    =
      it_any_tab_01 = it_makt.

  PERFORM  frm_get_data TABLES gt_alv .
  cl_demo_output=>display( gt_alv[] ).


FORM frm_get_data TABLES gt_alv.
  DATA:
    lr_any_t TYPE REF TO data,
    lr_any_s TYPE REF TO data.
  DATA:
    lr_dref  TYPE REF TO data,
    lr_stru  TYPE REF TO cl_abap_structdescr,
    lr_table TYPE REF TO cl_abap_tabledescr,
    lr_elem  TYPE REF TO cl_abap_elemdescr,
    lt_para  TYPE cl_abap_structdescr=>component_table,
    lt_comp  TYPE cl_abap_structdescr=>component_table.
  DATA:
        lt_comps  TYPE TABLE OF abap_compdescr.
  FIELD-SYMBOLS:
    <fs_tab> TYPE any,
    <ft_tab> TYPE STANDARD TABLE.

  IMPORT tab = lt_comps FROM MEMORY ID 'ZDTR0780_V1'.

  LOOP AT lt_comps INTO DATA(ls_comps).
    IF ls_comps-type_kind = 'P'
    OR ls_comps-type_kind = 'X'.
    ELSE.
      ls_comps-length = ls_comps-length / 2.
    ENDIF.

    APPEND INITIAL LINE TO lt_comp ASSIGNING FIELD-SYMBOL(<fs_comp>).
    <fs_comp>-name  =   ls_comps-name.
    <fs_comp>-type  ?=  cl_abap_elemdescr=>get_by_kind(
    p_type_kind  = ls_comps-type_kind
    p_length     = ls_comps-length
    p_decimals   = ls_comps-decimals ).
    UNASSIGN <fs_comp>.
  ENDLOOP.

  IF lt_comp[] IS NOT INITIAL.
    CLEAR:lr_stru,lr_table.
    lr_stru   =   cl_abap_structdescr=>create( lt_comp ).
    lr_table  =   cl_abap_tabledescr=>create( lr_stru ).

    CREATE DATA lr_any_s TYPE HANDLE lr_stru.
    ASSIGN lr_any_s->* TO <fs_tab>.

    CREATE DATA lr_any_t TYPE HANDLE lr_table.
    ASSIGN lr_any_t->* TO <ft_tab>.
  ENDIF.

  IMPORT tab = <ft_tab>[] FROM MEMORY ID 'ZDTR0780_V2'.
  FREE MEMORY ID 'ZDTR0780_V1'.
  FREE MEMORY ID 'ZDTR0780_V2'.
  MOVE-CORRESPONDING <ft_tab>[] TO gt_alv[].
ENDFORM.
View Code

ZFGTR_17_BILL_DETAIL

FUNCTION zfgtr_17_bill_detail.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  TABLES
*"      ET_RETURN STRUCTURE  BAPIRET2 OPTIONAL
*"      IT_ANY_TAB OPTIONAL
*"      IT_ANY_TAB_01 OPTIONAL
*"----------------------------------------------------------------------
*  如何传递动态内表数据:
*
*  1.发送方根据动态内表记录重新生成新的内表结构体,并将动态数据转换到新的内表,传值两个记录表:结构体,数据记录。
*
*  2.接收方根据结构体重新生成新的内表,根据新生成内表接收数据。

  DATA:
    lr_any_t TYPE REF TO data,
    lr_any_s TYPE REF TO data.
  DATA:
    lr_dref  TYPE REF TO data,
    lr_stru  TYPE REF TO cl_abap_structdescr,
    lr_table TYPE REF TO cl_abap_tabledescr,
    lr_elem  TYPE REF TO cl_abap_elemdescr,
    lt_para  TYPE cl_abap_structdescr=>component_table,
    lt_comp  TYPE cl_abap_structdescr=>component_table.
  FIELD-SYMBOLS:
    <fs_tab> TYPE any,
    <ft_tab> TYPE STANDARD TABLE.

  TRY.
      lr_stru ?= cl_abap_tabledescr=>describe_by_data( it_any_tab_01 ).
*       LOOP AT lr_stru->components[] INTO DATA(ls_comps).
      DATA ls_comps like LINE OF lr_stru->components[].
      LOOP AT lr_stru->components[] INTO ls_comps.
        IF ls_comps-type_kind = 'P'
        OR ls_comps-type_kind = 'X'.
        ELSE.
          ls_comps-length = ls_comps-length / 2.
        ENDIF.

        APPEND INITIAL LINE TO lt_comp ASSIGNING FIELD-SYMBOL(<fs_comp>).
        <fs_comp>-name  =   ls_comps-name.
        <fs_comp>-type  ?=  cl_abap_elemdescr=>get_by_kind(
        p_type_kind = ls_comps-type_kind
        p_length = ls_comps-length
        p_decimals = ls_comps-decimals  ).
        UNASSIGN <fs_comp>.
      ENDLOOP.

      IF lt_comp[] IS NOT INITIAL.
        CLEAR:lr_stru,lr_table.
        lr_stru   =   cl_abap_structdescr=>create( lt_comp ).
        lr_table  =   cl_abap_tabledescr=>create( lr_stru ).

        CREATE DATA lr_any_s TYPE HANDLE lr_stru.
        ASSIGN lr_any_s->* TO <fs_tab>.

        CREATE DATA lr_any_t TYPE HANDLE lr_table.
        ASSIGN lr_any_t->* TO <ft_tab>.
      ENDIF.

      MOVE-CORRESPONDING it_any_tab_01[] TO <ft_tab>[].

      FREE MEMORY ID 'ZDTR0780_V1'.
      FREE MEMORY ID 'ZDTR0780_V2'.
      EXPORT tab = lr_stru->components  TO MEMORY ID 'ZDTR0780_V1'.
      EXPORT tab = <ft_tab>[]           TO MEMORY ID 'ZDTR0780_V2'.
*      SUBMIT zdtr0780 AND RETURN.
    CATCH cx_root INTO DATA(lr_root).
      DATA(lv_msg) = lr_root->get_text( ).
*      PERFORM frm_public_message_get
*      TABLES  et_return
*      USING   'ZMCTR0040' '000' 'E'
*            lv_msg
*            space
*            space
*            space.
  ENDTRY.
ENDFUNCTION.
FORM frm_get_data .
  DATA:
    lr_any_t TYPE REF TO data,
    lr_any_s TYPE REF TO data.
  DATA:
    lr_dref  TYPE REF TO data,
    lr_stru  TYPE REF TO cl_abap_structdescr,
    lr_table TYPE REF TO cl_abap_tabledescr,
    lr_elem  TYPE REF TO cl_abap_elemdescr,
    lt_para  TYPE cl_abap_structdescr=>component_table,
    lt_comp  TYPE cl_abap_structdescr=>component_table.
  DATA:
        lt_comps  TYPE TABLE OF abap_compdescr.
  FIELD-SYMBOLS:
    <fs_tab> TYPE any,
    <ft_tab> TYPE STANDARD TABLE.

  IMPORT tab = lt_comps FROM MEMORY ID 'ZDTR0780_V1'.

  LOOP AT lt_comps INTO DATA(ls_comps).
    IF ls_comps-type_kind = 'P'
    OR ls_comps-type_kind = 'X'.
    ELSE.
      ls_comps-length = ls_comps-length / 2.
    ENDIF.

    APPEND INITIAL LINE TO lt_comp ASSIGNING FIELD-SYMBOL(<fs_comp>).
    <fs_comp>-name  =   ls_comps-name.
    <fs_comp>-type  ?=  cl_abap_elemdescr=>get_by_kind(
    p_type_kind  = ls_comps-type_kind
    p_length     = ls_comps-length
    p_decimals   = ls_comps-decimals ).
    UNASSIGN <fs_comp>.
  ENDLOOP.

  IF lt_comp[] IS NOT INITIAL.
    CLEAR:lr_stru,lr_table.
    lr_stru   =   cl_abap_structdescr=>create( lt_comp ).
    lr_table  =   cl_abap_tabledescr=>create( lr_stru ).

    CREATE DATA lr_any_s TYPE HANDLE lr_stru.
    ASSIGN lr_any_s->* TO <fs_tab>.

    CREATE DATA lr_any_t TYPE HANDLE lr_table.
    ASSIGN lr_any_t->* TO <ft_tab>.
  ENDIF.

  IMPORT tab = <ft_tab>[] FROM MEMORY ID 'ZDTR0780_V2'.
  FREE MEMORY ID 'ZDTR0780_V1'.
  FREE MEMORY ID 'ZDTR0780_V2'.
*  MOVE-CORRESPONDING <ft_tab>[] TO gt_alv[].
ENDFORM.
View Code

 动态SQL以及校验

DATA:lv_message(255).
DEFINE macro_msg.
IF &1 = 'E'.
&2-sep_flag = icon_red_light.
ELSEIF  &1 = 'S'.
&2-sep_flag = icon_green_light.
ELSEIF  &1 = 'W'.
&2-sep_flag = icon_yellow_light.
ENDIF.
CONCATENATE &2-msg ' & ' &3 INTO &2-msg.
CLEAR:lv_message.
END-OF-DEFINITION.
DATA formula TYPE string.
DATA result TYPE menge_d.
DATA:p1 TYPE menge_d,p2 TYPE menge_d,p3 TYPE menge_d,p4 TYPE menge_d,p5 TYPE menge_d,p6 TYPE menge_d,p7 TYPE menge_d,p8 TYPE menge_d.

INITIALIZATION.
func1 = '医生'.
func2 = '咨询'.

START-OF-SELECTION.

*---------------------------------------------------------------------*
* 取数
*---------------------------------------------------------------------*
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_zmc_tygh FROM  zmc_tygh .
SORT gt_zmc_tygh BY ygid.

*---------------------------------------------------------------------*
* 公共部分
*---------------------------------------------------------------------*
gv_form_pernr_check = 'B_CHECK_PERNR'.
formula = p1 + p2 * p3.
IF func1 = 'X'..
PERFORM a_get_data TABLES gt_doctor USING 'ZMCT_DOCTOR'.
ELSE.
PERFORM a_get_data TABLES gt_consault USING 'ZMCT_ZX'.
ENDIF.

*---------------------------------------------------------------------*
* 校验
*---------------------------------------------------------------------*
LOOP AT gt_doctor INTO gs_doctor.
CLEAR:resul.
PERFORM (gv_form_pernr_check) IN PROGRAM (sy-repid) CHANGING gs_doctor   IF FOUND.

p1 = '900'.  p2 = 7.  p3 = 2.
PERFORM dynamicformula(zabap_sedi_forms)  USING formula  p1  p2  p3  p4  p5  p6  p7  p8  result.
MODIFY gt_doctor  FROM gs_doctor.CLEAR gs_doctor.
ENDLOOP.


LOOP AT gt_consault INTO gs_consault.
PERFORM (gv_form_pernr_check) IN PROGRAM (sy-repid) CHANGING gs_consault   IF FOUND.
MODIFY gt_consault  FROM gs_consault.CLEAR gs_consault.
ENDLOOP.


*&---------------------------------------------------------------------*
*&      FORM  A_GET_DATA
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->CT_TABLE   TEXT
*      -->IV_TABNAME TEXT
*----------------------------------------------------------------------*
FORM a_get_data  TABLES ct_table
USING  iv_tabname TYPE tabname.
SELECT * INTO CORRESPONDING FIELDS OF TABLE ct_table
FROM (iv_tabname)
WHERE jgbm   IN s_jgbm1
AND zmc_mblx IN s_mblx1
AND zmc_mbbb IN s_mbbb1
AND gjahr    IN s_gjahr1
AND smon     IN s_smon1
.
ENDFORM.                    "FRM_GET_DATA_FROM_TABLE

*&---------------------------------------------------------------------*
*&      FORM  B_CHECK_DOCTOR_PERNR
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      <--P_GS_TABLE  TEXT
*----------------------------------------------------------------------*
FORM b_check_pernr  CHANGING gs_doctor TYPE typ_doctor.
READ TABLE gt_zmc_tygh   WITH KEY ygid = gs_doctor-pernr    .
IF sy-subrc NE 0.
MESSAGE e017(zmc_goal)   INTO lv_message.
macro_msg   'E'  gs_doctor  lv_message  .
ENDIF.
ENDFORM.                    " B_CHECK_DOCTOR_PERNR

 
View Code

 动态类/函数模块使用动态传参示例

 

METHOD determine_mat_sublelvel.
  DATA: table_type TYPE REF TO cl_abap_tabledescr,
        stru_type TYPE REF TO cl_abap_structdescr,
        ref_stru TYPE REF TO data.

  FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE,
                 <fs_stru> TYPE any,
                 <fs_field> TYPE any.

  "Dynamic Object Assign
  ASSIGN et_data TO <fs_table>.

  "Get Importing data Struture
  table_type ?= cl_abap_typedescr=>describe_by_data( <fs_table> ).
  stru_type ?= table_type->get_table_line_type( ).

  "Create Dynamic Object & Assign
  CREATE DATA ref_stru TYPE HANDLE stru_type.
  ASSIGN ref_stru->* TO <fs_stru>.

  "Process
*  <fs_table>      "动态传入的表
*  <fs_stru>       "动态传入的表的结构
ENDMETHOD.
View Code

 动态read

DATA:fl1  TYPE char20.  DATA:fl2  TYPE char20.  DATA:fl3  TYPE char20.
DATA:cl1  TYPE char20.  DATA:cl2  TYPE char20.  DATA:cl3  TYPE char20.DATA:cl4  TYPE char20.  DATA:cl5  TYPE char20.
DATA:gv_level  TYPE I.


  fl1 = 'ZZ1JFL  '.fl2 = 'ZZ2JFL  '. fl3 = 'ZZ3JFL  '.
  cl1 = 'ZZCLL1'  .cl2 = 'ZZCLL2'  . cl3 = 'ZZCLL3'  .  cl4 = 'ZZCLL4'.cl5 = 'ZZCLL5'.
  
PERFORM frm_find_zxpl TABLES it_plxx  CHANGING  ls_fl_info ev_zzxpl ev_zplwb.

IF ev_zzxpl IS INITIAL.
  ev_message = '没有查询到记录'.
ENDIF.
*&---------------------------------------------------------------------*
*&      Form  frm_find_zxpl
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->IT_PLXX    text
*      -->LS_FL_INFO text
*      -->EV_ZZXPL   text
*      -->EV_ZPLWB   text
*----------------------------------------------------------------------*
FORM frm_find_zxpl  TABLES    it_plxx STRUCTURE  zmct_plxx
CHANGING  ls_fl_info TYPE    zmcs_flxx1
  ev_zzxpl
  ev_zplwb.


  READ TABLE it_plxx   WITH KEY      (fl1) =  ls_fl_info-zz1jfl
  (fl2) =  ls_fl_info-zz2jfl
  (fl3) =  ls_fl_info-zz3jfl
  (cl1) =  ls_fl_info-zzcll1
  (cl2) =  ls_fl_info-zzcll2
  (cl3) =  ls_fl_info-zzcll3
  (cl4) =  ls_fl_info-zzcll4
  (cl5) =  ls_fl_info-zzcll5  .
  IF sy-subrc = 0 .
    ev_zzxpl = it_plxx-zzxpl.
    ev_zplwb = it_plxx-zplwb.
    EXIT.
  ENDIF.

  gv_level = gv_level + 1.
  CASE gv_level.
  WHEN 1.
    CLEAR:cl5.
  WHEN 2.
    CLEAR:cl4.
  WHEN 3.
    CLEAR:cl3.
  WHEN 4.
    CLEAR:cl2.
  WHEN 5.
    CLEAR:cl1.
  WHEN OTHERS.
    EXIT.
  ENDCASE.

  PERFORM frm_find_zxpl TABLES it_plxx  CHANGING  ls_fl_info ev_zzxpl ev_zplwb.
ENDFORM.                    " FRM_FIND_ZXPL
View Code

read 所隐行巧妙用法

REPORT 1.
TABLES:bkpf.
TABLES:t001w.

PARAMETERS :p_jgbm type  t001w-werks OBLIGATORY   DEFAULT '6106'.
PARAMETERS :p_gjahr type bkpf-gjahr OBLIGATORY   DEFAULT '2023'.
PARAMETERS :p_monat type bkpf-monat OBLIGATORY   DEFAULT '04'.

TYPES:BEGIN OF typ_data,
  jgbm TYPE I,
  gjahr TYPE gjahr,
  monat TYPE monat,
  percentage TYPE menge_d.
TYPES:END OF typ_data.
DATA lt_data TYPE TABLE OF typ_data.
DATA lt_data2 TYPE TABLE OF typ_data WITH HEADER LINE.
DATA ls_data TYPE   typ_data.
START-OF-SELECTION.


lt_data = VALUE #( BASE lt_data
( jgbm = '6104'  gjahr = '2023'  monat = '10' )
( jgbm = '6103'  gjahr = '2023'  monat = '10' )
( jgbm = '6208'  gjahr = '2023'  monat = '8' )
( jgbm = '6128'  gjahr = '2023'  monat = '10' )

( jgbm = '6106'  gjahr = '2023'  monat = '04' )
( jgbm = '6106'  gjahr = '2023'  monat = '02' )
*( jgbm = '6106'  gjahr = '2023'  monat = '03' )
*( jgbm = '6106'  gjahr = '2023'  monat = '07' )
*( jgbm = '6106'  gjahr = '2023'  monat = '06' )
).

p_monat = p_monat + 1.
SORT lt_data by jgbm  gjahr monat.

*---------------------------------------------------------------------*
*  月份 大于输入日期则退出:目的就是找到自己的合适位置,放进去
*---------------------------------------------------------------------*
data:lv_je  type sy-tabix.
READ TABLE lt_data INTO ls_data binary search  WITH KEY
                                         jgbm = p_jgbm
                                         gjahr = p_gjahr
                                         monat = p_monat  transporting no fields .

READ TABLE lt_data  INDEX sy-tabix INTO ls_data.

  IF ls_data-jgbm = p_jgbm AND ls_data-gjahr = p_gjahr.
    WRITE:'找到了,退出'.
  ENDIF.
*cl_demo_output=>display( lt_data ).

*IF sy-subrc = 0 .
*  lv_je = sy-tabix.
* MOVE-CORRESPONDING ls_data to lt_data2.
* lt_data2-monat = p_monat.
* APPEND  lt_data2.
*ENDIF.
*
*INSERT   lt_data2  into lt_data   INDEX lv_je .
*  如果sy-subrc = 0. read index (sy-tabix+1) 读下一行。
*如果subrc<>0.read index sy-tabix
View Code

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.

submit alv

 常规-1

TABLES:t000.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS:
  s_mandt FOR t000-mandt ,"no INTERVALS,                   "客户端
  s_mtext FOR t000-mtext,                   "集团名
  s_logsys FOR t000-logsys.                 "逻辑系统
SELECTION-SCREEN END OF BLOCK b1.

"//---------------------------------------------------
DATA:seltab    TYPE TABLE OF rsparams,
      seltab_wa LIKE LINE OF seltab.
DATA: ls_data TYPE REF TO DATA.

DATA:lv_sel_low_exist_more(1).
DEFINE d_sel.
  CLEAR:lv_sel_low_exist_more.
  
  seltab_wa-SIGN = 'I' .
  seltab_wa-selname = &1 .
  seltab_wa-low = &2 .
  IF  &3  IS NOT INITIAL.
    seltab_wa-option = 'BT' .
    seltab_wa-high = &3 .
  ELSE.
    IF LINES( &4[] ) > 1.
      lv_sel_low_exist_more =  'X'.
    ELSE.
      seltab_wa-option = 'EQ' .
    ENDIF.
  ENDIF.

  IF &3 IS  INITIAL AND  &2 IS    INITIAL.
  ELSE.
    IF lv_sel_low_exist_more =  'X'..

      CLEAR:seltab_wa.
      LOOP AT &4.
        seltab_wa-SIGN = 'I' .
        seltab_wa-selname = &1 .
        seltab_wa-low = &2 .
        seltab_wa-option = 'EQ' .
        APPEND seltab_wa TO seltab..CLEAR seltab_wa.
      ENDLOOP.
    ELSE.
      APPEND seltab_wa TO seltab..CLEAR seltab_wa.
    ENDIF.
  ENDIF.
END-OF-DEFINITION.
  d_sel 'S_ZSTYPI' s_zstypi-low  s_zstypi-high S_ZSTYPI.
  
DEFINE d_sel_parameter.
  IF &1 IS NOT INITIAL.
    seltab_wa-SIGN = 'I' .
    seltab_wa-selname = &1 .
    seltab_wa-option = 'EQ' .
    seltab_wa-low = &2 .
    APPEND seltab_wa TO seltab..CLEAR seltab_wa.
  ENDIF.
END-OF-DEFINITION.
*       APPEND  seltab FROM VALUE  seltab( SIGN = 'I' selname = &1  option = 'EQ' )
  d_sel_parameter 'P_0YD' 'X'.

"//---------------------------------------------------
FIELD-SYMBOLS: <lt_data> TYPE ANY TABLE.
CALL METHOD cl_salv_bs_runtime_info=>set  "可以让被调用的ALV不显示出来
EXPORTING
  display  = ''
  metadata = '' " 防止基本信息(布局,字段目录等)被取到内存中
DATA     = 'X'. "迫使数据表导出到内存而不是显示报表

SUBMIT zmc_rfi_xdmx
WITH  SELECTION-TABLE seltab
AND RETURN.

*SUBMIT zsdr07 WITH s_zcxtgh-low = '2019093000001'   AND RETURN.
*GET_DATA() - 如果知道需要调用的ALV数据表的结构,可以使用这个方法。
*参数:
*    T_DATA - 输出参数数据表。
*    T_DATA_LINE - 如果执行的ALV有HEADER(可选)。

TRY .
  CALL METHOD cl_salv_bs_runtime_info=>get_data_ref
  IMPORTING
    r_data = ls_data
*       R_DATA_LINE =  "如果执行的ALV有HEADER的(可选)
    .
  ASSIGN ls_data->* TO <lt_data>.
CATCH cx_salv_bs_sc_runtime_info.
  MESSAGE 'UNABLE TO RETRIEVE ALV DATA' TYPE 'E'.
ENDTRY.
cl_salv_bs_runtime_info=>clear_all( )."此方法清除在set()方法设置的标志。如果之后本程序还需要显示其他ALV 那么这个方法尤为重要。如果不清除设置,你的ALV就不会被显示出来

DATA gt_zppt_b001_yg LIKE TABLE OF zppt_b001_yg WITH HEADER LINE.
FIELD-SYMBOLS:<af1> TYPE ANY  .
IF <lt_data> IS ASSIGNED.
  LOOP AT <lt_data> ASSIGNING <af1>.
    gt_zppt_b001_yg = corresponding #( <af1> ).
    APPEND  gt_zppt_b001_yg.CLEAR gt_zppt_b001_yg.
  ENDLOOP.
ENDIF.
View Code

常规-2 封装调用

INCLUDE zabap_pool.
DATA:lt_submit_alv TYPE TABLE OF ty_tab WITH HEADER LINE.
iv_program = 'ZMCPRC1002'.
d_sel 'S_JGBM' s_jgbm-low  s_jgbm-high s_jgbm.
d_sel 'S_GJAHR' s_smon-low+0(4)  s_smon-high+0(4) s_gjahr.
d_sel 'S_MONAT' s_smon-low+4(2)  s_smon-high+4(2) s_monat.
d_sel 'S_SJLX'  'B'  s_sjlx-high s_sjlx.

* d_sel_parameter 'P_XD' 'X'.
APPEND LINES OF seltab TO it_parameters.
fs_data =  zcl_ck=>submit_alv( iv_program = iv_program  it_parameters  = it_parameters   )  .
ASSIGN fs_data->* TO <lt_data>.

LOOP AT <lt_data> ASSIGNING <ls_data>.
  MOVE-CORRESPONDING <ls_data> TO lt_submit_alv.
  APPEND lt_submit_alv.CLEAR lt_submit_alv.
ENDLOOP.
METHOD SUBMIT_ALV.
  FIELD-SYMBOLS: <lt_data> TYPE ANY TABLE.
  DATA: ls_data TYPE REF TO data.
  CALL METHOD cl_salv_bs_runtime_info=>set  "可以让被调用的ALV不显示出来
    EXPORTING
      display  = ''
      metadata = '' " 防止基本信息(布局,字段目录等)被取到内存中
      data     = 'X'. "迫使数据表导出到内存而不是显示报表

  SUBMIT  (iv_program)
  WITH  SELECTION-TABLE it_parameters
  AND RETURN.

  TRY .
      CALL METHOD cl_salv_bs_runtime_info=>get_data_ref
        IMPORTING
          r_data = fs_data.
      ASSIGN fs_data->* TO <lt_data>.
    CATCH cx_salv_bs_sc_runtime_info.
      MESSAGE 'UNABLE TO RETRIEVE ALV DATA' TYPE 'E'.
  ENDTRY.
  cl_salv_bs_runtime_info=>clear_all( )."


"//-----------------demo代码----------------------------------
*   INCLUDE zabap_pool.
*  DATA:lt_submit_alv TYPE TABLE OF ty_tab WITH HEADER LINE.
*  iv_program = 'ZMCPRC1002'.
*  d_sel 'S_JGBM' s_jgbm-low  s_jgbm-high s_jgbm.
*  d_sel 'S_GJAHR' s_smon-low+0(4)  s_smon-high+0(4) s_gjahr.
*  d_sel 'S_MONAT' s_smon-low+4(2)  s_smon-high+4(2) s_monat.
*  d_sel 'S_SJLX'  'B'  s_sjlx-high s_sjlx.
*
** d_sel_parameter 'P_XD' 'X'.
*  APPEND LINES OF seltab TO it_parameters.
*  fs_data =  zcl_ck=>submit_alv( iv_program = iv_program  it_parameters  = it_parameters   )  .
*  ASSIGN fs_data->* TO <lt_data>.
*
*  LOOP AT <lt_data> ASSIGNING <ls_data>.
*    MOVE-CORRESPONDING <ls_data> TO lt_submit_alv.
*    APPEND lt_submit_alv.CLEAR lt_submit_alv.
*  ENDLOOP.
"//-----------------demo代码----------------------------------


**&---------------------------------------------------------------------*
**&  Include           ZABAP_POOL
**&---------------------------------------------------------------------*
*  DATA:lv_sel_low_exist_more(1).
*  DATA:gv_cs TYPE I.
*  DEFINE d_sel.
*    LOOP AT &4.
*      gv_cs = gv_cs + 1.
*      seltab_wa-selname = &1 .
*      MOVE-corresponding &4 TO seltab_wa.
*      APPEND seltab_wa TO seltab..CLEAR seltab_wa.
*    ENDLOOP.
*    IF sy-subrc NE 0 .
*      CLEAR:lv_sel_low_exist_more.
*
*      seltab_wa-SIGN = 'I' .
*      seltab_wa-selname = &1 .
*      seltab_wa-low = &2 .
*      IF  &3  IS NOT INITIAL.
*        seltab_wa-option = 'BT' .
*        seltab_wa-high = &3 .
*      ELSE.
*        IF LINES( &4[] ) > 1.
*          lv_sel_low_exist_more =  'X'.
*        ELSE.
*          seltab_wa-option = 'EQ' .
*        ENDIF.
*      ENDIF.
*      IF &3 IS  INITIAL AND  &2 IS    INITIAL.
*      ELSE.
*        IF lv_sel_low_exist_more =  'X'..
*          CLEAR:seltab_wa.
*          LOOP AT &4.
*            seltab_wa-SIGN = 'I' .
*            seltab_wa-selname = &1 .
*            seltab_wa-low = &2 .
*            seltab_wa-option = &4-option .
*            APPEND seltab_wa TO seltab..CLEAR seltab_wa.
*          ENDLOOP.
*        ELSE.
*          APPEND seltab_wa TO seltab..CLEAR seltab_wa.
*        ENDIF.
*      ENDIF.
*    ENDIF.
*  END-OF-DEFINITION.
*  DEFINE d_sel_parameter.
*    IF &1 IS NOT INITIAL.
*      seltab_wa-SIGN = 'I' .
*      seltab_wa-selname = &1 .
*      seltab_wa-option = 'EQ' .
*      seltab_wa-low = &2 .
*      APPEND seltab_wa TO seltab..CLEAR seltab_wa.
*    ENDIF.
*  END-OF-DEFINITION.
*  FIELD-SYMBOLS: <lt_data> TYPE ANY TABLE.
*  FIELD-SYMBOLS: <ls_data> TYPE ANY  .
*  DATA: fs_data TYPE REF TO DATA.
*  DATA:seltab    TYPE TABLE OF rsparams,
*        seltab_wa LIKE LINE OF seltab.
*  DATA:it_parameters TYPE ztt_rsparams.
*  DATA:is_parameters TYPE rsparams.
*  DATA:iv_program TYPE name..
ENDMETHOD.
View Code

动态选择屏幕alv

REPORT 1.

*DEBUG发现,SUBMIT指定的动态条件带不到程序中
*前台输进去的动态条件却有

TYPE-POOLs RSDS.
DATA: ls_dyns TYPE rsds_type.
DATA: lt_trange TYPE rsds_trange WITH HEADER LINE.
DATA: lt_frange TYPE TABLE OF rsds_frange WITH HEADER LINE.
DATA: lt_selopt TYPE TABLE OF rsdsselopt WITH HEADER LINE.

lt_selopt-SIGN   = 'I'.
lt_selopt-option = 'EQ'.
lt_selopt-low    = '20230808'.
APPEND lt_selopt.

lt_frange-fieldname = 'BLDAT'.
lt_frange-selopt_t  = lt_selopt[].
APPEND lt_frange.

lt_trange-tablename = 'BSIS_FS'.
lt_trange-frange_t  = lt_frange[].
APPEND lt_trange.

ls_dyns-trange = lt_trange[].

SUBMIT fagl_account_items_gl
WITH sd_bukrs-low = '6101'
WITH so_wlsak-low = '10010003'
WITH fs_dyns      = ls_dyns.
View Code

给动态选择屏幕赋值

REPORT 1.

type-POOLs RSDS.
DATA: ls_dyns   TYPE rsds_type.
DATA: lt_trange TYPE rsds_trange WITH HEADER LINE.
DATA: lt_frange TYPE TABLE OF rsds_frange WITH HEADER LINE.
DATA: lt_selopt TYPE TABLE OF rsdsselopt WITH HEADER LINE.
DATA: lt_field  TYPE rsdsfields_t WITH HEADER LINE.
DATA: lv_num    LIKE sy-tfill.

lt_selopt-SIGN   = 'I'.
lt_selopt-option = 'EQ'.
lt_selopt-low    = '20230808'.
APPEND lt_selopt.

lt_frange-fieldname = 'BLDAT'.
lt_frange-selopt_t  = lt_selopt[].
APPEND lt_frange.

lt_trange-tablename = 'BSIS_FS'.
lt_trange-frange_t  = lt_frange[].
APPEND lt_trange.

ls_dyns-trange = lt_trange[].

CALL FUNCTION 'FREE_SELECTIONS_RANGE_2_WHERE'
EXPORTING
  field_ranges  = ls_dyns-trange
IMPORTING
  where_clauses = ls_dyns-clauses.
CALL FUNCTION 'FREE_SELECTIONS_RANGE_2_EX'
EXPORTING
  field_ranges = ls_dyns-trange
IMPORTING
  expressions  = ls_dyns-texpr.

lt_field-tablename = 'BSIS_FS'.
lt_field-fieldname = 'BLDAT'.
APPEND lt_field.
lv_num = 1.

SUBMIT fagl_account_items_gl
WITH sd_bukrs-low = '6900'
WITH fs_dyns      = ls_dyns
WITH fs_num       = lv_num
WITH fs_field     = lt_field[]
VIA SELECTION-SCREEN.
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.


后台设置

用程序创建:

 
DEFINE macro_record_message.
  gt_msg-type = &1.
  gt_msg-message = &2.
  append gt_msg.
END-OF-DEFINITION.
DATA: l_status TYPE tbtco-status.
DATA: gt_msg TYPE TABLE OF bapiret2 WITH HEADER LINE.
DATA: ls_job TYPE tbtcjob.
DATA: lt_list TYPE TABLE OF tbtcstep WITH HEADER LINE.
DATA: g_progname_trans_job TYPE progname VALUE 'ZCOR_HISTORY_COST'.



SELECT SINGLE status INTO l_status FROM tbtco WHERE jobname = g_progname_trans_job AND status = 'S' AND ( sdlstrtdt > sy-datum OR ( sdlstrtdt = sy-datum AND sdlstrttm > sy-uzeit ) ) AND authckman = sy-mandt.
IF sy-subrc = 0.  "检查有没有已经计划的JOB
  macro_record_message: 'S' 'JOB已存在,无需重复创建'.
  EXIT.
ENDIF.

CLEAR: ls_job, lt_list, lt_list[].
ls_job-jobname    =   g_progname_trans_job..
CONCATENATE sy-uzeit '00' INTO ls_job-jobcount.
ls_job-intreport  = '%NEWSTEP'.
ls_job-stepcount  = 1.
ls_job-sdlstrtdt  = sy-datum.
ls_job-sdlstrttm  = sy-uzeit + 30.
*ls_job-prdmins    = 30.    "每隔三十分钟
*ls_job-periodic   = 'X'.
ls_job-status     = 'S'.
ls_job-jobclass   = 'C'.

lt_list-program   = g_progname_trans_job.
*  lt_list-PARAMETER = rt_kunr-low."变式
lt_list-parameter =  'CK'.."变式
lt_list-typ       = 'A'.
lt_list-authcknam = sy-uname.
lt_list-language  = sy-langu.
lt_list-status    = 'P'.
APPEND lt_list.

CALL FUNCTION 'BP_JOB_CREATE'
  EXPORTING
    job_cr_dialog       = 'N'
    job_cr_head_inp     = ls_job
  TABLES
    job_cr_steplist     = lt_list[]
  EXCEPTIONS
    cant_create_job     = 1
    invalid_dialog_type = 2
    invalid_job_data    = 3
    job_create_canceled = 4
    OTHERS              = 5.
IF sy-subrc <> 0.
  macro_record_message: 'E'  'JOB创建失败,请手工创建JOB'.
ELSE.
  COMMIT WORK.
  macro_record_message: 'S' 'JOB创建成功'.
ENDIF.
COMMIT WORK AND WAIT.
View Code

手动创建:

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

 

 

 

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

 

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

 

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

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

 

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

 

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

 

然后保存即可。

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

 

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

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

七、

调用后台job

"注:后台运行的标记为SY-BATCH = 'X'

FORM FRM_CREATE_JOB.
  DATA: L_JOBNUMBER TYPE BTCJOBCNT.
  DATA: L_JOBNAME   TYPE BTCJOB VALUE 'Z05HR_BONUS_CALC_JOB'.
  "检查权限
  AUTHORITY-CHECK OBJECT 'S_BTCH_ADM' FOR USER SY-UNAME ID 'BTCADMIN' FIELD 'Y'.

  IF SY-SUBRC NE 0.

    MESSAGE S017 DISPLAY LIKE 'E'.

  ELSE.

    CALL FUNCTION 'JOB_OPEN'
      EXPORTING
        JOBNAME          = L_JOBNAME
      IMPORTING
        JOBCOUNT         = L_JOBNUMBER
      EXCEPTIONS
        CANT_CREATE_JOB  = 1
        INVALID_JOB_DATA = 2
        JOBNAME_MISSING  = 3
        OTHERS           = 4.

    IF SY-SUBRC = 0.

      SUBMIT Z05HR_BONUS_CALC_JOB USER SY-UNAME
        VIA JOB L_JOBNAME NUMBER L_JOBNUMBER
        AND RETURN
        WITH P_WSBM   = GC_WSBM
        WITH P_YWDW   = P_YWDW
        WITH P_KSRQ   = P_KPZQ-LOW
        WITH P_JZRQ   = P_KPZQ-HIGH
        WITH P_DWJS   = P_DWJS
        WITH P_CHUSHI = GW_CHUSHI
        WITH P_FLAG   = G_FLAG_CHUSHI
        WITH P_JOBNUM = L_JOBNUMBER.

      IF SY-SUBRC = 0.
        CALL FUNCTION 'JOB_CLOSE'
          EXPORTING
            JOBCOUNT             = L_JOBNUMBER
            JOBNAME              = L_JOBNAME
            STRTIMMED            = 'X'
          EXCEPTIONS
            CANT_START_IMMEDIATE = 1
            INVALID_STARTDATE    = 2
            JOBNAME_MISSING      = 3
            JOB_CLOSE_FAILED     = 4
            JOB_NOSTEPS          = 5
            JOB_NOTEX            = 6
            LOCK_FAILED          = 7
            OTHERS               = 8.
      ENDIF.

    ENDIF.

  ENDIF.

ENDFORM.                    "FRM_CREATE_JOB
View Code

批导

*&---------------------------------------------------------------------*
*& 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=DEV -client=210 -user=CHENK -pw=1qaz2wsx. -GuiSize=Maximized -language=ZH

 跨client数据拷贝

函数

FUNCTION zrfc_get_dbdata .
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     VALUE(IV_TABNAME) TYPE  DNTAB-TABNAME
*"  EXPORTING
*"     VALUE(EV_JSON) TYPE  STRING
*"----------------------------------------------------------------------
  TYPE-POOLS:abap.

  DATA: dyn_table TYPE REF TO data.
  DATA: dyn_wa TYPE REF TO data.

  FIELD-SYMBOLS :
    <dyn_table> TYPE table,
    <dyn_wa> TYPE ANY.


*指定生成的内表到字段符号
  CREATE DATA dyn_table TYPE TABLE OF (iv_tabname).
  ASSIGN dyn_table->* TO <dyn_table>.
  CREATE DATA dyn_wa LIKE LINE OF <dyn_table>.
  ASSIGN dyn_wa->* TO <dyn_wa>.


*从动态表中取数到动态内表中
  SELECT * INTO CORRESPONDING FIELDS OF TABLE <dyn_table> FROM (iv_tabname).
  IF sy-subrc = 0.
    "转换JSON输出
    ev_json = zui2_json=>serialize( data = <dyn_table>  ).
  ENDIF.
ENDFUNCTION.
View Code
*&---------------------------------------------------------------------*
*& Report  ZFIR_DBCOPY
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zfir_dbcopy.
TABLES:dd02l,zfit_cond_comb.
DATA: lt_table LIKE TABLE OF dntab.
DATA: ls_table TYPE dntab.
TYPES:BEGIN OF ty_tname,
      tabname TYPE dd02l-tabname,
     END OF ty_tname.
DATA: lt_tname TYPE TABLE OF ty_tname ,
      ls_tname TYPE ty_tname.
DATA: dyn_table TYPE REF TO data.
DATA: dyn_wa TYPE REF TO data.
DATA: d_ref TYPE REF TO data,
      lt_alv_cat TYPE TABLE OF lvc_s_fcat,
      ls_alv_cat LIKE LINE OF lt_alv_cat.
DATA: lv_json TYPE string.
FIELD-SYMBOLS :
  <dyn_table> TYPE table,
  <dyn_wa> TYPE ANY,
  <dyn_field> TYPE ANY,
  <fs_jgbm> TYPE ANY,
  <fs_str> TYPE ANY.

SELECTION-SCREEN BEGIN OF BLOCK b1.
SELECT-OPTIONS:s_jgbm FOR zfit_cond_comb-jgbm NO INTERVALS, " NO-EXTENSION
               s_name FOR dd02l-tabname NO INTERVALS.
PARAMETERS:p_from TYPE sy-mandt,
           p_to   TYPE sy-mandt.
SELECTION-SCREEN END OF BLOCK b1.


INITIALIZATION.


START-OF-SELECTION.

  PERFORM frm_auth_check.

  IF p_to NE sy-mandt.
    MESSAGE '请在目标client运行此程序' TYPE 'E'.
  ENDIF.

  SELECT tabname INTO TABLE lt_tname FROM dd02l WHERE tabname IN s_name.

  LOOP AT lt_tname INTO ls_tname.

*指定生成的内表到字段符号
    CREATE DATA dyn_table TYPE TABLE OF (ls_tname-tabname).
    ASSIGN dyn_table->* TO <dyn_table>.
    CREATE DATA dyn_wa LIKE LINE OF <dyn_table>.
    ASSIGN dyn_wa->* TO <dyn_wa>.

    CLEAR lv_json.
    IF p_to = '210'.                                        "866 到 210
      CALL FUNCTION 'ZRFC_GET_DBDATA'
      DESTINATION 'PRD_GROUP'
        EXPORTING
          iv_tabname = ls_tname-tabname
        IMPORTING
          ev_json = lv_json.
    ELSEIF p_to = '866'.                                    "210 到 866
    ENDIF.

    "json to tab
    CALL METHOD zui2_json=>deserialize
    EXPORTING
      json = lv_json
    CHANGING
      data = <dyn_table>.

    IF p_to = '866'.
      LOOP AT s_jgbm.
        LOOP AT <dyn_table> ASSIGNING <dyn_wa>.
          ASSIGN COMPONENT 'JGBM' OF STRUCTURE <dyn_wa> TO <fs_jgbm>.
          IF <fs_jgbm> NE s_jgbm-low.
            CONTINUE.
          ENDIF.
          ASSIGN COMPONENT 'MANDT' OF STRUCTURE <dyn_wa> TO <fs_str>.
          <fs_str> = p_to.
        ENDLOOP.
      ENDLOOP.
    ELSEIF p_to = '210'.
      LOOP AT <dyn_table> ASSIGNING <dyn_wa>.
        ASSIGN COMPONENT 'MANDT' OF STRUCTURE <dyn_wa> TO <fs_str>.
        <fs_str> = p_to.
      ENDLOOP.
    ENDIF.


    MODIFY (ls_tname-tabname)  CLIENT SPECIFIED FROM TABLE <dyn_table>.
    IF sy-subrc = 0.
      WRITE:/  ls_tname-tabname , ' copy successfully'.
    ELSE.
      WRITE:/  ls_tname-tabname , ' copy failed'.
    ENDIF.

    CLEAR: ls_tname,lt_table,ls_table,lt_alv_cat,ls_alv_cat.
    FREE d_ref.
  ENDLOOP.
*&---------------------------------------------------------------------*
*&      Form  FRM_AUTH_CHECK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_auth_check .
  "权限检查
  DATA:lv_flag TYPE c.

  PERFORM frm_check_qxsz(zhrf_0002) TABLES s_jgbm
                         USING ''
                         CHANGING lv_flag.
  IF lv_flag = 'X'.
    LEAVE LIST-PROCESSING.
  ENDIF.
ENDFORM.                    " FRM_AUTH_CHECK
View Code

 

posted @ 2019-01-15 15:31  蜡哲图  阅读(984)  评论(0)    收藏  举报
目录内容