2010年10月30日 星期六

[MM]料號主檔維護作業

*********************************************************************
* Goal         : 建立物料
* T-Code       : MM01
* P.S          : 黃字部分為TABLE-FIELD標記。
*********************************************************************

可以從選單進去,也可以直接打T-code: MM01建立物料。

image

 輸入物料名稱,選定產業別、物料類型(MARA),打勾繼續。

image

選定欲建立之資訊,如果欲將建立之資訊設定為[預設值]下次系統即代選定。

image 

輸入工廠(MARC)。

image 

輸入物料說明(MAKT-MAKTX)以及其他資訊,按[附加資料]繼續。

image 

(備註: 基礎計量單位只可以於物料未開始異動前更換。 )

這裡可以輸入多語系(MAKT-SPRAS)的物料說明(MAKT-MAKTX),按[計量單位]輸入其他相關資訊。

image 

輸入計量單位,例如1Drum = 50KG,按[主要資料]輸入其他相關資訊。

image

[採購頁籤] 輸入採購群組,啟用自動轉採購訂單,輸入訂購單位(如果不是基礎計量單位)。

ENTER(打勾)繼續。

image

繼續。

image

儲存回到最初畫面。

image 

一般物料資料: MARA (General Material Data)。

image

物料工廠資料: MARC (Plant Data for Material)。

image 

物料說明: MAKT (Material Descriptions)

image 

來張關連圖:

image

*注意事項:
Join MAKT時,記得加Language的條件,不然抓出來的資料會Double,再者建議用left outer join的方式做select,以防止user漏建該語言之description。(MAKT有兩個Key,一個是物料,一個是語言SPRAS)

2010年10月29日 星期五

SAP-Dialog(Open the text editor when click the button in table control)

*********************************************************************
* Goal         : 讓表格維護器產生的交易裡能編輯長文。
* T-Code       : SE11、SM30、SE75(Object & id)
* Description  : 利用系統產生出來的程式以及畫面再做部分修改維護自訂Table。
* Source       :
saptechnical.com
* P.S          : 此為我的練習,英文範本請參考上列網址。
*********************************************************************

=>建議:可先到文章末端看看實做出來的結果,大致的流程如下五步驟。
1.
建立自訂Table。
2.
表格維護產生器,系統產生一堆程式碼以及畫面。
3.
再利用Screen Painter加上Button欄位。
4.有建立表格維護的Table可用SM30來做維護。
5.自建一支T-code來呼叫SM30(跳過第一個畫面)執行Table的維護。

T-code: SE11 建立一個Z打頭的Table,他必須是[許可使用標準表格維護工具維護]。

image

欄位如下圖。

image

對這個Table建立表格維護產生器(table maintenance generator)

做法請參考連結(開新視窗) -> 表格維護產生器

---------------------------------------------------------------------

上面的步驟完成之後,開啟T-code: SM30,在[表格/檢視]填入剛剛自訂的Table名稱。

然後請點[維護]繼續。

image

Table維護的畫面如下(單階),是系統幫我們生成的畫面。

image

但我們希望每個row之後都加一個Button好讓使用者能輸入長文的payment term。

現在再回來T-code: SE11,開啟[表格維護產生器]如下圖。

image

出現的畫面如下。 

image

點[功能群組內文]按鈕,出現如下畫面。

image

點[主程式]按鈕。

雙擊畫面0001如下。

image

單擊[格式]按鈕。

加入button元件以及text field元件如下。 

image

button的屬性設定如下:  

image

text field的屬性設定如下:

image

Save & active。

回到[流程邏輯]。 

image

加入程式碼:

*module to create text editor for payment term text
  MODULE text_editor.

Module裡的程式碼:

