ABAP随笔记

1、SAP表记录

1.1:非业务数据表

表名备注
DD02L/DD02T/DD03VTSAP底表数据&文本
USR02用户登陆数据(口令、状态等)
SMODILOG打开已被关闭的ABAP助手(SUB_NAME = 程序名 ,删除此条记录即可打开)
E070更改 & 运输系统: 请求/任务
TMCNV关物料号转换的数据表
AGR_USERS用户与角色的关联表,记录每个用户被分配的角色
AGR_TCODES角色对应事务表
TBTCO后台作业概述
TBTCS后台作业计划表

1.2:采购模块表

表名备注
MARA物料主数据基本视图
MARC物料主数据工厂视图
MARD物料主数据存储视图
MBEW物料主数据财务视图
MVKE物料销售数据
BUT000业务伙伴数据表
ADRC业务伙伴地址数据信息表
LFA1供应商主数据(一般数据)
LFB1供应商主数据(公司代码)
LFM1供应商采购组织数据
EINA采购信息记录(一般数据)
EINE采购信息记录(采购组织数据)
EKKO/EKPO采购订单抬头/行数据
EBAN采购申请数据
EKET计划协议计划行
EKBE采购凭证历史
MATDOC/MSEG/MKPF物料凭证
RBKP采购发票抬头数据
RSEG采购发票行数据
TB003I供应商BP角色

1.3:销售模块表

表名备注
VBAK/VBAP销售订单抬头/行数据
LIKP/LIPS交货单/交货单行数据
VBRK/VBRP销售发票/行
VBEP销售凭证计划行数据
VBKD销售凭证业务数据
VBPA销售凭证合作伙伴
VBFA销售凭证流
VBUK销售凭证:抬头状态和管理数据
VBUP销售凭证 : 项目状态
T682I条件:存取顺序( 产生格式 )
T681条件:结构
T682Z条件:存取顺序( 字段 )
T685条件:类型
KNA1客户主数据(一般数据)
KNB1客户主数据(公司代码)
KONV条件价格表(旧)
PRCD_ELEMENTS条件价格表(新)
KNVV客户主记录销售数据
UKMBP_CMS客户信用主数据
KNMT客户物料信息记录表

1.4:生产模块表

表名备注
AUFK/AFKO/AFPO订单主数据/抬头/行
JEST对象状态表
MASTBOM链接物料
STKOBOM表头
STPOBOM行
MKAL生产版本
PLAF计划订单
RKPF预定/相关需求抬头
RESB预定/相关需求行项目
AFVC订单的工序
AFVV工序中数量/日期/值的DB结构
AFUR订单报工计数器和确认号

1.5:财务块表

表名备注
BKPF/BSEG会计凭证
ACDOCA同一日记账
FAGLFLEXA/FAGLFLEXT记录分割行项目和分割汇总表的数据
SKA1总帐科目主记录 (科目表)
SKB1总帐科目主记录 (公司代码)
CSKB成本要素
ANLA资产主记录段
ANLC资产值字段
CSKS成本中心主数据
COEP成本控制对象:与期间相关的各行项目
COSSCO 对象:内部过帐成本总计
COSPCO 对象:外部记帐的成本总计
FMBDT财务管理预算总表
FMIT基金管理的总计表

2、SAP函数记录

常用函数记录

函数名描述事务码
OWN_LOGICAL_SYSTEM_GET获取当前逻辑系统

2.1、MM模块

函数名描述事务码
BAPI_GOODSMVT_CREATE物料凭证创建BAPIMIGO
BAPI_GOODSMVT_CREATE物料凭证冲销BAPIMIGO
BAPI_MATERIAL_SAVEDATA物料主数据创建-批量MM01
BAPI_MATERIAL_SAVEREPLICA物料主数据创建-单个MM01
BAPI_MATERIAL_GETINTNUMBER创建物料号(内部给好,单个物料号)MM01
BAPI_MATINSPCTRL_SAVEREPLICA扩充物料质量视图MM02
BAPI_OBJCL_CREATE扩充物料分类视图MM02
BAPI_MATERIAL_SAVEREPLICA扩充物料库存地点视图MM02
cl_md_bp_maintain=>maintain客商主数据创建BP
BAPI_BUPA_TAX_ADD客商税号新增BP
BAPI_BUPA_TAX_REMOVE客商税号删除BP
BAPI_BUPA_TAX_CHANGE客商税号修改BP
ME_INFORECORD_MAINTAIN采购信息记录创建ME11/ME12
ME_UPDATE_SOURCES_OF_SUPPLY维护货源清单ME01
ME_INITIALIZE_SOURCE_LIST初始化货源清单ME01
ME_DIRECT_INPUT_SOURCE_LIST创建货源清单ME01
ME_UPDATE_QUOTA配额创建MEQ1
BAPI_PR_CREATE采购申请创建ME51N
BAPI_PR_CHANGE采购申请修改ME52N
BAPI_REQUISITION_RELEASE_GEN采购申请审批ME29N
BAPI_REQUISITION_RESET_REL_GEN采购申请审批ME29N
BAPI_PO_CREATE1采购订单创建ME21N
BAPI_PO_CREATE采购订单创建ME21
MRM_SRM_INVOICE_SIMULATE采购发票模拟(可返回会计凭证数据,但是没有资产相关结构)MIR7/MIRO
BAPI_INCOMINGINVOICE_CREATE1采购发票创建+过账(可模拟,不返回会计凭证数据)MIRO
BAPI_INCOMINGINVOICE_CHANGE预制发票修改MIR7
BAPI_INCOMINGINVOICE_POST采购发票过账MIRO
BAPI_INCOMINGINVOICE_CANCEL采购发票冲销
BAPI_INCOMINGINVOICE_DELETE删除采购发票
BAPI_INCOMINGINVOICE_PARK创建预制发票MIR7
BAPI_RESERVATION_CREATE1创建预留MB21
BAPI_RESERVATION_CREATE(不推荐)创建预留MB21
BAPI_RESERVATION_DELETE预留删除MB22
BAPI_RESERVATION_CHANGE预留修改MB22
BAPI_MATVAL_PRICE_CHANGE更新物料标准价

2.2、财务模块

函数名描述事务码
BAPI_FIXEDASSET_CREATE1资产主数据创建AS01
BAPI_FIXEDASSET_CHANGE资产主数据修改AS02
BAPI_ASSET_TRANSFER_POST资产转移ABUMN
BAPI_ACC_DOCUMENT_POST创建会计凭证F-02
BAPI_ACC_DOCUMENT_CHECK会计凭证检查模拟F-02
BAPI_HOUSE_BANK_REPLICATE创建开户行创建开户行/银行账号
FCLM_BAM_ACCOUNT_CREATE创建银行账号
BAPI_ACC_DOCUMENT_REV_POST会计凭证冲销
BAPI_ASSET_ACQUISITION_POST资产盘盈(当前年度)
BAPI_ASSET_RETIREMENT_POST资产盘亏
BAPI_ASSET_REVALUATION_POST资产减值
BAPI_COSTCENTER_CHANGEMULTIPLE成本中心修改
BAPI_COSTCENTER_CREATEMULTIPLE成本中心创建
BAPI_PROFITCENTER_CREATE利润中心创建
BAPI_FIXEDASSET_OVRTAKE_CREATE创建资产卡片/维护价值
BAPI_FIXEDASSET_OVRTAKE_POST仅维护资产价值
FM_FUNDS_CENTER_UPDATE创建基金中心
FM_COMITEM_UPDATE创建承诺项目
GL_ACCT_MASTER_SAVE科目创建
BAPI_BANK_CREATE创建银行主数据
BAPI_BANK_CHANGE维护银行主数据

