2009年11月19日 星期四

彈出訊息視窗

在程式編寫時希望在USER對執行某個事件時
回傳一個資訊給USER詢問是否要再向下執行
這時我們可以拋出一個視窗給USER決定與選擇

  CALL FUNCTION 'POPUP_TO_CONFIRM'
    EXPORTING
TITLEBAR  = '確認視窗'
 TEXT_QUESTION    = '確認是否執行'
START_COLUMN    = 25
START_ROW      = 6
   IMPORTING
ANSWER        = L_IO
   EXCEPTIONS
TEXT_NOT_FOUND = 1
OTHERS      = 2
    .
  IF L_IO = '1'.
    PERFORM TRANSFER_DATA.
  ENDIF.
  IF L_IO = '2'.
    MESSAGE S001(00) WITH '已終止傳送...'.
  ENDIF.

2009年11月10日 星期二

BAPI_GOODSMVT_CREATE

庫存盤點在作SCAN BARCODE之後依盤虧盤盈的結果依相同的PLANTStorage Location BY BATCH 去作311 Movement
使用BAPI_GOODSMVT_CREATE 來處理異動
基本結構為六項:Headergm_codegm_head_retmat_docgm_itemreturn


REPORT  ZBEN_AUTO_GT.
************************************************************************
* Data type definition segment
************************************************************************
*Header
DATA: GM_HEADER LIKE BAPI2017_GM_HEAD_01.
*GM_code
DATA: BEGIN OF GM_CODE.
    INCLUDE STRUCTURE BAPI2017_GM_CODE.
DATA: END OF GM_CODE.
*GM_head_ret
DATA: BEGIN OF GM_HEADRET.
    INCLUDE STRUCTURE BAPI2017_GM_HEAD_RET.
DATA: END OF GM_HEADRET.
*Mat_doc
DATA: MAT_DOC LIKE BAPI2017_GM_HEAD_RET-MAT_DOC.
*GM_item
DATA: BEGIN OF GM_ITEM OCCURS 100.
    INCLUDE STRUCTURE BAPI2017_GM_ITEM_CREATE.
DATA: END OF GM_ITEM.
*Return Msg
DATA: BEGIN OF ERRMSG OCCURS 10.
    INCLUDE STRUCTURE BAPIRET2.
DATA: END OF ERRMSG.

************************************************************************
* Selection screen definition segment
************************************************************************
PARAMETERS: P_MATNR LIKE MCHB-MATNR OBLIGATORY.
PARAMETERS: P_WERKS LIKE MCHB-WERKS OBLIGATORY.
PARAMETERS: P_LGORT LIKE MCHB-LGORT OBLIGATORY.

************************************************************************
* Main program entry
************************************************************************
**Header
GM_HEADER-PSTNG_DATE = '20091031'. "SY-DATUM.
GM_HEADER-DOC_DATE   = '20091031'. "SY-DATUM.
** IF PACK_NO NE SPACE.
*    GM_HEADER-REF_DOC_NO = POITEM-PACK_NO "DELIVER NOTE - GR
*    GM_HEADER-HEADER_TXT = POITEM-PACK_NO " FOR GT
** ENDIF.
**Code
GM_CODE-GM_CODE = '04'.
**Item
GM_ITEM-MATERIAL = ' 2C P 906011A F001'.
GM_ITEM-PLANT = 1000.
GM_ITEM-STGE_LOC = ' 14A 1'.
GM_ITEM-BATCH = ' 5M C1680002'.
GM_ITEM-MOVE_TYPE = '311'.
GM_ITEM-MVT_IND = ''.
GM_ITEM-ENTRY_QNT = 2.
GM_ITEM-ENTRY_UOM = 'EA'.
GM_ITEM-MOVE_STLOC = ' 1A 01'.
GM_ITEM-NO_TRANSFER_REQ = 'X'.
APPEND GM_ITEM.

CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
GOODSMVT_HEADER    = GM_HEADER
GOODSMVT_CODE = GM_CODE   "Transfer posting
*   IMPORTING
*    GOODSMVT_HEADRET = GM_HEADRET
*    MATERIALDOCUMENT = MAT_DOC
*    MATDOCUMENTYEAR   =
  TABLES
