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

news2025/2/26 23:04:25

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.
"--------------------@斌将军--------------------

定期更文,欢迎关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1158555.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024上海国际人工智能展(CSITF)以“技术,让生活更精彩”为核心理念,以“创新驱动发展,保护知识产权,促进技术贸易”为主题

2024上海国际人工智能展&#xff08;CSITF&#xff09; China&#xff08;Shanghai&#xff09;International Technology Fair 时间:2024年6月12-14日 地点:上海世博展览馆 主办单位 中华人民共和国商务部 中华人民共和国科学技术部 中华人民共和国国家知识产权局 上海市…

进口跨境电商商城源码(海关179接口+海关报关+三单对碰)

海关179接口 现如今&#xff0c;跨境电商正在飞速发展&#xff0c;进口商品成为人们消费的热点。然而&#xff0c;进口商品的报关手续繁琐&#xff0c;而海关179接口的出现解决了这个问题。海关179接口是指与海关电子数据交换的商业接口&#xff0c;可以实现与海关进行数据对接…

小红书协议算法最新版

如果您想通过学习来了解小红书的点赞、关注、私信等功能的实现&#xff0c;以下是一些一般性的思路和示例代码&#xff0c;供您学习参考&#xff1a; 1. 点赞功能&#xff1a; - 后端实现&#xff1a;在后端&#xff0c;您可以创建一个用于存储用户点赞信息的数据库表。对于每…

自适应H5樱花个人网站引导页导航源码SEO增强版

懂前端和 PHP 技术想更改前端页面的可以看&#xff1a;网站的前端页面不好看&#xff0c;你可以查看 index 目录&#xff0c;内有参数 txt 文本里面记录了前端页面所使的关键 JS 代码和 php 代码&#xff0c;只需要稍加复制粘贴修改到新的前端页面就可以了&#xff01;主目录的…

【干货】分享几个免费下载音乐mp3的网站实测可用

简述 本文仅用于学习交流,不做任何声明。 分享几个免费下载音乐mp3的网站、免费音乐、 大家有找不到资源的,可以留言评论下,帮忙代下载~~ 一说 文本由PUSDN强力驱动! 有账号的朋友,可以点个赞或者评论两句哦,评论后会获得积分奖励~ wandhi【实测可用】 评价:比…

【Javascript】Javascript高级程序设计:js 事件 随手笔记

目录 一、事件概述1.1 html 与 js1.2 事件流1.3 DOM 事件流 二、事件处理程序2.1 html 事件处理程序2.2 dom0 级事件处理程序2.3 dom2 级事件处理程序2.4 IE 事件处理程序 三、事件对象四、事件类型4.1 概述4.2 UI 事件4.3 焦点事件4.4 鼠标与滚轮事件4.5 键盘与文本事件4.6 额…

Vue基本使用

上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><!-…

【PCIe 5.0 - 10】Memory, I/O, and Configuration Request 规则

下列规则适用于所有 Memory, I/O, Configuration Requests&#xff0c;以下是针对各类请求的附加规则。 除通用 header 字段外&#xff0c;所有 Memory, I/O, 和 Configuration Requests 还包括以下字段&#xff1a; Requester ID[15:0] 和 Tag[9:0]&#xff0c;组成 Transact…

Easy-Laser激光测平仪维修易激光对中仪E920

Easy-Laser激光对中仪常见故障&#xff1a;触摸屏损坏&#xff08;屏碎&#xff0c;不显示&#xff0c;黑屏&#xff0c;蓝屏&#xff0c;无背光等&#xff09;&#xff0c;对中仪电路板损坏&#xff0c;对中仪接收装置电路板&#xff0c;对中仪发射控制装置电路板等均可维修。…

筋膜炎能自愈吗

筋膜炎的临床表现&#xff1a; 在发病前&#xff0c;通常有过度劳累的历史&#xff0c;剧烈运动、创伤、寒冷和上呼吸道感染也可能导致这种疾病。肢体皮肤肿胀&#xff0c;或皮肤红斑和关节活动有限。侵犯部位以下的下肢&#xff0c;特别是小腿&#xff0c;其次是前臂。损伤的…

