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,分析索引的質量
替換字符串中的特殊字符:
? 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.
總結
- 上一篇: 【超级实用】程序添加后台执行的选项
- 下一篇: 解决归档出错,ORA-00257: ar