09界面編程恩溅,實(shí)踐A2-設(shè)計(jì)界面管理訂單

圖9-A2_1 程序執(zhí)行初始界面
圖9-A2_2 訂單維護(hù)界面

需求分析:

1隔箍、具體需求

本《設(shè)計(jì)界面管理訂單》有如下需求:

  1. 程序執(zhí)行后,顯示初始界面脚乡,在界面中可以輸入訂單號后蜒滩,點(diǎn)擊按鈕進(jìn)行新建、修改每窖、查看和刪除的操作帮掉;
  2. 在點(diǎn)擊“新建訂單”時,如果輸入的訂單編號在訂單表中已存在窒典,則發(fā)出錯誤提示且停止創(chuàng)建操作蟆炊;否則在訂單維護(hù)界面中維護(hù)訂單的具體信息,包括訂單相關(guān)的員工瀑志、雇員涩搓、物料等信息污秆;
  3. 在點(diǎn)擊“修改訂單”時,如果輸入的訂單編號在訂單表中不存在昧甘,或輸入的訂單編號在10000~60000范圍良拼,則發(fā)出錯誤提示且停止修改操作;否則打開訂單維護(hù)界面以進(jìn)行更改充边;
  4. 在點(diǎn)擊“查看訂單”時庸推,如果輸入的訂單編號在訂單表中不存在,則發(fā)出錯誤提示且停止查看操作浇冰;否則打開顯示訂單的詳細(xì)贬媒;
  5. 在點(diǎn)擊“刪除訂單”時,如果輸入的訂單編號在訂單表中不存在肘习,或輸入的訂單編號在10000~60000范圍际乘,則發(fā)出錯誤提示且停止刪除操作;否則將刪除此訂單編號的記錄及返回提示漂佩;
  6. 在“新建訂單”和“修改訂單”操作的訂單維護(hù)界面中脖含,如果輸入了數(shù)據(jù)后,還沒點(diǎn)擊“保存”前點(diǎn)擊了“返回”投蝉,則彈出窗口給用戶進(jìn)行確認(rèn)是否保存养葵。

2、開發(fā)分析

要達(dá)成本實(shí)踐目標(biāo)墓拜,將需要使用ABAP的數(shù)據(jù)處理和界面設(shè)計(jì)技術(shù)港柜,程序流程分析如下。

圖9- 34 程序流程

實(shí)踐步驟:

本實(shí)踐可以在ABAP工作臺(SE80)完成所有工作咳榜,也可以通過不同的工具完成不同部分夏醉。

No 部分 說明 事務(wù)代碼
1 建立程序 建立本實(shí)踐的程序,設(shè)置程序基本信息涌韩。 SE38
2 GUI狀態(tài)標(biāo)題設(shè)計(jì) 設(shè)計(jì)GUI狀態(tài)畔柔,增加相應(yīng)的功能以接受用戶的指令;設(shè)計(jì)GUI標(biāo)題臣樱,以在程序運(yùn)行時顯示在界面的標(biāo)題上靶擦。 SE41
3 屏幕設(shè)計(jì) 根據(jù)實(shí)踐需求設(shè)計(jì)屏幕,并將相關(guān)元素添加到屏幕上雇毫。 SE51
4 代碼編寫 編寫代碼以進(jìn)行變量定義玄捕、數(shù)據(jù)獲取、輸出數(shù)據(jù)到界面等棚放。 SE38
4.1 對象定義 定義要使用的變量枚粘,以在程序執(zhí)行過程中計(jì)算和存儲臨時值。
4.2 程序初始事件 通過START-OF-SELECTION執(zhí)行程序初始事件飘蚯。
4.3 屏幕100事件 對于屏幕100馍迄,數(shù)據(jù)輸出到屏幕前的處理(PBO事件)福也;以及在用戶點(diǎn)擊按鈕后觸發(fā)相應(yīng)操作(PAI事件)。
4.4 屏幕150事件 對于屏幕150攀圈,數(shù)據(jù)輸出到屏幕前的處理(PBO事件)暴凑;以及在用戶點(diǎn)擊按鈕后觸發(fā)相應(yīng)操作(PAI事件)。
4.5 子程序 根據(jù)程序執(zhí)行的過程將部分代碼封裝為主程序赘来,以實(shí)現(xiàn)代碼重用现喳、提高效率和提高代碼可讀性。

