cxGrid中使用cxGridDBTableView表可以使用多层,如果第一层与第二层只需一列对应,可以设置keyfieldnames,detaikeyfieldNames与masterkeyfieldnames我想问一下,如果第二层需要有两个列同时才能与第一层对应,有没有办法?

解决方案 »

  1.   

    没试过是否可行。你可以试一下:
    第一层和第二层的KeyFieldNames := 'InvCode,InvNo'; //示例:发票代码和发票号码
    DetailKeyFieldNames := 'InvCode,InvNo';
    MasterKeyFieldNames := 'InvCode,InvNo';
    KeyFieldNames可以不止一个字段吧
      

  2.   

    二楼的方法我是想过的,只不过这要改动数据库或者在查询中用函数,会减慢速度的,不到不得已不想用,三楼的方法试了一下,好像不行,我是直接填写KeyFieldNames的。不知道四楼说的可以是什么意思?是三楼的方法可以还是你会?如果你会的话,就写出来给我,可以用的话我单独给100分。
      

  3.   

    我的方法不行吗.我试了一下
    create table t1 (a varchar2(10),b varchar2(10),c varchar2(30));  
    insert into t1 values ('a','b','主题1');
    insert into t1 values ('a','3','主题2');
    insert into t1 values ('b','81','主题3');
    create table t2(a varchar2(10),b varchar2(10),items varchar2(10),quantity int)insert into t2 values ('a','b','书',10);
    insert into t2 values ('a','b','教材书',15);
    insert into t2 values ('a','3','笔',20);
    insert into t2 values ('b','81','本子',30);select a,b,a||b keyc from t1select a,b,items,quantity,a||b keyc from t2我用的数据库为oracle,用sqlserver应该也一样,我没有试
    步骤1.建一个form1,放入两个oraquery,两个OraDataSource1, 一个orasession
    设置好数据库连接
    步骤2.在oraquery1加入sql :select a,b,a||b keyc from t1
            在oraquery2加入sql :select a,b,items,quantity,a||b keyc from t2
    步骤3.设置cxGrid的属性
            第二层的masterKeyField为 KEYC,detailKeyField也为 KEYC 
    目前我在这里试是没有问题的.
    2楼的方法,我也试了根本不行,masterkeyfield不允许设置两个列a,b这样就会报错
      

  4.   

    To link two tables by several fields, you need to specify them in the DetailKeyFieldNames and MasterKeyFieldNames strings, separating them by a semicolon.
    上面这句话是ExpressDataController帮助中的原话。我想我在上面的贴子中写错了,刚刚去查了一下,应该是分号分隔。
    楼主可以试试,不是以逗号分隔,而是分号分隔,象这样:'InvCode;InvNo'
      

  5.   

    回阿日:我用的是mysql,是可以连接字符,但是要用一个concat的函数,使用函数会降低速度的,而且我本来的查询语句很长,已经有点慢了,所以不到不得已不想用这个方法。而且
            的关键字又个是int类型,一个是varchar的,int那个是自增的,所以不可能改成其他的类型,这样两个不同类型的字段连接有点麻烦。
    回阿生:用分号的确不报错,但是第二层完全连接不到第一层了,不知道什么原因,两个字段我都排序了,就是第二层完全没有数据显示。
      

  6.   

    我的测试结果是可以。测试例子:http://www.stvoip.com/UploadFiles/test.rar
    例子数据库中只有两个表,其中的数据是我另一个应用程序的测试数据,这两个表是典型的发票开票记录主表和明细表。其他表与本示例无关,被我Drop了。示例中没有添加任何代码,只是设置了属性。包括:
    ADOConnection一个,ADOQuery两个,DataSource两个。这些不用多说,我只是将两个ADOQuery都Active了。压缩包中有编译好的.exe文件。在cxGrid中,两个View分别名为tvMaster和tvDetail,两个View都取消了组框和过滤框,这个是额外的设置,在此仅仅说明一下,可以不用管它。另外,在tvMaster中,设置了KeyFieldNames为InvCode;InvNo。在tvDetail中,将DetailKeyFieldNames和MasterKeyFieldNames都设置成了InvCode;InvNo,而KeyFieldNames属性为InvCode;InvNo;RowID,因为在明细表中,主键为InvCode+InvNo+RowID,主表与明细表通过InvCode+InvNo来关联,主表的某条记录可能会对应明细表中的多条记录,每条记录以RowID来区分。
      

  7.   

    o,我两个表的字段名不一样的,我的第一层是tid和channelId,第二层是tid和chlId,好像要连字段都相同才连的起来。
    但是一个字段连接的时候明明可以的,第一层是Id,第二层是parentId。
    我都搞不清那三个属性怎么对应?可不可以讲讲?就是KeyFieldNames,DetailKeyFieldNames,MasterKeyFieldNames这三个,具体代表什么?我可用分只剩90了,明天登录才加分结这个贴给你。
      

  8.   

    1、你可以这样:
    Master查询SQL:Select tid, channelId as chlId, ... from table where ...这样就可以与第二层的ID相同了,不用更改数据库字段名。
    只有一个字段对应时,不同的确是可以的。但当有两个字段要对应时,我没试过不同是否可以,我一般是相同字段名称。实在不行你就用 as 别名的方法保持相同吧。2、三个属性的意思很好理解:
    KeyFieldNames是指当前层的关键字段名,一般就是当前层所查询的表的主键
    MasterKeyFieldNames和DetailKeyFieldNames在第一层不设置,在第二层时设置。分别针对第一层的关键字段和第二层的关键字段。在第二层设置这两个属性后,就与第一层关联起来了。