GOODSMVT_ITEM = GM_ITEM
RETURN     = ERRMSG
  EXCEPTIONS
OTHERS     = 1.

IF ERRMSG[] IS INITIAL.
  REFRESH: GM_ITEM, ERRMSG.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
  WAIT = 'X'.
ELSE.
*  MESSAGE = ERRMSG-MESSAGE.
  EXIT.
ENDIF.

2009年11月7日 星期六

ALV自訂工具按鈕控制

於ALV的STATUS SET內新增一個自訂的按鈕設定好圖示與回傳CODE
在EVENT這邊呼叫
並讀取 RT_EVENTS的KEY值為SLIS_EV_USER_COMMAND傳回的CODE
這時如果有值時..於內編寫程式要作那些事件

  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
    EXPORTING
  I_LIST_TYPE = 0
    IMPORTING
  ET_EVENTS   = RT_EVENTS.
  READ TABLE RT_EVENTS WITH KEY NAME = SLIS_EV_USER_COMMAND
   INTO LS_EVENT.
  IF SY-SUBRC = 0.

  ENDIF.

2009年11月2日 星期一

ALV架構

呼叫前必須先完成TYPE-POOLS與ALV的欄位宣告
再程式輸出時呼叫CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'來完成


*&---------------------------------------------------------------------*
*& Report  ZBEN_TEST01
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT  ZBEN_TEST01 .
************************************************************************
* TYPES and TYPE-POOLS *
************************************************************************
TYPE-POOLS: SLIS.
************************************************************************
* Working Area & Internal Tables    *
************************************************************************
*ITAB
DATA: BEGIN OF GW_RPT,
    EBELN LIKE EKPO-EBELN,
    EBELP LIKE EKPO-EBELP,
  END OF GW_RPT.
DATA: GT_RPT LIKE GW_RPT OCCURS 0 WITH HEADER LINE.

*ALV
DATA: GT_FIELDCAT  TYPE SLIS_T_FIELDCAT_ALV,
  GT_SORTINFO  TYPE SLIS_T_SORTINFO_ALV,
  GT_EVENTS    TYPE SLIS_T_EVENT,
  G_REPID   TYPE SY-REPID,
  L_LAYOUT TYPE SLIS_LAYOUT_ALV,
  L_SELFIELD   TYPE SLIS_SELFIELD,
  SAV_SY_REPID TYPE SY-REPID,
  L_PRINT   TYPE SLIS_PRINT_ALV,
  GT_LIST_TOP_OF_PAGE TYPE SLIS_T_LISTHEADER.
DATA: BEGIN OF SELTAB OCCURS 0.
    INCLUDE STRUCTURE RSPARAMS.
DATA: END OF SELTAB.
************************************************************************
* Selection Screen *
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
PARAMETERS: P_EBELN LIKE EKKO-EBELN OBLIGATORY.
SELECTION-SCREEN END OF BLOCK B1.
************************************************************************
* START-OF-SELECTION Event *
************************************************************************
START-OF-SELECTION.
  PERFORM GET_DATA.
  PERFORM PROCESS_DATA.
  PERFORM PRINT_DATA.

************************************************************************
* END-OF-SELECTION Event    *
************************************************************************
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*&   Form  GET_DATA
*&---------------------------------------------------------------------*
FORM GET_DATA.
  SELECT EBELN EBELP FROM EKPO
    INTO CORRESPONDING FIELDS OF TABLE GT_RPT
   WHERE EBELN = P_EBELN.
