模拟Select-Options对象实现多项数据输入功能

   模拟Select-Options对象实现多项数据输入功能

Select-Options对象可以同时输入多项值并将所输入数据存入内表以供程序使用,不过Select-Options的功能有一定的局限性,它所能显示信息的长度是固定的,对于一些较长的文本,会因为输出长度过短而影响显示效果(如地址信息)。本例将以邮件地址输入字段为例,创建一个长度为50的可输入多值的文本对象。

本例中需要定义一个隐藏的Select-Options对象,用于保存实际输入数据。需要定义一个够长的文本框及一个多值输入按钮作为数据传递的接口。数据会通过所定义的文本框传递到隐藏的Select-Options对象中,并通过改变多值输入按钮上的图标样式来表示该对象中是否存在数据。

相关函数:

COMPLEX_SELECTIONS_DIALOG:开启输入多值对话框

  1. REPORT ZR_EXAMPLE_04 .  
  2. TYPE-POOLS: ICON.           "按钮上显示图标时需要调用该类库  
  3.  
  4. DATA: L_COUNT TYPE I.       "用于计算内表数值总数  
  5. DATA: LMAIL(50) TYPE C.     "定义Mail地址输入变量长度及类型  
  6.  
  7. *定义屏幕元素及文本元素(参考第7章)  
  8. SELECTION-SCREEN: BEGIN OF BLOCK ALV WITH FRAME TITLE TEXT-002.  
  9. SELECTION-SCREEN: BEGIN OF LINE.  
  10. SELECTION-SCREEN: COMMENT (14) TEXT-001.  
  11. PARAMETERS: MAILCOPY LIKE LMAIL.  
  12. SELECTION-SCREEN: PUSHBUTTON 63(5) PUBU USER-COMMAND MAILBUTT.  
  13. SELECTION-SCREEN: END   OF LINE.  
  14. SELECTION-SCREEN: END OF BLOCK ALV.  
  15.  
  16. DATA: MAILTYPE TYPE C VALUE ''.  
  17. *定义一隐藏的SELECT-OPTIONS用于保存输入值  
  18. SELECT-OPTIONS: MAILADD FOR LMAIL NO-DISPLAY .  
  19.  
  20. AT SELECTION-SCREEN OUTPUT.  
  21.   CLEAR L_COUNT.  
  22.   DESCRIBE TABLE MAILADD LINES L_COUNT.  
  23. *判断内表是否有值来设置按钮图标  
  24.   IF L_COUNT > 1.  
  25.  WRITE ICON_DISPLAY_MORE AS ICON TO PUBU.  
  26.   ELSE.  
  27.  WRITE ICON_ENTER_MORE  AS ICON TO PUBU.  
  28.   ENDIF.  
  29.  
  30. AT SELECTION-SCREEN.  
  31.   CLEAR L_COUNT.  
  32.   DESCRIBE TABLE MAILADD LINES L_COUNT.  
  33. *实现内表与文本元素间的值传递  
  34.   IF NOT MAILCOPY IS INITIAL AND MAILADD[] IS INITIAL.  
  35.  MAILADD-LOW = MAILCOPY.  
  36.  APPEND MAILADD.  
  37.   ENDIF.  
  38.  
  39.   IF L_COUNT = 1.  
  40.  REFRESH MAILADD.  
  41.  CLEAR MAILADD.  
  42.  IF NOT MAILCOPY IS INITIAL.  
  43.    MAILADD-LOW = MAILCOPY.  
  44.    APPEND MAILADD.  
  45.  ENDIF.  
  46.   ENDIF.  
  47.  
  48.   IF L_COUNT > 1 .  
  49.  IF MAILCOPY IS INITIAL.  
  50.    DELETE MAILADD INDEX 1.  
  51.  ELSE.  
  52.    MAILADD-LOW = MAILCOPY.  
  53.    MODIFY MAILADD INDEX 1 TRANSPORTING LOW.  
  54.  ENDIF.  
  55.   ENDIF.  
  56.  
  57. *在单击按钮的事件时调用输入多值输入对话框  
  58.   IF SY-UCOMM = 'MAILBUTT'.  
  59.  PERFORM SHOW_BOX.  
  60.   ENDIF.  
  61.  
  62. *---------------------------------------------------------------------*  
  63. *     调用多值输入对话框                       *  
  64. *---------------------------------------------------------------------*  
  65. FORM SHOW_BOX.  
  66.   TYPE-POOLS AQADH .  
  67.   DATA: TAB_AND_FIELD TYPE  RSTABFIELD.  
  68.  
  69.   TAB_AND_FIELD-TABLENAME = 'ADR6'.  
  70.   TAB_AND_FIELD-FIELDNAME = 'SMTP_ADDR'.  
  71. *该函数将输入值传递给内表  
  72.   CALL FUNCTION 'COMPLEX_SELECTIONS_DIALOG'  
  73.     EXPORTING  
  74.          TEXT           = 'SET E-Mail To ' 
  75.          TAB_AND_FIELDTAB_AND_FIELD  = TAB_AND_FIELD  
  76.     TABLES  
  77.          RANGE          = MAILADD[]  
  78.     EXCEPTIONS  
  79.          NO_RANGE_TAB   = 1 
  80.          CANCELLED      = 2 
  81.          INTERNAL_ERROR = 3 
  82.          OTHERS         = 4.  
  83.  
  84. *将内表首行值传给文本对象,显示在屏幕上  
  85.   IF NOT MAILADD[] IS INITIAL.  
  86.  READ TABLE MAILADD INDEX 1.  
  87.  MAILCOPY = MAILADD-LOW.  
  88.   ELSE.  
  89.  MAILCOPY = ''.  
  90.   ENDIF.  
  91. ENDFORM 

程序输出界面如图16-4所示。

 
图16-4  自定义多值输入文本对象执行界面
原文地址:https://www.cnblogs.com/ruingy/p/3469720.html