2.3、PS模块

函数名描述事务码
BAPI_BUS2001_CREATE创建项目CJ20N
BAPI_BUS2054_CREATE_MULTI创建WBSCJ20N
KBPP_EXTERN_UPDATE_CO维护项目预算/下达金额CJ30/CJ31/CJ32(根据预算类型区分)
KBPP_EXTERN_UPDATE预算转移CJ34

2.4、SD模块

函数名描述事务码
cl_md_bp_maintain=>maintain客户主数据创建BP
BAPI_BUPA_TAX_REMOVE删除客户主数据税类别BP
BAPI_BUPA_TAX_ADD新增客户主数据税类别BP
io_bupa_factory->get_credit_account维护客户主数据信用视图信用视图维护
BAPI_OUTB_DELIVERY_CHANGE交货单删除/修改(可批次拆分,但写入库存地点需要调用两次BAPI)VL02N
WS_DELIVERY_UPDATE交货单拣配VL02N
BAPI_OUTB_DELIVERY_CONFIRM_DEC交货单过账(需要做增强不然无法冲销已过帐的交货单)VL02N
WS_REVERSE_GOODS_ISSUE交货单冲销VL09
BAPI_BILLINGDOC_CREATEMULTIPLE销售发票创建VF01
BAPI_BILLINGDOC_CANCEL1删除发票VF02

3、SAP事务码记录

4:内表数据拼接

4.1、给内表加一个空行并修改他的值

  APPEND INITIAL LINE TO GT_ALV ASSIGNING FIELD-SYMBOL(<FS>) .

4.2、将内表数据拼接在一行

  CONCATENATE LINES OF GT_ZMTZBZ INTO LV_ZBZ SEPARATED BY '/'

4.3、将内表部分字段数据拼接在一行

  CONCATENATE LV_Z1 LV_Z2 INTO LV_ZBZ SEPARATED BY '/'.

4.4、两个内表数据拼接

  APPEND LINE OF GT_TAB1 TO GT_TAB2 .

5、Group By分组

常规分组

  LOOP AT gt_alv3 INTO gs_alv3 GROUP BY ( matnr = gs_alv3-matnr
                                          kostl = gs_alv3-kostl
                                          size  = GROUP SIZE )
                               ASSIGNING FIELD-SYMBOL(<lt_out>) .
    LOOP AT GROUP <lt_out> ASSIGNING FIELD-SYMBOL(<fs_out>) .
    ENDLOOP .
  ENDLOOP .

动态Group分组
可以用到SWITCH/COND关键字实现动态分组

"DEMO1
  DATA : lv_type TYPE c VALUE 'B'.
  ASSIGN lt_ekpo TO FIELD-SYMBOL(<dy_table>) .
  IF <dy_table> IS ASSIGNED .
    LOOP AT <dy_table> ASSIGNING FIELD-SYMBOL(<fs_ekko>)
                       GROUP BY SWITCH string( lv_type WHEN 'A' THEN <fs_ekko>-matnr
                                                       WHEN 'B' THEN <fs_ekko>-matkl )
  *                     GROUP BY COND string(  WHEN lv_type = 'A' THEN <fs_ekko>-matnr
  *                                            WHEN lv_type = 'B' THEN <fs_ekko>-matkl )
      ASSIGNING FIELD-SYMBOL(<ft_group>) .
      LOOP AT GROUP <ft_group> ASSIGNING FIELD-SYMBOL(<fs_group>) .
      ENDLOOP .
    ENDLOOP .
  ENDIF .

"DEMO2
  LOOP AT gt_alv INTO gs_alv WHERE sel IS NOT INITIAL
                             GROUP BY SWITCH string( lv_buttom
                             WHEN 'A' THEN | vbeln = { gs_alv-vbeln } |
                             WHEN 'B' THEN | kunnr = { gs_alv-kunnr } vkorg  = { gs_alv-vkorg } kunnr2 = { gs_alv-kunnr2 } auart  = { gs_alv-auart } | )
                             ASSIGNING FIELD-SYMBOL(<ft_tab>) .

    LOOP AT GROUP <ft_tab> ASSIGNING FIELD-SYMBOL(<fs_tab>) .
    ENDLOOP .
    
  ENDLOOP .

6、查看表中的数据条目数

DESCRIBE TABLE LT_MARC LINES LV_TABIX .
DATA(LV_LINES) = LINES( GT_ALV )

7、增删改查

UPDATA [TABLE] SET A = 1 .
MODIFY [TABLE] FROM [LS_TAB] .
MODIFY [TABLE] FROM [LS_TAB] TRANSPORTING [FIELD1] [FIELD2] .
APPEND [LS_TAB] TO [TABLE] .
APPEND LINE OF [TABLE1] TO [TABLE2] .
INSERT [LS_TAB] INTO [TABLE] INDEX 1 .
DELETE TABLE [TABLE] FROM [LS_TABLE] .
DELETE ADJACENT DUPLICATES FROM [TABLE] COMPARING [FIELD1] [FIELD2] .

8、常用小语法

"获取字符串长度
lv_len = cl_abap_list_utilities=>dynamic_output_length( lv_str ).

"字符串去空格
CONDENSE <字符串> NO-GAPS.

"选择屏幕添加文本
1SELECTION-SCREEN COMMENT 01(78) TEXT-001 .

"快捷输出简易ALV
cl_demo_output=>display( lt_table ).

9、新语发

历程转换
在这里插入图片描述
CORRESPONDING语句
在这里插入图片描述
VALUE 赋值
在这里插入图片描述
table读取

DATA(ls_ekko) = lt_ekko[ 11 ].       
DATA(lss_ekko) = lt_ekko[ ebeln = '4500000086' ].

读取的行如果不存在会DUMP,所以用这个语法的时候尽量配合TRY-CATCH一起

TRY.
    DATA(ls_ekko) = lt_ekko[ 11 ].
  CATCH cx_root INTO DATA(exception) .
    DATA(lv_message) = exception->get_text( ) .
ENDTRY.

此语法等价于read table

IF line_exists( lt_ekko[ ebeln = '' ] ) .
ENDIF .

此语法等价于read table …… TRANSPORTING NO FIELDS

汇总

    lv_menge = REDUCE #( INIT sum TYPE menge_d"定义求和的字段SUM类型QUAN,名字随便
                       FOR ls_mseg1 IN lt_mseg "创建一个工作区ls_wa对应内表
                       WHERE ( matnr = <gs_alv>-matnr ) "汇总如果有条件,可以添加汇总条件
                       NEXT sum = sum + ls_mseg1-menge )."把值和工作区wa取的值相加

10、财务替代校验

顾问创建出口
ZRGGBR000(校验)
ZRGGBS000(替代)

11、红绿灯

函数组:icon

12、submit调用程序

正常调用:

  cl_salv_bs_runtime_info=>set(
        display  = abap_true"abap_false(这个参数很SB,后面的ALV输出不了)
        metadata = abap_false
        data     = abap_true  ).

"获取数据

  SUBMIT rm07docs
        WITH budat BETWEEN lv_firday AND lv_lastday
        WITH bwart IN lr_bwart
        WITH rflat_l  = 'X'
        WITH database = 'X'
        EXPORTING LIST TO MEMORY
        AND RETURN.
  IF sy-subrc = 0 .
    TRY.
        cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lr_alv_data ) .
        ASSIGN lr_alv_data->* TO <lt_alv_data> .
        CLEAR :lr_alv_data .
      CATCH cx_salv_bs_sc_runtime_info.
        MESSAGE '查询结果为空!' TYPE 'E'.
    ENDTRY.
  ENDIF .

