ABAP零碎知识
DELETE ADJACENT DUPLICATES FROM itab COMPARING f1 f2 f3.
1、使用前根據(jù)COMPARING后面字段排序,SORT itab BY f1 f2 f3.
2、程序運行的效果是保留第一行,刪除后面相同KEY的行
FOR ALL ENTRIES IN itab
1、判斷內(nèi)表itab是否為空,如果為空不可以使用這個語法
2、默認(rèn)做DISTINCT的動作,所以SELECT后面跟所有主鍵
3、如果內(nèi)表數(shù)據(jù)量達(dá)到幾十萬上百萬,則最好不要使用,因為內(nèi)存消耗巨大
READ TABLE itab WITH KEY f1 = 'A' BINARY SEARCH.
1、使用前根據(jù)KEY后面字段升序排序
2、如果有多條記錄滿足條件,SY-TABIX返回第一條的INDEX
C類型的變量間賦值,A = B,從前往后開始復(fù)制。
比如str1(6) str2(3),str1 = ' ABC' str2 = str1,則str2 = ' AB'
如果是數(shù)值型的賦值給字符型,則從后面開始復(fù)制,如果字符型變量長度不夠,第一位會變成*
如果是字符型的賦值給數(shù)值型,如果數(shù)值型長度不夠,則會溢出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'.
判斷數(shù)值類型變量是否有小數(shù)
IF frac( menge ) = 0.?
? WRITE '沒有小數(shù)'.?
ELSE.?
? WRITE '有小數(shù)'.?
ENDIF.
在程序開始運行后,SY-DATUM SY-UZEIT就不會再變了,除非有提交的動作(COMMIT、WAIT等)。
如果想獲取實時的時間,可以用語句:
GET TIME.
這個執(zhí)行完,SY-DATUM SY-UZEIT就會變成最新的值
SM37 作業(yè)狀態(tài)
'P'. 已計劃
'S'. 已釋放
'Y'. 就緒
'R'. 活動
'F'. 已完成
'A'. 已取消
'Z'. 已發(fā)布/已暫停
Status一般對應(yīng)快捷方式:
F3 后退
F15 退出
F12/ESC 取消
SELECT SINGLE * FOR UPDATE 不能用在IN UPDATE TASK中
在IN UPDATE TAST里面,AUTHORITY-CHECK也是不好用的
在第一次調(diào)用函數(shù)模塊的時候,會把整個函數(shù)組放入內(nèi)存,而且在程序執(zhí)行的期間不會釋放,這就導(dǎo)致全局變量會一直存在直到你去顯式的改變它,所以需要特別注意全局變量的清空。
如何在函數(shù)組第一次調(diào)用的時候設(shè)置斷點呢?使用LOAD-OF-PROGRAM事件。
精確到微秒的時間戳:DATA:tsl TYPE timestampl,tsstr TYPE string. GET TIME STAMP FIELD tsl. tsstr = |{ tsl TIMEZONE = 'UTC+8 ' }|. WRITE tsstr.
無列名的單列內(nèi)表:
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關(guān)于字符串的新語法:
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條件動態(tài):
LOOP AT itab WHERE (stt).
? WRITE itab.
ENDLOOP.
使用FTP_R3_TO_SERVER時,如果文本內(nèi)漢字上傳后有亂碼,把文本文件轉(zhuǎn)換成FTP編碼格式的二進(jìn)制文件,然后FTP_R3_TO_SERVER用BOLB方式。
用BAPI生成/修改PO/SO,然后緊接著使用BAPI_OUTB_DELIVERY_CREATE_STO/BAPI_OUTB_DELIVERY_CREATE_SLS來生成交貨單,就會出現(xiàn)很多莫名其妙的錯誤。
原因是因為沒有清空函數(shù)的全局變量,暫時的解決方案可以用DESTINATION 'NONE'。
或者另一個解決方案:
FIELD-SYMBOLS <fs>.?
ASSIGN ('(SAPLME03)GT_EKET_DOC[]') to <fs>.?
IF sy-subrc = 0.?
? CLEAR <fs>.?
ENDIF.
根據(jù)PR找對應(yīng)的PO,視圖M_MEKKE?
PSTYP、EPSTP的對應(yīng)關(guān)系,表T163Y?
使用BAPI_PO_CREATE1連續(xù)創(chuàng)建多個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. 非必輸?shù)窃诮缑嫔献龀霰剌數(shù)臉幼?#xff1b;
screen-required = 3. 你寫錯了?
哈希表的MODIFY:?
LOOP AT hs_tab.?
? MODIFY TABLE hs_tab .?
ENDLOOP.
物料可以擴(kuò)充的銷售范圍?
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 ).
?
設(shè)置外部斷點調(diào)試,還需要TCODE:SRDEBUG
RFC_READ_TABLE的一個Bug,解決方法是在函數(shù)的開頭添加 CLEAR DATA.
函數(shù)SAVE_LIST的致命缺陷:后臺執(zhí)行的時候只能保存最后一頁
IT_XLIPS:更改后的所有行項目。
IT_YLIPS:有更改的行的舊值
如果不想在COMMIT WORK后釋放程序中的鎖,可以 _scope = '1'
交貨單的發(fā)貨過賬日期:LIKP-WADAT_IST,如果VL09沖銷,這個日期會清空
RKE_TSTMP,跟日期的轉(zhuǎn)換函數(shù):RKE_TIMESTAMP_CONVERT_INPUT、RKE_TIMESTAMP_CONVERT_OUTPUT。
如果在Excel內(nèi)轉(zhuǎn)為日期:=A1/10000/3600/24 + DATE(1990,1,1)
SAP 快捷鍵:
編輯器
? ? Ctrl+F 搜索
? ? Ctrl+G 搜索下一個(LIST也可以)
? ? Ctrl+I 增量搜索
? ? Ctrl+U 塊大寫
? ? Ctrl+L 塊小寫 ?
? ? Ctrl+, 塊注釋
? ? Ctrl+. 塊取消注釋
GUI
? ? Ctrl+/ 光標(biāo)定位到Command Field
? ? Ctrl+Y 選擇塊
? ? Ctrl+G 搜索下一個
? ? Ctrl+N 新窗口?
ALV界面:
? ? 按著Shift在空白處雙擊鼠標(biāo)右鍵
新版的SE38編輯器,按住Alt,然后鼠標(biāo)豎向拉一下,就能變成列模式。
Tcode:SRDEBUG,配合外部斷點使用
RFC_READ_TABLE的一個Bug,在函數(shù)的開頭添加 CLEAR DATA.?
交貨單的揀配數(shù)量 VBFA-RFMNG,注意VBTYP_N和VBTYP_V的值。
取PO項目Condition:KONV-KNUMV = EKKO-KNUMV KONV-KPOSN = EKPO-EBELP;KONV-KAPPL的值為 'M';KONV-KINAK標(biāo)識此條條件類型是否活動。
BAPI_PO_CHANGE或BAPI_PO_CREATE1,如果需要輸入Category of Delivery Date(POSCHEDULE-DEL_DATCAT_EXT),注意是'D',而不是1(EKET-LPEIN)。對應(yīng)關(guān)系在表TPRG。
另外,PSTYP EPSTP的對應(yīng)關(guān)系在T163Y。bapimepoitem-item_cat = epstp;ekpo-pstyp = pstyp。
交貨單的發(fā)貨過賬日期:LIKP-WADAT_IST,如果VL09沖銷,這個日期會清空。但是有時候由于未知的原因,即便是是沖銷了這個也不會清空
無列名的單列內(nèi)表:
定義:DATA: itab TYPE TABLE OF matnr WITH HEADER LINE.?
需要列名的時候:READ TABLE itab WITH KEY table_line = ''.?
檢查程序在哪些Job中用到: 表:V_OP,字段:PROGNAME?
SAP本身暫不支持QRCode,需要在外部程序獲取,一般來說是在局域網(wǎng)內(nèi)放一臺生成QRCode的機(jī)器,SAP通過HTTP來獲取。?
SAP內(nèi)核版本大于等于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對應(yīng)的結(jié)構(gòu)為:SCXTAB_CONTROL.
還有:
TYPE-POOLS CXTAB.
TYPES: CXTAB_COLUMN type scxtab_column,
? ? ? ?CXTAB_CONTROL type scxtab_control,
? ? ? ?CXTAB_TABSTRIP type scxtab_tabstrip.?
交貨單VBFA后續(xù)憑證類型:
Q 揀配
R 發(fā)貨過賬
h 取消發(fā)貨
i 對交貨單收貨/取消收貨
M 發(fā)票
N 取消發(fā)票
如何在第一次調(diào)用函數(shù)組內(nèi)任一函數(shù)時設(shè)置斷點(在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
函數(shù)DATE_CHECK_PLAUSIBILITY/TIME_CHECK_PLAUSIBILITY可以用一檢查日期/時間值是否合法
觸發(fā)TCODE:
CALL FUNCTION: 'CONTROL_INIT',
? ? ? ? ? ? ? ?'CONTROL_SETFUNCTIONCODE' EXPORTING fcode = '/I'," /NEX?
? ? ? ? ? ? ? ?'CONTROL_FLUSH'.
兩個日期所經(jīng)歷的月份:
months = ( d2+0(4) - d1+0(4) ) * 12 + d2+4(2) - d1+4(2) + 1.
因為WAIT UP語句有提交數(shù)據(jù)庫的作用,所以在增強(qiáng)里面是禁止使用WAIT UP語句的,可以如下:
? WAIT UP TO 1 SECOND.
改為:
? CALL FUNCTION 'ENQUE_SLEEP'
? ? ? EXPORTING
? ? ? ? seconds = 1
? ? ? EXCEPTIONS
? ? ? ? OTHERS ?= 2.
另外這兩個語句只支持整數(shù),如果不是整數(shù),則四舍五入。
庫存:
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訂單刷新狀態(tài)程序:SDVBUK00
更新導(dǎo)航索引,函數(shù):WB_TREE_ACTUALIZE
執(zhí)行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,分析索引的質(zhì)量
替換字符串中的特殊字符:
? 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.
總結(jié)
- 上一篇: 【超级实用】程序添加后台执行的选项
- 下一篇: 解决归档出错,ORA-00257: ar