ENDFORM.     " GET_DATA
*&---------------------------------------------------------------------*
*&   Form  PROCESS_DATA
*&---------------------------------------------------------------------*
FORM PROCESS_DATA.
ENDFORM.     " PROCESS_DATA
*&---------------------------------------------------------------------*
*&   Form  PRINT_DATA
*&---------------------------------------------------------------------*
FORM PRINT_DATA.
  G_REPID = SY-REPID.
  PERFORM FIELDCAT_INIT USING GT_FIELDCAT[].
  PERFORM SORTINFO_INIT USING GT_SORTINFO[].
  PERFORM EVENTS_INIT   USING GT_EVENTS[].
  PERFORM LAYOUT_INIT   USING L_LAYOUT.
  PERFORM PRINT_INIT    USING L_PRINT.
  CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
   EXPORTING
    I_CALLBACK_PROGRAM    = G_REPID
    IT_FIELDCAT   = GT_FIELDCAT[]
    IT_SORT   = GT_SORTINFO[]
    IT_EVENTS     = GT_EVENTS
    IS_LAYOUT     = L_LAYOUT
    I_SAVE    = 'A'
    IS_PRINT = L_PRINT
   TABLES
    T_OUTTAB = GT_RPT.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
ENDFORM.     " PRINT_DATA
*---------------------------------------------------------------------*
*    FORM fieldcat_inite    *
*---------------------------------------------------------------------*
FORM FIELDCAT_INIT USING IT_FIELDCATE TYPE SLIS_T_FIELDCAT_ALV.
  DATA: ST_FIELDCATE TYPE SLIS_FIELDCAT_ALV.
  ST_FIELDCATE-TABNAME = 'IT_RPT'.
  ST_FIELDCATE-FIELDNAME   = 'EBELN'.
  ST_FIELDCATE-SELTEXT_L   = '單號'.
  ST_FIELDCATE-OUTPUTLEN   = 10.
  ST_FIELDCATE-KEY = 'X'.
  APPEND ST_FIELDCATE TO IT_FIELDCATE.
  CLEAR  ST_FIELDCATE.
  ST_FIELDCATE-TABNAME = 'IT_RPT'.
  ST_FIELDCATE-FIELDNAME   = 'EBELP'.
  ST_FIELDCATE-SELTEXT_L   = '項次'.
  ST_FIELDCATE-OUTPUTLEN   = 10.
  ST_FIELDCATE-KEY = 'X'.
  APPEND ST_FIELDCATE TO IT_FIELDCATE.
  CLEAR  ST_FIELDCATE.
ENDFORM.
*---------------------------------------------------------------------*
*    FORM sortinfo_init     *
*---------------------------------------------------------------------*
FORM SORTINFO_INIT  USING IT_SORTINFOE TYPE SLIS_T_SORTINFO_ALV.
  DATA: ST_SORTE TYPE SLIS_SORTINFO_ALV.
ENDFORM.
*---------------------------------------------------------------------*
*    FORM events_init   *
*---------------------------------------------------------------------*
FORM EVENTS_INIT USING RT_EVENTS TYPE SLIS_T_EVENT.
  DATA: LS_EVENT TYPE SLIS_ALV_EVENT.
  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
   EXPORTING
    I_LIST_TYPE = 0
   IMPORTING
    ET_EVENTS   = RT_EVENTS.
  READ TABLE RT_EVENTS WITH KEY NAME = SLIS_EV_TOP_OF_PAGE
   INTO LS_EVENT.
  IF SY-SUBRC = 0.
    MOVE 'TOP_OF_PAGE' TO LS_EVENT-FORM.
    MODIFY RT_EVENTS FROM LS_EVENT INDEX SY-TABIX.
  ENDIF.
ENDFORM.
*---------------------------------------------------------------------*
*    FORM USER_COMMAND *
*---------------------------------------------------------------------*
FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
    RS_SELFIELD TYPE SLIS_SELFIELD.
  L_SELFIELD = RS_SELFIELD.
ENDFORM.
*&---------------------------------------------------------------------*
*&   Form  LAYOUT_INIT
*&---------------------------------------------------------------------*
FORM LAYOUT_INIT USING P_L_LAYOUT TYPE SLIS_LAYOUT_ALV.
  P_L_LAYOUT-ZEBRA  = 'X'.
ENDFORM.     " LAYOUT_INIT
*&---------------------------------------------------------------------*
*&   Form  PRINT_INIT
*&---------------------------------------------------------------------*
FORM PRINT_INIT USING  P_L_PRINT TYPE SLIS_PRINT_ALV.
ENDFORM.     " PRINT_INIT

