dbgrid显示如下数据:
   单据号  供应商代码  供应商名称  制单人    物料代码  物料名称  数量  单价 
  PIn001  01.01       信达电子    王八      01.01     AAA       10    10    
  PIn001  01.01       信达电子    王八      01.02     bbb       10    10    
  PIn001  01.01       信达电子    王八      01.03     ccc       20    10 
  PIn001  01.01       信达电子    王八      01.04     ddd       30    20    
  PIn002  01.02       下滑电子    王伍      02.01     KKK       10    10   
  PIn002  01.02       下滑电子    王伍      02.02     XXX       10    20   
  PIn002  01.02       下滑电子    王伍      02.03     YYY       15    15   
  PIn003  01.03       泉州电子    小猫      03.01     abc       10    10   
  PIn003  01.03       泉州电子    小猫      03.02     fds       10    10  
  PIn005  01.03       哈哈电子    小猫      03.01     abc       10    10  
  PIn004  01.03       哈哈电子    小明      04.01     dds       10    10   
  PIn004  01.03       哈哈电子    小明      04.02     ddf       10    10  
前面相同的记录是主表的数据,后面的物料开始是从表的,我通过Left outer关联起来
但是我想在dbgrid得到的效果是:   单据号  供应商代码  供应商名称  制单人  物料代码  物料名称  数量  单价  
  PIn001  01.01       信达电子    王八      01.01     AAA       10    10   
                                            01.02     bbb       10    10
                                            01.03     ccc       20    10   
                                            01.04     ddd       30    20   
  PIn002  01.02       下滑电子    王伍      02.01     KKK       10    10   
                                            02.02     XXX       10    20  
                                            02.03     YYY       15    15  
  PIn003  01.03       泉州电子    小猫      03.01     abc       10    10   
                                            03.02     fds       10    10  
  PIn005  01.03       哈哈电子    小猫      03.01     abc       10    10 
  PIn004  01.03       哈哈电子    小明      04.01     dds       10    10  
                                            04.02     ddf       10    10   也就是要如何屏蔽前面相同的内容

