反馈已提交

网络繁忙

分页取数-按偏移量取数

  • 文档创建者:Roxy
  • 历史版本:8
  • 最近更新:Roxy 于 2024-04-03
  • 1. 概述

    1.1 应用场景

    公司内部使用金蝶云星空进行供应链管理。

    希望将 销售报价单的单据查询接口 中的数据取出,以便进行数据分析。

    1.2 接口说明

    接口文档详情参见:销售报价单的单据查询接口

    2. 方案一

    4.1.3 以及之后的版本支持的方案。

    2.1 实现思路

    FilterString 参数中使用日期区间作为参数,获取一段时间(开始时间和结束时间)作为日期参数,取出该段时间内的数据,后续通过定时调度任务进行追加。

    如何取出该时间段数据:使用接口请求参数偏移量 StartRow 和每次的限制条数 Limit ,为 StartRow 赋值参数 ${offset},以${offset} 0 为初始值,增长间隔也就是 Limit 设置为 30,进行取数并设置分页取数的结束条件,即如果最后一次取数返回的数据条数小于 Limit 限制 30,则此次数据就已经被取完,停止循环,取出所有数据。

    2.2 操作步骤

    给出的接口请求如下:

    {
        "data": {
            "FormId": "SAL_QUOTATION",
            "FieldKeys": "FID,FQUOTATIONENTRY_FEntryID,FMaterialId.Fnumber,FMaterialModel,FMaterialType,FUnitID,FPrice,FQty,FTaxPrice,FTaxRate,FTaxAmount,FAllAmount,FEntryNote,FAmount,FPriceUnitId,FPriceUnitQty,FBaseUnitQty,FBaseUnitId,FTaxCombination,FAuxPropId,FPriceCoefficient,FSysPrice,FDiscount,FDiscountRate,FTaxNetPrice,FBomId,FIsFree,FTaxAmount_LC,FAmount_LC,FAllAmount_LC,FStartQty,FLimitDownPrice,FMapId,FMapName,FMaterialName,FPriceBaseQty,FSetPriceUnitID,FStockUnitID,FStockQty,FStockBaseQty,FPriceListEntry,FChangeFlag,FRowType,FParentMatId,FRowId,FParentRowId,FSupplyOrgId,FSourceBillFormId,FLot,FEntryDiscountList,FPriceDiscount,FBOMEntryId,F_PYBU_RecomReferPrice,F_PYBU_CostPrice,F_PYBU_VolumeReferPrice,F_PYBU_VolumeCostPrice,F_PYBU_QuotCoefficient,F_PYBU_VarianceMoney,F_PYBU_differenceScale,F_PYBU_SuccessFlag,F_PYBU_SCXH,F_PYBU_YBJ,F_PYBU_JJBL,F_PYBU_JYHXJJB,F_PYBU_SQBJDJBWB,F_PYBU_BZGG,F_PYBU_BaseProperty3_VOCFL,F_PYBU_VOC,F_PYBU_CLMLB,F_PYBU_CLCBCYJE,F_PYBU_HXJHS,F_PYBU_CLCBCYJESR,F_PYBU_CLMLLSR,F_PYBU_JSJE,FDATE",
            "FilterString": [
                {
                    "Left":"(",
                    "FieldName":"FDATE",
                    "Compare":">=",
                    "Value":"${STARDATE}",
                    "Right":")",
                    "Logic":"AND"
                },
                {
                    "Left":"(",
                    "FieldName":"FDATE",
                    "Compare":"<",
                    "Value":"${ENDDATE}",
                    "Right":")",
                    "Logic":"AND"
                }],
            "OrderString": "",
            "TopRowCount": 0,
            "StartRow": "${startrow}",
            "Limit": "${limit}",
            "SubSystemId": ""
        }
    }

    2.2.1 获取日期参数

    本文示例设置日期区间为最近120天,使用 SQL 语句获取开始时间和截止到数据库当天的时间,作为日期参数,便于后续取出此时间段内的数据。

    使用参数赋值,选择数据库并输入 SQL 语句,如下图所示:

    SELECT
      CONCAT(
        DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 120 DAY), '%Y-%m-%d'),
        ' ',
        '00:00:00'
      ) AS STARDATE,
      CONCAT(DATE_FORMAT(NOW(), '%Y-%m-%d'), ' ', '00:00:00') AS ENDDATE;

    「数据预览」即可看到设置的开始时间 STARDATE 和结束时间 ENDDATE,如下图所示:

    将其分别设置为参数。如下图所示:

    2.2.2 设置分页取数

    新增「数据同步」节点,输入 API 配置,如下图所示:

    点击「高级配置」并勾选分页取数,分页取数逻辑为,使用接口请求参数偏移量 StartRow 和每次的限制条数 Limit ,为 StartRow 赋值参数 ${offset},以 0 为初始值,增长间隔也就是 Limit 设置为 30,进行取数,也就是下一次循环则 offset 参数变为 30,如下图所示:

    注1:取数限制为分页取数循环次数,可以根据实际情况设置。

    注2:总数刚好是pageSize或limit的整数时,有可能会产生空数据,可以使用数据转换节点中的API输入算子,并在其后接一个算子过滤空数据,参见:API循环取数时取出数据为空

    然后设置分页取数的结束条件,即如果最后一次取数返回的数据条数小于 Limit 限制 30,则此次数据就已经被取完。因此设置,解析接口返回值 Jsonpath 中数据的条数。如下图所示:

    注:JsonPath 表达式说明请参见:JSONPath表达式

    然后再设置接口的请求参数,将开始和结束时间参数写入接口,同时 StartRow 设置为偏移量 ${offset},每次的限制条数 Limit 设置为 30,如下图所示:


    然后可以解析返回值,如下图所示:

    然后即可预览到取出的数据,并对数据进行处理和输出。

    3. 方案二

    4.1.3 之前的版本支持的方案。

    3.1 实现思路

    FilterString 参数中使用日期区间作为参数,获取一段时间(开始时间和结束时间)作为日期参数,取出该段时间内的数据,后续通过定时调度任务进行追加。

    如何取出该时间段数据:先清空日期区间内的数据,然后通过循环容器循环次数来确定每次取数的开始行数,直到结果数据行数无法整除每次区数量,再跳出循环。

    FineDataLink 中的数据处理过程,详情参见:https://demo.finedatalink.com/ 「API取数-金蝶云星空销售报价单单据查询」。

    3.2 操作步骤

    示例给出的接口请求示例如下:

    {
        "data": {
            "FormId": "SAL_QUOTATION",
            "FieldKeys": "FID,FQUOTATIONENTRY_FEntryID,FMaterialId.Fnumber,FMaterialModel,FMaterialType,FUnitID,FPrice,FQty,FTaxPrice,FTaxRate,FTaxAmount,FAllAmount,FEntryNote,FAmount,FPriceUnitId,FPriceUnitQty,FBaseUnitQty,FBaseUnitId,FTaxCombination,FAuxPropId,FPriceCoefficient,FSysPrice,FDiscount,FDiscountRate,FTaxNetPrice,FBomId,FIsFree,FTaxAmount_LC,FAmount_LC,FAllAmount_LC,FStartQty,FLimitDownPrice,FMapId,FMapName,FMaterialName,FPriceBaseQty,FSetPriceUnitID,FStockUnitID,FStockQty,FStockBaseQty,FPriceListEntry,FChangeFlag,FRowType,FParentMatId,FRowId,FParentRowId,FSupplyOrgId,FSourceBillFormId,FLot,FEntryDiscountList,FPriceDiscount,FBOMEntryId,F_PYBU_RecomReferPrice,F_PYBU_CostPrice,F_PYBU_VolumeReferPrice,F_PYBU_VolumeCostPrice,F_PYBU_QuotCoefficient,F_PYBU_VarianceMoney,F_PYBU_differenceScale,F_PYBU_SuccessFlag,F_PYBU_SCXH,F_PYBU_YBJ,F_PYBU_JJBL,F_PYBU_JYHXJJB,F_PYBU_SQBJDJBWB,F_PYBU_BZGG,F_PYBU_BaseProperty3_VOCFL,F_PYBU_VOC,F_PYBU_CLMLB,F_PYBU_CLCBCYJE,F_PYBU_HXJHS,F_PYBU_CLCBCYJESR,F_PYBU_CLMLLSR,F_PYBU_JSJE,FDATE",
            "FilterString": [
                {
                    "Left":"(",
                    "FieldName":"FDATE",
                    "Compare":">=",
                    "Value":"${STARDATE}",
                    "Right":")",
                    "Logic":"AND"
                },
                {
                    "Left":"(",
                    "FieldName":"FDATE",
                    "Compare":"<",
                    "Value":"${ENDDATE}",
                    "Right":")",
                    "Logic":"AND"
                }],
            "OrderString": "",
            "TopRowCount": 0,
            "StartRow": "${startrow}",
            "Limit": "${limit}",
            "SubSystemId": ""
        }
    }

    3.2.1 获取日期参数

    本文示例设置日期区间为最近120天,使用 SQL 语句获取开始时间和截止到数据库当天的时间,作为日期参数,便于后续取出此时间段内的数据。

    使用参数赋值,选择需要落库的数据库并输入 SQL 语句,如下图所示:

    SELECT
      CONCAT(
        DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 120 DAY), '%Y-%m-%d'),
        ' ',
        '00:00:00'
      ) AS STARDATE,
      CONCAT(DATE_FORMAT(NOW(), '%Y-%m-%d'), ' ', '00:00:00') AS ENDDATE;

    「数据预览」即可看到设置的开始时间 STARDATE 和结束时间 ENDDATE,如下图所示:

    将其分别设置为参数。如下图所示:

    3.2.2 设置Limit 参数

    销售报价单的单据查询接口 需要使用请求参数 Limit 获取每次取数的数据量。

    在参数设置中新增 limit 参数,如下图所示:

    注:示例将参数值设置为 30,用户可根据实际情况进行设置。

    3.2.3 清空目标表日期参数区间内的数据

    为了保证本次取数的纯净,因此使用 SQL 脚本删除目标数据表中本次取数的日期参数区间内的数据。

    使用「SQL脚本」,输入 SQL 语句,如下图所示:

    DELETE from
      ods_JDYXK
    WHERE
      订购日期 >= '${STARDATE}'
      and 到货日期 <= '${ENDDATE}'

    3.2.4 循环取数-判断目标表指定区间数据能否被Limit整除

    接下来进行取数,因为数据量较大不能一次取完,因此循环取数就需要用到循环容器。

    新增「循环容器」节点,后续的节点需要在循环容器中新增,如下图所示:

    对目标表中设置的日期参数区间数据进行求余,如果余数为0,则表示目标表数据能被整除,表示还有未读取的接口数据,因此需要继续写入数据。

    余数不为 0,则表示已经取出了指定日期中的所有接口数据,需要停止取数。

    在循环容器中新增「参数赋值」节点,计算指定日期区间中目标数据表数据除以 limit 参数的余数,如下图所示:

    select count(*)%${limit} as  tflag   from  `demotest`.`ods_JDYXK`
                  WHERE 订购日期 >= '${STARDATE}' and 到货日期 <='${ENDDATE}'

    将余数结果设置为参数 tflag,如下图所示:

    3.2.5 判断是否继续写入数据

    判断是否继续写入数据。

    如果余数为0,则表示目标表数据能被整除,表示还有未读取的接口数据,因此需要继续写入数据。

    若余数不为 0,则表示已经取出了指定日期中的所有接口数据,需要停止取数。

    新增「条件分支」节点,设置判断条件,如果余数 tflag为 0 则继续执行下个节点,否则停止执行,如下图所示:

    因此对整个循环容器进行循环设置,选中循环容器,然后选择循环方式为「条件循环」,设置执行的条件为 tflag 参数属于 0,若满足条件,则继续执行,否则停止:

    3.2.6 获取每次循环开始行数

    获取每次循环请求参数 StartRow 的开始位置,因此新建参数赋值节点,使用 FineDataLink 内置的参数${loopTimes}——循环容器当前循环次数

    SQL语句:

    select (${loopTimes}- 1 ) * ${limit};

    由于 loopTimes 默认从 1 开始,因此 StartRow 的开始位置默认从 0 开始,如下图所示:

    将其设置为参数 startrow,如下图所示:

    3.2.7 API 取数

    请求中参数 开始时间 STARDATE 和结束时间 ENDDATE、Limit、startrow 均已经定义好,因此就可以引用参数进行取数。

    新增数据转换节点,编辑界面新增 API 输入算子,并输入 URL、和请求Body,如下图所示:

    然后即可预览到取出的数据,并对数据进行处理和输出。

    附件列表


    主题: 数据开发
    • 有帮助
    • 没帮助
    • 只是浏览
    • 评价文档,奖励 1 ~ 100 随机 F 豆!

    鼠标选中内容,快速反馈问题

    鼠标选中存在疑惑的内容,即可快速反馈问题,我们将会跟进处理。

    不再提示

    10s后关闭

    联系我们
    在线支持
    获取专业技术支持,快速帮助您解决问题
    工作日9:00-12:00,13:30-17:30在线
    页面反馈
    针对当前网页的建议、问题反馈
    售前咨询
    采购需求/获取报价/预约演示
    或拨打: 400-811-8890 转1
    qr
    热线电话
    咨询/故障救援热线:400-811-8890转2
    总裁办24H投诉:17312781526
    提交页面反馈
    仅适用于当前网页的意见收集,帆软产品问题请在 问答板块提问前往服务平台 获取技术支持