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
2011年2月11日
BAPI_ACC_DOCUMENT_POST 建立Park文件TAX item問題
還是用BAPI_ACC_DOCUMENT_POST 建立Park文件的問題。TAX item要在code裡面先處理好,借貸才會相等。步驟如下:
1 Tax不存入internal table ACCOUNTGL,要存入ACCOUNTTAX,指定的ITEMNO_ACC要正確。
2 處理 CURRENCYAMOUNT時,除了field AMT_DOCCUR要有稅額,field AMT_BASE稅基也要一併處理。
處理完成後進行測試,發現以下新的問題,金額借貸不相等,但是item相加是正常的???
檢查tax amount多了,要清除為0
做法:用BADI ACC_DOCUMENT的method CHANGE
DATA: WA_ACCTX TYPE ACCBSET.
LOOP AT C_ACCTX INTO WA_ACCTX.
CLEAR WA_ACCTX-FWSTE.
MODIFY C_ACCTX FROM WA_ACCTX .
ENDLOOP.
再RUN一次BAPI_ACC_DOCUMENT_POST這次正常:
1 Tax不存入internal table ACCOUNTGL,要存入ACCOUNTTAX,指定的ITEMNO_ACC要正確。
2 處理 CURRENCYAMOUNT時,除了field AMT_DOCCUR要有稅額,field AMT_BASE稅基也要一併處理。
處理完成後進行測試,發現以下新的問題,金額借貸不相等,但是item相加是正常的???
檢查tax amount多了,要清除為0
做法:用BADI ACC_DOCUMENT的method CHANGE
DATA: WA_ACCTX TYPE ACCBSET.
LOOP AT C_ACCTX INTO WA_ACCTX.
CLEAR WA_ACCTX-FWSTE.
MODIFY C_ACCTX FROM WA_ACCTX .
ENDLOOP.
再RUN一次BAPI_ACC_DOCUMENT_POST這次正常:
2011年2月10日
由payment term決定baseline date的function module
繼上次寫到的用BAPI_ACC_DOCUMENT_POST 建立Park文件之後出現了新的問題:
在vendor的line item上面只寫入payment term是不夠的,baseline date會變成空的,post時還要再補上baseline date。
以下是計算vendor baseline date的function module
FI_TERMS_OF_PAYMENT_PROPOSE
要計算customer時用這個:GET_BASELINE_DATE
在vendor的line item上面只寫入payment term是不夠的,baseline date會變成空的,post時還要再補上baseline date。
以下是計算vendor baseline date的function module
FI_TERMS_OF_PAYMENT_PROPOSE
要計算customer時用這個:GET_BASELINE_DATE
2011年1月6日
parked document posting問題
新project在parked document posting時出現了
error message 00 349
'Field COBL-FKBER does not exist in the screen SAPLKACB'
在SAP找到了note 1020574就解決了
Reason and Prerequisites
The function module CODING_BLOCK_FIELD_CLEAR is not generated.
The field status of the field is defined as HIDE. The field contents were derived and not entered manually.
Solution
Run the generation report RFBIPPG1.
error message 00 349
'Field COBL-FKBER does not exist in the screen SAPLKACB'
在SAP找到了note 1020574就解決了
Reason and Prerequisites
The function module CODING_BLOCK_FIELD_CLEAR is not generated.
The field status of the field is defined as HIDE. The field contents were derived and not entered manually.
Solution
Run the generation report RFBIPPG1.
訂閱:
文章 (Atom)