SAP ABAP零碎知识详解编程语言

DELETE ADJACENT DUPLICATES FROM itab COMPARING f1 f2 f3.

1、使用前根据COMPARING后面字段排序,SORT itab BY f1 f2 f3.

2、程序运行的效果是保留第一行,删除后面相同KEY的行


FOR ALL ENTRIES IN itab

1、判断内表itab是否为空,如果为空不可以使用这个语法

2、默认做DISTINCT的动作,所以SELECT后面跟所有主键

3、如果内表数据量达到几十万上百万,则最好不要使用,因为内存消耗巨大


READ TABLE itab WITH KEY f1 = ‘A’ BINARY SEARCH.

1、使用前根据KEY后面字段升序排序

2、如果有多条记录满足条件,SY-TABIX返回第一条的INDEX


C类型的变量间赋值,A = B,从前往后开始复制。

比如str1(6) str2(3),str1 = ‘ ABC’ str2 = str1,则str2 = ‘ AB’

如果是数值型的赋值给字符型,则从后面开始复制,如果字符型变量长度不够,第一位会变成*

如果是字符型的赋值给数值型,如果数值型长度不够,则会溢出DUMP,运行时错误 CONVT_OVERFLOW

CALL其他程序的子程序并先给全局变量赋值:

FIELD-SYMBOLS <fs> TYPE any. 

PERFORM (space) IN PROGRAM z_barry_test2 IF FOUND. 

ASSIGN (‘(Z_BARRY_TEST2)STR’) to <fs>. 

IF <fs> IS ASSIGNED. 

  <fs> = ‘BAI’. 

ENDIF. 

PERFORM out IN PROGRAM z_barry_test2 IF FOUND.


在CALL FUNCTION前给Function的全局变量赋值:

PERFORM (space) IN PROGRAM saplztest_01 IF FOUND. 

ASSIGN (‘(SAPLZTEST_01)STR’) TO <fs>. 

IF <fs> IS ASSIGNED. 

  <fs> = ‘BARRY’. 

ENDIF. 

CALL FUNCTION ‘ZTEST001’.



判断数值类型变量是否有小数

IF frac( menge ) = 0. 

  WRITE ‘没有小数’. 

ELSE. 

  WRITE ‘有小数’. 

ENDIF.



在程序开始运行后,SY-DATUM SY-UZEIT就不会再变了,除非有提交的动作(COMMIT、WAIT等)。

如果想获取实时的时间,可以用语句:

GET TIME.

这个执行完,SY-DATUM SY-UZEIT就会变成最新的值



SM37 作业状态

‘P’. 已计划

‘S’. 已释放

‘Y’. 就绪

‘R’. 活动

‘F’. 已完成

‘A’. 已取消

‘Z’. 已发布/已暂停



Status一般对应快捷方式:

F3后退

F15退出

F12/ESC取消



SELECT SINGLE * FOR UPDATE 不能用在IN UPDATE TASK中

在IN UPDATE TAST里面,AUTHORITY-CHECK也是不好用的

在第一次调用函数模块的时候,会把整个函数组放入内存,而且在程序执行的期间不会释放,这就导致全局变量会一直存在直到你去显式的改变它,所以需要特别注意全局变量的清空。



如何在函数组第一次调用的时候设置断点呢?使用LOAD-OF-PROGRAM事件。



精确到微秒的时间戳:DATA:tsl TYPE timestampl,tsstr TYPE string. GET TIME STAMP FIELD tsl. tsstr = |{ tsl TIMEZONE = ‘UTC+8 ‘ }|. WRITE tsstr.



无列名的单列内表:

DATA: itab TYPE TABLE OF matnr WITH HEADER LINE. 

使用:READ TABLE itab WITH KEY table_line = ”.



检查程序在哪些Job中用到: 表:V_OP,字段:PROGNAME



三大代码样例集散地Tcode:ABAPDOCU、DWDM、BIBS



Modern ABAP关于字符串的新语法:

str2 = substring_after( val = str sub = ‘.’ occ = count( val = str sub = ‘.’ ) ).

str = substring_before( val = ‘1111-2222-3333’ sub = ‘-‘ occ = 2 ).

str = translate( val = translate( val = str from = |/t| to = ” ) from = |/r/n| to = ” ). 去掉制表符、回车换行


如果str最后一个有效字符是*,则删掉这个*,否则不删。

IF substring( val = str off = strlen( str ) – 1 len = 1 ) = ‘*’. 

  str = substring( val = str len = strlen( str ) – 1 ) . 

ENDIF.

更简洁的写法:str = shift_right( val = str sub = |*| ).



Modern ABAP开始支持LOOP的Where条件动态:

LOOP AT itab WHERE (stt).

  WRITE itab.