后台调用:

cl_salv_bs_runtime_info=>set(
        display  = abap_true
        metadata = abap_false
        data     = abap_true  ).

  CALL FUNCTION 'JOB_OPEN'
    EXPORTING
      jobname          = name
    IMPORTING
      jobcount         = number
    EXCEPTIONS
      cant_create_job  = 1
      invalid_job_data = 2
      jobname_missing  = 3
      OTHERS           = 4.
  IF sy-subrc = 0.
    SUBMIT ukm_rfdkli20
                           WITH sdchd = 'X'
                           WITH testlauf = ''
                           WITH pkunnr IN r_kunnr
                           WITH pkkber IN r_kkber
                           TO SAP-SPOOL
                           SPOOL PARAMETERS print_parameters
                           WITHOUT SPOOL DYNPRO
                           VIA JOB name NUMBER number
                           AND RETURN.
    IF sy-subrc = 0.
      CALL FUNCTION 'JOB_CLOSE'
        EXPORTING
          jobcount             = number
          jobname              = name
          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.
      IF sy-subrc = 0.
      ENDIF.
    ENDIF .
  ENDIF.

13、创建UUID

    TRY.
        lo_uuid = cl_uuid_factory=>create_system_uuid(  ).
        lv_uuid_x16 = lo_uuid->create_uuid_x16( ).
        lo_uuid->convert_uuid_x16(
          EXPORTING
            uuid     = lv_uuid_x16
          IMPORTING
            uuid_c26 = lv_uuid_c26 ).
      CATCH cx_uuid_error.
    ENDTRY.

DATA lo_uuid TYPE REF TO if_system_uuid.
DATA lv_uuid_x16 TYPE sysuuid_x16. " raw(16) -> data element GUID
DATA lv_uuid_c22 TYPE sysuuid_c22.
DATA lv_uuid_c32 TYPE sysuuid_c32.
DATA lv_uuid_c26 TYPE sysuuid_c26.

TRY.
    lo_uuid = cl_uuid_factory=>create_system_uuid(  ).
    lv_uuid_x16 = lo_uuid->create_uuid_x16( ).
    lo_uuid->convert_uuid_x16(
      EXPORTING
        uuid     = lv_uuid_x16
      IMPORTING
        uuid_c22 = lv_uuid_c22
        uuid_c32 = lv_uuid_c32
        uuid_c26 = lv_uuid_c26 ).
  CATCH cx_uuid_error. " Error Class for UUID Processing Errors
ENDTRY.

WRITE: / 'uuid_x16:', lv_uuid_x16.
WRITE: / 'uuid_c22:', lv_uuid_c22.
WRITE: / 'uuid_c32:', lv_uuid_c32.
WRITE: / 'uuid_c26:', lv_uuid_c26.

14、查找关键字在那个程序中出现过

   执行程序:RS_ABAP_SOURCE_SCAN

15、动态调用函数模块

  DATA: lt_param TYPE abap_func_parmbind_tab,
        ls_param TYPE abap_func_parmbind,
        lt_excep TYPE abap_func_excpbind_tab,
        ls_excep TYPE abap_func_excpbind,

  DEFINE fill_func_parm.
    IF &3 IS NOT INITIAL.
      ls_param-name = &1.
      ls_param-kind = &2.
      GET REFERENCE OF &3 INTO ls_param-value.
      INSERT ls_param INTO TABLE lt_param.
      CLEAR ls_param.
    ENDIF.
  END-OF-DEFINITION.
  fill_func_parm:
                 gs_config-parm1 abap_func_exporting lv_key,
                 gs_config-parm2 abap_func_exporting lf_log->key2,
                 gs_config-parm3 abap_func_exporting lf_log->key3,
                 gs_config-parm4 abap_func_exporting lf_log->key4,
                 gs_config-parm5 abap_func_exporting lf_log->key5.
      CALL FUNCTION gs_config-zprogram
        PARAMETER-TABLE
        lt_param
        EXCEPTION-TABLE
        lt_excep.

16、读表不存工作区

READ TABLE XVBUV[] WITH KEY TBNAM = 'VBAP' FDNAM = 'NETWR' FEHGR = 'Y1' TRANSPORTING NO FIELDS .

17、复制表部分数据到新表


APPEND LINES OF 【Tab1】 FROM 1 TO 10 TO 【Tab2】 .

18、…

19、ABAP 字符串处理

"RESPECTING BLANKS:左对齐
CONCATENATE `bearer`  ' ' lv_base64 INTO token RESPECTING BLANKS.

"字符串替换
REPLACE ALL OCCURRENCES OF 'A' IN lv_string WITH 'B'.  (将lv_string 中所有A 换为B ) 
REPLACE ALL OCCURRENCES OF 'ABC' IN lv_string WITH space. (将lv_string 中 所有 ABC 换为 空 )

"字符串拼接
CONCATENATE t1 t2 INTO result. "直接拼接 
CONCATENATE t1 t2 INTO result SEPARATED BY space. "用空格将字符串连接

"字符串拆分
SPLIT text AT space INTO str1 str2. "根据空格将字符串拆分到str1 和str2中 

"字符转换
TRANSLATE text TO UPPER CASE. "转大写 
TRANSLATE text TO LOWER CASE. "转小写

"取字符长度
len = strlen( text ). "字符串长度

"字符串截取
subtext = text+0(5). "取左边5個字符('ABCDE') 
subtext = text+3(5). "从第四個字串起取5个字符('DEFGH) 
text+0(1) = 'Z'. "將第一个字符转为Z

"查找字符位置
SEARCH text FOR '='. "查找=在text中的位置
IF sy-subrc = 0.
  DATA(l_index) = sy-fdpos. "sy-fdpos的位置
ENDIF .
注意:sy-fdpos是从第0位开始的

"正则判断字符串
FIND FIRST OCCURRENCE OF REGEX '[^0-9]' IN wa_data-lfdat.“判断wa_data-lfdat中是否包含不是0-9的数字 
IF sy-subrc = 0.
Endif.

"字符串去空格
CONDENSE:重新整合分配字符串 
CONDENSE C <NO-GAPS> 

"字符串大小写转换
TRANSLATE 
TRANSLATE c TO UPPER CASE. "转大写 
TRANSLATE c TO LOWER CASE. "转小写 
TRANSLATE c USING c1. "用C1替换C 

"字符移动
"SHIFT:字符串整体或者字串进行转移. 
"如果SHIFT 操作的对象是 C类型, 则所有字节都会向前移动一位,最后一位用空格代替; 
"如果SHIFT操作的对象是String类型,则所有字符都会向前移动一位,最后一位删除; 
SHIFT c <LEFT/RIGHT/CIRCULAR>. 
SHIFT c BY n PLACES. 
SHIFT c UP TO c1.

20、金额大小写转换代码

