2012年1月11日

物料異動數量/金額控制及過帳的科目決定表格

T134M 控制數量/價值更新
T156X 交易/事件代碼修改
T156X 過帳字串值
T030  標準科目表

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 。


2011年10月27日

SO 狀態說明讀取

下圖的狀態欄位經過讀取TABLE VBUK只能得到狀態碼,無法得到顯示的內文。若直接Call Function DOMAIN_VALUE_GET去讀到Domain的value也不是正確的。實際上SO的狀態說明是維護在TABLE TVBST當中,不是在Domain。



2011年5月26日

Smartform圖片用變數指定

在設計smartform時,遇到像LOGO的圖片需要依不用的條件指定時,可用以下的方式處理:

首先設定一個smartform的參數,資料類型是TDOBNAME


再來就是指字圖片的變數名稱,前後要用符號&

2011年5月18日

READ_EXCHANGE_RATE EUR匯率問題

在讀匯率資料時使用READ_EXCHANGE_RATE 進行EUR/USD的匯率讀取後
系統會回傳一個值DERIVED_RATE_TYPE = EURX
這個意思是系統會以EURX的匯率來讀取

可用TCODE OBBS進行設定

新增一筆時間較晚的設定將替代的匯率類型空白即可使用原匯率類型讀取匯率


2011年5月16日

Smartform 輸出總頁數問題

在設計SMARTFORM時,輸出總頁數會用到一個系統變數SFSY-FORMPAGES,通常是直接在內文使用&SFSY-FORMPAGES&輸出,但是遇到總頁數達到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.





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
*****計算出顯示長度後依條件分割
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