1撕捍、建立程序

與一般程序的建立過程一樣拿穴,在程序編輯器初始界面輸入程序名稱后點(diǎn)擊創(chuàng)建,設(shè)置類型和狀態(tài)后忧风,將進(jìn)入程序編輯器界面,默認(rèn)代碼如下球凰,不改動內(nèi)容狮腿,保存后退出。

REPORT zu0902_order_trans.

2呕诉、GUI狀態(tài)標(biāo)題設(shè)計(jì)

使用菜單設(shè)計(jì)器(SE41)缘厢,完成GUI狀態(tài)和GUI標(biāo)題的設(shè)計(jì)。

2.1甩挫、建立狀態(tài)

在本實(shí)踐中贴硫,在程序執(zhí)行初始界面和訂單維護(hù)的界面都會有相應(yīng)的工具欄,因此需要建立2個相應(yīng)的GUI狀態(tài)伊者,本步驟可參考實(shí)踐9A1完成英遭。

1)GUI狀態(tài)STAT1

GUI狀態(tài)STAT1的模擬結(jié)果如圖9-35所示,編輯維護(hù)的界面如圖9-36亦渗。

圖9- 35 STAT1模擬結(jié)果
圖9- 36 STAT1維護(hù)

各功能按鈕的定義可參考下表完成挖诸。


2)GUI狀態(tài)STAT2

GUI狀態(tài)STAT1的模擬結(jié)果如圖9-37所示,編輯維護(hù)的界面如圖9-38法精。

圖9- 37 STAT2模擬結(jié)果
圖9- 38 STAT2維護(hù)界面

各功能按鈕的定義可參考下表完成多律。

2.2、建立標(biāo)題

重新執(zhí)行“菜單設(shè)計(jì)器”搂蜓,在初始界面中選擇“標(biāo)題列表”后點(diǎn)擊創(chuàng)建狼荞,參考圖9-39所示建立2個標(biāo)題。

圖9- 39 GUI標(biāo)題列表

3帮碰、屏幕設(shè)計(jì)

在本實(shí)踐中相味,有程序執(zhí)行初始界面,還有訂單維護(hù)的界面收毫,因此需要建立2個屏幕攻走,本步驟可參考實(shí)踐9A1殷勘,使用屏幕設(shè)計(jì)器(SE51),完成各個屏幕的設(shè)計(jì)昔搂。

3.1玲销、初始屏幕100
1)屏幕屬性
圖9- 40 屏幕100的屬性
2)屏幕格式設(shè)計(jì)

點(diǎn)擊工具欄的“格式”后,在顯示“屏幕繪制器”界面中添加屏幕元素摘符,結(jié)果如圖9-41贤斜。

圖9- 41屏幕100的格式
3)屏幕元素清單

點(diǎn)擊工具欄的“元素列表”按鈕,將返回到屏幕定義的“元素清單”中逛裤,此處將列出界面中所包含的元素瘩绒,以及各元素的具體屬性,如圖9-42带族。

圖9- 42 屏幕100包含的元素
4)屏幕邏輯流

點(diǎn)擊“邏輯流”頁簽锁荔,邏輯流的代碼如下。

PROCESS BEFORE OUTPUT.
  MODULE status_0100.
*
PROCESS AFTER INPUT.
*  MODULE user_command_0100.
  MODULE over_and_out_0100 AT EXIT-COMMAND.
  CHAIN.
    FIELD:ztorders_h-orderid
    MODULE validate_input_0100.
  ENDCHAIN.
  MODULE main_pai_0100.

在如上屏幕100的“邏輯流”PBO事件中蝙砌,包含一個MODULE:status_0100阳堕,此MODULE在屏幕輸出前執(zhí)行,包括設(shè)置GUI择克、標(biāo)題欄恬总、變量初始值等,具體代碼將在后續(xù)屏幕100的PBO事件代碼中實(shí)現(xiàn)肚邢。

