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,分析索引的质量
替换字符串中的特殊字符:
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.