首页 > 其他分享 >递归函数实现省市区多级联动搜索帮助

递归函数实现省市区多级联动搜索帮助

时间:2023-11-01 18:11:05浏览次数:31  
标签:sy return 递归函数 多级 lv fieldname TABLE 省市区 EQ

1、需求背景

当程序中有互为层级的字段,需要使用搜索帮助时,可以通过多次调用搜索帮助来实现。比如在程序中需要填写省市区三级地址

2、实现方式

2.1、平铺直叙

程序的搜索帮助,通常使用F4IF_INT_TABLE_VALUE_REQUEST来实现。多级的搜索帮助,可以简单的通过多次调用F4函数来实现。

点击省字段,弹出省搜索帮助,根据选择的省份,查询对应的市,弹出市搜索帮助,根据选择的市,查询对应的区县,弹出区县搜索帮助,选择后更新到ALV报表。

同理,点击市则弹出市和区的搜索帮助;点击区则只弹出区的搜索帮助

如图所示:

点击省字段代码示例,省需要写三遍F4:

"--------------------@斌将军--------------------
READ TABLE gt_cjso_alv ASSIGNING <fs_cjso_alv> INDEX pv_row_no-row_id.
  "获取对应数据集
  CASE lv_fieldname1.
    WHEN 'ZZDEADREGION'."送货地址-省
      SELECT
        land1,
        bland AS zzdeadregion,
        bezei
      FROM t005u
      INTO TABLE @DATA(lt_t005u)
      WHERE land1 EQ 'CN'
        AND spras EQ @sy-langu.

      ASSIGN lt_t005u TO <lt_f4table>.

      REFRESH gt_return.
      CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
        EXPORTING
          retfield        = lv_fieldname1
          dynpprog        = sy-repid
          dynpnr          = sy-dynnr
          dynprofield     = lv_fieldname2
          value_org       = 'S'
          display         = 'F'
        TABLES
          value_tab       = <lt_f4table>
          return_tab      = gt_return
        EXCEPTIONS
          parameter_error = 1
          no_values_found = 2
          OTHERS          = 3.

      IF sy-subrc =  0.
        READ TABLE gt_return INTO gs_return INDEX 1.
        IF sy-subrc = 0.
          ASSIGN COMPONENT lv_fieldname1 OF STRUCTURE <fs_cjso_alv> TO <lv_field>.
          <lv_field> = gs_return-fieldval.

          SELECT
            country,
            region,
            city_code AS zzdeadcity,
            city_name
          FROM v_adrcity
          INTO TABLE @DATA(lt_v_adrcity)
          WHERE country EQ 'CN'
            AND langu  EQ @sy-langu
            AND region EQ @<fs_cjso_alv>-zzdeadregion.
          ASSIGN lt_v_adrcity TO <lt_f4table>.

          lv_fieldname = 'ZZDEADCITY'.
          lv_dynprofld = 'ZZDEADCITY'.
          REFRESH gt_return.
          CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
            EXPORTING
              retfield        = lv_fieldname
              dynpprog        = sy-repid
              dynpnr          = sy-dynnr
              dynprofield     = lv_dynprofld
              value_org       = 'S'
              display         = 'F'
            TABLES
              value_tab       = <lt_f4table>
              return_tab      = gt_return
            EXCEPTIONS
              parameter_error = 1
              no_values_found = 2
              OTHERS          = 3.

          IF sy-subrc =  0.
            READ TABLE gt_return INTO gs_return INDEX 1.
            IF sy-subrc = 0.
              ASSIGN COMPONENT 'ZZDEADCITY' OF STRUCTURE <fs_cjso_alv> TO <lv_field>.
              <lv_field> = gs_return-fieldval.

              lv_zzdeadcity = |{ <fs_cjso_alv>-zzdeadcity ALPHA = IN }|.
              SELECT
                country,
                city_code,
                city_name,
                strt_code AS zzdeadstreet,
                street
              FROM m_strta
              INTO TABLE @DATA(lt_m_strta)
              WHERE country EQ 'CN'
                AND langu  EQ @sy-langu
                AND region EQ @<fs_cjso_alv>-zzdeadregion
                AND city_code EQ @lv_zzdeadcity.

              ASSIGN lt_m_strta TO <lt_f4table>.

              lv_fieldname = 'ZZDEADSTREET'.
              lv_dynprofld = 'ZZDEADSTREET'.
              REFRESH gt_return.
              CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
                EXPORTING
                  retfield        = lv_fieldname
                  dynpprog        = sy-repid
                  dynpnr          = sy-dynnr
                  dynprofield     = lv_dynprofld
                  value_org       = 'S'
                  display         = 'F'
                TABLES
                  value_tab       = <lt_f4table>
                  return_tab      = gt_return
                EXCEPTIONS
                  parameter_error = 1
                  no_values_found = 2
                  OTHERS          = 3.

              IF sy-subrc =  0.
                READ TABLE gt_return INTO gs_return INDEX 1.
                IF sy-subrc = 0.
                  ASSIGN COMPONENT 'ZZDEADSTREET' OF STRUCTURE <fs_cjso_alv> TO <lv_field>.
                  <lv_field> = gs_return-fieldval.
                ENDIF.
              ENDIF.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
    WHEN 'ZZDEADCITY'."送货地址-市
    ……
    WHEN 'ZZDEADSTREET'."送货地址-区县
    ……
    WHEN OTHERS.
  ENDCASE.

  PERFORM frm_refresh_alv USING g_grid_9001.
