Select 限制用户在选择选项中仅输入有效的SC值

Select 限制用户在选择选项中仅输入有效的SC值,select,abap,sap-selection-screens,Select,Abap,Sap Selection Screens,我编写了在SRM服务器中显示购物车(SC)详细信息的程序。 在我的程序中,我对选择选项进行验证。它工作正常,但如果我为sc提供任何随机范围,例如99900000到9999999999,该范围内的所有SCs都应该显示,但它会抛出错误消息,因为我将验证保持在低值和高值。因此,我的培训师说,对所选选项进行验证并不可取。他给了我一个新的任务,除了进行验证之外,我应该限制用户只在输入字段中输入有效值。我怎样才能做到这一点?请给我完整的代码 DATA : lv_shc TYPE crmd_orderadm_

我编写了在SRM服务器中显示购物车(SC)详细信息的程序。 在我的程序中,我对选择选项进行验证。它工作正常,但如果我为sc提供任何随机范围,例如99900000到9999999999,该范围内的所有SCs都应该显示,但它会抛出错误消息,因为我将验证保持在低值和高值。因此,我的培训师说,对所选选项进行验证并不可取。他给了我一个新的任务,除了进行验证之外,我应该限制用户只在输入字段中输入有效值。我怎样才能做到这一点?请给我完整的代码

DATA : lv_shc TYPE crmd_orderadm_h-object_id .
*DATA : lv_shc TYPE z_obj_id.

SELECTION-SCREEN BEGIN OF BLOCK a1 WITH FRAME TITLE text-111.
*SELECT-OPTIONS : s_shc FOR crmd_orderadm_h-object_id VALUE-REQUEST.
SELECT-OPTIONS : s_shc FOR lv_shc .
SELECTION-SCREEN END OF BLOCK a1.

INCLUDE zsrmi_declarations1.

*validations.
AT SELECTION-SCREEN ON s_shc .


  IF s_shc IS NOT INITIAL.
    IF s_shc-low IS NOT INITIAL.
      SELECT SINGLE object_id FROM crmd_orderadm_h INTO lv_shc WHERE object_id = s_shc-low AND object_type = 'BUS2121'.
      IF sy-subrc <> 0.
        MESSAGE text-001 TYPE 'E'.
        EXIT.
      ENDIF.
    ENDIF.
    IF s_shc-high IS NOT INITIAL.
      SELECT SINGLE object_id FROM crmd_orderadm_h INTO lv_shc WHERE object_id = s_shc-high AND object_type = 'BUS2121'.
      IF sy-subrc <> 0.
        MESSAGE text-001 TYPE 'E'.
        EXIT.
      ENDIF.
    ENDIF.
  ENDIF.
数据:lv\u shc类型crmd\u orderadm\u h-object\u id。
*数据:lv_shc类型z_obj_id。
块a1的选择屏幕开始,框架标题文本为-111。
*SELECT-OPTIONS:crmd\U orderadm\U h-object\U id值请求的s\U shc。
SELECT-OPTIONS:s\U shc用于lv\U shc。
选择框a1的屏幕末端。
包括zsrmi_声明1。
*验证。
在s_shc的选择屏幕上。
如果s_shc不是首字母。
如果s_shc-low不是初始值。
从crmd_orderadm_h选择单个对象_id进入lv_shc,其中对象_id=s_shc-low,对象_type='BUS2121'。
如果sy subrc为0。
消息文本-001类型为“E”。
出口
恩迪夫。
恩迪夫。
如果s_shc-high不是初始值。
从crmd_orderadm_h选择单个对象_id进入lv_shc,其中对象_id=s_shc-high,对象_type='BUS2121'。
如果sy subrc为0。
消息文本-001类型为“E”。
出口
恩迪夫。
恩迪夫。
恩迪夫。

您应该根据范围而不是离散值进行验证:

AT SELECTION-SCREEN ON s_shc.

    IF s_shc[] IS NOT INITIAL.

        SELECT COUNT( * )
        FROM crmd_orderadm_h 
        WHERE object_id IN s_shc[] AND object_type = 'BUS2121'.

        IF SY-SUBRC NE 0.
            MESSAGE e000 WITH 'Enter Valid SC Number'.
            EXIT.
        ENDIF.

    ENDIF.

获取记录时应使用相同的查询。

您应根据范围而不是离散值进行验证:

AT SELECTION-SCREEN ON s_shc.

    IF s_shc[] IS NOT INITIAL.

        SELECT COUNT( * )
        FROM crmd_orderadm_h 
        WHERE object_id IN s_shc[] AND object_type = 'BUS2121'.

        IF SY-SUBRC NE 0.
            MESSAGE e000 WITH 'Enter Valid SC Number'.
            EXIT.
        ENDIF.

    ENDIF.

同样的查询应该用于获取记录。

至少对我来说,“为我解决培训任务并给我完整的代码”不是一个巨大的动机…@VWegert我已经完成了全部任务。我的程序正确地给出了所有sc细节。我还保留了验证。如何限制用户在我没有得到的经典报告中只输入有效的i/p。我尝试了不同的方法,但我的程序以失败告终。我向教练展示了我的努力。他只是告诉我,我应该做到这一点,他是最不麻烦的。我一个人做这件事,或者找人帮忙。他只是想解决问题。我问代码是因为我想知道哪里出了问题。我的培训师也知道我所有的努力。至少对我来说,“为我解决我的培训任务并给我完整的代码”不是一个巨大的动机…@VWegert我已经完成了我的全部任务。我的程序正确地给出了所有sc细节。我还保留了验证。如何限制用户在我没有得到的经典报告中只输入有效的i/p。我尝试了不同的方法,但我的程序以失败告终。我向教练展示了我的努力。他只是告诉我,我应该做到这一点,他是最不麻烦的。我一个人做这件事,或者找人帮忙。他只是想解决问题。我问代码是因为我想知道哪里出了问题。我的教练也知道我所有的努力。