2010年7月5日

BDC 程式寫入SM35後自動執行

用SHDB錄完BDC之後自動產生程式,可以貼到自己寫的程式當中
用以下FM可以將BDC動作寫入SM35,這是SHDB就有的功能
CALL FUNCTION 'BDC_OPEN_GROUP'
CALL FUNCTION 'BDC_INSERT'
CALL FUNCTION 'BDC_CLOSE_GROUP'.

到SM35之後想要讓job自動執行時,要再加上以下程式碼
SUBMIT RSBDCSUB WITH MAPPE EQ GROUP_NAME
WITH VON EQ SY-DATUM
WITH BIS EQ SY-DATUM
WITH Z_VERARB EQ 'X' "新
WITH FEHLER EQ ' ' "有錯誤
EXPORTING LIST TO MEMORY
AND RETURN.

2010年7月4日

Query掛Tcode

1 執行SE93, 輸入要建立的Tcode後按新增。

2 輸入短文並選擇第5項Transaction with parameters,再按繼續。

3 Transaction欄位輸入START_REPORT,取消Skip initial screen,並將Inherit GUI attributes選起來。

4 輸入報表參數:
D_SREPOVARI-REPORTTYPE = AQ
D_SREPOVARI-REPORT = user group + G (G為第13碼,中間不足放空白)
D_SREPOVARI-EXTDREPORT = 報表名稱

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

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

2010年6月24日

ABAP List在Unicode環境輸出中文問題

不多說,直接看程式碼

*&---------------------------------------------------------------------*
*& Include ZINCL_OUTPUT
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*& Macro M_STROUT
*&---------------------------------------------------------------------*
* 參考 Form OUTPUT_STR
*----------------------------------------------------------------------*
DEFINE M_STROUT.
PERFORM OUTPUT_STR USING &1 &2 &3 &4.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& Form OUTPUT_STR
*&---------------------------------------------------------------------*
* 將輸出資料(DATA1)輸出到目標(STR1)的特定位置(POS)
*----------------------------------------------------------------------*
* -->STR1 來源及輸出目標
* -->DATA1 輸出資料
* -->POS 預計位置
* -->LEN 預計長度, 輸入0則以實際長度顯示
*----------------------------------------------------------------------*
FORM OUTPUT_STR USING STR1 DATA1 POS LEN.
DATA : RET_POS TYPE I.
DATA : LEN1 TYPE I.

IF LEN = 0.
LEN1 = CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH( DATA1 ).
ELSE.
LEN1 = LEN.
ENDIF.
PERFORM GET_OUTPUT_POS USING STR1 POS RET_POS.
WRITE DATA1 TO STR1+RET_POS(LEN1).
ENDFORM. "OUTPUT_STR
*&---------------------------------------------------------------------*
*& Form GET_OUTPUT_POS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->STR1 來源字串
* -->POS 預估輸出位置
* -->RET_POS 實際輸出位置
*----------------------------------------------------------------------*
FORM GET_OUTPUT_POS USING STR1
POS
RET_POS.
DATA : LEN1 TYPE I,
LEN2 TYPE I.
DATA : L_STR(1024) TYPE C.

L_STR = STR1+0(POS).
LEN1 = STRLEN( L_STR ).
LEN2 = CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH( L_STR ).
RET_POS = POS - LEN2 + LEN1.
ENDFORM. "GET_OUTPUT_POS