"--------------------@斌将军--------------------

2.2、简洁递归

上述方法,虽然能够实现,但是三级地址就需要写五遍重复性代码,如果遇到层级更多的搜索帮助,则需要写N(N+1)/2遍代码,所以我们可以使用递归函数,重复调用搜索帮助,使代码更简洁。

这里说明一点,什么是递归函数?

递归函数:在函数内部调用自身的函数被称为递归函数。递归函数可以将复杂问题转化为更简单的子问题来解决。一个经典的递归函数例子是阶乘函数,其中 n! 等于 n 乘以 (n-1)!。在函数内部通过调用自身来计算阶乘。

抽出通用代码,编写递归函数

"--------------------@斌将军--------------------
FORM frm_callback_f4 USING pv_level pv_fieldname CHANGING ps_alv TYPE ty_cjso_alv.

*  DATA:lv_zzdeadcity   TYPE vbak-zzdeadcity. "送货地址-市

  DATA:lt_return TYPE STANDARD TABLE OF ddshretval,
       ls_return TYPE ddshretval.

  DATA:lv_next_field TYPE dfies-fieldname,
       lv_next_level TYPE int4,
       lv_fieldname  TYPE dfies-fieldname,
       lv_dynprofld  TYPE help_info-dynprofld.

  FIELD-SYMBOLS:<lv_field>.

  lv_fieldname = pv_fieldname.
  lv_dynprofld = pv_fieldname.
  CONDENSE:lv_fieldname,lv_dynprofld NO-GAPS.
  lv_next_level = pv_level.
  "根据层级,查询当前层级的数据集,并赋值下一层的字段名
  CASE lv_next_level.
    WHEN 1."第1层 省
      SELECT
        land1,
        bland AS zzdeadregion,
        bezei
      FROM t005u
      INTO TABLE @DATA(lt_t005u)
      WHERE land1 EQ 'CN'
        AND spras EQ @sy-langu.

      UNASSIGN <gt_f4table>.
      ASSIGN lt_t005u TO <gt_f4table>.
      lv_next_field = 'ZZDEADCITY'.
    WHEN 2."第2层 市
      SELECT
        country,
        region,
        city_code AS zzdeadcity,
        city_name
      FROM v_adrcity
      INTO TABLE @DATA(lt_v_adrcity)
      WHERE country EQ 'CN'
        AND langu  EQ @sy-langu
        AND region EQ @ps_alv-zzdeadregion.

      UNASSIGN <gt_f4table>.
      ASSIGN lt_v_adrcity TO <gt_f4table>.
      lv_next_field = 'ZZDEADSTREET'.
    WHEN 3."第3层 区
      DATA(lv_zzdeadcity) = |{ ps_alv-zzdeadcity ALPHA = IN }|.
      SELECT
        country,
        city_code,
        city_name,
        strt_code AS zzdeadstreet,
        street
      FROM m_strta
      INTO TABLE @DATA(lt_m_strta)
      WHERE country EQ 'CN'
        AND langu  EQ @sy-langu
        AND region EQ @ps_alv-zzdeadregion
        AND city_code EQ @lv_zzdeadcity.

      UNASSIGN <gt_f4table>.
      ASSIGN lt_m_strta TO <gt_f4table>.

    WHEN OTHERS.
  ENDCASE.

  "调用搜索帮助函数
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = lv_fieldname
      dynpprog        = sy-repid
      dynpnr          = sy-dynnr
      dynprofield     = lv_dynprofld
      value_org       = 'S'
      display         = 'F'
    TABLES
      value_tab       = <gt_f4table>
      return_tab      = lt_return
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.

  IF sy-subrc =  0.
    READ TABLE lt_return INTO ls_return INDEX 1.
    IF sy-subrc = 0.
      ASSIGN COMPONENT lv_fieldname OF STRUCTURE ps_alv TO <lv_field>.
      <lv_field> = ls_return-fieldval.
      IF lv_next_level < 3."第三层查询完退出
        lv_next_level = lv_next_level + 1.
        "调用函数本身,开始下次循环
        PERFORM frm_callback_f4 USING lv_next_level lv_next_field CHANGING ps_alv.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFORM.