2009年10月20日 星期二

VA03 Enhancement Addon Field

想在VA01 VA02 VA03的畫面上加入一個欄位

這時先在TABLE VBAK APPEND一個新的結構

取得Object Key才能接下以下的動作
首先要找到的事情就是「User-Exit」
知道後才能再向下修改....

於前面的文章都已記錄過如何建立Table與Layout畫面了(不重覆介紹)


接下來要在Enhancement的Screen中作Layout 增加新欄位

取得Screen在裏面加入例如 ( Sales Document Header User Exit Header )

生成的程式 於PROCESS BEFORE OUTPUT.作MODULE編寫


程式中需要作控制VA01 VA02是Input模式

VA03則是Display模式

case vbak-vbtyp.
when 'C' or 'I' or 'G'.
CASE t180-trtyp.
WHEN 'H' or 'V'. "Create or Change mode
Loop at screen.
If screen-group1 = 'GP1'.
Screen-input = 1.
Modify screen.
else.
Screen-active = 0.
Modify screen.
Endif.
Endloop.

WHEN 'A'. " Display mode
Loop at screen.
If screen-group1 = 'GP1'.
Screen-input = 0.
Modify screen.
else.
Screen-active = 0.
Modify screen.
ENDIF.
ENDLOOP.
ENDCASE.

when others.
Loop at screen.
If Screen-group1 = 'GP1'.
Screen-active = 0.
Modify screen.
ENDIF.
ENDLOOP.

ENdcase.

2009年9月15日 星期二

Bapi Create SO V2

發現 BAPI_SALESORDER_CREATEFROMDATA 建立出來的資料太多限制與事後修改
於是在改用了BAPI_SALESORDER_CREATEFROMDAT2
這部份在Schedule Line 與 Condition有很好的控制
回傳值的部份也比 BAPI_SALESORDER_CREATEFROMDATA 清楚的很多
運用上還可以把長文的部份輸入在內...

CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
    EXPORTING
ORDER_HEADER_IN  = ORDER_HEADER_IN
ORDER_HEADER_INX = ORDER_HEADER_INX
SALESDOCUMENTIN  = L_SALESDOCUMENT
*     testrun   = 'X'
    IMPORTING
SALESDOCUMENT    = L_VBELN
    TABLES
RETURN    = LI_RETURN
ORDER_ITEMS_IN    = ORDER_ITEMS_IN
ORDER_ITEMS_INX   = ORDER_ITEMS_INX
ORDER_SCHEDULES_IN   = ORDER_SCHEDULES_IN
ORDER_SCHEDULES_INX  = ORDER_SCHEDULES_INX
ORDER_PARTNERS    = ORDER_PARTNERS
ORDER_CONDITIONS_IN  = ORDER_CONDITIONS_IN.
ORDER_CONDITIONS_INX = ORDER_CONDITIONS_INX.
<code>


但真正控制還是把正確的資訊傳達給 BAPI_SALESORDER_CREATEFROMDAT2

重點分為五項:header、item、Schedule、Condition、Pantner

* Sales document type
  ORDER_HEADER_IN-DOC_TYPE   = WA_OPENSO-AUART.  
  ORDER_HEADER_IN-SALES_ORG  = WA_OPENSO-VKORG.
  ORDER_HEADER_IN-DISTR_CHAN = WA_OPENSO-VTWEG.
  ORDER_HEADER_IN-DIVISION =   WA_OPENSO-SPART.
  ORDER_HEADER_IN-SALES_GRP = WA_OPENSO-VKGRP.
  ORDER_HEADER_IN-SALES_OFF = WA_OPENSO-VKBUR.
  ORDER_HEADER_IN-REQ_DATE_H = WA_OPENSO-VDATU.
  ORDER_HEADER_IN-PURCH_NO_C = WA_OPENSO-BSTNK.
  ORDER_HEADER_IN-CURRENCY   = WA_OPENSO-WAERK.
  ORDER_HEADER_IN-PMTGAR_PRO = WA_OPENSO-PMTGAR_PRO.
  ORDER_HEADER_IN-DOC_NUM_FI = WA_OPENSO-DOC_NUM_FI.
  ORDER_HEADER_IN-INCOTERMS1  = WA_OPENSO-INCO1.
  ORDER_HEADER_IN-INCOTERMS2  = WA_OPENSO-INCO2.
  APPEND ORDER_HEADER_IN.

