tquery部件的sql语句实现多表查询.数据库别名问题

时间:2021-07-11 17:36:31
你好,
我是新手,

现在想用tquery部件的sql语句实现多表查询。我看资料说在查询之前要把tquery的databasename属性设置为空 ('').

现在问题是,这个tquery在进行多表查询的时候,datasource要如何设置?我编写代码的时候给这个属性设置成空属性了(nil)。
在使用了下面这样的sql语句时,总是提示说数据表不存在。如果我把tquery的datasource设置为第一个数据表的数据库,提示的错误就是第二个数据表不存在,未知的数据库。

在编写程序之前没有用bde设置过数据库的别名,在程序中使用数据库时都是采用代码进行相应的属性设置的。

希望能给些建议。如果有一个实例的源代码最好不过了。
谢谢!

select name,sum(data) as sumdata from 表2 inner join 表1 on 表2.[group]=表1.[group] group by name



下面这些是我自己写的一部分代码


  //userdata is a Tform object. TBresutl1,TBresutl2,TBresutl3 are three TTable objects.
  //TQuery1 is a Tquery object. DSResult is a TDataSource object.
  //Open three database
  userdata.TBresult1.databasename:= 'c:\data\';
  userdata.TBresult1.Tablename:='Result1.DB';
  userdata.TBresult1.Open;
  userdata.TBresult2.databasename:= 'c:\data\';
  userdata.TBresult2.Tablename:='Result2.DB';
  userdata.TBresult2.Open;
  userdata.TBresult3.databasename:= 'c:\data\';
  userdata.TBresult3.Tablename:='Result3.DB';
  userdata.TBresult3.Open;


  //set the Tquery1.databasename and Tquery1.datasource
  userdata.TQuery1.Close ;
  userdata.TQuery1.DatabaseName :='c:\data\';
    
    
  userdata.DSResult.DataSet :=userdata.TbResult ;
  userdata.TQuery1.DataSource := userdata.DSResult1 ;  

  userdata.TQuery1.DatabaseName :='';
    
  userdata.TQuery1.Sql.Clear ;
  userdata.TQuery1.sql.add('SELECT Result1.field1, Result1.field3, Result2.field1, Result3.field3');
  userdata.TQuery1.sql.add('FROM ":TBResult1:result1.DB" Result1'');
  userdata.TQuery1.sql.add('INNER JOIN ":TBRsult2:Result2.DB" Result2');
  userdata.TQuery1.sql.add('ON (Result1.field1 = Result2.field1)');
  userdata.TQuery1.sql.add('INNER JOIN ":TBRsult3:Result3.DB" Result3');
  userdata.TQuery1.sql.add('ON (Result3.field3 = Result1.field1)');
  userdata.TQuery1.sql.add('WHERE ...................... ');

13 个解决方案

#1


datasource是用于输出结果给可见db控件的(如tdbedit,tdbgrid...)
与多表查询无关,再多的表关联后,出来的也是一个结果集(ado支持返回多个是另一回事)
看看sql是否正确

#2


多表查询与datasource物管,query通过sql去查询多个表,返回的仍然是一个数据集

#3


请教,query通过sql去查询多个表的时候,怎么设置那个数据表的路径问题。
我现在的问题是查询一个表的时候,我可以把query通过datasource与数据表建立连接。
但是多个表的时候,这个连接要怎么设置。 如果指向其中一个表的话,会提示后面的两个表不存在。
谢谢。


引用 2 楼 bdmh 的回复:
多表查询与datasource物管,query通过sql去查询多个表,返回的仍然是一个数据集

#4


你这种情况除非是数据表不在同一个数据库中,这样的话,就要加上数据库的路径,比如对于access,是
select * from A in ['c:\1.mdb'],sqlserver就要致命数据库主机等

#5


哦。明白了。
我用的是paradox的数据库。具体版本得看看。
那这样的话,数据库路径要怎么指定呢?
还有一个问题。我看有人说用database控件指定数据别名也可以,但是没有看明白具体怎么用。


引用 4 楼 bdmh 的回复:
你这种情况除非是数据表不在同一个数据库中,这样的话,就要加上数据库的路径,比如对于access,是
select * from A in ['c:\1.mdb'],sqlserver就要致命数据库主机等

#6





关于Tdatabase指定数据库别名的内容,是看到下面这段话的

As an alternative to using a BDE alias to specify the database in a heterogeneous query, you can use a TDatabase component. Configure the TDatabase as normal to point to the database, set the TDatabase.DatabaseName to an arbitrary but unique value, and then use that value in the SQL statement instead of a BDE alias name.



引用 5 楼 a001s001 的回复:
哦。明白了。
我用的是paradox的数据库。具体版本得看看。
那这样的话,数据库路径要怎么指定呢?
还有一个问题。我看有人说用database控件指定数据别名也可以,但是没有看明白具体怎么用。



引用 4 楼 bdmh 的回复:
你这种情况除非是数据表不在同一个数据库中,这样的话,就要加上数据库的路径,比如对于access,是
select * from A in ['c:……

#7


參考之:

procedure TRES_HR_AUDIT_F.cxButton4Click(Sender: TObject);
begin
  inherited;
  if (Trim(cx_gh.Text)='') and (Trim(cxDateEdit4.Text)='') and (Trim(cxDateEdit5.Text)='') then
  begin
    qry_rpt.Close;
    qry_rpt.SQL.Clear;
    qry_rpt.SQL.Add(' select e.*  from (select * , ');
    qry_rpt.SQL.Add(' CASE BuyerCode WHEN BuyerCode THEN(SELECT COLDSC FROM HR_Zone WHERE COLBCODE=d.BuyerCode ) ELSE NULL END AS COLDSC, ');
    qry_rpt.SQL.Add(' CASE BuyerCode WHEN BuyerCode THEN(SELECT COLPEO FROM HR_Zone WHERE COLBCODE=d.BuyerCode ) ELSE NULL END AS COLPEO ');
    qry_rpt.SQL.Add(' from (select *,CASE xb WHEN xb THEN ( SELECT COLBCODE FROM HR_BuyerCode WHERE COLCODE=xb )ELSE NULL END AS BuyerCode ');
    qry_rpt.SQL.Add(' from (select a.rq,a.bh,a.xm,a.jc,b.BM,b.KB,b.XB,b.ZJQF,b.SF,a.sjsm,a.by2,a.by1 From RES_EMP_RPMENTS a ');
    qry_rpt.SQL.Add(' left join Res_User_Temp b on a.bh=b.Account_Id and a.xm=b.Full_Name) c)d )e order by e.rq desc ');
    qry_rpt.Open;
  end;
  if (Trim(cx_gh.Text)<>'') and (Trim(cxDateEdit4.Text)='') and (Trim(cxDateEdit5.Text)='') then
  begin
    qry_rpt.Close;
    qry_rpt.SQL.Clear;
    qry_rpt.SQL.Add(' select e.*  from (select * , ');
    qry_rpt.SQL.Add(' CASE BuyerCode WHEN BuyerCode THEN(SELECT COLDSC FROM HR_Zone WHERE COLBCODE=d.BuyerCode ) ELSE NULL END AS COLDSC, ');
    qry_rpt.SQL.Add(' CASE BuyerCode WHEN BuyerCode THEN(SELECT COLPEO FROM HR_Zone WHERE COLBCODE=d.BuyerCode ) ELSE NULL END AS COLPEO ');
    qry_rpt.SQL.Add(' from (select *,CASE xb WHEN xb THEN ( SELECT COLBCODE FROM HR_BuyerCode WHERE COLCODE=xb )ELSE NULL END AS BuyerCode ');
    qry_rpt.SQL.Add(' from (select a.rq,a.bh,a.xm,a.jc,b.BM,b.KB,b.XB,b.ZJQF,b.SF,a.sjsm,a.by2,a.by1 From RES_EMP_RPMENTS a ');
    qry_rpt.SQL.Add(' left join Res_User_Temp b on a.bh=b.Account_Id and a.xm=b.Full_Name) c)d )e where e.bh='''+ Trim(cx_gh.Text)+''' order by e.rq desc ');
    qry_rpt.Open;
  end;
  if (Trim(cx_gh.Text)='') and (Trim(cxDateEdit4.Text)<>'') and (Trim(cxDateEdit5.Text)<>'') then
  begin
    if (cxDateEdit5.Date)<(cxDateEdit4.Date) then
    begin
      MessageDlg('操作提示:查詢的結束日期不能小於開始日期!',mtWarning,[mbOK],0);
      Exit;
    end;
    if (cxDateEdit5.Date)>=(cxDateEdit4.Date) then
    begin
      qry_rpt.Close;
      qry_rpt.SQL.Clear;
      qry_rpt.SQL.Add(' select e.*  from (select * , ');
      qry_rpt.SQL.Add(' CASE BuyerCode WHEN BuyerCode THEN(SELECT COLDSC FROM HR_Zone WHERE COLBCODE=d.BuyerCode ) ELSE NULL END AS COLDSC, ');
      qry_rpt.SQL.Add(' CASE BuyerCode WHEN BuyerCode THEN(SELECT COLPEO FROM HR_Zone WHERE COLBCODE=d.BuyerCode ) ELSE NULL END AS COLPEO ');
      qry_rpt.SQL.Add(' from (select *,CASE xb WHEN xb THEN ( SELECT COLBCODE FROM HR_BuyerCode WHERE COLCODE=xb )ELSE NULL END AS BuyerCode ');
      qry_rpt.SQL.Add(' from (select a.rq,a.bh,a.xm,a.jc,b.BM,b.KB,b.XB,b.ZJQF,b.SF,a.sjsm,a.by2,a.by1 From RES_EMP_RPMENTS a ');
      qry_rpt.SQL.Add(' left join Res_User_Temp b on a.bh=b.Account_Id and a.xm=b.Full_Name) c)d )e where e.rq between '''+ FormatDateTime('yyyy/mm/dd',cxDateEdit4.Date)+''' and '''+ FormatDateTime('yyyy/mm/dd',cxDateEdit5.Date)+''' order by e.rq desc ');
      qry_rpt.Open;
    end;    
  end;
  if (Trim(cx_gh.Text)<>'') and (Trim(cxDateEdit4.Text)<>'') and (Trim(cxDateEdit5.Text)<>'') then
  begin
    if (cxDateEdit5.Date)<(cxDateEdit4.Date) then
    begin
      MessageDlg('操作提示:查詢的結束日期不能小於開始日期!',mtWarning,[mbOK],0);
      Exit;
    end;
    if (cxDateEdit5.Date)>=(cxDateEdit4.Date) then
    begin
      qry_rpt.Close;
      qry_rpt.SQL.Clear;
      qry_rpt.SQL.Add(' select e.*  from (select * , ');
      qry_rpt.SQL.Add(' CASE BuyerCode WHEN BuyerCode THEN(SELECT COLDSC FROM HR_Zone WHERE COLBCODE=d.BuyerCode ) ELSE NULL END AS COLDSC, ');
      qry_rpt.SQL.Add(' CASE BuyerCode WHEN BuyerCode THEN(SELECT COLPEO FROM HR_Zone WHERE COLBCODE=d.BuyerCode ) ELSE NULL END AS COLPEO ');
      qry_rpt.SQL.Add(' from (select *,CASE xb WHEN xb THEN ( SELECT COLBCODE FROM HR_BuyerCode WHERE COLCODE=xb )ELSE NULL END AS BuyerCode ');
      qry_rpt.SQL.Add(' from (select a.rq,a.bh,a.xm,a.jc,b.BM,b.KB,b.XB,b.ZJQF,b.SF,a.sjsm,a.by2,a.by1 From RES_EMP_RPMENTS a ');
      qry_rpt.SQL.Add(' left join Res_User_Temp b on a.bh=b.Account_Id and a.xm=b.Full_Name) c)d )e where e.bh='''+ Trim(cx_gh.Text)+''' and e.rq between '''+ FormatDateTime('yyyy/mm/dd',cxDateEdit4.Date)+''' and '''+ FormatDateTime('yyyy/mm/dd',cxDateEdit5.Date)+''' order by e.rq desc ');
      qry_rpt.Open;
    end;  
  end;
end;

#8


你好,非常感谢你的代码。我已经能看明白了。
有个问题想问一下。你的数据库是事先定义好的吗?还是在程序中动态指定的?

HR_Zone  应该是一个数据表吧。  delphi的程序运行的时候好像是默认在当前路径下查找数据表。如果我想指定一个其他的路径,比如‘D:\data\table1\table1.db’。 那么在代码里面应该如何处理?

谢谢! 


引用 7 楼 kye_jufei 的回复:
參考之:


Delphi(Pascal) code
procedure TRES_HR_AUDIT_F.cxButton4Click(Sender: TObject);
begin
  inherited;
  if (Trim(cx_gh.Text)='') and (Trim(cxDateEdit4.Text)='') and (Trim(cxDateEdit5.Text)='……

#9


參考一下:(連接access的...)

procedure TMain_Frm.FormCreate(Sender: TObject);
begin
  try
    //AnimateWindow(Handle,1000,AW_CENTER);
    ADOConnection1.ConnectionString:=
    'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(Application.ExeName)+'KYE.mdb;Persist Security Info=False';
    ADOConnection1.LoginPrompt:=False;
    ADOConnection1.Connected:=True;
    //label1.Caption:=FormatDateTime('ddd',Now);
    except
      Application.Terminate;//程序中止退出
      Application.MessageBox('數據庫連接文件出錯!請與MIS聯系!!!', '錯誤',
        MB_OK + MB_ICONSTOP);
      Application.Terminate;//數據庫連接文件出錯,程序中止退出
      end;
end;

#10


非常感谢。这个我也已经了解了一些了。
由于刚刚开始用delphi,对一些控件的使用不是很熟悉。尤其这个tquery进行多表查询的问题。
对于单表的问题,我已经基本可以处理了,没有什么问题。

我是在用别人的程序,当初考到自己电脑上的时候,比较仓促,也找不到原来写代码的人了,只能自己一点点的看。
当初写代码的人可能是在编程之初就把数据库设置好了。在代码里面没有动态设置数据库连接的代码。

现在就遇到这个利用tquery多个数据表进行查询的操作。数据库是采用delphi自带的paradox数据库,应该是最简单的数据库了。

也希望其他有过这个tquery多表查询操作的朋友帮忙看看。

多个数据表的问题要如何设置路径或者如何设置数据表的别名。

谢谢


引用 9 楼 kye_jufei 的回复:
參考一下:(連接access的...)


Delphi(Pascal) code
procedure TMain_Frm.FormCreate(Sender: TObject);
begin
  try
    //AnimateWindow(Handle,1000,AW_CENTER);
    ADOConnection1.ConnectionString:=
    'P……

#11


在下面这篇论文中看到的,解决办法应该如论文所说的。
那如果用代码实现在BDE数据引擎中动态设置不同数据的别名要如何处理呢?
谢谢!





刘卫. SQL在Delphi数据库查询中的应用[J]. 计算机与现代化. 2005,(11):76-78. 

4.2跨数据库多表查询

进行多库(包括同构数据库和异构数据库)联查时,首先要在BDE数据库引擎中
分别为不同的数据库设置别名。TQuery控件的DataBaseName属性必须置空。

代码格式如下(以两个数据库为例):

   Select 字段列表 from”:库1别名:表1名”,”:库2别名:表2名”where条件;
   
或 
 
   Select 字段列表 from”:库1别名:表1名”join”:库2别名:表2名”on条件;

例1:

select student.*,score.课程号,score.成绩 
from":XSmdb:student" join ":xskcmdb:score" on student.学号=score.学号;  
//(xsmdb xskcmdb都为Access数据库别名)

例2:

select student.*,score.课程号,score.成绩 
from":xsvfp:student" join ":xskcmdb:score" on student.学号=score.学号;  
//(xsvfp为FoxPro数据库别名,xskcmdb为Access数据库别名)



对于Paradox和dBASE进行异库查询时,还可以使用如下形式:

Select * from ”表1.db" a, ”表2.db where 条件;

例3:

Select * from student.db" a, ”score.db where a.学号= b.学号;

#12


问题最终解决了。

第一设置好tdatabase组件的databasename, params('path= X:\'),以及driver,就可以了。如果再设置aliasname的话会出错。

第二讲ttable组件的databasename与tdatabase的databasename设置相同的内容,设置tablename,为相应的*.db文件。
之后直接设置ttable的open为true。就可以实现paradox数据库的多表查询了。

利用tquery的sql语句,

Select 字段列表 from”:databasename1:tablename1”,":databasename1:tablename1” where条件;

#13


解决后能把自己的经验教训写出来,很好。。。。。。。

好久没用这些桌面型数据库了。。。。。。。

#1


datasource是用于输出结果给可见db控件的(如tdbedit,tdbgrid...)
与多表查询无关,再多的表关联后,出来的也是一个结果集(ado支持返回多个是另一回事)
看看sql是否正确

#2


多表查询与datasource物管,query通过sql去查询多个表,返回的仍然是一个数据集

#3


请教,query通过sql去查询多个表的时候,怎么设置那个数据表的路径问题。
我现在的问题是查询一个表的时候,我可以把query通过datasource与数据表建立连接。
但是多个表的时候,这个连接要怎么设置。 如果指向其中一个表的话,会提示后面的两个表不存在。
谢谢。


引用 2 楼 bdmh 的回复:
多表查询与datasource物管,query通过sql去查询多个表,返回的仍然是一个数据集

#4


你这种情况除非是数据表不在同一个数据库中,这样的话,就要加上数据库的路径,比如对于access,是
select * from A in ['c:\1.mdb'],sqlserver就要致命数据库主机等

#5


哦。明白了。
我用的是paradox的数据库。具体版本得看看。
那这样的话,数据库路径要怎么指定呢?
还有一个问题。我看有人说用database控件指定数据别名也可以,但是没有看明白具体怎么用。


引用 4 楼 bdmh 的回复:
你这种情况除非是数据表不在同一个数据库中,这样的话,就要加上数据库的路径,比如对于access,是
select * from A in ['c:\1.mdb'],sqlserver就要致命数据库主机等

#6





关于Tdatabase指定数据库别名的内容,是看到下面这段话的

As an alternative to using a BDE alias to specify the database in a heterogeneous query, you can use a TDatabase component. Configure the TDatabase as normal to point to the database, set the TDatabase.DatabaseName to an arbitrary but unique value, and then use that value in the SQL statement instead of a BDE alias name.



引用 5 楼 a001s001 的回复:
哦。明白了。
我用的是paradox的数据库。具体版本得看看。
那这样的话,数据库路径要怎么指定呢?
还有一个问题。我看有人说用database控件指定数据别名也可以,但是没有看明白具体怎么用。



引用 4 楼 bdmh 的回复:
你这种情况除非是数据表不在同一个数据库中,这样的话,就要加上数据库的路径,比如对于access,是
select * from A in ['c:……

#7


參考之:

procedure TRES_HR_AUDIT_F.cxButton4Click(Sender: TObject);
begin
  inherited;
  if (Trim(cx_gh.Text)='') and (Trim(cxDateEdit4.Text)='') and (Trim(cxDateEdit5.Text)='') then
  begin
    qry_rpt.Close;
    qry_rpt.SQL.Clear;
    qry_rpt.SQL.Add(' select e.*  from (select * , ');
    qry_rpt.SQL.Add(' CASE BuyerCode WHEN BuyerCode THEN(SELECT COLDSC FROM HR_Zone WHERE COLBCODE=d.BuyerCode ) ELSE NULL END AS COLDSC, ');
    qry_rpt.SQL.Add(' CASE BuyerCode WHEN BuyerCode THEN(SELECT COLPEO FROM HR_Zone WHERE COLBCODE=d.BuyerCode ) ELSE NULL END AS COLPEO ');
    qry_rpt.SQL.Add(' from (select *,CASE xb WHEN xb THEN ( SELECT COLBCODE FROM HR_BuyerCode WHERE COLCODE=xb )ELSE NULL END AS BuyerCode ');
    qry_rpt.SQL.Add(' from (select a.rq,a.bh,a.xm,a.jc,b.BM,b.KB,b.XB,b.ZJQF,b.SF,a.sjsm,a.by2,a.by1 From RES_EMP_RPMENTS a ');
    qry_rpt.SQL.Add(' left join Res_User_Temp b on a.bh=b.Account_Id and a.xm=b.Full_Name) c)d )e order by e.rq desc ');
    qry_rpt.Open;
  end;
  if (Trim(cx_gh.Text)<>'') and (Trim(cxDateEdit4.Text)='') and (Trim(cxDateEdit5.Text)='') then
  begin
    qry_rpt.Close;
    qry_rpt.SQL.Clear;
    qry_rpt.SQL.Add(' select e.*  from (select * , ');
    qry_rpt.SQL.Add(' CASE BuyerCode WHEN BuyerCode THEN(SELECT COLDSC FROM HR_Zone WHERE COLBCODE=d.BuyerCode ) ELSE NULL END AS COLDSC, ');
    qry_rpt.SQL.Add(' CASE BuyerCode WHEN BuyerCode THEN(SELECT COLPEO FROM HR_Zone WHERE COLBCODE=d.BuyerCode ) ELSE NULL END AS COLPEO ');
    qry_rpt.SQL.Add(' from (select *,CASE xb WHEN xb THEN ( SELECT COLBCODE FROM HR_BuyerCode WHERE COLCODE=xb )ELSE NULL END AS BuyerCode ');
    qry_rpt.SQL.Add(' from (select a.rq,a.bh,a.xm,a.jc,b.BM,b.KB,b.XB,b.ZJQF,b.SF,a.sjsm,a.by2,a.by1 From RES_EMP_RPMENTS a ');
    qry_rpt.SQL.Add(' left join Res_User_Temp b on a.bh=b.Account_Id and a.xm=b.Full_Name) c)d )e where e.bh='''+ Trim(cx_gh.Text)+''' order by e.rq desc ');
    qry_rpt.Open;
  end;
  if (Trim(cx_gh.Text)='') and (Trim(cxDateEdit4.Text)<>'') and (Trim(cxDateEdit5.Text)<>'') then
  begin
    if (cxDateEdit5.Date)<(cxDateEdit4.Date) then
    begin
      MessageDlg('操作提示:查詢的結束日期不能小於開始日期!',mtWarning,[mbOK],0);
      Exit;
    end;
    if (cxDateEdit5.Date)>=(cxDateEdit4.Date) then
    begin
      qry_rpt.Close;
      qry_rpt.SQL.Clear;
      qry_rpt.SQL.Add(' select e.*  from (select * , ');
      qry_rpt.SQL.Add(' CASE BuyerCode WHEN BuyerCode THEN(SELECT COLDSC FROM HR_Zone WHERE COLBCODE=d.BuyerCode ) ELSE NULL END AS COLDSC, ');
      qry_rpt.SQL.Add(' CASE BuyerCode WHEN BuyerCode THEN(SELECT COLPEO FROM HR_Zone WHERE COLBCODE=d.BuyerCode ) ELSE NULL END AS COLPEO ');
      qry_rpt.SQL.Add(' from (select *,CASE xb WHEN xb THEN ( SELECT COLBCODE FROM HR_BuyerCode WHERE COLCODE=xb )ELSE NULL END AS BuyerCode ');
      qry_rpt.SQL.Add(' from (select a.rq,a.bh,a.xm,a.jc,b.BM,b.KB,b.XB,b.ZJQF,b.SF,a.sjsm,a.by2,a.by1 From RES_EMP_RPMENTS a ');
      qry_rpt.SQL.Add(' left join Res_User_Temp b on a.bh=b.Account_Id and a.xm=b.Full_Name) c)d )e where e.rq between '''+ FormatDateTime('yyyy/mm/dd',cxDateEdit4.Date)+''' and '''+ FormatDateTime('yyyy/mm/dd',cxDateEdit5.Date)+''' order by e.rq desc ');
      qry_rpt.Open;
    end;    
  end;
  if (Trim(cx_gh.Text)<>'') and (Trim(cxDateEdit4.Text)<>'') and (Trim(cxDateEdit5.Text)<>'') then
  begin
    if (cxDateEdit5.Date)<(cxDateEdit4.Date) then
    begin
      MessageDlg('操作提示:查詢的結束日期不能小於開始日期!',mtWarning,[mbOK],0);
      Exit;
    end;
    if (cxDateEdit5.Date)>=(cxDateEdit4.Date) then
    begin
      qry_rpt.Close;
      qry_rpt.SQL.Clear;
      qry_rpt.SQL.Add(' select e.*  from (select * , ');
      qry_rpt.SQL.Add(' CASE BuyerCode WHEN BuyerCode THEN(SELECT COLDSC FROM HR_Zone WHERE COLBCODE=d.BuyerCode ) ELSE NULL END AS COLDSC, ');
      qry_rpt.SQL.Add(' CASE BuyerCode WHEN BuyerCode THEN(SELECT COLPEO FROM HR_Zone WHERE COLBCODE=d.BuyerCode ) ELSE NULL END AS COLPEO ');
      qry_rpt.SQL.Add(' from (select *,CASE xb WHEN xb THEN ( SELECT COLBCODE FROM HR_BuyerCode WHERE COLCODE=xb )ELSE NULL END AS BuyerCode ');
      qry_rpt.SQL.Add(' from (select a.rq,a.bh,a.xm,a.jc,b.BM,b.KB,b.XB,b.ZJQF,b.SF,a.sjsm,a.by2,a.by1 From RES_EMP_RPMENTS a ');
      qry_rpt.SQL.Add(' left join Res_User_Temp b on a.bh=b.Account_Id and a.xm=b.Full_Name) c)d )e where e.bh='''+ Trim(cx_gh.Text)+''' and e.rq between '''+ FormatDateTime('yyyy/mm/dd',cxDateEdit4.Date)+''' and '''+ FormatDateTime('yyyy/mm/dd',cxDateEdit5.Date)+''' order by e.rq desc ');
      qry_rpt.Open;
    end;  
  end;
end;

#8


你好,非常感谢你的代码。我已经能看明白了。
有个问题想问一下。你的数据库是事先定义好的吗?还是在程序中动态指定的?

HR_Zone  应该是一个数据表吧。  delphi的程序运行的时候好像是默认在当前路径下查找数据表。如果我想指定一个其他的路径,比如‘D:\data\table1\table1.db’。 那么在代码里面应该如何处理?

谢谢! 


引用 7 楼 kye_jufei 的回复:
參考之:


Delphi(Pascal) code
procedure TRES_HR_AUDIT_F.cxButton4Click(Sender: TObject);
begin
  inherited;
  if (Trim(cx_gh.Text)='') and (Trim(cxDateEdit4.Text)='') and (Trim(cxDateEdit5.Text)='……

#9


參考一下:(連接access的...)

procedure TMain_Frm.FormCreate(Sender: TObject);
begin
  try
    //AnimateWindow(Handle,1000,AW_CENTER);
    ADOConnection1.ConnectionString:=
    'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(Application.ExeName)+'KYE.mdb;Persist Security Info=False';
    ADOConnection1.LoginPrompt:=False;
    ADOConnection1.Connected:=True;
    //label1.Caption:=FormatDateTime('ddd',Now);
    except
      Application.Terminate;//程序中止退出
      Application.MessageBox('數據庫連接文件出錯!請與MIS聯系!!!', '錯誤',
        MB_OK + MB_ICONSTOP);
      Application.Terminate;//數據庫連接文件出錯,程序中止退出
      end;
end;

#10


非常感谢。这个我也已经了解了一些了。
由于刚刚开始用delphi,对一些控件的使用不是很熟悉。尤其这个tquery进行多表查询的问题。
对于单表的问题,我已经基本可以处理了,没有什么问题。

我是在用别人的程序,当初考到自己电脑上的时候,比较仓促,也找不到原来写代码的人了,只能自己一点点的看。
当初写代码的人可能是在编程之初就把数据库设置好了。在代码里面没有动态设置数据库连接的代码。

现在就遇到这个利用tquery多个数据表进行查询的操作。数据库是采用delphi自带的paradox数据库,应该是最简单的数据库了。

也希望其他有过这个tquery多表查询操作的朋友帮忙看看。

多个数据表的问题要如何设置路径或者如何设置数据表的别名。

谢谢


引用 9 楼 kye_jufei 的回复:
參考一下:(連接access的...)


Delphi(Pascal) code
procedure TMain_Frm.FormCreate(Sender: TObject);
begin
  try
    //AnimateWindow(Handle,1000,AW_CENTER);
    ADOConnection1.ConnectionString:=
    'P……

#11


在下面这篇论文中看到的,解决办法应该如论文所说的。
那如果用代码实现在BDE数据引擎中动态设置不同数据的别名要如何处理呢?
谢谢!





刘卫. SQL在Delphi数据库查询中的应用[J]. 计算机与现代化. 2005,(11):76-78. 

4.2跨数据库多表查询

进行多库(包括同构数据库和异构数据库)联查时,首先要在BDE数据库引擎中
分别为不同的数据库设置别名。TQuery控件的DataBaseName属性必须置空。

代码格式如下(以两个数据库为例):

   Select 字段列表 from”:库1别名:表1名”,”:库2别名:表2名”where条件;
   
或 
 
   Select 字段列表 from”:库1别名:表1名”join”:库2别名:表2名”on条件;

例1:

select student.*,score.课程号,score.成绩 
from":XSmdb:student" join ":xskcmdb:score" on student.学号=score.学号;  
//(xsmdb xskcmdb都为Access数据库别名)

例2:

select student.*,score.课程号,score.成绩 
from":xsvfp:student" join ":xskcmdb:score" on student.学号=score.学号;  
//(xsvfp为FoxPro数据库别名,xskcmdb为Access数据库别名)



对于Paradox和dBASE进行异库查询时,还可以使用如下形式:

Select * from ”表1.db" a, ”表2.db where 条件;

例3:

Select * from student.db" a, ”score.db where a.学号= b.学号;

#12


问题最终解决了。

第一设置好tdatabase组件的databasename, params('path= X:\'),以及driver,就可以了。如果再设置aliasname的话会出错。

第二讲ttable组件的databasename与tdatabase的databasename设置相同的内容,设置tablename,为相应的*.db文件。
之后直接设置ttable的open为true。就可以实现paradox数据库的多表查询了。

利用tquery的sql语句,

Select 字段列表 from”:databasename1:tablename1”,":databasename1:tablename1” where条件;

#13


解决后能把自己的经验教训写出来,很好。。。。。。。

好久没用这些桌面型数据库了。。。。。。。