⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bcjq074.txt

📁 c++ builder 的一些txt文档
💻 TXT
📖 第 1 页 / 共 2 页
字号:
      Link Designer"对话框进行设置工作,选择从表和主表的相应关联字段添加到"Joined  
      Fields"(关联字段)中即可。本例中以主表(Customer.db客户信息)及从表(Orders.db定单信息)的CustNo(客户号)字段为关联字段,故设置TableDetail的MasterSource属性为DataSourceMaster,指向主表;MasterFields属性为CustNo关联字段。 
      
  如果TableMaster和TableDetail的Active属性为false,则需双击窗体Form1空白处,添加以下两句黑体字代码到TForm1::FormCreate()事件句柄中去: 
      
TableMaster->Active = true;TableDetail->Active = true; 
      
  运行程序,即可在DBGridMaster、DBGridDetail中浏览到Master/Detail关系主从表的相关数据记录。 
      
  二、TQuery控件实现Master/Detail关系报表 
      
  TQuery控件和TTable控件之间的主要差别在于TQuery控件通过SQL属性所赋的SQL指令语句来动态访问数据库,TTable控件则是静态和数据表相关联。TQuery控件可以同时对多个数据库表进行关联访问,TTable控件则只能关联查询单一的数据库表。和TTable控件相比,TQuery控件因为SQL语言的灵活性和相对复杂性,更适合应用在多层、大型、网络数据库系统中。 
      
  2.1、 
      
TTable控件关联主表、TQuery控件关联从表实现Master/Detail关系报表 
      
  窗体Form1上删去TableDetail控件,放置TQuery类型控件QueryDetail,修改DataSourceDetail的DataSet属性为QueryDetail,其余控件属性不变。TQuery控件可以对访问范围设定限制条件,依此即可实现M/D关系的功能。设定QueryDetail的DatabaseName为BCDEMOS,SQL属性为:"Select  
      OrderNo,CustNo,SaleDate,EmpNo From Orders Where  
      Orders.CustNo=:CustNo"。 
      
  即可取出从表中所有CustNo字段与主表CustNo字段相同的记录集并且只显示四个限定的字段信息实现Master/Detail关系,另一关键在于从表关联控件QueryDetail的DataSource属性和Params属性:前者指向了一个TDataSource控件,该控件DataSet属性应该指明SQL指令参数的数据来源;后者则设定SQL指令中的参数,需要双击打开"QueryDetail  
      Parameters"对话框进行设置工作,选择相应的SQL指令中参数设置正确即可。本例中以主表(Customer.db客户信息)的CustNo(客户号)字段作为SQL指令的参数,故设置QueryDetail的DataSource属性为DataSourceMaster,指向主表;Params属性为CustNo关联字段作参数。 
      
  注:SQL指令中参数名前一定要加冒号作为前缀,以加以区分。 
      
  添加以下两句黑体字代码到TForm1::FormCreate()事件句柄中去: 
      
  TableMaster->Active = true;QueryDetail->Active = true; 
      
  运行程序,即可在DBGridMaster、DBGridDetail中浏览到Master/Detail关系主从表的相关数据记录,注意从表的栅格数据记录只显示有限定的四个字段信息。 
      
  若QueryDetail的SQL属性为:"Select*From Orders Where  
      Orders.CustNo = :CustNo",不限定从从表取出的字段名。 
      
  2.2、TQuery控件关联主、从表实现Master/Detail关系报表 
      
  Master/Detail关系更灵活的实现方法是主表及从表都与TQuery控件关联,分别起名为QueryMaster和QueryDetail。设置QueryMaster和QueryDetail的DatabaseName都为BCDEMOS;QueryMaster的SQL属性为:"Select*From  
      Customer ",DataSource和Params属性均为空,如此即可关联上主数据表,得到和用TableMaster控件一样的效果;QueryDetail的其余属性和2.1中相同。相应的,分别改DataSourceMaster和DataSourceDetail的DataSet属性指向QueryMaster和QueryDetail。 
      
  注:由于TQuery控件是以动态方式访问数据表的,故在只用TQuery控件关联主从表时,设计时从表关联控件QueryDetail的Active属性必须设置为false,否则运行时BDE会报告出错信息。 
      
  添加以下两句黑体字代码到TForm1::FormCreate()事件句柄中去: 
      
  QueryMaster->Active = true;QueryDetail->Active = true; 
      
  运行程序,即可在DBGridMaster、DBGridDetail中浏览到与2.1相同效果的Master/Detail关系主从表相关记录信息。 
      
  三、单表情况下TQuery控件实现Master/Detail关系汇总、分类报表 
      
  在流水作业系统或实时监控系统中,常常要求实时存储当前记录信息到单一的数据表文件中去,而事后再对其进行关系汇总、分类、入库等工作。TTable控件因为只能对单表进行操作,所以在这种单表情况下实现Master/Detail关系汇总、分类等功能的要求只能用TQuery控件实现。仍以Orders.db(定单信息表)举例说明如何灵活利用TQuery控件的SQL指令属性。 
      
  在窗体Form1上放置TQuery 控件QueryMaster和QueryDetail,其它的控件属性不变。设置QueryMaster和QueryDetail的DatabaseName都为BCDEMOS;QueryMaster的SQL属性为:  "SELECT  
      DISTINCT CustNo, SUM( ItemsTotal )ItemsTotalAll,SUM( Freight ) FreightAll,  
      SUM( AmountPaid ) AmoutPaidAll FROM Orders GROUP BY CustNo ORDER BY 
      