****項目資料***************************
  ORDER_ITEMS_IN-ITM_NUMBER = WA_OPENSO-POSNR.
  ORDER_ITEMS_IN-MATERIAL =  WA_OPENSO-MATNR.
  ORDER_ITEMS_IN-BATCH    = WA_OPENSO-CHARG.
  ORDER_ITEMS_IN-PLANT = WA_OPENSO-WERKS.
  ORDER_ITEMS_IN-STORE_LOC = WA_OPENSO-LGORT.
  ORDER_ITEMS_IN-PURCH_NO_C = WA_OPENSO-PURCH_NO_C.
  ORDER_ITEMS_IN-DLVSCHDUSE = WA_OPENSO-DLVSCHDUSE.
  APPEND ORDER_ITEMS_IN.
****Schedule Line資料***************************
  ORDER_SCHEDULES_IN-ITM_NUMBER = WA_OPENSO-POSNR.
  ORDER_SCHEDULES_IN-REQ_DATE = WA_OPENSO-REQ_DATE.
  ORDER_SCHEDULES_IN-REQ_QTY = WA_OPENSO-KWMENG.
  APPEND ORDER_SCHEDULES_IN.


****CONDITIONS資料***************************
  ORDER_CONDITIONS_IN-ITM_NUMBER  = WA_OPENSO-POSNR.
  ORDER_CONDITIONS_IN-COND_TYPE   = 'ZPR0'.
  ORDER_CONDITIONS_IN-COND_VALUE  = WA_OPENSO-KBETR.
  APPEND ORDER_CONDITIONS_IN.

****Partner資料***************************
**賣方  SP
  CLEAR ORDER_PARTNERS.
  ORDER_PARTNERS-PARTN_ROLE = 'AG'.
  ORDER_PARTNERS-PARTN_NUMB = WA_OPENSO-KUNAG.
  APPEND ORDER_PARTNERS .
*出貨對象  SH
  CLEAR ORDER_PARTNERS.
  ORDER_PARTNERS-PARTN_ROLE = 'WE'.
  ORDER_PARTNERS-PARTN_NUMB = WA_OPENSO-KUNWE.
  APPEND ORDER_PARTNERS.
*"發票收受人 RE
  CLEAR ORDER_PARTNERS.
  ORDER_PARTNERS-PARTN_ROLE = 'RE'.
  ORDER_PARTNERS-PARTN_NUMB = WA_OPENSO-KUNWE.
  APPEND ORDER_PARTNERS.
*付款方  PY
  CLEAR ORDER_PARTNERS.
  ORDER_PARTNERS-PARTN_ROLE = 'RG'.
  ORDER_PARTNERS-PARTN_NUMB = WA_OPENSO-KUNRG.
  APPEND ORDER_PARTNERS.
*End Customer  Z1
  CLEAR ORDER_PARTNERS.
  ORDER_PARTNERS-PARTN_ROLE = 'Z1'.
  ORDER_PARTNERS-PARTN_NUMB = WA_OPENSO-KUNZ1.
  APPEND ORDER_PARTNERS.

2009年9月11日 星期五

擔保品到期通知

要建立一個當擔保品額度低於某個值時可以通知負責業務人員
包含一些G/L Accont And S G/L Indicator的部份
流程分析:
1.可至BSID內取得客戶擔保品額度的G/L Accont
   將擔保品分為二個暫存區
   一個為擔保品額度   另一個為取消額度
   將擔保品額度 減去 取消額度
2.至KNVP取得客戶編號回串員工編號
   得到員工編號後回串員工電子郵件
3.當擔保品額度過小時寄發郵件給該負責業務人員
   不建議發於登入SAP帳號內的業務工作場所(內部郵件)..
   應發於員工個人電子郵件信箱(例如Outlook.Note等)