ABAP零碎知识

时间:2024-03-25 14:39:08

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,分析索引的质量



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.