FUNCTION yjezh.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(INPUT) TYPE  STRING OPTIONAL
*"  EXPORTING
*"     VALUE(OUTPUT) TYPE  CHAR100
*"----------------------------------------------------------------------
  DATA:s_zs TYPE spell,
       s_j  TYPE spell,
       s_f  TYPE spell,
       v_nu TYPE char30,
       v_zs TYPE char30,
       v_xs TYPE char30,
       v_j  TYPE char30,
       v_f  TYPE char30.

  v_nu = input.
  SPLIT v_nu AT '.' INTO v_zs v_xs.
  v_j = v_xs(1).
  v_f = v_xs+1(1).

  IF v_zs <> '0' .
    CALL FUNCTION 'SPELL_AMOUNT'
      EXPORTING
        language = '1'   "sy-langu"
        currency = sy-waers
        amount   = v_zs
        filler   = ' '
      IMPORTING
        in_words = s_zs.
  ENDIF.

  CALL FUNCTION 'SPELL_AMOUNT'
    EXPORTING
      language = '1'   "sy-langu"
      currency = sy-waers
      amount   = v_j
      filler   = ' '
    IMPORTING
      in_words = s_j.

  IF v_f <> '0' .
    CALL FUNCTION 'SPELL_AMOUNT'
      EXPORTING
        language = '1'   "sy-langu"
        currency = sy-waers
        amount   = v_f
        filler   = ' '
      IMPORTING
        in_words = s_f.
  ENDIF.

  IF s_j-word = '零' AND s_f-word = '零' .          "如果没有小数位数 如 11.00"
    CONCATENATE s_zs-word '元整' INTO output.
  ELSEIF s_zs IS INITIAL .                        "如果没有证书位 如 0.10 0.01 0.11"
    IF s_j-word <> '零' .
      CONCATENATE s_j-word '角' INTO output .
    ENDIF.
    IF s_f IS NOT INITIAL.
      CONCATENATE output s_f-word '分' INTO output.
    ENDIF.
  ELSE.                                           "如果整数小数位都有 如 11.01  11.10 11.11"
    CONCATENATE s_zs-word '元' INTO output.
    IF s_j-word = '零' AND s_f IS NOT INITIAL .
      CONCATENATE output s_j-word INTO output.
    ELSE.
      CONCATENATE output s_j-word '角' INTO output .
    ENDIF.
    IF s_f IS NOT INITIAL .
      CONCATENATE output s_f-word '分' INTO output.
    ENDIF.
  ENDIF.
ENDFUNCTION.

21、SQL 相关

EXISTS关键字

EXISTS语法和FOR ALL ENTRIES IN相似,如果只需要前者的数据,用EXISTS效率更高

SELECT *
  FROM mseg
  INTO TABLE @DATA(lt_mseg)
 WHERE EXISTS ( SELECT * FROM m_mbmps  WHERE smbln = mseg~mblnr
                                        AND  sjahr = mseg~mjahr
                                        AND  smblp = mseg~zeile ).

SQL截取字符串
substring在WHERE条件和JOIN中都能用,但是FOR ALL ENTRIES IN不行,因为此语法要求两张表的字段类型一致

SEKECT SINGLE BELNR
  FROM bkpf AS A1
  WHERE substring( A1~AWKEY , 1, 10 ) = @GT_OUT-MBLBR
  INTO @LV_BELNR .

关键字DISTINCT可用于SELECT 内连接时去除重复项

SELECT 中用CASE WHEN 判断

SELECT a~bukrs ,a~gjahr ,
         a~bldat ,a~budat ,
         a~tcode ,a~belnr AS belnr_r ,
         a~xblnr ,a~zbill ,
         a~lifnr ,a~waers ,
         CASE WHEN a~tcode  = 'MIRO'
              THEN a~rmwwr  * 1 ELSE a~rmwwr  * -1 END AS rmwwr ,
         CASE WHEN a~tcode  = 'MIRO'
              THEN a~wmwst1 * 1 ELSE a~wmwst1 * -1 END AS wmwst1,
         a~mwskz1,a~stblg ,a~stjah ,
         b~buzei ,b~ebeln ,
         b~matnr ,b~ebelp ,
         b~werks ,b~mwskz ,
         CASE WHEN b~shkzg  = 'H'
              THEN b~wrbtr  * 1 ELSE b~wrbtr  * -1 END AS wrbtr ,
         CASE WHEN b~shkzg  = 'H'
              THEN b~menge  * 1 ELSE b~menge  * -1 END AS menge ,
         b~bstme ,b~lfgja ,
         b~lfbnr ,b~lfpos ,b~shkzg
    FROM rbkp AS a
    INNER JOIN rseg AS b ON a~belnr = b~belnr AND a~gjahr = b~gjahr
    INTO TABLE @DATA(lt_rbkp)
    WHERE a~bukrs IN @s_bukrs
    AND   a~gjahr IN @s_gjahr
    AND   a~budat IN @s_budat
    AND   a~lifnr IN @s_lifnr .

22 、SAP内存和ABAP内存

SAP内存: SET / GET PAREMTER
ABAP内存:IMPORT / EXPORT
前者的值是放在SAP内存,后者是放在 ABAP 内存。
SAP内存是对当前登录所有会话都可以访问到的,除非用户退出系统不然在整个登录期间都有 效。ABAP内存只是针对一个会话,你用哪个会话设置的那么就只能在当前的会话才可以取到值, 新开的或者是其他的会话是访问不到的。

23、选择屏幕相关

选择屏幕相关参数
PARAMETERS 附加项
DEFAULT ‘A’ 设置初始值
LENGTH N 定义长度,只适用于C,N,X,P
DECIMALS des 指定小数点位数
MEMORY ID pid 指定SAP内存参数ID
MATCHCODE OBJECT mobj 设定使用的Search Help (SE11 中定义搜索帮助)
MODIF ID 通过screen-group1为屏幕元素分组
NO-DISPLAY 不显示在画面上
LOWER CASE 区分大小写(默认大写)

SELECT-OPTIONS 附加项
DEFAULT ‘A’ 始值初始值
DEFAULT g… OPTION op… SIGN s 设置初始的option和sign
DEFAULT g TO h 设置初始的LOW值和HIGH值 ,SIGN为 ‘BT’
DEFAULT g TO h OPTION op… SIGN s 设置初始的OPTION,SIGN, LOW值和HIGH值 ,SIGN只能为BT 或 NB
MEMORY ID pid 指定SAP内存参数ID
MATCHCODE OBJECT mobj 设定使用的Search Help
OBLIGATORY 设定必输项,画面上显示?,不输入时自动报错
VISIBLE LENGTH vlen 设置显示长度
NO-EXTENSION 隐藏多指输入按钮
NO INTERVALS 隐藏HIGH 输入部分

SELECTION-SCREEN 去掉HIGH值和多选框
NO-EXTENSION
NO INTERVALS

假必输

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN  .
    "的必输性:外观上打钩,但不自动校验
    IF screen-group1 = 'MXY'.
      screen-required = '2'."外观上打钩,但不自动校验
      MODIFY SCREEN.
  ENDLOOP.

把CHECKBOX的框放在左边
在这里插入图片描述
选择屏幕字段下拉框
在这里插入图片描述
SELECTION-SCREEN SKIP ."添加空行

24、抛异常

cx_root为所有异常的父类,异常都可以用这个抛出来

DATA : lv_num1 TYPE char10 VALUE '20'.
TRY.
    lv_num1 = lv_num1 / 0 .
  CATCH cx_root INTO DATA(exception).
    DATA(lv_message) = exception->get_text( ) .
ENDTRY.
WRITE : lv_message .

25、Smartforms无法编辑,以及文本框异常等问题补丁

链接: https://pan.baidu.com/s/1I0cpVEqW4F2yaHaZMuo4AQ 提取码: p8j5 复制这段内容后打开百度网盘手机App,操作更方便哦

26、MIGO跳转

双击跳转的时候可能有异常,建议用这个函数

CALL FUNCTION 'MIGO_DIALOG'
   EXPORTING
     I _ ACTION                   = 'A04'
     I _ REFDOC                   = 'R02'
     I _ MBLNR                    = '4900000001'
     I _ MJAHR                    = '2024'
   EXCEPTIONS
     ILLEGAL _ COMBINATION        = 1
     OTHERS                       = 2

