当前位置: 首页 > news >正文

FireDAC(Master-Detail 功能)主从表查询

主从表查询方案优点:

  1. FIREDAC 原生支持,性能最优

  2. 代码简洁,易于维护

  3. 自动关联,减少手动处理错误

  4. 内存效率高,只加载需要的数据

    JSON格式:

    {"data": [{"company": "DEMO","creator": "DS","usr_group": "","create_date": "20110607161401513","modifier": "DS","modi_date": "20110607163936093","flag": 6,"list": [{"company": "DEMO","creator": "DS","usr_group": "","create_date": "20110607161401623","modifier": "DS","modi_date": "20110607163936047","flag": 6,}]}],"page": {"pageIndex": 1,"pageSize": 10,"totalCount": 5,"totalPages": 1,"hasPrevious": false,"hasNext": false}
    }

     

    procedure TDBDemoController.GetEmployeesWithDBHelperV9;
    varMasterDBHelper: TDBHelper;DetailDBHelper: TDBHelper;LPageNum, LPageSize, LTotalCount: Integer;LJsonResp: TJDOJsonObject;lSer: TMVCJsonDataObjectsSerializer;
    begin// 分页参数处理LPageNum := StrToIntDef(Context.Request.QueryStringParam('pageIndex'), 1);LPageSize := StrToIntDef(Context.Request.QueryStringParam('pageSize'), 10);LPageNum := Max(1, LPageNum);LPageSize := EnsureRange(LPageSize, 1, 1000);     //第页限制
    MasterDBHelper := TDBHelper.Create(ConnectionDef);DetailDBHelper := TDBHelper.Create(ConnectionDef);try// 先获取总记录数(使用COUNT查询更高效)MasterDBHelper.Query.SQL.Text := 'SELECT COUNT(*) as TotalCount FROM COPTC';MasterDBHelper.Query.Open;tryLTotalCount := MasterDBHelper.Query.FieldByName('TotalCount').AsInteger;finallyMasterDBHelper.Query.Close;end;// 如果没有数据,直接返回空结果if LTotalCount = 0 thenbegin// Render(Format('{"data":[],"totalCount":0,"pageIndex":%d,"pageSize":%d,"hasNext":false}', [LPageNum, LPageSize]));raise EMVCException.Create(HTTP_STATUS.NotFound, 'Not Found');Exit;end;// 设置主从关系DetailDBHelper.Query.MasterSource := TDataSource.Create(nil);try// 先设置主查询并打开MasterDBHelper.Query.SQL.Text := 'SELECT * FROM COPTC ORDER BY TC001, TC002';MasterDBHelper.Query.FetchOptions.RecsSkip := (LPageNum - 1) * LPageSize;MasterDBHelper.Query.FetchOptions.RecsMax := LPageSize;MasterDBHelper.Query.Open;// 设置主从关系(在主查询打开后)DetailDBHelper.Query.MasterSource.DataSet := MasterDBHelper.Query;DetailDBHelper.Query.MasterFields := 'TC001;TC002';DetailDBHelper.Query.IndexFieldNames := 'TD001;TD002';// 明细查询 - FIREDAC 会自动处理关联DetailDBHelper.Query.SQL.Text := 'SELECT * FROM COPTD WHERE TD001 = :TC001 AND TD002 = :TC002 ORDER BY TD001, TD002';DetailDBHelper.Query.Open;LJsonResp := TJDOJsonObject.Create;trylSer := TMVCJsonDataObjectsSerializer.Create;try// 序列化主数据lSer.DataSetToJsonArray(MasterDBHelper.Query, LJsonResp.A['data'], TMVCNameCase.ncLowerCase, [], nil);// 利用 FIREDAC 的主从关系自动关联数据
              MasterDBHelper.Query.First;var CurrentIndex := 0;while not MasterDBHelper.Query.Eof dobegin// 当前主记录对应的明细记录会自动过滤lSer.DataSetToJsonArray(DetailDBHelper.Query, LJsonResp.A['data'].O[CurrentIndex].A['list'], TMVCNameCase.ncLowerCase, [], nil);MasterDBHelper.Query.Next;Inc(CurrentIndex);end;// 分页元数据LJsonResp.O['page'].I['pageIndex'] := LPageNum;LJsonResp.O['page'].I['pageSize'] := LPageSize;LJsonResp.O['page'].I['totalCount'] := LTotalCount;LJsonResp.O['page'].I['totalPages'] := Ceil(LTotalCount / LPageSize); // 计算总页数LJsonResp.O['page'].B['hasPrevious'] := (LPageNum > 1);                         //上一页LJsonResp.O['page'].B['hasNext'] := (LPageNum * LPageSize) < LTotalCount;       //下一页
              Render(LJsonResp, False);finallylSer.Free;end;finally// LJsonResp 由 Render 自动释放FreeAndNil(LJsonResp);end;finallyDetailDBHelper.Query.MasterSource.Free;end;finallyDetailDBHelper.Free;MasterDBHelper.Free;end;
    end;

     

http://www.hskmm.com/?act=detail&tid=19975

相关文章:

  • 极氪汽车火山引擎:AI数据专家“上岗”,注入“分钟级”数据洞察力
  • C++面试宝典 01 new/delete/malloc/free关系
  • Ansible + Docker 部署 MinIO 集群
  • ​​万用表与电流探头测量电流信号的技术对比分析​​
  • flink运行时架构 - --
  • k8s命令
  • wifi亮灭屏机制--系统修改
  • 自动遍历测试利器:开源工具AppCrawler 配置全解析
  • 得帆云ETL全新版本升级驱动数据高效流转
  • Windows 的图标没有及时更新
  • 拒绝 “能源糊涂账”!MyEMS 如何让中小企业能耗管理 “秒上手”?
  • 【海内外多个支持单位|学生优惠|高录用快见刊】第五届管理科学和软件工程国际学术会议(ICMSSE 2025)
  • 电天下dq123.com搜索功能全新升级,AI加持,焕新垂直行业搜索体验!
  • 中小微企业能源管理 “入门神器”:MyEMS 开源系统如何低成本实现专业级管控?
  • jinja2和角色管理和集合
  • 挖同行墙脚!有稳定供应商的客户怎么下手构建?
  • 视频融合平台EasyCVR在智慧工地中的应用:构建安全、智能、高效的“云上工地”
  • 开源技术崛起:中国如何构建数字经济时代的创新基础设施
  • 250928
  • 地图商业授权共享 - no
  • DevOps平台选型指南:数字化转型中的技术决策关键
  • window 安全模式卸载任何软件
  • 题解:qoj1261 Inv
  • sv 去除字符串行尾空格函数
  • 题解:AT_abc214_g [ABC214G] Three Permutations
  • 通过velocity将增量发版的代码及文件生成生成一个linux shell文件(解放运维)
  • 从企业级项目到普惠API:我如何将自研的人脸识别引擎打造成「识度AI」
  • 得帆AI aPaaS 1.0正式发布,低代码+AI关键特性等你探索
  • 配置驱动的动态 Agent 架构网络:实现高效编排、动态更新与智能治理
  • NVIDIA Dynamo深度解析:如何优雅地解决LLM推理中的KV缓存瓶颈 - 实践