"--------------------@斌将军--------------------

在点击字段时调用,通过赋值层级,就可以循环调用多级搜索帮助,且代码更加简洁,复用性更高

"--------------------@斌将军--------------------
FORM frm_alv_on_f4_9001 USING pv_fieldname pv_fieldvalue pv_row_no TYPE lvc_s_roid
      pv_event_data TYPE REF TO cl_alv_event_data
      pv_display.


  READ TABLE gt_cjso_alv ASSIGNING <fs_cjso_alv> INDEX pv_row_no-row_id.
  "获取对应数据集
  CASE pv_fieldname.
    WHEN 'ZZDEADREGION'."送货地址-省
      PERFORM frm_callback_f4 USING 1 'ZZDEADREGION' CHANGING <fs_cjso_alv>.
    WHEN 'ZZDEADCITY'."送货地址-市
      PERFORM frm_callback_f4 USING 2 'ZZDEADCITY' CHANGING <fs_cjso_alv>.
    WHEN 'ZZDEADSTREET'."送货地址-区县
      PERFORM frm_callback_f4 USING 3 'ZZDEADSTREET' CHANGING <fs_cjso_alv>.
    WHEN OTHERS.
  ENDCASE.

  PERFORM frm_refresh_alv USING g_grid_9001.

ENDFORM.
"--------------------@斌将军--------------------

 

定期更文,欢迎关注

 

 

 

 

  TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
  TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back     此页面的语言为英语   翻译为中文(简体)        
  • 中文(简体)
  • 中文(繁体)
  • 丹麦语
  • 乌克兰语
  • 乌尔都语
  • 亚美尼亚语
  • 俄语
  • 保加利亚语
  • 克罗地亚语
  • 冰岛语
  • 加泰罗尼亚语
  • 匈牙利语
  • 卡纳达语
  • 印地语
  • 印尼语
  • 古吉拉特语
  • 哈萨克语
  • 土耳其语
  • 威尔士语
  • 孟加拉语
  • 尼泊尔语
  • 布尔语(南非荷兰语)
  • 希伯来语
  • 希腊语
  • 库尔德语
  • 德语
  • 意大利语
  • 拉脱维亚语
  • 挪威语
  • 捷克语
  • 斯洛伐克语
  • 斯洛文尼亚语
  • 旁遮普语
  • 日语
  • 普什图语
  • 毛利语
  • 法语
  • 波兰语
  • 波斯语
  • 泰卢固语
  • 泰米尔语
  • 泰语
  • 海地克里奥尔语
  • 爱沙尼亚语
  • 瑞典语
  • 立陶宛语
  • 缅甸语
  • 罗马尼亚语
  • 老挝语
  • 芬兰语
  • 英语
  • 荷兰语
  • 萨摩亚语
  • 葡萄牙语
  • 西班牙语
  • 越南语
  • 阿塞拜疆语
  • 阿姆哈拉语
  • 阿尔巴尼亚语
  • 阿拉伯语
  • 韩语
  • 马尔加什语
  • 马拉地语
  • 马拉雅拉姆语
  • 马来语
  • 马耳他语
  • 高棉语
 