高效率、低待机功耗TUHS15F12、TUHS25F05、TUHS25F12、TUHS25F24、TUHS5F05小型板载AC/DC转换器

简介 TUHS AC-DC转换器具有高效率、低待机功耗以及内置过流和过压保护电路。这些小型板安装AC-DC转换器在保持时间和预期寿命方面具有设计灵活性。该系列具有3W至26.4W的额定输出和AC85至264V、DC120至370V的通用输入电压。工作温度范围为-40C至85C。 引脚配置 规格参数 1、…

数据结构(四)--队列及面试常考的算法

一、队列介绍 1、定义 与栈相似&#xff0c;队列是另一种顺序存储元素的线性数据结构。栈与队列的最大差别在于栈是LIFO&#xff08;后进先出&#xff09;&#xff0c;而队列是FIFO&#xff0c;即先进先出。 2、优缺点及使用场景 优点&#xff1a;先进先出&#xff08;FIFO&…

如何较为准确的测试自己的网速?

相对靠谱公正的20个测速网站(或APP或软件)大全&#xff08;不断更新中&#xff09; 一、电信宽带网页测速 网址&#xff1a;https://10000.gd.cn/#/speed 预览&#xff1a; 二、测速网 网址&#xff1a;测速网 - 专业测网速, 网速测试, 宽带提速, 游戏测速, 直播测速, 5G测…

Window下coturn服务器的搭建

Window下搭建coturn服务器&#xff1a; 准备材料&#xff1a; 1、安装Cygwin&#xff0c;地址&#xff1a;https://cygwin.com/install.html 由于Window无法直接部署coturn&#xff0c;因此需要下载安装Cygwin在Window上部署Linux虚拟环境。 在安装的时候需要安装几下packe…

Aigtek的ATA-7050高压放大器对比进口品牌TREK的609E-6

一、公司介绍 中国安泰&#xff1a;西安安泰电子科技有限公司是国内专业从事测量仪器研发生产和销售的高科技企业&#xff0c;公司依托西安交大、西北工业大学组建的科研团队&#xff0c;专注功率放大器、功率信号源等产品为核心的相关行业测试解决方案的研究&#xff0c;拥有国…

taro全局配置页面路由和tabBar页面跳转

有能力可以看官方文档&#xff1a;Taro 文档 页面路由配置&#xff0c;配置在app.config.ts里面的pages里&#xff1a; window用于设置小程序的状态栏、导航条、标题、窗口背景色&#xff0c;其配置项如下&#xff1a; tabBar配置&#xff1a;如果小程序是一个多 tab 应用&…

Node和Python遍历文件夹自动注入代码

需求是从文件夹中遍历检索多层级文件夹,找到其中文件取到上面namespace 后面的名称,在下面代码中自动注入动态代码: static displayName = "Test";下面使用node和python两种代码实现一下,方便对照学习 node代码 const fs = require(fs); const path = requir…

【算法|滑动窗口No.4】leetcode 485.最大连续 1 的个数 487.最大连续 1 的个数 II 1004. 最大连续1的个数 III

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

配置开启swap分区自定义大小

当前服务器swap分区是关闭状态&#xff0c;因服务需求需要开启swap分区 在 /data 目录下创建一个名为 swapfile 的文件&#xff0c;并将其大小设置为 8GB 注意这个操作占用的是/data目录的磁盘空间&#xff0c;要确保磁盘剩余空间大于设置的内存大小并且不影响磁盘空间的正常使…

10kb的WordPress外链页面安全跳转插件

老白博客我参照csdn和腾讯云的外链跳转页面&#xff0c;写了一个WordPress外链安全跳转插件&#xff1a;给网站所有第三方链接添加nofollow标签和重定向功能&#xff0c;提高网站安全性。插件包括两个样式&#xff0c;由于涉及到的css不太一样&#xff0c;所以分别写了两个版本…