PAI事件中壹堰,則包含了3個MODULE:
over_and_out_0100,此MODULE是在屏幕100中點(diǎn)擊“退出”時的響應(yīng)骡湖,并加上AT EXIT-COMMAND關(guān)鍵字贱纠,以在自動字段檢查之前調(diào)用模塊(對應(yīng)按鈕需將類型設(shè)置為E);如果PAI中沒有此MODULE勺鸦,則會點(diǎn)擊“退出”按鈕時還會執(zhí)行后面的語句并巍,如檢查輸入的訂單編號,而這是多余的换途。
validate_input懊渡,此MODULE是繼續(xù)響應(yīng)點(diǎn)擊按鈕,以對輸入的訂單編號進(jìn)行檢查军拟;如點(diǎn)擊“新建”時剃执,輸入的訂單編號在數(shù)據(jù)表中已存在,則返回相應(yīng)提示懈息。
main_pai_0100肾档,此MODULE是繼續(xù)對點(diǎn)擊不同的按鈕進(jìn)行響應(yīng),如點(diǎn)擊新建或修改、顯示怒见,則進(jìn)入屏幕150俗慈,如點(diǎn)擊刪除,則對指定的訂單進(jìn)行刪除遣耍。
CHAIN……ENDCHAIN闺阱,通過CHAIN語句,當(dāng)輸入的編號發(fā)生變化時舵变,則調(diào)用MODULE:validate_input進(jìn)行檢查酣溃。

3.2、訂單明細(xì)屏幕150
1)屏幕屬性
圖9- 43 屏幕150的屬性
2)屏幕格式設(shè)計(jì)

通過“屏幕繪制器”對屏幕150添加的屏幕元素結(jié)果纪隙,如圖9-44所示赊豌。

圖9- 44屏幕150的格式
3)屏幕元素清單

點(diǎn)擊工具欄的“元素列表”按鈕,將返回到屏幕定義的“元素清單”中绵咱,此處將列出界面中所包含的元素碘饼,以及各元素的具體屬性,如圖9-45麸拄。

圖9- 45 屏幕150包含的元素
4)屏幕邏輯流

點(diǎn)擊“邏輯流”頁簽派昧,邏輯流的代碼如下。

PROCESS BEFORE OUTPUT.
  MODULE status_0150.
  LOOP AT ordersi_tab INTO ztorders_i  WITH  CONTROL items.
    MODULE items_0150_change_field_attr.
  ENDLOOP.
*
PROCESS AFTER INPUT.
  CHAIN.
    FIELD:ztorders_h-orderid, ztorders_h-customerid,
       ztorders_h-employeeid,ztorders_h-orderdate, ztorders_h-shipdate.
    MODULE set_change_0150 ON CHAIN-REQUEST.
  ENDCHAIN.

  LOOP AT ordersi_tab.
    MODULE items_0150_modify.
  ENDLOOP.
  MODULE user_command_0150.

在如上屏幕150的“邏輯流”PBO事件中拢切,包含2個MODULE:
status_0150,此MODULE在屏幕150輸出前執(zhí)行秆吵,包括設(shè)置GUI淮椰、標(biāo)題欄、元素顯示屬性等纳寂,具體代碼將在后續(xù)屏幕150的PBO事件代碼中實(shí)現(xiàn)主穗。
items_0150_change_field_attr,此MODULE是設(shè)置字段的顯示毙芜,通過LOOP AT語句讀取和填充數(shù)據(jù)到屏幕150的界面元素后忽媒,根據(jù)不同的操作(新建、修改腋粥、顯示)設(shè)置元素顯示狀態(tài)(可更改晦雨、只顯示)

PAI事件中,則包含了3個MODULE:
CHAIN……ENDCHAIN隘冲,通過CHAIN語句闹瞧,當(dāng)訂單編號、客戶編號展辞、雇員編號奥邮、訂單日期、交貨日期值發(fā)生變化時,則調(diào)用MODULE:set_change_0150設(shè)置界面元素的顯示狀態(tài)洽腺。
set_change_0150脚粟,此MODULE是通過對變量“data_chg_150”的賦值,設(shè)置界面元素的顯示狀態(tài)(X則為可更改)蘸朋。
items_0150_modify核无,此MODULE結(jié)合LOOP AT語句,調(diào)用子程序在維護(hù)訂單明細(xì)數(shù)據(jù)后度液,更新內(nèi)表數(shù)據(jù)厕宗。
user_command_0150,此MODULE是對點(diǎn)擊不同的按鈕進(jìn)行響應(yīng)堕担。