ENDLOOP.



使用FTP_R3_TO_SERVER时,如果文本内汉字上传后有乱码,把文本文件转换成FTP编码格式的二进制文件,然后FTP_R3_TO_SERVER用BOLB方式。



用BAPI生成/修改PO/SO,然后紧接着使用BAPI_OUTB_DELIVERY_CREATE_STO/BAPI_OUTB_DELIVERY_CREATE_SLS来生成交货单,就会出现很多莫名其妙的错误。

原因是因为没有清空函数的全局变量,暂时的解决方案可以用DESTINATION ‘NONE’。

或者另一个解决方案:

FIELD-SYMBOLS <fs>. 

ASSIGN (‘(SAPLME03)GT_EKET_DOC[]’) to <fs>. 

IF sy-subrc = 0. 

  CLEAR <fs>. 

ENDIF.


根据PR找对应的PO,视图M_MEKKE 



PSTYP、EPSTP的对应关系,表T163Y 



使用BAPI_PO_CREATE1连续创建多个PO,DUMP,

问题出在程序:CL_PO_ITEM_HANDLE_MM==========CM00G,

Notes:0001518346 – RAISE_EXCEPTION when calling BAPI several times 



screen-required = 0. 非必输;

screen-required = 1. 必输;

screen-required = 2. 非必输但是在界面上做出必输的样子;

screen-required = 3. 你写错了 



哈希表的MODIFY: 

LOOP AT hs_tab. 

  MODIFY TABLE hs_tab . 

ENDLOOP.



物料可以扩充的销售范围 

SELECT DISTINCT vkorg vtwku INTO TABLE it_tvta FROM tvta 

  WHERE NOT EXISTS ( SELECT * FROM mvke WHERE matnr = matnr AND vkorg = tvta~vkorg AND vtweg = tvta~vtwku ).

 


设置外部断点调试,还需要TCODE:SRDEBUG



RFC_READ_TABLE的一个Bug,解决方法是在函数的开头添加 CLEAR DATA.



函数SAVE_LIST的致命缺陷:后台执行的时候只能保存最后一页



IT_XLIPS:更改后的所有行项目。

IT_YLIPS:有更改的行的旧值



如果不想在COMMIT WORK后释放程序中的锁,可以 _scope = ‘1’



交货单的发货过账日期:LIKP-WADAT_IST,如果VL09冲销,这个日期会清空



RKE_TSTMP,跟日期的转换函数:RKE_TIMESTAMP_CONVERT_INPUT、RKE_TIMESTAMP_CONVERT_OUTPUT。

如果在Excel内转为日期:=A1/10000/3600/24 + DATE(1990,1,1)


SAP 快捷键:

编辑器

    Ctrl+F 搜索

    Ctrl+G 搜索下一个(LIST也可以)

    Ctrl+I 增量搜索

    Ctrl+U 块大写

    Ctrl+L 块小写  

    Ctrl+, 块注释

    Ctrl+. 块取消注释

GUI

    Ctrl+/ 光标定位到Command Field

    Ctrl+Y 选择块

    Ctrl+G 搜索下一个

    Ctrl+N 新窗口 

ALV界面:

    按着Shift在空白处双击鼠标右键



新版的SE38编辑器,按住Alt,然后鼠标竖向拉一下,就能变成列模式。



Tcode:SRDEBUG,配合外部断点使用



RFC_READ_TABLE的一个Bug,在函数的开头添加 CLEAR DATA. 



交货单的拣配数量 VBFA-RFMNG,注意VBTYP_N和VBTYP_V的值。



取PO项目Condition:KONV-KNUMV = EKKO-KNUMV KONV-KPOSN = EKPO-EBELP;KONV-KAPPL的值为 ‘M’;KONV-KINAK标识此条条件类型是否活动。



BAPI_PO_CHANGE或BAPI_PO_CREATE1,如果需要输入Category of Delivery Date(POSCHEDULE-DEL_DATCAT_EXT),注意是’D’,而不是1(EKET-LPEIN)。对应关系在表TPRG。

另外,PSTYP EPSTP的对应关系在T163Y。bapimepoitem-item_cat = epstp;ekpo-pstyp = pstyp。



交货单的发货过账日期:LIKP-WADAT_IST,如果VL09冲销,这个日期会清空。但是有时候由于未知的原因,即便是是冲销了这个也不会清空



无列名的单列内表:

定义:DATA: itab TYPE TABLE OF matnr WITH HEADER LINE. 

需要列名的时候:READ TABLE itab WITH KEY table_line = ”. 



检查程序在哪些Job中用到: 表:V_OP,字段:PROGNAME 



SAP本身暂不支持QRCode,需要在外部程序获取,一般来说是在局域网内放一台生成QRCode的机器,SAP通过HTTP来获取。 