*----------------------------------------------------------------------*
***INCLUDE LZEISRICEI01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  TEXT_EDITOR  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE text_editor INPUT.
  DATA g_aftnr  LIKE thead-tdname.
  DATA g_vendor TYPE lifnr.
  DATA st_thead LIKE thead.
  DATA wa_lines TYPE tline.
  DATA it_lines TYPE TABLE OF tline.
  DATA g_tdname LIKE stxh-tdname.
  DATA g_lineno TYPE sy-index.
  DATA g_ok_code TYPE sy-ucomm.
  DATA g_lin_no.  CLEAR :  g_lineno,
           g_tdname,
           st_thead,
           it_lines,
           wa_lines,
           g_lin_no.
  REFRESH it_lines.
  g_ok_code = sy-ucomm.
  CLEAR sy-ucomm.
  IF g_ok_code EQ 'PTERM'.
    GET CURSOR LINE g_lineno.   
    g_lineno =  g_lineno + tctrl_zcontract-top_line - 1.   
    READ TABLE extract INDEX g_lineno.
    g_vendor = extract+3(10).
    g_aftnr = extract+13(10).   
    CONCATENATE g_vendor g_aftnr INTO g_tdname.   
    PERFORM read_text.
    IF sy-subrc NE 0.
      PERFORM enter_st_head.
      PERFORM edit_text.
    ELSE.
      PERFORM edit_text.
    ENDIF.
  ENDIF.
  PERFORM create_text.
ENDMODULE.                 " TEXT_EDITOR  INPUT
*&----------------------------------------------------------------*
*&      Form  READ_TEXT
*&----------------------------------------------------------------*
FORM read_text .
  CALL FUNCTION 'READ_TEXT'     "讀長文
    EXPORTING
*     CLIENT                        = SY-MANDT
      id                            = 'ZTS'       "自己建立的長文ID
      language                      = sy-langu
      name                          = g_tdname
      object                        = 'ZTEST_ID"之後會建立這個物件
*     ARCHIVE_HANDLE                = 0
*     LOCAL_CAT                     = ' '
   IMPORTING
     header                        = st_thead
    TABLES
      lines                         = it_lines
   EXCEPTIONS
     id                            = 1
     language                      = 2
     name                          = 3
     not_found                     = 4
     object                        = 5
     reference_check               = 6
     wrong_access_to_archive       = 7
     OTHERS                        = 8
            .
  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.                    " READ_TEXT
*&----------------------------------------------------------------*
*&      Form  ENTER_ST_HEAD
*&----------------------------------------------------------------*
FORM enter_st_head .
  st_thead-tdobject   = 'ZTEST_ID'.  "我們之後會建立這個物件 
  st_thead-tdid       = 'ZTS' .       "自己建立的長文ID 
  st_thead-tdspras    = sy-langu.
  st_thead-tdlinesize = '072'.
  st_thead-tdtxtlines = '1'.
ENDFORM.                    " ENTER_ST_HEAD
*&---------------------------------------------------------------*
*&      Form  EDIT_TEXT
*&---------------------------------------------------------------*
FORM edit_text .
  CALL FUNCTION 'EDIT_TEXT'    "編輯長文
    EXPORTING
*     DISPLAY             = ' '
*     EDITOR_TITLE        = ' '
      header              = st_thead
*     PAGE                = ' '
*     WINDOW              = ' '
*     SAVE                = 'X'
*     LINE_EDITOR         = ' '
*     CONTROL             = ' '
*     PROGRAM             = ' '
*     LOCAL_CAT           = ' '
   IMPORTING
*     FUNCTION            =
     newheader           = st_thead
*     RESULT              =
    TABLES
      lines               = it_lines
   EXCEPTIONS
     id                  = 1
     language            = 2
     linesize            = 3
     name                = 4
     object              = 5
     textformat          = 6
     communication       = 7
     OTHERS              = 8            .
  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.                    " EDIT_TEXT
*&---------------------------------------------------------------*
*&      Form  CREATE_TEXT
*&---------------------------------------------------------------*
FORM create_text .
  CALL FUNCTION 'CREATE_TEXT'
    EXPORTING
      fid         = 'ZTS'         "自己建立的長文ID 
      flanguage   = sy-langu
      fname       = g_tdname
      fobject     = 'ZTEST_ID'    "我們之後會建立這個物件 
      save_direct = 'X'
      fformat     = '*'
    TABLES
      flines      = it_lines
    EXCEPTIONS
      no_init     = 1
      no_save     = 2
      OTHERS      = 3.
  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.                    " CREATE_TEXT

現在開啟T-code: SE75,選更改文字物件與IDs如下圖,點[更改]。

image 