4已慢、代碼編寫

完成如上步驟后,接下來通過程序編輯器(SE38)對代碼的各部分進(jìn)行編寫霹购。

4.1佑惠、對象定義

根據(jù)程序功能需求,定義的變量齐疙、內(nèi)表膜楷、控件等對象如代碼所列。

*****對象定義*****
CONTROLS: items TYPE TABLEVIEW USING SCREEN 0150."子屏幕150中的列表元素
TABLES:ztorders_h, ztorders_i.                   "根據(jù)表格定義的內(nèi)表
DATA:ordersi_tab     TYPE STANDARD TABLE OF ztorders_i
                          WITH HEADER LINE,      "含工作區(qū)內(nèi)表贞奋,存儲讀取的訂單明細(xì)數(shù)據(jù)
     ok_code         TYPE sy-ucomm,              "用戶指令
     save_ok_code    TYPE sy-ucomm,              "保存用戶指令赌厅,用以設(shè)置界面元素狀態(tài)
     strng           TYPE string,                "在不同操作時顯示的界面標(biāo)題不同
     data_chg_150(1) TYPE c,                     "記錄子屏幕150是否為修改狀態(tài)
     answer(1)       TYPE c,                     "記錄數(shù)據(jù)更改退出時用戶的確認(rèn)
     prv_orderid     TYPE ztorders_h-orderid.    "用以記錄已操作過的訂單

4.2、程序初始事件

在程序執(zhí)行后轿塔,通過START-OF-SELECTION語句特愿,調(diào)用屏幕100以進(jìn)行后續(xù)處理。

*&----------------------------------------------------------------------*
*& START-OF-SELECTION
*&----------------------------------------------------------------------*
START-OF-SELECTION.
  CALL SCREEN 0100.                                "調(diào)用主屏幕100

4.3勾缭、屏幕100事件
1)PBO事件的MODULE

當(dāng)屏幕100被調(diào)用的時候揍障,首先觸發(fā)屏幕的PBO事件,此事件包含的MODULE status_0100的代碼如下俩由。

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       主屏幕100的初始GUI狀態(tài)標(biāo)題欄及變量設(shè)置
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STAT1'.                           "設(shè)置屏幕GUI狀態(tài)為STAT1
  SET TITLEBAR 'TITLE01'.                          "設(shè)置屏幕GUI標(biāo)題欄為TITLE01
  prv_orderid = ztorders_h-orderid.                "清空內(nèi)表前將操作過的訂單號記錄起來
  FREE: ztorders_h,                                "清空變量數(shù)據(jù)以對新的訂單進(jìn)行操作
        ordersi_tab.
  ok_code = ' '.
  data_chg_150 = ' '.
  items-lines = 0.
  ztorders_h-orderid = prv_orderid.                "設(shè)置屏幕中的訂單編號為之前操作的
ENDMODULE.

此代碼首先設(shè)置GUI狀態(tài)為STAT1毒嫡,標(biāo)題為TITLE01;然后使用prv_orderid變量幻梯,記錄上一次操作的訂單編號兜畸;隨后對存儲訂單抬頭信息和訂單明細(xì)數(shù)據(jù)的內(nèi)表、包括點(diǎn)擊的操作礼旅、字段狀態(tài)膳叨、行數(shù)量進(jìn)行重置;最后將前面保存的prv_orderid值賦值給字段ztorders_h-orderid痘系。這樣在操作完成一個訂單后返回初始屏幕時菲嘴,各個變量被重置,同時上一次訂單編號顯示在輸入框龄坪。

2)PAI事件的MODULE

當(dāng)點(diǎn)擊GUI狀態(tài)對應(yīng)圖標(biāo)時妓局,將觸發(fā)屏幕的PAI事件存炮。

