二维码

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

Twilight发表于 2015-08-10 14:37zlzt 最后回复于 2020-01-06 15:53 [复制链接] 4207 1

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

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

相关函数:COMPLEX_SELECTIONS_Dialog:开启输入多值对话框

程序代码:
  1. TYPE-POOLS: icon.           "按钮上显示图标时需要调用该类库

  2. DATA: l_count TYPE i.       "用于计算内表数值总数
  3. DATA: lmail(50) TYPE c.     "定义Mail地址输入变量长度及类型

  4. *定义屏幕元素及文本元素(参考第7章)
  5. SELECTION-SCREEN: BEGIN OF BLOCK ALV WITH FRAME TITLE text-002.
  6. SELECTION-SCREEN: BEGIN OF LINE.
  7. SELECTION-SCREEN: COMMENT (14) text-001.
  8. PARAMETERS: mailcopy LIKE lmail.
  9. SELECTION-SCREEN: PUSHBUTTON 63(5) pubu USER-COMMAND mailbutt.
  10. SELECTION-SCREEN: END   OF LINE.
  11. SELECTION-SCREEN: END OF BLOCK alv.

  12. DATA: mailtype TYPE c VALUE ''.
  13. *定义一隐藏的SELECT-OPTIONS用于保存输入值
  14. SELECT-OPTIONS: mailadd FOR lmail NO-DISPLAY .

  15. AT SELECTION-SCREEN OUTPUT.
  16.   CLEAR l_count.
  17.   DESCRIBE TABLE mailadd LINES l_count.
  18. *判断内表是否有值来设置按钮图标
  19.   IF l_count > 1.
  20.     WRITE icon_display_more AS ICON TO pubu.
  21.   ELSE.
  22.     WRITE icon_enter_more  AS ICON TO pubu.
  23.   ENDIF.

  24. AT SELECTION-SCREEN.
  25.   CLEAR l_count.
  26.   DESCRIBE TABLE mailadd LINES l_count.
  27. *实现内表与文本元素间的值传递
  28.   IF NOT mailcopy IS INITIAL AND mailadd[] IS INITIAL.
  29.     mailadd-low = mailcopy.
  30.     APPEND mailadd.
  31.   ENDIF.

  32.   IF l_count = 1.
  33.     REFRESH mailadd.
  34.     CLEAR mailadd.
  35.     IF NOT mailcopy IS INITIAL.
  36.       mailadd-low = mailcopy.
  37.       APPEND mailadd.
  38.     ENDIF.
  39.   ENDIF.

  40.   IF l_count > 1 .
  41.     IF mailcopy IS INITIAL.
  42.       DELETE mailadd INDEX 1.
  43.     ELSE.
  44.       mailadd-low = mailcopy.
  45.       MODIFY mailadd INDEX 1 TRANSPORTING low.
  46.     ENDIF.
  47.   ENDIF.

  48. *在单击按钮的事件时调用输入多值输入对话框
  49.   IF sy-ucomm = 'MAILBUTT'.
  50.     PERFORM show_box.
  51.   ENDIF.

  52. *---------------------------------------------------------------------*
  53. *     调用多值输入对话框                       *
  54. *---------------------------------------------------------------------*
  55. FORM show_box.
  56.   TYPE-POOLS aqadh .
  57.   DATA: tab_and_field TYPE  rstabfield.

  58.   tab_and_field-tablename = 'ADR6'.
  59.   tab_and_field-fieldname = 'SMTP_ADDR'.
  60. *该函数将输入值传递给内表
  61.   CALL FUNCTION 'COMPLEX_SELECTIONS_DIALOG'
  62.     EXPORTING
  63.       text           = 'SET E-Mail To'
  64.       tab_and_field  = tab_and_field
  65.     TABLES
  66.       range          = mailadd[]
  67.     EXCEPTIONS
  68.       no_range_tab   = 1
  69.       cancelled      = 2
  70.       internal_error = 3
  71.       invalid_fieldname = 4
  72.       OTHERS            = 5.

  73. *将内表首行值传给文本对象,显示在屏幕上
  74.   IF NOT mailadd[] IS INITIAL.
  75.     READ TABLE mailadd INDEX 1.
  76.     mailcopy = mailadd-low.
  77.   ELSE.
  78.     mailcopy = ''.
  79.   ENDIF.
  80. ENDFORM.
复制代码

执行效果:
select option.jpg
回复

使用道具 举报

zlzt
感谢分享
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表