出現如下畫面,單擊Button建立物件,如下圖。

image

出現如下畫面,建立物件ZTEST_ID。(剛剛出現在程式裡的物件)

image

打勾繼續,出現如下畫面。

到這裡先儲存起來image

image 

點[內文IDs]建立Text ID。

image

點[建立]按鈕如上圖,輸入內文ID: zts。 (剛剛在程式的部分出現很多次)

image

[v]打勾繼續,接著再存檔一次image

執行我們自己建立的Call SM30 表格維護T-code,出現如下畫面。

image

出現Button了,點[Maintext Text]按鈕會出現長文編輯器。

image

以上。^(+++++)^

2010年10月28日 星期四

SAP-ABAP(Working with Table Maintenance Generator)

*********************************************************************
* Goal         : 表格維護產生器(Table Maintenance Generator)
* T-Code       : SE11、SM30、SE93
* Description  : 自訂T-code呼叫SM30塞入預設值,可做Table維護。
* Source       :
saptechnical.com
* P.S          : 此為我的練習,英文範本如上網址。^_^好站推薦給你!
*********************************************************************

開啟T-code: SE11輸入一個已經建好的Z打頭table,選擇[更改]。

image

注意:在 [ Delivery & Maintenance ] 頁籤,必須是 [ 許可使用標準表格維護工具 ]。

image

下圖是這個Table的欄位們。

image

[選單]->[公用程式]->[表格維護產生器]。(Table Maintenance Generator)

image

進來的畫面如圖。

image

輸入[權限群組],這裡我輸入[&NC&]。
輸入[功能群組],可以在T-code: SE80去創建新的function group。

維護類型可以選擇 "單階" 或 "雙階" ,指定維護畫面號碼可以利用Button[尋找畫面號碼]來做指定。

image

Createimage & Save。

現在要替table maintenance generator建一個T-code。

開啟T-code: SE93,輸入要建立的T-code名稱->[建立]。

image

選擇 " Transaction with parameters (Parameter transaction) " 。

image

輸入[Transation]SM30,因為我們要透過這支交易來做維護表格的動作。

image

[v]Skip initial screen跳過第一個畫面要打勾,就是跳過SM30初始畫面的意思。

image

不過其實SM30第一個畫面有一些值是必輸的,我們就將他定在預設值。

=>簡言之:開啟自訂T-code時會去呼叫SM30並且塞入預設值,直接帶出我們自訂Table的維護畫面。

Click on save.

大功告成,現在你可以開啟剛剛自訂的T-code來做表格維護的動作。

2010年10月27日 星期三

SAP-Dialog(Update any standard table field value(s) by using Table control with wizard)

*********************************************************************
* Goal         : update any standard table field value(s)
* T-Code       : SE38
* Description  : 這次的練習是更新物料的描述。
* Source       :
saptechnical.com
* P.S          : 該範例是看著範本的練習,英文原版如上網址。
*********************************************************************

=>建議開始前可以先到頁尾看看這隻的程式作用。

開啟SE38建立一隻Z打頭可執行的程式。

image

存在本端做測試。

宣告TYPE以及internal tables & work areas還有別忘了selection screen,到時候要篩選資料用的。

image

程式碼如下。

TABLES: mara.

TYPES:  BEGIN OF ty_makt.
        INCLUDE STRUCTURE makt.
TYPES:  END OF ty_makt,

        tt_makt TYPE STANDARD TABLE OF ty_makt.

DATA:   gt_makt     TYPE tt_makt,
        gs_makt     TYPE ty_makt,
        gt_makt_old TYPE tt_makt,
        gs_makt_old TYPE ty_makt.

SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-100.

  SELECT-OPTIONS s_matnr FOR mara-matnr.

SELECTION-SCREEN END OF BLOCK bl1.

在事件start of selection,我們開始SELECT資料。

image

程式碼如下。

START-OF-SELECTION.

  PERFORM get_materials.
*&---------------------------------------------------------------------*
*&      Form  GET_MATERIALS
*&---------------------------------------------------------------------*
FORM get_materials .
  SELECT *
  INTO TABLE gt_makt
  FROM makt
  WHERE matnr IN s_matnr
    AND spras EQ sy-langu.

  APPEND LINES OF gt_makt TO gt_makt_old.

  CALL SCREEN 100. "SELECT完就呼叫畫面