over_and_out_0100是PAI后的第一個MODULE,此MODULE是對按鈕“退出”點(diǎn)擊后的響應(yīng):退出程序。

*&---------------------------------------------------------------------*
*&      Module  OVER_AND_OUT_0100  INPUT
*&---------------------------------------------------------------------*
*       訂單編號輸入及訂單操作前如果點(diǎn)擊退出按鈕倒源,則退出程序
*----------------------------------------------------------------------*
MODULE over_and_out_0100 INPUT.
  IF ok_code = 'EXIT'.
    LEAVE PROGRAM.
  ENDIF.
ENDMODULE.

validate_input_0100通過CHAIN語句胳螟,在輸入的訂單編號更改時觸發(fā)丘薛。此MODULE首先根據(jù)輸入的訂單編號從訂單表ztorders_h中讀取記錄边苹;然后根據(jù)點(diǎn)擊的按鈕和讀取記錄的結(jié)果慕购,給出不同的處理:如果點(diǎn)擊的按鈕為“新建”且讀取到記錄(sy-subrc為0)則輸出錯誤提示,如果點(diǎn)擊的按鈕不是“新建”且沒有讀取到記錄也一樣輸出錯誤提示捶枢。

*&---------------------------------------------------------------------*
*&      Module  VALIDATE_INPUT_0100  INPUT
*&---------------------------------------------------------------------*
*       輸入訂單編號后胯努,
*           如果此編號已存在且點(diǎn)擊了新建逢防,則發(fā)出錯誤提示
*           如果此編號不存在而點(diǎn)擊的不是新建叶沛,同樣發(fā)出錯誤提示
*----------------------------------------------------------------------*
MODULE validate_input_0100 INPUT.
  SELECT SINGLE * FROM ztorders_h INTO ztorders_h WHERE
      orderid = ztorders_h-orderid.               "根據(jù)輸入的訂單編號從表中讀取記錄
  "點(diǎn)擊新建且記錄存在則輸出錯誤提示
  IF ok_code = 'NEW' AND sy-subrc = 0.
    MESSAGE  e091(zu03_mclass01) WITH ztorders_h-orderid.
    "點(diǎn)擊的不是新建且記錄不存在則輸出錯誤提示
  ELSEIF ok_code <> 'NEW' AND sy-subrc <> 0.
    MESSAGE e092(zu03_mclass01) WITH ztorders_h-orderid.
  ENDIF.
ENDMODULE.

main_pai_0100則根據(jù)點(diǎn)擊的按鈕進(jìn)行不同的處理。

*&---------------------------------------------------------------------*
*&      Module  MAIN_PAI_0100  INPUT
*&---------------------------------------------------------------------*
*       主屏幕100的不同按鈕點(diǎn)擊后觸發(fā)事件
*----------------------------------------------------------------------*
MODULE main_pai_0100 INPUT.
  save_ok_code = ok_code.
  CASE ok_code.
    WHEN 'NEW'.
      strng = '新建'.
      LEAVE TO SCREEN 150.
    WHEN 'MODIFY'.
      IF ztorders_h-orderid NOT BETWEEN 10000 AND 60000.
        PERFORM read_table.
        strng = '修改'.
        LEAVE TO SCREEN 150.
      ELSE.                       "不能修改編號范圍在10000~60000的訂單
        MESSAGE s096(zu03_mclass01) WITH ztorders_h-orderid
                DISPLAY LIKE 'E'.
      ENDIF.
    WHEN 'DISPLAY'.
      PERFORM read_table.
      strng = '顯示'.
      LEAVE TO SCREEN 150.
    WHEN 'DELETE'.
      IF ztorders_h-orderid NOT BETWEEN 10000 AND 60000.
        PERFORM delete_sr USING answer ztorders_h.
        IF answer = 1.
          DELETE ztorders_h.
          DELETE FROM ztorders_i WHERE orderid = ztorders_h-orderid.
          MESSAGE s094(zu03_mclass01) WITH ztorders_h-orderid
                  DISPLAY LIKE 'W'.
        ELSE.
          MESSAGE s095(zu03_mclass01).
        ENDIF.
      ELSE.                       "不能刪除編號范圍在10000~60000的訂單
        MESSAGE s096(zu03_mclass01) WITH ztorders_h-orderid
                DISPLAY LIKE 'E'.
      ENDIF.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.