解决方案 »

  1.   

    如果是單純的顯示、還是要用SQL去實現了。先用SQL處理好想要的格式、再利用DBGRID顯示出來
      

  2.   

    就是单纯的显示,用SQL去实现,我也想过了,就是没有更好的方法
    以前是我是把数据集设置为缓存的,然后判断相同的赋值为空,但觉得这种方法繁琐
    请问SQL要怎么实现?
      

  3.   

    举个例子吧
    例如主表
    table1
    FInterID   FDate   FNumber
    1          2001    PIN01
    2          2001    PIN02
    从表table2
    FInterID   FName   FAmount
    1          01.01   10
    1          01.02   20
    1          01.03   30
    2          02.01   40
    2          02.02   50按理得到的是
    FInterID   FDate   FNumber   FName   FAmount
    1          2001    PIN01     01.01   10
    1          2001    PIN01     01.02   20
    1          2001    PIN01     01.03   30
    2          2001    PIN02     02.01   40
    2          2001    PIN02     02.02   50但我想得到的是如下:
    FInterID   FDate   FNumber   FName   FAmount
    1          2001    PIN01     01.01   10
                                 01.02   20
                                 01.03   30
    2          2001    PIN02     02.01   40
                                 02.02   50
      

  4.   

    select * into #t from tablename
    update  set 单据号='',  供应商代码 ='', 供应商名称='',  制单人='' from #t where 
    not exists (select 单据号,供应商代码,供应商名称,制单人,Min(物料代码) as 物料代码,物料名称,数量,单价  
     from #t group by 单据号)
    slect * from #t 
    drop table #t
    ========================
    没测试,应该可以实现的,就是这个思路
      

  5.   

    错了,
    (select 单据号,供应商代码,供应商名称,制单人,Min(物料代码) as 物料代码,物料名称,数量,单价  
     from #t group by 单据号)//应该为
    (select 单据号,供应商代码,供应商名称,制单人,Min(物料代码) as 物料代码,min(物料名称) as 物料名称 ,min(数量) as 数量,min(单价) as 单价   
     from #t group by 单据号,供应商代码,供应商名称,制单人)
      

  6.   

    欢迎广大Delphi程序员到《delphi专题研讨会》到QQ群7568683
    讨论
      

  7.   

    定义永久字段,在永久字段的OnGetText事件中处理。
    如果你想显示内容(如每项的第一行)返回字段值,想显示内容空白(后面的那些)返回''
    至于如何判断是否显示内容,你可以在查询语句中做一个标记来表示,或者在OnGetText事件中查询上一行的内容是否相同,不相同则显示内容,相同则显示空白
      

  8.   

    DBGrid直接反映数据库的内容,用StringGrid也可。
      

  9.   

    StringGrid速度慢
    DBGrid怎么实现?
      

  10.   

    刚做了一个,你自己参考首改:/*SQL部分,写到存储过程中*/
    SET NOCOUNT ONif exists (select * from dbo.sysobjects where id = object_id('[#tmp_ClothImport]') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
    Drop table [#tmp_ClothImport] 
    select FirstRow=0, M.*, C.khdm as CustomerCode,C.khmc as Customer,
      D.ID as ID_1,D.MasterID, D.CustomerID as CustomerID_1, D.ClothID, D.Quantity, D.Weight,
      D.ImportType, WarehouseID, D.Memo as Memo_1,
      L.bcdm as ClothCode,L.bcmc as Cloth, U.username
    into #tmp_ClothImport
    from ClothImportM M 
    left join ClothImportD D on D.MasterID=M.ID
    left join khzlb C on C.ID=M.CustomerID
    left join bczlb L on L.ID=D.ClothID
    left join password U on U.ID=M.UserID
    order by M.OrderNum, D.IDDeclare @M_ID BigInt, @M_ID2 BigInt, @D_ID BigInt, @D_ID2 BigInt
    Declare cur_FirstRow CURSOR FOR
      select ID, ID_1 from #tmp_ClothImport select @M_ID = 0, @D_ID=0
    open cur_FirstRow
    fetch next from cur_FirstRow into @M_ID2, @D_ID2while  (@@FETCH_STATUS <> -1) begin
      if (@M_ID<>@M_ID2) and (@D_ID<>@D_ID2) begin
        update #tmp_ClothImport set FirstRow=1 where ID=@M_ID2 and ID_1=@D_ID2
        select @M_ID=@M_ID2, @D_ID=@D_ID2
      end
      
      fetch next from cur_FirstRow into @M_ID2, @D_ID2
    end
    close cur_FirstRow
    Deallocate cur_FirstRow
    select * from #tmp_ClothImportdrop table #tmp_ClothImport
    //Dephi中定义记录字段在字段的OnGetText中处理
    procedure TfrmImportQuery.ADOQImportImportDateGetText(Sender: TField;
      var Text: String; DisplayText: Boolean);
    begin
        if Sender.DateSet.FieldByName("FirstRow").AsInteger=1 then Text := Sender.AsString
        else Text := '';
    end;
      

  11.   

    我之前是用这个的,不过排序条件必须保证结果是按:主表ID、从表ID的顺序排序,否则结果不正确:select FirstRow=case when D.ID=(select top 1 ID from ClothImportD where MasterID=M.ID) then 1 else 0 end,
     M.*, C.khdm as CustomerCode,C.khmc as Customer, D.*, L.bcdm as ClothCode,L.bcmc as Cloth, U.username
    from ClothImportM M 
    left join ClothImportD D on D.MasterID=M.ID
    left join khzlb C on C.ID=M.CustomerID
    left join bczlb L on L.ID=D.ClothID
    left join password U on U.ID=M.UserID
    order by M.OrderNum, D.ID