ENDFORM.                    " GET_MATERIALS

存檔 & active.

雙擊畫面100,建立畫面。

image

簡短描述這個畫面。

image

點[格式]開啟Screen Printer。 

image

單擊Table Control (with Wizard )如下圖,並且繪製大小在畫面上。

image

點[繼續]。

image

替這個Table Control命名,繼續。

image

將我們剛剛宣告的internal table和work area填入。  

image

選擇要秀在table上的欄位。 

image

選擇Input control

image

[v]table可捲動,繼續。  

image

繼續。

image

繼續完成。

image

將MATNR、SPRAS、MAKTG設成read only如圖。

image

存檔 and Active。 

建立 GUI Status。

image

輸入名稱並且描述。  

image

在應用程式工具列新增[UPD]。

image

輸入好按ENTER即出現下面畫面,指定內文以及圖示。  

image

打勾他會讓你指定功能鍵。

image

回到畫面在[UDP]上點兩下,圖示內文指的是出現圖之後會一併帶出的文字敘述。

image

設定功能鍵。 

image

存檔並且Active GUI Status。雙擊Module TC_MAKT_GET_LINES。

image

加入下面程式片段將SCREEN_STATUS插入。

image

程式如下。

SET PF-STATUS 'SCREEN_STATUS'.

輸入下面程式到子常式USER_OK_TC,指的就是畫面的PAI user下了command之後,要判斷user做了啥咪動作。

image

程式碼如下。

IF ( p_ok EQ 'BACK' OR p_ok EQ 'CANCEL' OR p_ok EQ 'EXIT' ).
  LEAVE TO SCREEN 0.
ELSEIF p_ok EQ 'UPD' .
  PERFORM process_data.
ENDIF.

建立你要更新的standard table的加鎖物件。 

T-code: SE11。名稱要以E打頭。  

image

填入短文敘述以及表格名稱Lock Mode選擇[專用,累計]如果是英文版本=Write Lock。

image

加鎖參數顯示如下,儲存且active。 

image 

在選單->[轉到]->[加鎖模組]。 

image

顯示兩個Functione Module我們之後在update DB時要用的。

image

在副程式Process_Data寫下面這段程式。

image

*&---------------------------------------------------------------------*
*&      Form  PROCESS_DATA
*&---------------------------------------------------------------------*
FORM process_data .
  LOOP AT gt_makt INTO gs_makt.
    READ TABLE gt_makt_old INTO gs_makt_old
                           WITH KEY matnr = gs_makt-matnr.
    IF sy-subrc EQ 0.
      IF gs_makt NE gs_makt_old.
        CALL FUNCTION 'ENQUEUE_EZMAKT_06'
          EXPORTING
            mode_makt      = 'E'
            mandt          = sy-mandt
            matnr          = gs_makt-matnr
            spras          = gs_makt-spras
            x_matnr        = ' '
            x_spras        = ' '
            _scope         = '2'
            _wait          = ' '
            _collect       = ' '
          EXCEPTIONS
            foreign_lock   = 1
            system_failure = 2
            OTHERS         = 3.
        IF sy-subrc <> 0.
*         MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
        ENDIF.

        MODIFY makt FROM gs_makt.

        CALL FUNCTION 'DEQUEUE_EZMAKT_06'
         EXPORTING
           mode_makt       = 'E'
           mandt           = sy-mandt
           matnr           = gs_makt-matnr
           spras           = gs_makt-spras
           x_matnr         = ' '
           x_spras         = ' '
           _scope          = '3'
           _synchron       = ' '
           _collect        = ' '   .

      ENDIF.
    ENDIF.
  ENDLOOP.
ENDFORM.                    " PROCESS_DATA

存檔並且active完成程式。

現在可以來Run看看,輸入物料號碼。

image

table帶出物料名稱。

image

修改名稱。

image

開啟T-code: MM03,物料名稱被改變哩。

image

♥  總結:
=>利用Wizard做出Table Control。
=>定義畫面的Status。
=>Update Table前先Lock Table,Update後deLock。