SAP内核版本大于等于7.21的就可以支持QRCODE了



SE11里面对表激活、删除的LOG表:

DDPRH

DDPRS




SAPGUI_PROGRESS_INDICATOR

能不用就尽量不用

尤其在LOOP里面



str+m(n).

1、m、n、m+n都不可以大于str的定义长度

2、str+m:第m个字符之后的所有字符

   如果str = ‘abcdefg’,那么str+4 = ‘efg’

3、str(m):前m个字符

   如果str = ‘abcdefg’,那么str(4) = ‘abcd’


CONTROLS:TABNAME TYPE TABLEVIEW USING SCREEN ‘0100’ “定义TABLE CONTROL.

这个TABLEVIEW对应的结构为:SCXTAB_CONTROL.

还有:

TYPE-POOLS CXTAB.

TYPES: CXTAB_COLUMN type scxtab_column,

       CXTAB_CONTROL type scxtab_control,

       CXTAB_TABSTRIP type scxtab_tabstrip. 




交货单VBFA后续凭证类型:

Q 拣配

R 发货过账

h 取消发货

i 对交货单收货/取消收货

M 发票

N 取消发票




如何在第一次调用函数组内任一函数时设置断点(在TOP文件添加LOAD-OF-PROGRAM事件)

程序:LZTEST01TOP


FUNCTION-POOL ztest01.                      “MESSAGE-ID ..


LOAD-OF-PROGRAM.

  break baitianzhen .




GOODSMVT_CODE you can below codes for respective transaction

01 – MB01

02 – MB31

03 – MB1A

04 – MB1B

05 – MB1C

06 – MB11

07 – MB04




函数DATE_CHECK_PLAUSIBILITY/TIME_CHECK_PLAUSIBILITY可以用一检查日期/时间值是否合法





触发TCODE:

CALL FUNCTION: ‘CONTROL_INIT’,

               ‘CONTROL_SETFUNCTIONCODE’ EXPORTING fcode = ‘/I’,” /NEX 

               ‘CONTROL_FLUSH’.




两个日期所经历的月份:

months = ( d2+0(4) – d1+0(4) ) * 12 + d2+4(2) – d1+4(2) + 1.




因为WAIT UP语句有提交数据库的作用,所以在增强里面是禁止使用WAIT UP语句的,可以如下:

  WAIT UP TO 1 SECOND.

改为:

  CALL FUNCTION ‘ENQUE_SLEEP’

      EXPORTING

        seconds = 1

      EXCEPTIONS

        OTHERS  = 2.

另外这两个语句只支持整数,如果不是整数,则四舍五入。




库存:

MMBE:MARD-LABST(Valuated stock with unrestricted use)

MB52:MARD-LABST

MB51:MSEG:ERFMG累加

MM03:MBEW-LBKUM (Total valuated stock)

MB5L:MBEW-SALK3 (Value of total valuated stock)

MC.9:S032-MBWBEST(Quantity of valuated stock)

     S032-WBWBEST(Value of valuated stock)




GOS的附件放到表:SOFFCONT1




SO的不完整日志放到表:VBUV




Char类型的日期搜索帮助F4:

PARAMETERS cdate(10) MATCHCODE OBJECT bu_date_char.




SD订单刷新状态程序:SDVBUK00




更新导航索引,函数:WB_TREE_ACTUALIZE




执行OS命令:

SE38:RSBDCOS0



REPLACE ALL OCCURRENCES OF REGEX ‘[^x00-xff]’ IN str WITH space.

去掉字符不在 x00到xFF的,比如汉字




分析Oracle表:

程序:RSANAORA

语句: cl_sdb_ora_update_stats=>update_stats(

               i_tablnm      = ‘ZCIS_T001L’  “表名

               i_signi       = 0

               i_histo       = ”

               i_cascade     = 0

               i_force       = ‘X’ ).

程序RSORATAD,分析索引的质量



SAP ABAP零碎知识详解编程语言



替换字符串中的特殊字符:

  maktx = translate( val = maktx from = |/r| to = ” ).  “0D 回车

  maktx = translate( val = maktx from = |/n| to = ” ).  “0A 换行

  maktx = translate( val = maktx from = |/t| to = ” ).  “09 制表符




针对一会儿不动SAP就断开的情况:

DO .

  WAIT UP TO 10 SECONDS.

  CALL FUNCTION ‘SAPGUI_PROGRESS_INDICATOR’

    EXPORTING

      percentage = 0

      text       = ‘……..’.

ENDDO.

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/20100.html

(0)
上一篇 2021年7月19日 23:00
下一篇 2021年7月19日 23:00

相关推荐

发表回复

登录后才能评论