27、ALV DATA CHANGE事件

**----------------------------------------------------------------------*
**       CLASS zcl_get_data IMPLEMENTATION
**----------------------------------------------------------------------*
**  实例化类
**----------------------------------------------------------------------*
CLASS zcl_get_data IMPLEMENTATION .
  METHOD get_data .
    PERFORM get_data .
  ENDMETHOD .

  METHOD display_data .
    PERFORM frm_set_fieldcat.
    PERFORM frm_set_layout.  "设置输出格式
    PERFORM frm_alv_display ."显示ALV
  ENDMETHOD .
ENDCLASS .

*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
*  声明类
*----------------------------------------------------------------------*

CLASS lcl_event_receiver  DEFINITION .  "定义类 捕捉各种事件
  PUBLIC  SECTION .
*   数据改变事件
    METHODS handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid
      IMPORTING er_data_changed
                e_onf4
                e_onf4_before
                e_onf4_after
                e_ucomm.
ENDCLASS .                     "LCL_EVENT_RECEIVER DEFINITION

**----------------------------------------------------------------------*
**       CLASS lcl_event_receiver IMPLEMENTATION
**----------------------------------------------------------------------*
**  实例化类
**----------------------------------------------------------------------*
CLASS lcl_event_receiver  IMPLEMENTATION .  "实现类 处理事件
  METHOD handle_data_changed.   "数据改变事件
    PERFORM frm_when_changed USING er_data_changed
                                   e_onf4
                                   e_onf4_before
                                   e_onf4_after
                                   e_ucomm.

  ENDMETHOD.
ENDCLASS .   
FORM frm_alv_display .

  DATA:
    ls_set    TYPE lvc_s_glay,
    lt_events TYPE slis_t_event,
    ls_events LIKE LINE OF  lt_events.
  " 回车事件抓取
  ls_set-edt_cll_cb = 'X'.   "ALV 控制: 退出可编辑单元格时回调
  REFRESH lt_events.

  ls_events-name = 'CALLER_EXIT'.
  ls_events-form = 'CALLER_EXIT'.
  APPEND ls_events TO lt_events.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      is_layout_lvc            = gs_layout
      i_callback_pf_status_set = 'FRM_SET_STATUS'
      i_callback_user_command  = 'FRM_USER_COMMAND'
      it_fieldcat_lvc          = gt_fieldcat
      it_events                = lt_events
      i_grid_settings          = ls_set
      i_save                   = 'A'
    TABLES
      t_outtab                 = gt_alv
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  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 frm_set_layout .
  gs_layout-zebra = 'X'.
  gs_layout-cwidth_opt = 'A'.
  gs_layout-sel_mode = 'A'.
*  gs_layout-box_fname = 'SEL'.
ENDFORM.
FORM frm_when_changed USING  er_data_changed TYPE REF TO cl_alv_changed_data_protocol
                             e_onf4
                             e_onf4_before
                             e_onf4_after
                             e_ucomm.

  DATA:
    ls_good   TYPE lvc_s_modi,
    l_index   TYPE i,
    ls_out    TYPE ty_alv,
    ls_stable TYPE        lvc_s_stbl,
    lv_box    TYPE char20,
    l_grid    TYPE REF TO cl_gui_alv_grid.

* 获取当前选中行
  LOOP AT er_data_changed->mt_mod_cells INTO DATA(ls_good1).
    l_index = ls_good1-row_id.
    lv_box  = ls_good1-value.
  ENDLOOP.

  IF ls_good1-fieldname = 'SEL' .
    READ TABLE gt_alv INTO gs_alv INDEX l_index .
    IF sy-subrc = 0 .
      LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<fs_alv>) WHERE belnr = gs_alv-belnr .
        <fs_alv>-sel = lv_box .
      ENDLOOP .
    ENDIF .

  ENDIF .

* 刷新ALV数据
  PERFORM frm_refresh.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_refresh
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_refresh .
  DATA: g_grid TYPE REF TO cl_gui_alv_grid.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = g_grid.

  gs_layout-no_toolbar = 'X' . "隐藏工具栏
  CALL METHOD g_grid->set_frontend_layout
    EXPORTING
      is_layout = gs_layout. " 自动优化列宽

  CALL METHOD g_grid->refresh_table_display.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  caller_exit
*&---------------------------------------------------------------------*
*       ALV事件
*----------------------------------------------------------------------*
FORM caller_exit  USING e_grid  TYPE slis_data_caller_exit .
  DATA:
    lo_grid  TYPE REF TO cl_gui_alv_grid,
    lr_event TYPE REF TO lcl_event_receiver.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.

  CALL METHOD lo_grid->register_edit_event      "注册GRID事件
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter "事件:回车
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.

  CREATE OBJECT lr_event.

* 数据改变事件
  SET HANDLER lr_event->handle_data_changed FOR lo_grid.

ENDFORM .                     "CALLER_EXIT

28、选择屏幕按钮

*&---------------------------------------------------------------------*
*& Selection Screen/选择屏幕
*&---------------------------------------------------------------------*

SELECTION-SCREEN:BEGIN OF BLOCK b10 WITH FRAME TITLE TEXT-100,
SKIP,
BEGIN OF LINE,
PUSHBUTTON 2(30)   p_bt101 USER-COMMAND comm101,
END OF LINE,
SKIP,
BEGIN OF LINE,
PUSHBUTTON 2(30)   p_bt102 USER-COMMAND comm102, 
END OF LINE,
SKIP,
BEGIN OF LINE,
PUSHBUTTON 2(30)   p_bt103 USER-COMMAND comm103, 
END OF LINE,
SKIP,
BEGIN OF LINE,
PUSHBUTTON 2(30)   p_bt104 USER-COMMAND comm104, 
END OF LINE,
SKIP,
END OF BLOCK b10.

INITIALIZATION.
*&---初始化选择屏幕值
  p_bt101 = TEXT-101. 
  p_bt102 = TEXT-102. 
  p_bt103 = TEXT-103. 
  p_bt104 = TEXT-104.

29、隐藏选择屏幕执行按钮

  "隐藏执行按钮
  DATA it_exclude TYPE TABLE OF sy-ucomm.
  APPEND 'ONLI' TO it_exclude.
  CALL FUNCTION 'RS_SET_SELSCREEN_STATUS'
    EXPORTING
      p_status  = sy-pfkey
    TABLES
      p_exclude = it_exclude.

30、消息弹窗

      ls_smesg-msgty = sy-msgty.
      ls_smesg-arbgb = sy-msgid.
      ls_smesg-txtnr = sy-msgno.
      ls_smesg-msgv1 = sy-msgv1.
      ls_smesg-msgv3 = sy-msgv3.
      ls_smesg-msgv4 = sy-msgv4.
      APPEND ls_smesg TO lt_smesg.
    CALL FUNCTION 'FB_MESSAGES_DISPLAY_POPUP'
      EXPORTING
        it_smesg        = lt_smesg
      EXCEPTIONS
        no_messages     = 1
        popup_cancelled = 2
        OTHERS          = 3.

31、动态sql、动态结构、动态表、动态内表

选择屏幕输入表名字,自动输出对应的ALV报表

TABLES : sflight .
DATA : dy_table TYPE REF TO data,
       dy_line  TYPE REF TO data.

DATA : lt_dfies_tab TYPE TABLE OF dfies .

DATA : it_fieldcatalog TYPE lvc_t_fcat,
       is_fieldcatalog TYPE lvc_s_fcat,
       is_layot        TYPE lvc_s_layo.