CustNo",DataSource和Params属性均为空,产生M/D关系中的主表;QueryDetail的的SQL属性设为:"Select  
      OrderNo,CustNo,PaymentMethod,ItemsTotal,TaxRate,Freight,AmountPaid From  
      Orders Where Orders.CustNo = :CustNo 
      
",DataSource属性为DataSourceMaster,指向主表;Params属性以CustNo关联字段作参数。相应的,DataSourceMaster和DataSourceDetail的DataSet属性分别指向QueryMaster和QueryDetail。 
      
  示例程序的SQL指令实现了以下功能:以表中每个客户的客户号、定货总值、货运总费、付款总数为记录的字段,从定单信息表中提取出相应信息汇总作为主表;以表中每个定单记录的定单号、客户号、付款方式、提货价值、税率、运费、付款数为记录的字段,从定单信息表中提取相应的信息作为从表;主从表的关联字段CustNo(客户号)通过SQL指令的参数来传递。最终的结果即实现了在DBGridMaster控件上显示出每个客户总的定货信息,在DBGridDetail控件上显示出相应客户的限定字段的详细定货信息记录的功能。 
      
  添加以下两句黑体字代码到TForm1::FormCreate()事件句柄中去: 
      
  QueryMaster->Active= true;QueryDetail->Active =true; 
      
  运行程序,即可在DBGridMaster、DBGridDetail中浏览到Master/Detail关系主从表相关记录信息。 
      
  综上所述,对于一般的Master/Detail关系应用,用TTable控件就足以应付了,而要实现更进一步的功能,如多层M/D关系、远程网络数据库操作、多表互关联类型、单表M/D关系的数据库编程,则需要用到TQuery控件,利用SQL指令的灵活性对数据库进行操作。复杂功能的Master/Detail关系数据库编程可在本文的基础上参考相应的书籍以及BCB的联机帮助实现。 
      
本文程序在C++Builder 3.0/ PWin95,C++Builder 4.0/ PWin98下调试通过。 
      
  (西安SkyRabbit) 
                                
                              
                            
                                
                        
                              
                                
                              
                  if (ad==1) {document.write(''+'');}              
                  if (ad==2) {document.write(''+'');}              
                  if (ad==3) {document.write(''+'');}              
                                                
                              
                            
                          
                        
                   
                    
                      
                        
                      
                      
                          
                      
                    
                       
                     
                   
                 
               
               
                 
                   
                     
                       
            C++ Builder开发者®            
              2000年06月01日 站长:唐朝            
                      
                    
                  
                
                
                  
                
              
              
            
            
            
            

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -