快速实现主从表编辑,实现多个不定长从表

news2024/11/25 13:22:10

目录

1 前言

2 不定长表、定长表的定义

3 根据已有的电子表格制作数据库表并导入数据

3.1 订单

3.2 订单明细

3.3 客户

4 配置主从关联关系

5 继续增加一个主从关联关系 

 6 测试一下运行结果

 7 一段代码用于实现在panel中画出字段列表面板


1 前言

实际工作中,经常遇到一对多的主从表编辑需求,例如,主表是订单列表,从表是每个订单包含的一个或多个产品信息。

这里尝试实现以下主从表编辑:

订单——订单明细,一对多

订单——客户,一对一

2 不定长表、定长表的定义

  •  不定长表是指,与主表某条记录对应的从表记录数量不定,例如一个订单中,可能包含1种产品,也可能包含多种产品。
  •  定长表与不定长表相反。例如,某个班级的学生明细为主表,对应的从表是每个学生的学科分数情况,每个学生对应的行数是固定的。

定长表与不定长表,需要不一样的处理。

3 根据已有的电子表格制作数据库表并导入数据

 与上一篇操作相同,制作3个表:

3.1 订单

 

3.2 订单明细

 

3.3 客户

 

4 配置主从关联关系

工具——关联设计

注意是主表的订单ID字段与从表的订单ID进行关联,拖放的时候一定不要搞错了。

 这样就完成了一个主从关系的配置。完成后,在编辑列表中自动显示出来。

双击可看到效果。

5 继续增加一个主从关联关系 

订单表的客户ID字段与客户表的客户ID字段进行关联,完成后在主界面左上角编辑列表中自动显示出名称。

 6 测试一下运行结果

由于两个主从关系指向同一个主表,所以在从表界面中,显示2个主从关系选项卡,可以切换使用。

 7 一段代码用于实现在panel中画出字段列表面板

本来想实现可以自由拖动面板位置、拖放后在2个字段之间连线、保存面板状态等功能,太费时间,以后再说。这里仅仅实现最基本功能。

// 根据表名称画字段列表面板
procedure TFormLinks.drawTbl(parName, tblOrViewName, table_or_view: string; bCreateOrDestroy: boolean);
var
  //iLinks: integer;
  APanel: TPanel;
  ACheckListBoxFldCn: TCheckListBox;
  AListBoxTblEn, AListBoxFldEn: TListBox;
  ALabel: TLabel;
  //sql, sLeftPanelTop, sLeftPanelLeft, sRightPanelTop, sRightPanelLeft, linkNameTmp, srcTblTmp, dstTblTmp,
    tblNameCn,
    sFldCn, sFldEn: string;
begin

  // 创建 table 面板
  if bCreateOrDestroy = true then
  begin
    tblNameCn := clbTablesCnTobeChked.Items[clbTablesCnTobeChked.ItemIndex];
    memo1.append('tblNameCn: ' + tblNameCn);


    APanel := TPanel.Create(self);
    APanel.Name := 'panel_' + tblOrViewName;
    APanel.Parent := PanelMain;
    APanel.Caption := '';
    APanel.Hint := '';

    if ifMouseClick = True then // 如果鼠标单击表名生成的panel
    begin

      if (panel_left + checkedTableCnt * 200) < PanelMain.Width then
        APanel.Left := panel_left + checkedTableCnt * 300
      else
        APanel.Left := PanelMain.Width - 200;

      //memo1.append('APanel.Left: ' + intToStr(APanel.Left));

      APanel.Top := panel_top; // + (checkedTableCnt mod 2) * 100;
      //memo1.append('APanel.Top: ' + intToStr(APanel.Top));
    end
    else  // 如果不是鼠标点击表名生成的,则从数据库中读取位置信息
    begin

    end;

    APanel.Height := 300; //ZROQuery.RecordCount * 20 + 30;
    APanel.Width := 180;


    // 中文字段名列表
    if Assigned(FindComponent('clb_' + tblOrViewName)) then
      FindComponent('clb_' + tblOrViewName).Destroy;

    ACheckListBoxFldCn := TCheckListBox.Create(self);
    ACheckListBoxFldCn.Name := 'clb_' + tblOrViewName;
    ACheckListBoxFldCn.Parent := TPanel(FindComponent('panel_' + tblOrViewName));
    ACheckListBoxFldCn.Height := 300; //ZROQuery.RecordCount * 20;
    ACheckListBoxFldCn.Align := alClient;
    //ACheckListBoxFldCn.Left:=0;
    //ACheckListBoxFldCn.Top:=40;

    ACheckListBoxFldCn.DragMode := dmAutomatic;

     赋予创建的 CheckListBox 自定义函数
    ACheckListBoxFldCn.OnClick := @ACheckListBoxClick;
     自定义 复选列表 复选事件
    //ACheckListBoxFldCn.OnClickCheck := ACheckListBoxClickCheck;

    ACheckListBoxFldCn.OnDragOver := @ACheckListBoxDragOver;
    ACheckListBoxFldCn.OnDragDrop := @ACheckListBoxDragDrop;

    // 创建 listbox 用于记录原始英文表名(用于记录原始表名称)
    if Assigned(FindComponent('lbt_' + tblOrViewName)) then
      FindComponent('lbt_' + tblOrViewName).Destroy;

    AListBoxTblEn := TListBox.Create(self);
    AListBoxTblEn.Name := 'lbt_' + tblOrViewName;
    AListBoxTblEn.Parent := TPanel(FindComponent('panel_' + tblOrViewName));
    AListBoxTblEn.Height := 300; //ZROQuery.RecordCount * 10;
    AListBoxTblEn.Width := 100;
    AListBoxTblEn.Left := 60;
    AListBoxTblEn.Top := 40;
    AListBoxTblEn.Visible := false;

    //memo1.Append('创建了:' + 'lbt_' + tblOrViewName);

    // 创建 listbox 用于记录英文字段名(处理视图时用于查找英文字段)
    if Assigned(FindComponent('lb_' + tblOrViewName)) then
      FindComponent('lb_' + tblOrViewName).Destroy;

    AListBoxFldEn := TListBox.Create(self);
    AListBoxFldEn.Name := 'lb_' + tblOrViewName;
    AListBoxFldEn.Parent := TPanel(FindComponent('panel_' + tblOrViewName));
    AListBoxFldEn.Height := 300; // ZROQuery.RecordCount * 10;
    AListBoxFldEn.Width := 100;
    AListBoxFldEn.Left := 90;
    AListBoxFldEn.Top := 120;
    AListBoxFldEn.Visible := false;


    ALabel := TLabel.Create(self);
    ALabel.Name := 'lbl_' + tblOrViewName;
    ALabel.Caption := tblNameCn;
    ALabel.Parent := TPanel(FindComponent('panel_' + tblOrViewName));
    ALabel.Align:= alTop;
    //ALabel.Top := 0; //ACheckListBoxFldCn.Top - 17;
    //ALabel.Left := 0; //ACheckListBoxFldCn.Left + 5;
    ALabel.BorderSpacing.Left := 5;
    ALabel.BorderSpacing.Bottom := 5;
    //ALabel.Color := $7FFF0000;

    ACheckListBoxFldCn.Clear;
    //AListBoxTblEn.Clear;
    AListBoxFldEn.Clear;

    Form_main.queryFields.disablecontrols;
    //ACheckListBoxEn.Clear;
    Form_main.queryFields.First;
    while not Form_main.queryFields.EOF do
    begin

      if Form_main.queryFields.FieldByName('TABLE_NAME_EN').AsString = tblOrViewName then
      begin
        sFldCn := Form_main.queryFields.FieldByName('FIELD_NAME_CN').AsString;
        sFldEn := Form_main.queryFields.FieldByName('FIELD_NAME_EN').AsString;

        ACheckListBoxFldCn.Items.Add(sFldCn);

        AListBoxTblEn.items.Add(tblOrViewName);
        AListBoxFldEn.Items.Add(sFldEn);
      end;


      Form_main.queryFields.Next;
    end;

    checkedTableCnt := checkedTableCnt + 1;
  end;
  Form_main.queryFields.EnableControls;



end;  

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

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

相关文章

扑克牌检测Y8S

采用YOLOV8训练&#xff0c;得到PT模型&#xff0c;然后直接转ONNX&#xff0c;使用OPENCV的DNN&#xff0c;不需要其他依赖&#xff0c;支持C/PYTHON 扑克牌检测Y8S

数据结构(王道)——线性表的存储结构之顺序表

线性表和顺序表的关系&#xff1a; 两种实现方式&#xff1a;静态分配、动态分配 总结&#xff1a;

Win7如何合并C盘与D盘?

电脑C盘不够用&#xff0c;需要把D盘的卷删除并合并到C盘中。 整体步骤&#xff1a; 1.右击此电脑-管理-磁盘管理。 2.假如要把D盘容量合并到C盘&#xff0c;右击D盘&#xff0c;选择删除卷&#xff0c;点击“是”。此时D盘数据会被清空&#xff0c;建议先备份数据。 3.删除…

消息队列MQ入门理解

功能特性: 物联网应用 物联网设备通过微消息队列(LMQ)连接云端,双向通信,数据传输;设备数据通过消息队列(MQ)连接计算引擎,分析数据或者源数据实时高效写入到 HiTSDB / HiStore / ODPS 等。 大规模缓存同步 在商业大促活动中,如“双11”大促,各个分会场会有琳琅…

基于输出调节的一致性编队控制

参考博客&#xff1a; https://blog.csdn.net/weixin_44346182/article/details/131747082 在输出调节的基础上&#xff0c;实现了输出一致性&#xff0c;而编队控制就是没有偏移量的状态一致性&#xff0c;恰好本题的C矩阵就是系统的第一阶的状态&#xff08;位置&#xff0…

spring boot security自定义权限检查

前言 鉴权主要分为身份认证和权限控制两部分&#xff1a; 身份认证&#xff1a;检查当前用户是否合法&#xff08;比如已登录&#xff09; 权限控制&#xff1a;检查当前用户是否有访问该资源的权限 本文主要给出一个示例&#xff0c;说明如何自定义权限控制。 因为一个完整的…

增长能力模型:最大限度地发挥增长团队的潜力

作为增长领导者&#xff0c;准确评估你的组织和团队成员是一项非常重要且耗时的工作。但是如果我们计划为未来的增长领导者创造一条职业道路&#xff0c;我们就需要一个流程来为整个团队提供客观的反馈&#xff0c;这就是增长能力模型的用武之地。 增长能力模型提供了一个框架&…

argc,argv

文章目录 argc 是argument count的缩写表示传入main函数中的参数个数&#xff0c;包括这个程序本身 argv 是 argument vector的缩写表示传入main函数中的参数列表&#xff0c;其中argv[0]:程序的名字(.exe) int main(int argc, char** argv) {std::cout << "argc:…

1、环境搭建

下载visual studio,社区版基本够用了,其他版本是收费的。 下载之后安装即可。 安装完成之后要求我们选择要使用的模块。这里我们勾选如图中圈起来的模块,并选择安装。因为我这边已经安装过,所以按钮变成了“关闭” 安装完毕后,重启。 重启完成之后,打开Visual studio。…

配置JDK_IDEA

配置JDK_IDEA 1.安装JDK配置环境变量1.1.安装JDK1.2.配置JDK环境变量 2.IDEA 1.安装JDK配置环境变量 1.1.安装JDK 链接: 下载JDK 1.2.配置JDK环境变量 2.IDEA 链接: IDEA官网 自行激活

分布式运用——ELK 企业级日志分析系统

分布式运用——ELK 企业级日志分析系统 一、ELK 简介1.ELK的主要组件2.可以添加的其它组件3.为什么要使用 ELK4.完整日志系统基本特征5.ELK 的工作原理&#xff1a; 二、ELK集群部署三、ELK Elasticsearch 集群部署&#xff08;在Node1、Node2节点上操作&#xff09;1&#xff…

扩散模型学习笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 前言 &#xff08;注&#xff1a;高斯分布前加乘以项改变其方差&#xff09; 深入浅出扩散模型系列&#xff1a;DDPM架构图解&#xff08;模型架构篇&#x…

【C/C++】类成员进阶——类中静态成员static

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

暑假第十一天打卡

离散&#xff1a; 今天主要学的是推理&#xff0c;感觉推理定理那一大堆公式就是假设箭头前是true&#xff0c;然后将双箭头改为单箭头&#xff0c;然后由此得到对应推理规则&#xff0c;横线上是“因为”&#xff0c;横线下是所以 推理的形式结构: (p → q) ∧ q → p 科研 …

Java编译运行程序(Windows环境)

1.运行条件&#xff1a;我们已经配好环境变量&#xff0c;且在需要编译的文件的目录下打开cmd&#xff1b;还没配好环境变量的同学可以参考&#xff08;链接最上面的推荐文章链接&#xff09;&#xff1a;http://t.csdn.cn/HPWWr 2.首先需编译目标编译的Java文件&#xff0c;…

【Linux】udp服务器实现英汉互译以及远程操作

全是好玩的小功能~ 文章目录 前言一、udp服务器实现网络在线英汉互译二、udp服务器实现网络远程操作总结 前言 在上一篇文章中我们详细的讲解了udp服务器的实现步骤&#xff0c;把用到的每一个接口都进行了详细的讲解&#xff0c;而我们在上一篇只是简单的网络通信功能&#x…

Spring中必备的自定义扩展点,结合工作中的案例,你一定用得到

文章目录 简单介绍Spring流程从问题入手介绍扩展点如何在static方法中从Spring容器中获取bean对象如何在bean实例化前后做一些自定义操作如何移除&#xff0c;修改一些BeanDefination怎样用相同的线程从Spring容器中获取同一个bean对象如何在Spring容器初始化或销毁时做一些自定…

2023年软件测试方向大厂招人和面试要求趋势

当前软件测试的行业现状是什么&#xff1f;2022年后半年经常能够在知乎、小红书、抖音等互联网平台上看到有人在抱怨软件测试行业就业困难。抱怨的一个主要内容是相比2021年测试岗位数下跌&#xff0c;几个月都找不到工作。另外一个测试岗位是有限的&#xff0c;但是应聘者在变…

Python读取excle文件,插入到数据库

一、需求背景 最近项目实践过程中遇到了一个问题&#xff1a;在使用Navicat将数据导入到PostgreSQL数据库时&#xff0c;发现时间格式的字段中的时间数值发生了变化&#xff0c;导致部分数据的时间不正确&#xff0c;故数据手动导入数据库报错。为了解决这个问题&#xff0c;决…

集群基础6——keepalived+lvs+apache

文章目录 一、环境说明二、安装apache三、配置keepalivedlvs3.1 配置lvs规则3.2 配置keepalived规则&#xff08;主&#xff09;3.3 配置keepalived规则&#xff08;备&#xff09; 四、验证 一、环境说明 先对两台后端服务器的httpd服务进行负载均衡&#xff0c;再对负载均衡服…