4.4忘朝、屏幕150事件
1)PBO事件的MODULE

當(dāng)屏幕150被調(diào)用的時候灰署,首先觸發(fā)屏幕的PBO事件。

MODULE status_0150中局嘁,首先設(shè)置GUI狀態(tài)為STAT2溉箕,標(biāo)題為TITLE02;然后調(diào)用子程序change_scr_150_prop設(shè)置屏幕元素的顯示屬性悦昵。

*&---------------------------------------------------------------------*
*&      Module  STATUS_0150  OUTPUT
*&---------------------------------------------------------------------*
*       子屏幕150的初始GUI狀態(tài)標(biāo)題欄及界面元素屬性設(shè)置
*----------------------------------------------------------------------*
MODULE status_0150 OUTPUT.
  SET PF-STATUS 'STAT2'.  SET TITLEBAR 'TITLE02' WITH ztorders_h-orderid strng.
  PERFORM change_scr_150_prop.
ENDMODULE.

MODULE items_0150_change_field_attr是結(jié)合PAI中的LOOP AT語句肴茄,逐行對表格控件的各個單元格設(shè)置顯示屬性。

*&---------------------------------------------------------------------*
*&      Module  items_0150_change_field_attr  OUTPUT
*&---------------------------------------------------------------------*
*       子屏幕150設(shè)置界面表格控件的顯示但指。
*----------------------------------------------------------------------*
MODULE items_0150_change_field_attr OUTPUT.
  PERFORM change_scr_150_prop.
ENDMODULE.

2)PAI事件的MODULE

當(dāng)點(diǎn)擊GUI狀態(tài)對應(yīng)圖標(biāo)時寡痰,將觸發(fā)屏幕的PAI事件抗楔。

set_change_0150模塊,將變量data_chg_150賦值為“X”氓癌,由此表示為界面元素為可更改狀態(tài)谓谦。

*&---------------------------------------------------------------------*
*&      Module  SET_CHANGE_0150  INPUT
*&---------------------------------------------------------------------*
*       子屏幕150設(shè)置界面元素為修改狀態(tài)
*----------------------------------------------------------------------*
MODULE set_change_0150 INPUT.
  data_chg_150 = 'X'.
ENDMODULE.

Items_0150_modify模塊,則通過調(diào)用子程序贪婉,在表格控件中的數(shù)據(jù)更改后反粥,更新內(nèi)表的數(shù)據(jù)。

*&---------------------------------------------------------------------*
*&      Module  ITEMS_0150_MODIFY  INPUT
*&---------------------------------------------------------------------*
*       子屏幕150將修改后的表格數(shù)據(jù)填充到表格控件對應(yīng)內(nèi)表
*----------------------------------------------------------------------*
MODULE items_0150_modify INPUT.
  PERFORM modify_ordersitem.
ENDMODULE.

user_command_0150模塊則是響應(yīng)不同按鈕點(diǎn)擊后的處理疲迂。

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0150  INPUT
*&---------------------------------------------------------------------*
*       子屏幕150的不同按鈕點(diǎn)擊后觸發(fā)的事件
*----------------------------------------------------------------------*
MODULE user_command_0150 INPUT.
  CASE ok_code.
    WHEN 'BACK'.
      IF data_chg_150 = 'X'.
        PERFORM abort_sr USING answer ztorders_h.
        IF answer = 1.
          LEAVE TO SCREEN 0100.
        ENDIF.
      ELSE.
        LEAVE TO SCREEN 0100.
      ENDIF.
    WHEN 'SAVE'.
      data_chg_150 = ' '.
      MODIFY ztorders_h.
      MODIFY ztorders_i FROM TABLE ordersi_tab.
      IF sy-subrc <> 0.
      ENDIF.
      MESSAGE s093(zu03_mclass01) WITH ztorders_h-orderid.
  ENDCASE.
ENDMODULE.

4.5才顿、子程序

