2010年7月3日

BAPI_ACC_DOCUMENT_POST寫入COPA特性值

1 宣告
DATA: IT_CRITERIA LIKE TABLE OF BAPIACKEC9 WITH HEADER LINE

2 依需求填入值
IT_CRITERIA-ITEMNO_ACC = ITAB-BUZEI.
IT_CRITERIA-FIELDNAME = 'VTWEG'.
IT_CRITERIA-CHARACTER = ITAB-VTWEG.
APPEND IT_CRITERIA. CLEAR IT_CRITERIA.

3 過帳
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
DOCUMENTHEADER = GD_DOCUMENTHEADER
IMPORTING
OBJ_TYPE = GS_BAPIACHE09-OBJ_TYPE
OBJ_KEY = GS_BAPIACHE09-OBJ_KEY
OBJ_SYS = GS_BAPIACHE09-OBJ_SYS
TABLES
ACCOUNTGL = IT_ACCOUNTGL
CURRENCYAMOUNT = IT_CURRENCYAMOUNT
CRITERIA = IT_CRITERIA
RETURN = IT_RETURN.

2010年7月2日

利用Message Control列印採購單,在ME9F處理多張問題

透過ME9F列印採購單時程式要處理多張PO一次列印有技術性問題,以下是處理步驟:

1 抓出總筆數和目前處理的筆數,做法是用function group的global變數來紀錄,寫一支function程式碼如下:
  • 宣告回傳值
E_COUNTS TYPE I 列印總筆數
E_CURRENT TYPE I 目前列印筆數

  • 程式碼
FIELD-SYMBOLS: TYPE ANY TABLE,
TYPE ANY,
TYPE ANY.
DATA: W_LINE TYPE REF TO DATA.
DATA: OBJNAME(30) VALUE '(RM06ENDR_ALV)XITEM[]'.

IF G_COUNTS = 0.
ASSIGN (OBJNAME) TO .
IF SY-SUBRC = 0.
CREATE DATA W_LINE LIKE LINE OF .
ASSIGN W_LINE->* TO .
LOOP AT ASSIGNING .
ASSIGN COMPONENT 'BOX' OF STRUCTURE TO .
IF = 'X'.
G_COUNTS = G_COUNTS + 1.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.

G_CURRENT = G_CURRENT + 1.
E_COUNTS = G_COUNTS.
E_CURRENT = G_CURRENT.

*讀到最後一筆時,清空global.
IF E_COUNTS = E_CURRENT.
CLEAR: G_COUNTS, G_CURRENT.
ENDIF.


2 處理呼叫表單程式,以smartform為例:
  • 讀取PO及其他表單欄位資訊程式碼(略)

  • 多個表單處理程式碼:
DATA: CONTROL TYPE SSFCTRLOP.
DATA: LV_COUNTS TYPE I,
LV_CURRENT TYPE I.

CALL FUNCTION 'Z_FLAG_ZMMS0002_2'
IMPORTING
E_COUNTS = LV_COUNTS
E_CURRENT = LV_CURRENT.

IF LV_COUNTS > 1 AND LV_CURRENT = 1.
CONTROL-NO_OPEN = ''.
CONTROL-NO_CLOSE = 'X'.
CONTROL-NO_DIALOG = ' '.
CALL FUNCTION 'SSF_OPEN'
EXPORTING
CONTROL_PARAMETERS = CONTROL
EXCEPTIONS
FORMATTING_ERROR = 1
INTERNAL_ERROR = 2
SEND_ERROR = 3
USER_CANCELED = 4
OTHERS = 5.
ENDIF.

IF LV_COUNTS = 1.
CALL FUNCTION L_FM_NAME
EXPORTING
I_EKKO = W_EKKO
I_NAST = NAST
TABLES
IT_EKPO = IT_EKPO
GT_LINES_F = LT_ZTLINE
IT_MDSB = LT_MDSB
IT_EKET = LT_EKET
EXCEPTIONS
FORMATTING_ERROR = 1
INTERNAL_ERROR = 2
SEND_ERROR = 3
USER_CANCELED = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE 'I' NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ELSE.
CONTROL-NO_OPEN = 'X'.
CONTROL-NO_CLOSE = 'X'.
CONTROL-NO_DIALOG = 'X'.
CALL FUNCTION L_FM_NAME
EXPORTING
CONTROL_PARAMETERS = CONTROL
I_EKKO = W_EKKO
I_NAST = NAST
TABLES
IT_EKPO = IT_EKPO
GT_LINES_F = LT_ZTLINE
IT_MDSB = LT_MDSB
IT_EKET = LT_EKET
EXCEPTIONS
FORMATTING_ERROR = 1
INTERNAL_ERROR = 2
SEND_ERROR = 3
USER_CANCELED = 4
OTHERS = 5.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE 'I' NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDIF.