标签:sy,return,递归函数,多级,lv,fieldname,TABLE,省市区,EQ
From: https://www.cnblogs.com/BinGeneral/p/17788092.html

相关文章

  • 传统渠道DMS系统跟不上时代?是时候建立多级渠道运营系统了
    在当今的商业环境中,品牌企业的渠道网络日益完善,从传统的批发到深度分销,从深度分销到BC一体化运营,传统的渠道DMS系统面临着架构陈旧、系统互通、渠道管控、业务扩展等一系列的问题,建立一个多级渠道运营系统已经成为了一种必要的策略,也是品牌企业数智化转型中不可或缺的业务路径。然......
  • 使用 excel 快速拼接省市区镇街村居五级区划完整名称
    你知道的越多,你不知道的越多点赞再看,养成习惯文章目录前言数据准备excel函数附件前言之前做了国家区划的映射关系,在其过程中,使用代码区拼接完整的五级区划,感觉还是比较麻烦的,后面偶然在excel上发现可以使用函数去完成这个拼接操作,记录一下方法。数据准备首先需要准备3个广......
  • 递归函数
    斐波那契数列(1)#include<iostream>usingnamespacestd;intx(intn){if(n<=2){return1;}else{returnx(n-1)+x(n-2);}}intmain(){intn;cin>>n;inta=x(n);cout<<a;return0;}斐波那契......
  • jenkins创建微服务流水线(微服务多级构建)
    1.Jenkins中新建一个maven的流水线  填写构建配置保存历史构建7天  填写git地址及凭证 填写build(cleanpackage-Dmaven.test.skip=true) 填写脚本 监本样例 ......
  • 2023年10月最新全国省市区县和乡镇街道行政区划矢量边界坐标经纬度地图数据 shp geojs
    发现个可以免费下载全国 geojson 数据的网站,推荐一下。支持全国、省级、市级、区/县级、街道/乡镇级以及各级的联动数据,支持导入矢量地图渲染框架中使用,例如:D3、Echarts等geojson数据下载地址:https://geojson.hxkj.vip该项目github地址:https://github.com/TangSY/echarts-m......
  • 多级索引结构
           ......
  • 多级编号与样式
    问题:多级编号与样式如何用解决: 选取待编号的段落》开始》编号》多级编号,选取如图所示的编号经此设置,该种编号自动与样式中的标题1-标题9绑定,对于需要设置相应编号的段落,只需要选取后应用对应样式即可。 ......
  • 以下是一个复杂的 C 语言代码示例,展示了如何使用递归函数来计算斐波那契数列: ```c #i
    以下是一个复杂的C语言代码示例,展示了如何使用递归函数来计算斐波那契数列:#include<stdio.h>//递归函数计算斐波那契数列intfibonacci(intn){if(n<=1){returnn;}returnfibonacci(n-1)+fibonacci(n-2);}intmain(){intnum;......
  • Sql(多级分销)无限极数据库表设计方法
    相信有过开发经验的朋友都曾碰到过这样一个需求。假设你正在为一个新闻网站开发一个评论功能,读者可以评论原文甚至相互回复。这个需求并不简单,相互回复会导致无限多的分支,无限多的祖先-后代关系。这是一种典型的递归关系数据。对于这个问题,以下给出几个解决方案,各位客......
  • 03_如何仅用递归函数和栈操作逆序一个栈
    如何仅用递归函数和栈操作逆序一个栈【题目】一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、3、2、1。将这个栈转置后,从栈顶到栈底为1、2、3、4、5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。【解答】本题考察栈的操作和递归函数......