顯示具有 MM 標籤的文章。 顯示所有文章
顯示具有 MM 標籤的文章。 顯示所有文章

2012年1月11日

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

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

2010年11月24日

預留單MB_RESERVATION_BADI method DATA_CHECK處理

有一個客戶希望在預留單Movement 201時進行成本中心及費用科目預算檢查(利用KP06設定),不通過時不允許save。

以下是利用BADI MB_RESERVATION_BADI時的重點:
1 IS_RESB有成本中心和會計科目,可以利用來讀COSP的計劃值。
2 讀取未刪除的預留單,需求數量減去領料數量才是要卡控的數量。
3 金額可考慮抓標準價格或異動平均單價。
4 利用I_NEW_ITEM = 'X'判斷create時沒有科目指派,要直接去table T030找出會計科目,規則要問一下MM顧問。

2010年11月22日

BADI ME_PROCESS_PO_CUST method CHECK拋出多筆message

使用BADI ME_PROCESS_PO_CUST時,method CHECK可以一次檢查所有的PO內容
要將訊息輸出時,從doc看不到該怎麼處理,以下是help的提醒:
Never use the ABAP statement MESSAGE in the BAdI ME_PROCESS_PO_CUST.

再進一步找尋,發現要用macro處理:
INCLUDE MM_MESSAGES_MAC.
MMPUR_MESSAGE_FORCED 'E' 'ZMM01' '001' LV_MSGV1 LV_MSGV2 LV_MSGV3 LV_MSGV4.
MMPUR_MESSAGE_FORCED 'E' 'ZMM01' '002' LV_MSGV1 LV_MSGV2 LV_MSGV3 LV_MSGV4.

2010年11月17日

利用BADI ME_PROCESS_PO_CUST進行PO check

BADI ME_PROCESS_PO_CUST當中有一個method CHECK可以進行整個PO的檢查。
要注意的是parameter只有IM_HEADER,並且是object形態。

以下是取得內容的範例:

*取得header
IM_HEADER->GET_DATA( ).
*取得item,一樣是object形態
IM_HEADER->GET_ITEMS( ).

檢查後若要拋出錯誤,直接用message即可。
MESSAGE E888(SABAPDOCU) WITH LV_MSGV1 LV_MSGV2 LV_MSGV3 LV_MSGV4.

利用BADI ME_PURCHDOC_POSTED將PO資訊在SAVE後寫入Addon Table

PO在save之後的BADI ME_PURCHDOC_POSTED只有一個Method POSTED,作用是在這個時間得到完整的PO資訊,可以寫到Addon Table。
要注意的地方是PO create時, IM_EKPO不會有PO number,只存在 IM_EKKO-EBELN當中。

2010年9月13日

MM03子頁面顯示圖片

前篇提到MM03顯示新的子頁面,在上面放了一張圖片,以下步驟說明如何完成:


1 進入Tcode SMW0,選擇Binary data for WebRFC applications,將圖片上傳至SAP,object name取名叫MY_PIC1


2 在function group ZMGD1 copy screen 1002,給號0200。並在screen layout 拉出一個customer control 取名C_CONTAINER,並在flow logic 新增一個PBO module SET_PICTURE,並填入以下程式碼:


  DATA: G_PICTURE TYPE REF TO CL_GUI_PICTURE,
         G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
         URL 
TYPE C LENGTH 255.

  
CLASS CL_GUI_CFW DEFINITION LOAD.

  
IF G_CUSTOM_CONTAINER IS INITIAL.

    
CREATE OBJECT G_CUSTOM_CONTAINER
      
EXPORTING
        CONTAINER_NAME              = 
'C_CONTAINER'
      
EXCEPTIONS
        CNTL_ERROR                  = 
1
        CNTL_SYSTEM_ERROR           = 
2
        CREATE_ERROR                = 
3
        LIFETIME_ERROR              = 
4
        LIFETIME_DYNPRO_DYNPRO_LINK = 
5
        
OTHERS                      = 6.
    
IF SY-SUBRC NE 0.
      
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                 
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.

    
CREATE OBJECT G_PICTURE
      
EXPORTING
        PARENT = G_CUSTOM_CONTAINER
      
EXCEPTIONS
        ERROR  = 
1
        
OTHERS = 2.
    
IF SY-SUBRC NE 0.
      
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                 
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.

    
PERFORM LOAD_PIC_FROM_DB USING 'MY_PIC1' CHANGING URL. * load picture
    
CALL METHOD G_PICTURE->LOAD_PICTURE_FROM_URL
      
EXPORTING
        URL    = URL
      
EXCEPTIONS
        ERROR  = 
1
        
OTHERS = 2.
    
IF SY-SUBRC NE 0.
      
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                 
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.

    
CALL METHOD CL_GUI_CFW=>FLUSH
      
EXCEPTIONS
        CNTL_SYSTEM_ERROR = 
1
        CNTL_ERROR        = 
2.

  ENDIF.



3 新增一個form routine LOAD_PIC_FROM_DB,可參考程式RSDEMO_DIALOGBOX_CONTROL並修改為可傳入Object Name(詳略)


4 進入Tcode OMT3B修改IMG

MM03新增子頁面

最近友人問我一個MM03新增子頁面並顯示圖片的問題,一直以來只知道可以新增,手癢之下在IDES練習了一下,把過程放上來


首先在se80 copy一個function group MGD1, 取名就叫做ZMGD1吧(不必copy function module)
再來就是到IMG設定新的子頁面,Tcode OMT3B,要選項目21
Copy Basic Data 2,號碼不要重覆,就給85
選取新增的Basic Data 3再雙擊subscreen
在第一個項目維護新function group的main program以及screen number
設定完成,進MM03看看吧(使用IDES最常用料號100-100),多了一個新的view
MM03果然出現了我們新增的view(如何顯示圖片略,請看下一篇)

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寫入