在屏幕事件(包括PBO和PAI)中,多處用到了不同的子程序尤蒿。

其中子程序read_table郑气,是用以根據(jù)屏幕100中輸入的訂單編號,獲得訂單抬頭和訂單行項(xiàng)目的數(shù)據(jù)并分別存儲到內(nèi)表ztorders_h和ordersi_tab中腰池,同時設(shè)置表格控件的行數(shù)量(items-lines)尾组。

*&---------------------------------------------------------------------*
*&      FORM   read_table
*&---------------------------------------------------------------------*
*       從訂單和訂單明細(xì)表中獲得數(shù)據(jù)填充內(nèi)表以備輸出
*----------------------------------------------------------------------*
FORM read_table.
  SELECT SINGLE * FROM ztorders_h INTO ztorders_h WHERE
    orderid = ztorders_h-orderid.
  ztorders_h-oamount = 0.
  SELECT * FROM ztorders_i INTO ordersi_tab WHERE
    orderid = ztorders_h-orderid.
    ztorders_h-oamount = ztorders_h-oamount + ordersi_tab-oquantity *
                         ordersi_tab-nprice * ( 1 - ordersi_tab-discount ).
    APPEND ordersi_tab TO ordersi_tab.
  ENDSELECT.
  items-lines = sy-dbcnt.
ENDFORM.

子程序delete_sr,是在點(diǎn)擊“刪除”按鈕后的響應(yīng)示弓,此子程序通過CALL FUNCTION調(diào)用功能函數(shù)“POPUP_TO_CONFIRM”以彈出對話框讳侨,以讓用戶確認(rèn)。

*&---------------------------------------------------------------------*
*&      Form  DELETE_SR
*&---------------------------------------------------------------------*
*       確定是否對訂單進(jìn)行刪除
*----------------------------------------------------------------------*
*      -->P_ANSWER  返回是否刪除奏属,1則刪除
*      -->P_ZTORDERS_H  訂單結(jié)構(gòu)體跨跨,根據(jù)訂單編號進(jìn)行判斷
*----------------------------------------------------------------------*
FORM delete_sr  USING    p_answer
                         p_ztorders_h TYPE ztorders_h.
  DATA: txt TYPE string.
  CONCATENATE '是否對編號為' p_ztorders_h-orderid '的訂單進(jìn)行刪除?'
       INTO txt.

  CALL FUNCTION 'POPUP_TO_CONFIRM'
    EXPORTING
      titlebar      = '確定是否刪除訂單'
*     DIAGNOSE_OBJECT             = ' '
      text_question = txt
      text_button_1 = '刪除'(001)
*     ICON_BUTTON_1 = ' '
      text_button_2 = '不刪除'(002)
*     ICON_BUTTON_2 = ' '
*     DEFAULT_BUTTON              = '1'
*     DISPLAY_CANCEL_BUTTON       = 'X'
*     USERDEFINED_F1_HELP         = ' '
*     START_COLUMN  = 25
*     START_ROW     = 6
*     POPUP_TYPE    =
*     IV_QUICKINFO_BUTTON_1       = ' '
*     IV_QUICKINFO_BUTTON_2       = ' '
    IMPORTING
      answer        = p_answer
*   TABLES
*     PARAMETER     =
*   EXCEPTIONS
*     TEXT_NOT_FOUND              = 1
*     OTHERS        = 2
    .
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.
ENDFORM.

子程序change_scr_150_prop,則是根據(jù)不同的按鈕操作囱皿,設(shè)置屏幕元素的顯示屬性勇婴。

*&---------------------------------------------------------------------*
*&      Form  CHANGE_SCR_150_PROP
*&---------------------------------------------------------------------*
*       子屏幕150設(shè)置界面元素的屬性
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM change_scr_150_prop .
  LOOP AT SCREEN.
    CASE save_ok_code.
      WHEN 'DISPLAY'.
        screen-input = 0.
      WHEN 'MODIFY'.
        screen-input = 1.
      WHEN 'NEW'.
        screen-input = 1.
    ENDCASE.
    CASE screen-name.
      WHEN 'ZTORDERS_H-ORDERID'.
        screen-input = 0.
    ENDCASE.

    MODIFY SCREEN.
  ENDLOOP.
