T134M 控制數量/價值更新
T156X 交易/事件代碼修改
T156X 過帳字串值
T030 標準科目表
肥肥豬的SAP心得
從事SAP相關工作以來,發現SAP相關技術及know-how非常多,利用Blogger整理曾經實作過的經驗。 本Blog歡迎交流,轉載請註明出處。
2012年1月11日
2011年11月29日
用ABAP寄送mail單封處理
透過ABAP寄送mail時,過去都是用SCOT直接發出去
遇到server上有等待的mail時會一口氣全部送出去,這樣在測試區會造成不必要的郵件被送出去
可以改執行程式RSSOSOSTSTAT,如此就可以指定要寄送的郵件再送出
2011年10月31日
MV45AFZZ修改SO ITEM問題
有個需求是希望在SO的ITEM在修改VBKD時,能夠update VBAP某些欄位,進到MV45AFZZ去找到FORM USEREXIT_SAVE_DOCUMENT_PREPARE.直接新增修改邏輯。改完實際去測試會發現,若VBAP相關的欄位沒有修改時,save之後VBAP還是一樣的。
想要在FORM USEREXIT_SAVE_DOCUMENT_PREPARE修改VBAP的值有二個方式:
1 在VA02時就已經有VBAP的修改(解法不佳)
2 在FORM當中指定VBAP要強制修改(可行),做法如下:
在XVBAP[]當中找到要修改的VBAP並指定UPDKZ = 'U',要特別注意UPDKZ若已是'D'時表示這個item save之後會被刪除,千萬不要去修改UPDKZ。另外也要考慮這一筆VBAP若是新增時,不需要指定UPDKZ 。
想要在FORM USEREXIT_SAVE_DOCUMENT_PREPARE修改VBAP的值有二個方式:
1 在VA02時就已經有VBAP的修改(解法不佳)
2 在FORM當中指定VBAP要強制修改(可行),做法如下:
在XVBAP[]當中找到要修改的VBAP並指定UPDKZ = 'U',要特別注意UPDKZ若已是'D'時表示這個item save之後會被刪除,千萬不要去修改UPDKZ。另外也要考慮這一筆VBAP若是新增時,不需要指定UPDKZ 。
2011年10月27日
SO 狀態說明讀取
下圖的狀態欄位經過讀取TABLE VBUK只能得到狀態碼,無法得到顯示的內文。若直接Call Function DOMAIN_VALUE_GET去讀到Domain的value也不是正確的。實際上SO的狀態說明是維護在TABLE TVBST當中,不是在Domain。
2011年5月26日
Smartform圖片用變數指定
2011年5月18日
READ_EXCHANGE_RATE EUR匯率問題
在讀匯率資料時使用READ_EXCHANGE_RATE 進行EUR/USD的匯率讀取後
系統會回傳一個值DERIVED_RATE_TYPE = EURX
這個意思是系統會以EURX的匯率來讀取
可用TCODE OBBS進行設定
系統會回傳一個值DERIVED_RATE_TYPE = EURX
這個意思是系統會以EURX的匯率來讀取
可用TCODE OBBS進行設定
2011年5月16日
Smartform 輸出總頁數問題
在設計SMARTFORM時,輸出總頁數會用到一個系統變數SFSY-FORMPAGES,通常是直接在內文使用&SFSY-FORMPAGES&輸出,但是遇到總頁數達到2位數時,就會顯示*
目前找到有二種解法:
1 改寫輸出方式
&SFSY-FORMPAGES& 改成 &SFSY-FORMPAGES(3ZC)&
2 修改內文所在視窗為最終視窗
目前找到有二種解法:
1 改寫輸出方式
&SFSY-FORMPAGES& 改成 &SFSY-FORMPAGES(3ZC)&
2 修改內文所在視窗為最終視窗
讀取不同語言的Text Symbol
在一般情形下,ABAP處理Text Symbol時是依登入的語言來處理,
登入的語言若沒有維護對應的Text時,會直接參考程式建立時的Original版本
在報表處理上,遇到使用者想依資料的上的狀態來讀取Text時,就需要另外處理
以下公司設定的語言別為例:
**讀取公司語言別的Text
DATA: lt_pool LIKE TABLE OF textpool.
READ TEXTPOOL sy-repid INTO lt_pool LANGUAGE t001-spras.
登入的語言若沒有維護對應的Text時,會直接參考程式建立時的Original版本
在報表處理上,遇到使用者想依資料的上的狀態來讀取Text時,就需要另外處理
以下公司設定的語言別為例:
**讀取公司語言別的Text
DATA: lt_pool LIKE TABLE OF textpool.
READ TEXTPOOL sy-repid INTO lt_pool LANGUAGE t001-spras.
2011年4月22日
將文字以指定的輸出長度分段
在報表輸出時,中文字佔了二個文字的長度,而Unicode系統的SAP中文字只算1個長度
報表格式上有長度限制時,就需要另外處理讓文字可以分段:
報表格式上有長度限制時,就需要另外處理讓文字可以分段:
FUNCTION Z_STRING_SPLIT_TO_TABLE .
*"----------------------------------------------------------------
*"*"區域介面:
*" IMPORTING
*" REFERENCE(PI_STRING) TYPE STRING
*" REFERENCE(PI_SIZE) TYPE I DEFAULT 20
*" EXPORTING
*" VALUE(PE_LINECOUNT) TYPE I
*" TABLES
*" PT_STRING STRUCTURE UPS_YS_STRING_TABLE OPTIONAL
*"----------------------------------------------------------------
DATA: LV_CHAR(4096),
LV_STRLEN TYPE I, "輸入字串長度
LV_STRCOUNT TYPE I VALUE 0, "字串計數器
LV_COUNTER TYPE I, "長度計數器
LV_LEN TYPE I. "長度變數
*****計算出字串長度
LV_STRLEN = STRLEN( PI_STRING ).
*****將String轉成char
LV_CHAR = PI_STRING.
*****利用CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH
*"----------------------------------------------------------------
*"*"區域介面:
*" IMPORTING
*" REFERENCE(PI_STRING) TYPE STRING
*" REFERENCE(PI_SIZE) TYPE I DEFAULT 20
*" EXPORTING
*" VALUE(PE_LINECOUNT) TYPE I
*" TABLES
*" PT_STRING STRUCTURE UPS_YS_STRING_TABLE OPTIONAL
*"----------------------------------------------------------------
DATA: LV_CHAR(4096),
LV_STRLEN TYPE I, "輸入字串長度
LV_STRCOUNT TYPE I VALUE 0, "字串計數器
LV_COUNTER TYPE I, "長度計數器
LV_LEN TYPE I. "長度變數
*****計算出字串長度
LV_STRLEN = STRLEN( PI_STRING ).
*****將String轉成char
LV_CHAR = PI_STRING.
*****利用CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH
*****計算出顯示長度後依條件分割
WHILE LV_STRCOUNT < LV_STRLEN.
LV_COUNTER = 1.
WHILE LV_COUNTER <= PI_SIZE.
CALL METHOD CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH
EXPORTING
FIELD = LV_CHAR+LV_STRCOUNT(LV_COUNTER)
RECEIVING
LEN = LV_LEN.
IF LV_LEN = PI_SIZE.
PT_STRING-LINE = LV_CHAR+LV_STRCOUNT(LV_COUNTER).
APPEND PT_STRING.
LV_STRCOUNT = LV_STRCOUNT + LV_COUNTER - 1.
EXIT.
ELSE.
LV_LEN = LV_STRCOUNT + LV_COUNTER.
IF LV_LEN = LV_STRLEN.
PT_STRING-LINE = LV_CHAR+LV_STRCOUNT(LV_COUNTER).
APPEND PT_STRING.
LV_STRCOUNT = LV_STRCOUNT + LV_COUNTER - 1.
ENDIF.
LV_COUNTER = LV_COUNTER + 1.
ENDIF.
ENDWHILE.
LV_STRCOUNT = LV_STRCOUNT + 1.
ENDWHILE.
*****計算分割後的字串數
DESCRIBE TABLE PT_STRING LINES PE_LINECOUNT.
ENDFUNCTION.
WHILE LV_STRCOUNT < LV_STRLEN.
LV_COUNTER = 1.
WHILE LV_COUNTER <= PI_SIZE.
CALL METHOD CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH
EXPORTING
FIELD = LV_CHAR+LV_STRCOUNT(LV_COUNTER)
RECEIVING
LEN = LV_LEN.
IF LV_LEN = PI_SIZE.
PT_STRING-LINE = LV_CHAR+LV_STRCOUNT(LV_COUNTER).
APPEND PT_STRING.
LV_STRCOUNT = LV_STRCOUNT + LV_COUNTER - 1.
EXIT.
ELSE.
LV_LEN = LV_STRCOUNT + LV_COUNTER.
IF LV_LEN = LV_STRLEN.
PT_STRING-LINE = LV_CHAR+LV_STRCOUNT(LV_COUNTER).
APPEND PT_STRING.
LV_STRCOUNT = LV_STRCOUNT + LV_COUNTER - 1.
ENDIF.
LV_COUNTER = LV_COUNTER + 1.
ENDIF.
ENDWHILE.
LV_STRCOUNT = LV_STRCOUNT + 1.
ENDWHILE.
*****計算分割後的字串數
DESCRIBE TABLE PT_STRING LINES PE_LINECOUNT.
ENDFUNCTION.
2011年4月12日
日期加減月份的處理
有個需求要抓最近半年內的文件,比如說2011年3月底的半年內,
要抓的是2010/10/1~2011/3/31範圍內的文件
可以利用HR的FM來處理,HR_HK_ADD_MONTH_TO_DATE,範例如下:
CALL FUNCTION 'HR_HK_ADD_MONTH_TO_DATE'
EXPORTING
dmm_datin = '20110331'
dmm_count = '5'
dmm_oper = '-'
dmm_pos = 'X'
IMPORTING
dmm_daout = g_date
EXCEPTIONS
unknown = 1
OTHERS = 2.
g_date+6(2) = '01'. "2010/10/01
要抓的是2010/10/1~2011/3/31範圍內的文件
可以利用HR的FM來處理,HR_HK_ADD_MONTH_TO_DATE,範例如下:
CALL FUNCTION 'HR_HK_ADD_MONTH_TO_DATE'
EXPORTING
dmm_datin = '20110331'
dmm_count = '5'
dmm_oper = '-'
dmm_pos = 'X'
IMPORTING
dmm_daout = g_date
EXCEPTIONS
unknown = 1
OTHERS = 2.
g_date+6(2) = '01'. "2010/10/01
訂閱:
文章 (Atom)