开发者社区> 问答> 正文

如何获取关联表子表的数据

已解决

A表包含一个子表,子表可以填写多行数据

创建新的B表单 ,需要通过联动查询 A表单下的子表数据,将其赋值到B表的单选组件,目前官方文档说的暂不支持 ,有什么别的方法可以曲线救国

展开
收起
游客wwnkd5qcw45og 2023-09-20 10:34:19 1092 3
来自:钉钉宜搭
8 条回答
写回答
取消 提交回答
  • 十年摸盘键,代码未曾试。 今日码示君,谁有上云事。
    采纳回答

    可以参考一下宜搭获取子表单的值赋值给当前主表单。

    可以先添加一个数值组件、子表单组件;在子表单内再添加一个单行文本、数值组件并将子表单内的数值组件设置一个默认值。

    打开 JS 面板,编写代码

    下述代码可以直接复制使用,请注意表单唯一标识的替换!

    const sonform = this.$("子表单的唯一标识").getValue();   const arr = []   console.log(sonform)   sonform.forEach(item => {            arr.push(item.子表单的数值组件唯一标识)   })   this.$("主表中需赋值组件的唯一标识").setValue(JSON.stringify(arr))

    获取页面的子表单中的值,需要通过 JS 获取,先使用 this.$("子表单的唯一标识").getValue() 拿到子表单中所有组件的值:

    这时我们拿到的 sonform 是一个数组,我们需要对数组进行遍历拿值,如下:

    值已经拿到了,存放在新的数组中,我们用 setValue() 进行赋值就可以了。

    最终效果:

    宜搭内若想获取到关联表单的主要信息和次要信息,您可以用代码获取到关联表单的主要信息和次要信息,代码如下:

    获取主要信息:this.$("关联表单唯一标识").getValue()[0].title

    获取次要信息:this.$("关联表单唯一标识").getValue()[0].subTitle。

    通过关联设置,去获取到被关联的表单的一个数据作为当前表单的数据。目前仅支持普通表单、流程表单,也可选择到跨应用表单数据集。

    获取跨应用表单数据可参考文档:跨应用获取表单数据

    只允许选择被关联表单内的单行文本、多行文本两个组件,其他组件不支持选择,例如数值、日期等,

    注:若需要关联非单行/多行文本组件的数据,可以加入一个隐藏的单行文本(勾选始终提交),通过公式赋值。

    2023-09-20 11:20:00
    赞同 8 展开评论 打赏
  • 可以通过以下步骤来获取关联表子表的数据:

    1. 在B表单中创建一个单选组件,用于显示A表单子表数据。

    2. 在B表单的“数据源”设置中,选择A表单作为数据源。

    3. 在B表单的“数据映射”设置中,将单选组件的值与A表单子表中的相应字段进行映射。

    4. 在B表单的“触发器”设置中,创建一个“前置触发器”,用于在B表单打开时查询A表单子表数据。

    5. 在“前置触发器”中,使用“关联查询”语句查询A表单子表数据,并将结果赋值给单选组件。

    例如,如果A表单的子表名为“sub_table”,需要查询“sub_table”中的“name”字段,并将结果赋值给单选组件,可以使用以下代码:

    
    var subTableData = kintone.app.getRelatedRecords({
      app: kintone.app.getId(),
      id: kintone.app.record.getId(),
      key: 'sub_table'
    });
    
    var options = [];
    
    for (var i = 0; i < subTableData.length; i++) {
      options.push({
        label: subTableData[i]['name']['value'],
        value: subTableData[i]['name']['value']
      });
    }
    
    kintone.app.record.setField('single_select', options);
    
    2023-09-30 08:22:47
    赞同 2 展开评论 打赏
  • 如果官方文档中说暂不支持将 A 表的子表数据作为 B 表单单选组件的选项,您可以考虑以下曲线救国的方法:

    1. 使用计算字段:在 B 表单中创建一个计算字段,通过联动查询 A 表的子表数据,并将其转换为适合单选组件的格式。然后,将计算字段用作 B 表单单选组件的选项。

    2. 使用自定义脚本:在 B 表单中使用自定义脚本来处理联动查询和数据转换。您可以编写自定义脚本来查询 A 表的子表数据,并将其转换为单选组件可接受的格式。然后,将自定义脚本与 B 表单的单选组件相关联,并在需要时触发脚本执行。

    3. 引入中间表:创建一个新的中间表,用于存储从 A 表子表查询到的数据。在 B 表单中使用该中间表作为单选组件的选项数据源。您可以通过定期或实时更新中间表来保持数据的同步性。

    这些方法都是一种绕过限制的方式,但也需要额外的开发工作和维护成本。具体选择哪种方法取决于您的需求、系统架构和技术能力。

    2023-09-20 19:25:14
    赞同 4 展开评论 打赏
  • 在关联表中添加一个外键约束,将子表的主键作为外键引用到关联表中。

    在关联表中添加一个关联表的引用,可以使用关联表的主键或外键引用到关联表中。

    在需要获取子表数据的地方,使用关联表的引用来获取子表数据。

    2023-09-20 18:01:49
    赞同 3 展开评论 打赏
  • 十分耕耘,一定会有一分收获!

    楼主你好,如果宜搭官方暂不支持关联表子表的数据获取,那么可以考虑通过以下曲线方式进行处理:

    1. 将A表的子表数据导出成 Excel 或 CSV 文件。
    2. 在B表的单选组件上设置数据源为导入的 Excel 或 CSV 文件。
    3. 在B表的触发器中添加代码,通过调用宜搭 API 将 A 表的子表数据传输到 B 表的 Excel 或 CSV 文件中,然后刷新 B 表的单选组件。

    这种方法虽然相对麻烦,但可以实现关联表子表的数据获取。需要注意的是,在调用宜搭 API 时需要进行认证,以确保数据的安全性。

    2023-09-20 14:03:26
    赞同 4 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    如果官方文档中指出当前不支持直接联动查询将A表单下的子表数据赋值到B表的单选组件,可以考虑以下曲线救国的方法:

    1. 使用自定义脚本:在B表单中添加一个自定义脚本组件,在该脚本中编写代码来查询A表单下的子表数据,并将结果赋值给B表的单选组件。

      示例代码如下(请根据实际情况进行修改):

      var aTableData = $data['A表单名称']; // 获取A表的数据
      
      // 根据需要筛选和处理子表数据
      var subTableData = aTableData['子表名称'];
      
      // 将子表数据转换为单选组件的选项格式
      var options = [];
      for (var i = 0; i < subTableData.length; i++) {
        options.push({
          label: subTableData[i]['显示字段名称'],
          value: subTableData[i]['值字段名称']
        });
      }
      
      $data['B表单名称']['单选组件名称'] = options; // 将选项赋值给B表的单选组件
      
    2. 手动导出并导入数据:将A表单下的子表数据手动导出为CSV、Excel等格式的文件,然后在B表单中使用导入功能将数据导入到单选组件中。这种方法虽然相对繁琐,但可以达到将数据从A表关联到B表的目的。

    3. 使用外部数据库或API:如果A表和B表数据需要频繁交互,可以考虑使用外部数据库或API来实现数据联动。在A表的子表数据发生变化时,通过触发器或定时任务将更新后的数据同步到外部数据库或调用API,然后在B表中通过访问外部数据库或API来获取相关数据并填充到单选组件中

    2023-09-20 13:45:22
    赞同 3 展开评论 打赏
  • 可以考虑使用自定义JS代码来实现联动查询和赋值。

    具体实现步骤如下:

    在A表单中添加一个联动查询组件,查询子表数据。
    在B表单中添加一个单选组件,用于显示查询结果。
    在B表单的提交事件中,使用JS代码获取A表单中联动查询组件的查询结果,并将其赋值给B表单中的单选组件。
    示例代码如下:

    <!-- A表单中的联动查询组件 -->
    <select id="select-a">
      <option value="">请选择</option>
      <option value="1">选项1</option>
      <option value="2">选项2</option>
    </select>
    
    <!-- B表单中的单选组件 -->
    <select id="select-b">
      <option value="">请选择</option>
    </select>
    
    <!-- B表单的提交事件 -->
    <script>
      document.getElementById("form-b").addEventListener("submit", function(event) {
        // 获取A表单中的联动查询结果
        var selectA = document.getElementById("select-a");
        var queryResult = selectA.options[selectA.selectedIndex].value;
    
        // 将查询结果赋值给B表单中的单选组件
        var selectB = document.getElementById("select-b");
        selectB.options.length = 0;
        selectB.appendChild(new Option(queryResult, queryResult));
        event.preventDefault();
      });
    </script>
    

    以上代码实现了将A表单中的联动查询结果赋值给B表单中的单选组件的功能。在提交B表单时,JS代码会获取A表单中的联动查询结果,并将其赋值给B表单中的单选组件。这样,就可以实现联动查询和赋值的功能了。

    2023-09-20 10:52:58
    赞同 2 展开评论 打赏
  • 宜搭无法直接获取关联表子表的数据,它只提供了一个可视化界面,用于创建和管理数据模型,以及与数据源进行交互。
    如果需要获取关联表子表的数据,需要在宜搭中创建两个数据模型,一个用于获取主表的数据,另一个用于获取子表的数据。然后在获取主表数据的脚本中,使用子表数据模型的相关方法,获取子表的数据。例如,可以使用以下代码在获取主表数据的脚本中获取子表数据:

    csharp// 获取当前行数据var row = $element.parents('tr').data('row'); // 获取子表数据模型对象var subTableModel = app.models[row.SubTableModel];// 根据主表中的主键值获取子表中的数据var subTableData = subTableModel ? subTableModel.get($element.data('key')) : null;// 输出子表数据console.log(subTableData);
    

    这段代码中,element表示当前按钮的jQuery对象,element 表示当前按钮的 jQuery 对象,element表示当前按钮的jQuery对象,element.parents('tr') 表示获取当前按钮所在的行,data('row') 表示获取该行的数据,保存在 row 变量中。通过 row.SubTableModel 可以获取子表数据模型对象,然后使用 get 方法根据主键值获取子表中的数据,最后输出子表数据。

    2023-09-20 10:38:30
    赞同 2 展开评论 打赏
滑动查看更多
问答分类:
问答地址:
关联地址:
来源圈子
更多
收录在圈子:
+ 订阅
「宜搭」是云钉原生低代码平台(钉钉 PaaS - aPaaS),让企业应用搭建更简单! 帮助中小企业降本提效,加强组织的数字化自主权; 帮助大型企业释放个体创新力,助力组织创新涌现。
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载