ENDFORM.

子程序modify_ordersitem,則是將表格控件的數(shù)據(jù)更新到內(nèi)表ordersi_tab中嘱腥。

*&---------------------------------------------------------------------*
*&      Form  MODIFY_ORDESITEM
*&---------------------------------------------------------------------*
*       將表格控件包含的數(shù)據(jù)更改后更新到內(nèi)表
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM modify_ordersitem .
  ztorders_i-orderid = ztorders_h-orderid.
  IF items-current_line <= lines( ordersi_tab ).
    MODIFY ordersi_tab FROM ztorders_i INDEX items-current_line.
  ELSE.
    APPEND ztorders_i TO ordersi_tab.
  ENDIF.
ENDFORM.

子程序abort_sr耕渴,跟子程序delete_sr類似,在點(diǎn)擊退出時進(jìn)行確認(rèn)齿兔。

*&---------------------------------------------------------------------*
*&      Form  ABORT_SR
*&---------------------------------------------------------------------*
*       確定是否退出訂單修改
*----------------------------------------------------------------------*
*      -->answr  返回是否退出更改萨螺,1則退出
*      -->stru  訂單結(jié)構(gòu)體,根據(jù)訂單編號進(jìn)行判斷
*----------------------------------------------------------------------*
FORM abort_sr  USING answr stru TYPE ztorders_h.
  DATA txt TYPE string .
  CONCATENATE '退出訂單' ztorders_h-orderid '的修改?' INTO txt.

  CALL FUNCTION 'POPUP_TO_CONFIRM'
    EXPORTING
      titlebar              = '退出修改'
*     DIAGNOSE_OBJECT       = ' '
      text_question         = txt
      text_button_1         = '退出'(001)
*     ICON_BUTTON_1         = ' '
      text_button_2         = '不退出'(002)
*     ICON_BUTTON_2         = ' '
      default_button        = '2'
      display_cancel_button = ' '
*     USERDEFINED_F1_HELP   = ' '
      start_column          = 40
      start_row             = 2
*     POPUP_TYPE            =
*     IV_QUICKINFO_BUTTON_1 = ' '
*     IV_QUICKINFO_BUTTON_2 = ' '
    IMPORTING
      answer                = answr
* TABLES
*     PARAMETER             =
* EXCEPTIONS
*     TEXT_NOT_FOUND        = 1
*     OTHERS                = 2
    .
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.
ENDFORM.

將如上各部分代碼合并愧驱,則組成了整個實(shí)踐的程序,完成后對所有內(nèi)容進(jìn)行激活椭盏。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末组砚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子掏颊,更是在濱河造成了極大的恐慌糟红,老刑警劉巖艾帐,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盆偿,居然都是意外死亡柒爸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門事扭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捎稚,“玉大人,你說我怎么就攤上這事求橄〗褚埃” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵罐农,是天一觀的道長条霜。 經(jīng)常有香客問我,道長涵亏,這世上最難降的妖魔是什么宰睡? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮气筋,結(jié)果婚禮上拆内,老公的妹妹穿的比我還像新娘。我一直安慰自己裆悄,他們只是感情好矛纹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著光稼,像睡著了一般或南。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上艾君,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天采够,我揣著相機(jī)與錄音,去河邊找鬼冰垄。 笑死掌眠,一個胖子當(dāng)著我的面吹牛充易,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼丢郊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纵势?” 一聲冷哼從身側(cè)響起埠偿,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎要门,沒想到半個月后虏肾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體廓啊,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年封豪,在試婚紗的時候發(fā)現(xiàn)自己被綠了谴轮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡吹埠,死狀恐怖第步,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情藻雌,我是刑警寧澤雌续,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站胯杭,受9級特大地震影響驯杜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜做个,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一鸽心、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧居暖,春花似錦顽频、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至省骂,卻和暖如春蟀淮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钞澳。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工怠惶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人轧粟。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓策治,卻偏偏與公主長得像,于是被迫代替她去往敵國和親兰吟。 傳聞我的和親對象是個殘疾皇子通惫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容