以我之前写的:在SAP自建 全国各大城市数据表http://blog.csdn.net/szlaptop/article/details/8074609 为基础,设计search help。
最终效果如下:
因为是自建全国各省市数据表,用做查询的时候没有search help ,很难记住那个省份,城市的ID是多少。所以利用search help功能。操作如下:
代码相对简单,入门级别的一看便知。
*&---------------------------------------------------------------------*
*& REPORT ZSEARCHHELP
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZSEARCHHELP.
TABLES ZCHINA_MESSAGE.
TYPES:BEGIN OF T_AREA,
AREACODE TYPE ZCHINA_MESSAGE-AREACODE,
AREANAME TYPE ZCHINA_MESSAGE-AREANAME,
END OF T_AREA.
TYPES:BEGIN OF T_PROVINCE,
PROVINCECODE TYPE ZCHINA_MESSAGE-PROVINCECODE,
PROVINCE TYPE ZCHINA_MESSAGE-PROVINCE,
END OF T_PROVINCE.
TYPES:BEGIN OF T_CITY,
CITYCODE TYPE ZCHINA_MESSAGE-CITYCODE,
CITY TYPE ZCHINA_MESSAGE-CITY,
END OF T_CITY.
DATA: IT_AREA TYPE STANDARD TABLE OF T_AREA, "定义大区内表
IT_PROVINCE TYPE STANDARD TABLE OF T_PROVINCE, "定义省份内表
IT_CITY TYPE STANDARD TABLE OF T_CITY, "定义城市内表
WA_RETURN_TAB TYPE DDSHRETVAL,
IT_RETURN_TAB TYPE STANDARD TABLE OF DDSHRETVAL, "接口结构搜索帮助 <-> 帮助系统
V_REPID TYPE SY-REPID,
V_DYNNR TYPE SY-DYNNR. "ABAP 程序, 当前屏幕的编号
SELECT-OPTIONS:S_ACODE FOR ZCHINA_MESSAGE-AREACODE NO INTERVALS NO-EXTENSION,
S_PCODE FOR ZCHINA_MESSAGE-PROVINCECODE NO INTERVALS NO-EXTENSION,
S_CCODE FOR ZCHINA_MESSAGE-CITYCODE NO INTERVALS NO-EXTENSION.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_ACODE-LOW.
IF IT_AREA[] IS INITIAL.
PERFORM INIT_AREALIST.
ENDIF.
PERFORM F_VALUEHELP_AREA.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_PCODE-LOW.
IF IT_PROVINCE[] IS INITIAL.
PERFORM INIT_PROVINCELIST.
ENDIF.
PERFORM F_VALUEHELP_PROVINCE.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_CCODE-LOW.
IF IT_CITY[] IS INITIAL.
PERFORM INIT_CITYLIST.
ENDIF.
PERFORM F_VALUEHELP_CITY.
*&---------------------------------------------------------------------*
*& Form INIT_KSTARLIST
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM INIT_AREALIST.
V_REPID = SY-REPID.
V_DYNNR = SY-DYNNR.
SELECT DISTINCT AREACODE AREANAME FROM ZCHINA_MESSAGE INTO TABLE IT_AREA ORDER BY AREACODE.
ENDFORM. "INIT_AREALIST
*&---------------------------------------------------------------------*
*& Form INIT_PROVINCELIST
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM INIT_PROVINCELIST.
V_REPID = SY-REPID.
V_DYNNR = SY-DYNNR.
SELECT DISTINCT PROVINCECODE PROVINCE FROM ZCHINA_MESSAGE INTO TABLE IT_PROVINCE ORDER BY PROVINCECODE.
ENDFORM. "INIT_PROVINCELIST
*&---------------------------------------------------------------------*
*& Form INIT_CITYLIST
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM INIT_CITYLIST.
V_REPID = SY-REPID.
V_DYNNR = SY-DYNNR.
SELECT DISTINCT CITYCODE CITY FROM ZCHINA_MESSAGE INTO TABLE IT_CITY ORDER BY CITYCODE.
ENDFORM. "INIT_CITYLIST
*&---------------------------------------------------------------------*
*& Form F_VALUEHELP_KSTAR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM F_VALUEHELP_AREA.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD = 'AREACODE'
DYNPPROG = V_REPID
DYNPNR = V_DYNNR
DYNPROFIELD = 'S_ACODE-LOW'
VALUE_ORG = 'S'
MULTIPLE_CHOICE = 'X'
TABLES
VALUE_TAB = IT_AREA
RETURN_TAB = IT_RETURN_TAB.
IF SY-SUBRC = 0.
S_ACODE-SIGN = 'I'.
S_ACODE-OPTION = 'EQ'.
LOOP AT IT_RETURN_TAB INTO WA_RETURN_TAB. "将内表的值传给结构
S_ACODE-LOW = WA_RETURN_TAB-FIELDVAL. "将屏幕选取的值填充上去
APPEND S_ACODE.
ENDLOOP.
ENDIF.
ENDFORM. "F_VALUEHELP_AREA
*&---------------------------------------------------------------------*
*& Form F_VALUEHELP_PROVINCE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM F_VALUEHELP_PROVINCE.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD = 'PROVINCECODE'
DYNPPROG = V_REPID
DYNPNR = V_DYNNR
DYNPROFIELD = 'S_PCODE-LOW'
VALUE_ORG = 'S'
MULTIPLE_CHOICE = 'X'
TABLES
VALUE_TAB = IT_PROVINCE
RETURN_TAB = IT_RETURN_TAB.
IF SY-SUBRC = 0.
S_PCODE-SIGN = 'I'.
S_PCODE-OPTION = 'EQ'.
LOOP AT IT_RETURN_TAB INTO WA_RETURN_TAB.
S_PCODE-LOW = WA_RETURN_TAB-FIELDVAL.
APPEND S_PCODE.
ENDLOOP.
ENDIF.
ENDFORM. "F_VALUEHELP_PROVINCE
*&---------------------------------------------------------------------*
*& Form F_VALUEHELP_CITY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM F_VALUEHELP_CITY.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD = 'CITYCODE'
DYNPPROG = V_REPID
DYNPNR = V_DYNNR
DYNPROFIELD = 'S_CCODE-LOW'
VALUE_ORG = 'S'
MULTIPLE_CHOICE = 'X'
TABLES
VALUE_TAB = IT_CITY
RETURN_TAB = IT_RETURN_TAB.
IF SY-SUBRC = 0.
S_CCODE-SIGN = 'I'.
S_CCODE-OPTION = 'EQ'.
LOOP AT IT_RETURN_TAB INTO WA_RETURN_TAB.
S_CCODE-LOW = WA_RETURN_TAB-FIELDVAL.
APPEND S_CCODE.
ENDLOOP.
ENDIF.
ENDFORM. "F_VALUEHELP_CITY
作为一名刚入行不久的新人,在接到任务要做一个这样的工作时,脑子一片空白不知道如何下手。将自建的表的字段要出现在查询条件 时才知道没有search help。如果不考虑search help,理论上这个工作没法交差的,毕竟那么多省区谁能记住编码呢。
几经搜索,sap标准里面有个示例程序“DEMO_DYNPRO_F4_HELP_MODULE”,于是照猫画虎的做了一遍不见效果。这里面的代码有的难度的,要重新添加屏幕,定位屏幕,设置屏幕等。于是继续google,搜到一条老外的博文,虽说是E文,但是有图有代码,很容易就看明白了,这样就有了上面的源代码。