DATA: dref_str    TYPE REF TO data,
      struct_type TYPE REF TO cl_abap_structdescr,
      comp_tab    TYPE cl_abap_structdescr=>component_table,
      dref_tab    TYPE REF TO data,
      itab_type   TYPE REF TO cl_abap_tabledescr.

FIELD-SYMBOLS : <lt_data> TYPE STANDARD TABLE,
                <fs_itab> TYPE ANY TABLE,
                <is_str>  TYPE any,
                <lw_data> TYPE any,
                <dyn_wa>  TYPE any.

DATA : lv_tabname TYPE string .

PARAMETERS : p_table TYPE ddobjname,
             p_num   TYPE char2.

CLASS get_data DEFINITION .
  PUBLIC SECTION .
    METHODS :get .
    METHODS :get_dy_table .
ENDCLASS .

CLASS get_data IMPLEMENTATION .
  METHOD get .

*--------------------------------Str---------------------------------*
*24.10.2024 15:57:46 :
    struct_type ?= cl_abap_typedescr=>describe_by_name( p_table ).  "根据表获取动态组件
    comp_tab = struct_type->get_components( ).                      "组成结构体的各个字段组件
*--------------------------------Str---------------------------------*
*24.10.2024 16:08:22 :动态结构
    struct_type = cl_abap_structdescr=>create( comp_tab[] ).
    CREATE DATA dref_str TYPE HANDLE struct_type.                   "生成动态结构
    IF dref_str IS BOUND.
      ASSIGN  dref_str->* TO <is_str>.
    ENDIF.
*--------------------------------End--------------------------------*

*--------------------------------Str---------------------------------*
*24.10.2024 16:08:49 :动态表
    itab_type = cl_abap_tabledescr=>create( struct_type ).          "生成动态表
    CREATE DATA dref_tab TYPE HANDLE itab_type.
    IF dref_tab IS BOUND.
      ASSIGN dref_tab->* TO <fs_itab>.
    ENDIF.
*--------------------------------End--------------------------------*

*--------------------------------End--------------------------------*
    TRY.
        SELECT * FROM (p_table) INTO TABLE @<fs_itab> ."想要达到动态查表并且自动生成一个内表,但是个新语发在这里用不了
      CATCH cx_root INTO DATA(message).
        DATA(lv_message) = message->get_text( ) .
    ENDTRY.

  ENDMETHOD .

  METHOD get_dy_table .

    "获取表字段
    CALL FUNCTION 'DDIF_FIELDINFO_GET'
      EXPORTING
        tabname        = p_table
        langu          = sy-langu
      TABLES
        dfies_tab      = lt_dfies_tab
      EXCEPTIONS
        not_found      = 1
        internal_error = 2
        OTHERS         = 3.

    LOOP AT lt_dfies_tab INTO DATA(ls_tab) WHERE fieldname <> 'MANDT' .
      is_fieldcatalog-fieldname = ls_tab-fieldname .
      is_fieldcatalog-coltext   = ls_tab-fieldtext .
      APPEND is_fieldcatalog TO it_fieldcatalog .
      CLEAR : ls_tab ,is_fieldcatalog.
    ENDLOOP .

    DO p_num TIMES.
      is_fieldcatalog-fieldname = 'W'  && sy-index .
      is_fieldcatalog-coltext   = '第' && sy-index && '列' .
      APPEND is_fieldcatalog TO it_fieldcatalog .
      CLEAR : ls_tab ,is_fieldcatalog.
    ENDDO.

    CALL METHOD cl_alv_table_create=>create_dynamic_table   "获取动态内表
      EXPORTING
        it_fieldcatalog = it_fieldcatalog
      IMPORTING
        ep_table        = dy_table.

    ASSIGN dy_table->* TO <lt_data> .

    CREATE DATA dy_line LIKE LINE OF <lt_data> .
    ASSIGN dy_line->* TO <dyn_wa> .

    MOVE-CORRESPONDING <fs_itab> TO <lt_data> .

    LOOP AT <lt_data> ASSIGNING FIELD-SYMBOL(<fs>)  .
      DO p_num TIMES.
        ASSIGN COMPONENT 'W1' OF STRUCTURE <fs> TO <lw_data> .
        IF <lw_data> IS ASSIGNED .
          <lw_data> = '123456' .
        ENDIF .
      ENDDO.
    ENDLOOP .

    CLEAR :is_layot .

    is_layot-zebra = 'X' .
    is_layot-cwidth_opt = 'X' .
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
      EXPORTING
        i_callback_program = sy-repid
        is_layout_lvc      = is_layot
        it_fieldcat_lvc    = it_fieldcatalog
      TABLES
        t_outtab           = <lt_data>
      EXCEPTIONS
        program_error      = 1
        OTHERS             = 2.
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ENDIF.

  ENDMETHOD .
ENDCLASS .

AT SELECTION-SCREEN OUTPUT.

  IF p_table IS NOT INITIAL .

    p_num = '10' .

  ENDIF .

START-OF-SELECTION .

  DATA :a1 TYPE REF TO get_data .
  CREATE OBJECT :a1.
  a1->get( ) .
  a1->get_dy_table( ) .

32、跳过新建/修改账号后强制修改密码增强

Calss:CL_IDENTITY->IF_IDENTITY_PASSWORD~SET_PASSWORD
字段lv_productive_pwd = ‘X’为生产密码,即可不用强制修改密码

33、BDC录屏时某些屏幕不定期跳出来的问题

业务背景:在做固定资产盘盈过程中,事务代码abnan登陆后首次进入会跳出一个屏幕,需要输入公司代码,而后续进入就不会再跳出此屏幕,默认为首次输入的屏幕,而我们abaper再录制BDC时怎么样精确的判断要不要走该屏幕呢?
解决方案:再执行BDC之前清空公司代码缓存

SET PARAMETER ID ‘BUK’ FIELD space .

  DATA: bdcdata    TYPE TABLE OF bdcdata,
        ctumode    LIKE ctu_params-dismode,
        gt_messtab TYPE TABLE OF bdcmsgcoll WITH HEADER LINE,
        lv_msg     TYPE char200.

  REFRESH:bdcdata[].

  "选择公司代码界面
  PERFORM bdc_dynpro  USING 'SAPLSPO4' '0300'                                                     CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_CURSOR' 'SVALD-VALUE(01)'                                        CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_OKCODE' '=FURT'                                                  CHANGING bdcdata.
  PERFORM bdc_field   USING 'SVALD-VALUE(01)'          ls_gener-comp_code                         CHANGING bdcdata.     "公司代码

  "业务数据
  PERFORM bdc_dynpro  USING 'SAPLAMDPS2I' '0100'                                                  CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_OKCODE' '=TAB02'                                                 CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0310OBJECT'     CHANGING bdcdata.
  PERFORM bdc_field   USING 'RAIFP3-XBANL' 'X'                                                    CHANGING bdcdata.
  PERFORM bdc_field   USING 'RAIFP2-ANLN1'             ls_gener-assetmaino                        CHANGING bdcdata.     "主资产号
  PERFORM bdc_field   USING 'RAIFP2-ANLN2'             ls_gener-assetsubno                        CHANGING bdcdata.     "资产次级编号
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0341SUBSCREEN1' CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0342SUBSCREEN2' CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0343SUBSCREEN3' CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0999SUBSCREEN4' CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0999SUBSCREEN5' CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0999SUBSCREEN6' CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0999SUBSCREEN7' CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLATAB                                0100TABSTRIP'   CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLATAB                                0202SUBSC'      CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0221AREA1'      CHANGING bdcdata.
  PERFORM bdc_field   USING 'RAIFP1-ACC_PRINCIPLE'     ls_gener-acc_principle                     CHANGING bdcdata.     "会计准则
  PERFORM bdc_field   USING 'RAIFP1-AFABE_POST'        ls_gener-depr_area                         CHANGING bdcdata.     "折旧范围
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             1110AREA2'      CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0200SUBSCREEN1' CHANGING bdcdata.
  PERFORM bdc_field   USING 'RAIFP1-BLDAT'             ls_gener-doc_date                          CHANGING bdcdata.     "凭证日期/
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0201SUBSCREEN2' CHANGING bdcdata.
  PERFORM bdc_field   USING 'RAIFP1-BUDAT'             ls_gener-pstng_date                        CHANGING bdcdata.     "过账日期/
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0209SUBSCREEN3' CHANGING bdcdata.
  PERFORM bdc_field   USING 'RAIFP1-UBZDT'             bzdat                                      CHANGING bdcdata.     "资产起息日/
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0214SUBSCREEN4' CHANGING bdcdata.
  PERFORM bdc_field   USING 'RAIFP2-ANBTR'             anbtr                                      CHANGING bdcdata.     "金额