IF LV_COUNTS > 1 AND LV_COUNTS = LV_CURRENT.
CALL FUNCTION 'SSF_CLOSE'
EXCEPTIONS
FORMATTING_ERROR = 1
INTERNAL_ERROR = 2
SEND_ERROR = 3
OTHERS = 4.
ENDIF.

3 以上寫法不限採購單列印,只要呼叫多個smartform時都可以適用,甚至是不同的smartform都可以用同一個spool來列印。重要技巧在取得總列印筆數和目前列印筆數,本例是用FIELD-SYMBOLS將畫面上選擇的筆數算出來。

4 CALL FUNCTION 'SSF_OPEN'時要記得OUTPUT_OPTIONS裡面的參數TDNEWID = 'X'
這樣每次印時,不管幾張po單都會開新的spool寫入

SM30 使用DEC欄位有負值時的dump問題


解法:

直接修改自動產生的畫面欄位設定


2010年6月30日

K_KKB_KKBCS_CO_OBJECT_READ 抓取目標值

K_KKB_KKBCS_CO_OBJECT_READ可以直接讀出工單的計畫值和實際值
但目標值無法讀出,所以要copy出來改:

1 建立新的function group

2 copy FM 指定function group

3 在新的FM最前面加上以下程式碼

*** Insert Parameter to get target cost data.
G_OBJECT = OBJ-AUF.
***

4 回傳的table 就會有目標值
T_COSPA
T_COSSA


FM TPM_TRL_FLOW_PROTOCOL複製

TR的security當中有個tcode TPM13可以看到交易的所有流量和更新類型
標準程式是用FM TPM_TRL_FLOW_PROTOCOL直接跑出來的,在客製報表是很有用的
只是這支FM執行時會直接跑出畫面,不是回傳table,所以必須修改:

1 建立一個function group,globe data就直接貼上LTPM_TRL_PROTOCOLSTOP裡面的程式碼

2 複製function module PM_TRL_FLOW_PROTOCOL到ZTPM_TRL_FLOW_PROTOCOL,並指定步驟1的function group

3
在import的地方新增一個參數IM_EXPORT TYPE CHAR1
在table的地方新增一個參數EX_FLOWDATA TYPE TRLY_FLOW_ALV

4
刪除原程式碼:
* *** call ALV
PERFORM display_flows.

新增新程式碼:
if im_export = 'X'.
ex_flowdata[] = g_tab_selected_flowdata[].
clear g_refresh.
else.
perform display_flows.
endif.

5 應用時記得做以下處理(回傳table是L_FLOWDATA):
* Read TRD transactions
PERFORM ENRICH_WITH_TRD(SAPLZTPM_TRL_PROTOCOLS)
CHANGING L_FLOWDATA.

Coding block客製欄位,BAPI_ACC_DOCUMENT_POST傳票過帳寫入做法

BAPI拋僄票的寫法,遇上cobl欄位的處理需要加上BADI ACCDOCUMENT


Implement 名稱取ZACC_DOCUMENT即可,需特別注意filter值要選BKPFF

這時只有BAPI才會進去

Implement Method: CHANGE

貼入以下程式碼:

DATA: LW_CI_COBL TYPE CI_COBL,

WA_ACCIT TYPE ACCIT,

WA_EXT2 TYPE BAPIPAREX .

LOOP AT C_ACCIT INTO WA_ACCIT.

READ TABLE C_EXTENSION2 INTO WA_EXT2 INDEX WA_ACCIT-POSNR.

IF SY-SUBRC = 0.

LW_CI_COBL = WA_EXT2-VALUEPART1.

MOVE-CORRESPONDING LW_CI_COBL TO WA_ACCIT.

MODIFY C_ACCIT FROM WA_ACCIT.

ENDIF.

ENDLOOP.

SAP 列印時無法按內容


跳出印表機視窗時,內容按鈕無法作用時

HKEY_CURRENT_USER\Software\SAP\SAPlpd\SAPLPD

新增兩組機碼如下圖 (大小寫需符合)