*  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0216SUBSCREEN5' CHANGING bdcdata.

  "附加细节
  PERFORM bdc_dynpro  USING 'SAPLAMDPS2I' '0100'                                                  CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_OKCODE' '=SAVE'                                                  CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0310OBJECT'     CHANGING bdcdata.
  PERFORM bdc_field   USING 'RAIFP3-XBANL' 'X'                                                    CHANGING bdcdata.
  PERFORM bdc_field   USING 'RAIFP2-ANLN1'             ls_gener-assetmaino                        CHANGING bdcdata.
  PERFORM bdc_field   USING 'RAIFP2-ANLN2'             ls_gener-assetsubno                        CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0203SUBSCREEN1' CHANGING bdcdata.
  PERFORM bdc_field   USING 'RAIFP2-MONAT'             ls_gener-doc_date+4(2)                     CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0204SUBSCREEN2' CHANGING bdcdata.
  PERFORM bdc_field   USING 'RAIFP1-BLART' 'AA'                                                   CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_SUBSCR' 'SAPLAMDPS2I                             0205SUBSCREEN1' CHANGING bdcdata.
  PERFORM bdc_field   USING 'BDC_CURSOR' 'RAIFP1-BWASL'                                           CHANGING bdcdata.
  PERFORM bdc_field   USING 'RAIFP1-BWASL' '401'                                                  CHANGING bdcdata.

  ctumode = 'N'.    "N就是一步完成,A前台运行模式 是分步enter完成 E 显示错误模式

  REFRESH gt_messtab[].

  SET PARAMETER ID 'BUK' FIELD space .

  CALL TRANSACTION 'ABNAN' USING bdcdata
        MODE ctumode
        UPDATE 'S'"S同步 A异步
        MESSAGES INTO gt_messtab.

  CLEAR:gt_messtab.

  LOOP AT gt_messtab.

    CLEAR:es_msg.

    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        msgid               = gt_messtab-msgid
        msgnr               = gt_messtab-msgnr
        msgv1               = gt_messtab-msgv1
        msgv2               = gt_messtab-msgv2
        msgv3               = gt_messtab-msgv3
        msgv4               = gt_messtab-msgv4
      IMPORTING
        message_text_output = lv_msg.

    CONCATENATE es_msg lv_msg INTO es_msg.

  ENDLOOP.

  IF sy-subrc = 0 .
    es_type = 'E' .
  ELSE .
    es_type = 'S' .
    es_msg = '以前年度资产的盘盈成功!' .
  ENDIF .

  CLEAR : bdcdata ,ctumode ,gt_messtab  ,lv_msg .

ENDFUNCTION.

*  &---------------------------------------------------------------------*
*  & Form BDC_DYNPRO
*  &---------------------------------------------------------------------*
*  & text
*  &---------------------------------------------------------------------*

FORM bdc_dynpro USING program dynpro CHANGING bdcdata TYPE STANDARD TABLE .

  DATA : ls_bdcdata TYPE bdcdata .

  CLEAR ls_bdcdata.

  ls_bdcdata-program  = program.

  ls_bdcdata-dynpro   = dynpro.

  ls_bdcdata-dynbegin = 'X'.

  APPEND ls_bdcdata TO bdcdata.

ENDFORM.



*  &---------------------------------------------------------------------*
*  & Form BDC_FIELD
*  &---------------------------------------------------------------------*
*  & text
*  &---------------------------------------------------------------------*

FORM bdc_field USING fnam fval CHANGING bdcdata TYPE STANDARD TABLE.

  DATA : ls_bdcdata TYPE bdcdata .

  CLEAR ls_bdcdata.

  ls_bdcdata-fnam = fnam.

  ls_bdcdata-fval = fval.
  IF ls_bdcdata-fnam = 'RAIFP2-ANBTR'.
    CONDENSE ls_bdcdata-fval NO-GAPS .
  ENDIF .

  APPEND ls_bdcdata TO bdcdata.

ENDFORM.

34、创建会计凭证时付款起算日期和付款到期日bapi传参

到期日时计算出来的,直接赋值可能会有问题,根据起算日期和折扣天数计算得出
NETDT(全额付款到期日期) = ZFBDT(到期日期计算的起算日期) + DSCT_DAYS1(第一次给予现金折扣的天数)

35、SAP GUI800导出excel文件失败闪退DUMP问题

1、SAP电脑D盘根目录新建文件夹tmp

2、要是还不行就只能上大招了:下载下述GUI补丁,重新安装GUI(安装时要关闭已经打开的GUI)
通过网盘分享的文件:GUI800闪退-80006342.EXE
链接: https://pan.baidu.com/s/1QRcEOuqmX5phIw6C6NwXZw 提取码: 7qyp 复制这段内容后打开百度网盘手机App,操作更方便哦

35、预制凭证界面添加coding block字段屏幕增强

事务码:fbv0(SAPMF05A和SAPMF05L的屏幕增强参见配置文档)
程序/屏幕:SAPLF040/302
将302屏幕替换为9002
配置表修改1:T019
将屏幕分类为S ,科目类型为K,交易类型和屏幕便是均为空的屏幕编号改为替换的屏幕
配置表修改2:TCOBX
将字段/程序/屏幕以及屏幕分组配上去(每一个屏幕的字段都要配置进去)

更新Coding Block字段数据元素和域后描述没有更新的问题
需要重新执行OXK3的添加控制条目更新T162X表的数据
OXK3->科目分配字段->专家模式
科目设置字段->添加控制条目->更新运行

36:/nsxi_monitor查看接口日志

37:程序效率问题

ORDER BY 优于 SORT
少量数据(<10000)FOR ALL ENTRIES IN 优于INNER JOIN
大量数据(>10000)INNER JOIN 优于FOR ALL ENTRIES IN

38:SAP订单信贷解冻

函数:SD_ORDER_CREDIT_RELEASE

TRY .
    CALL FUNCTION 'SD_ORDER_CREDIT_RELEASE'
      EXPORTING
        vbeln       = '1100000046'
        if_synchron = 'X'.
  CATCH cx_root.
ENDTRY.

错误的输入可能会导致报E类型错误,建议BDC

  FORM frm_dn_jd  USING    p_lv_vbeln
                  CHANGING p_lv_msg
                           p_lv_type.

    DATA: bdcdata    TYPE TABLE OF bdcdata,
          ctumode    LIKE ctu_params-dismode,
          gt_messtab TYPE TABLE OF bdcmsgcoll WITH HEADER LINE,
          lv_msg     TYPE char200.
    REFRESH:bdcdata[].

    PERFORM bdc_dynpro      USING 'RVKRED01' '1000'        CHANGING bdcdata .
    PERFORM bdc_field       USING 'BDC_CURSOR' 'VBELN-LOW' CHANGING bdcdata.
    PERFORM bdc_field       USING 'BDC_OKCODE' '=ONLI'     CHANGING bdcdata.
    PERFORM bdc_field       USING 'VBELN-LOW' p_lv_vbeln   CHANGING bdcdata.
    PERFORM bdc_field       USING 'GBSTK-LOW' 'A'          CHANGING bdcdata.
    PERFORM bdc_field       USING 'GBSTK-HIGH' 'B'         CHANGING bdcdata.
    PERFORM bdc_field       USING 'ORDER' 'X'              CHANGING bdcdata.
    PERFORM bdc_field       USING 'DELIV' 'X'              CHANGING bdcdata.

    PERFORM bdc_dynpro      USING 'SAPMSSY0' '0120'        CHANGING bdcdata.
    PERFORM bdc_field       USING 'BDC_CURSOR' '04/03'     CHANGING bdcdata.
    PERFORM bdc_field       USING 'BDC_OKCODE' '=&ALL'     CHANGING bdcdata.

    PERFORM bdc_dynpro      USING 'SAPMSSY0' '0120'        CHANGING bdcdata.
    PERFORM bdc_field       USING 'BDC_CURSOR' '04/03'     CHANGING bdcdata.
    PERFORM bdc_field       USING 'BDC_OKCODE' '=FREI'     CHANGING bdcdata.

    PERFORM bdc_dynpro      USING 'SAPMSSY0' '0120'        CHANGING bdcdata.
    PERFORM bdc_field       USING 'BDC_CURSOR' '04/03'     CHANGING bdcdata.
    PERFORM bdc_field       USING 'BDC_OKCODE' '=SAVE'     CHANGING bdcdata.


    ctumode = 'N'.    "N就是一步完成,A前台运行模式 是分步enter完成 E 显示错误模式
    REFRESH gt_messtab[].
    CALL TRANSACTION 'VKM4' USING bdcdata
          MODE ctumode
          UPDATE 'S'"S同步 A异步
          MESSAGES INTO gt_messtab.
    CLEAR:gt_messtab.

    LOOP AT gt_messtab.
      CLEAR:p_lv_msg.
      CALL FUNCTION 'MESSAGE_TEXT_BUILD'
        EXPORTING
          msgid               = gt_messtab-msgid
          msgnr               = gt_messtab-msgnr
          msgv1               = gt_messtab-msgv1
          msgv2               = gt_messtab-msgv2
          msgv3               = gt_messtab-msgv3
          msgv4               = gt_messtab-msgv4
        IMPORTING
          message_text_output = lv_msg.
      CONCATENATE p_lv_msg lv_msg INTO p_lv_msg.
    ENDLOOP.

    IF gt_messtab IS INITIAL .

      p_lv_msg  = '交货单状态解冻成功' .
      p_lv_type = 'S' .

    ELSE .

      p_lv_msg  = '交货单状态解冻失败:' && p_lv_msg .
      p_lv_type = 'E' .

    ENDIF .

    CLEAR : bdcdata ,ctumode ,gt_messtab  ,lv_msg .

  ENDFORM.

*  &---------------------------------------------------------------------*
*  & Form BDC_DYNPRO
*  &---------------------------------------------------------------------*
*  & text
*  &---------------------------------------------------------------------*
  FORM bdc_dynpro USING program dynpro CHANGING bdcdata TYPE STANDARD TABLE .
    DATA : ls_bdcdata TYPE bdcdata .
    CLEAR ls_bdcdata.
    ls_bdcdata-program  = program.
    ls_bdcdata-dynpro   = dynpro.
    ls_bdcdata-dynbegin = 'X'.
    APPEND ls_bdcdata TO bdcdata.
  ENDFORM.

*  &---------------------------------------------------------------------*
*  & Form BDC_FIELD
*  &---------------------------------------------------------------------*
*  & text
*  &---------------------------------------------------------------------*
  FORM bdc_field USING fnam fval CHANGING bdcdata TYPE STANDARD TABLE.
    DATA : ls_bdcdata TYPE bdcdata .
    CLEAR ls_bdcdata.
    ls_bdcdata-fnam = fnam.
    ls_bdcdata-fval = fval.
    APPEND ls_bdcdata TO bdcdata.
  ENDFORM.

39、隐藏VF02/VF03发布成本核算小旗子按钮

隐式增强->MV60AF0E

  IF sy-tcode = 'VF02' .
    cua_exclude-function = 'FKFR'."隐藏按钮
    APPEND cua_exclude.
  ELSE.
    DELETE cua_exclude WHERE function = 'FKFR'."取消隐藏按钮
  ENDIF .

40、刷新ALV时,自动跳转到第一列问题

  DATA: g_grid TYPE REF TO cl_gui_alv_grid.
  DATA: lw_stable  TYPE lvc_s_stbl.
*设置ALV刷新时的焦点,避免每次刷新都自动跳到第一列
  lw_stable-row = 0.
  lw_stable-col = 0.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = g_grid.

  gs_layout-no_toolbar = 'X' . "隐藏工具栏
  CALL METHOD g_grid->set_frontend_layout
    EXPORTING
      is_layout = gs_layout. " 自动优化列宽

  CALL METHOD g_grid->refresh_table_display
    EXPORTING
      is_stable = lw_stable.                  "刷新ALV

41、获取长文本

        cl_eso_extraction_tools=>extract_long_text_by_id( EXPORTING iv_langu        = sy-langu
                                                                    iv_text_id      = ''
                                                                    iv_name         = ''
                                                                    iv_object       = ''
                                                          IMPORTING ev_search_terms = DATA(lv_text) )

42、类型不一致传参

 CALL FUNCTION 'BAPI_BUPA_TAX_ADD'
                  EXPORTING
                    businesspartner = ls_cust_list-customer
                    taxtype         = 'CN0'
                    taxnumber       = CONV char20( ls_basic-taxnumxl ).

43、Coding Block字段增强后,OME9配置不显示问题

问题描述
在开发环境生成Coding Block字段且激活无误后,顾问在只有在配置OME9的时候并没有已经创建的Coding Block字段(在其他配置点可以找到,例如OBC4),但是在开发环境可以找到,且开发环境TR传值QAS后也可以找到(PS:开发环境生成的请求均是工作台请求,且在开发环境修改的表都是跨Client的)

解决方案:
OXK3 Coding Block字段需要在配置环境重新更新运行(更新表T162X)后才可以
OXK3->科目分配字段->专家模式->选中Coding Block字段->科目设置字段->添加控制条目->更新运行(每个字段持续2~3分钟)

结论:
个人感觉这是SAP的BUG,开发环境更新Coding Block字段时候包的是工作台请求,应该是要跨client的。

44、时间戳相关

    "获取当前时戳
    GET TIME STAMP FIELD timestamp.
    
    "根据日期生成时戳
    DATA : lv_timestamp_str  TYPE timestampl .
    CONVERT DATE gv_datum TIME '000000'
    INTO TIME STAMP lv_timestamp_str TIME ZONE sy-zonlo)."(SY-ZONLO 当前时区,UTF+8,转成时间戳后会-8)
 
    "将时间戳转为日期
    DATA: lv_timestamp TYPE timestampl VALUE '20250523071541.1730540'.
    CONVERT TIME STAMP lv_timestamp TIME ZONE sy-zonlo
    INTO DATE DATA(lv_date)
    TIME DATA(lv_time).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

消气伟消消气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值