unit UnitCX;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, Grids, DBGrids, ComCtrls, StdCtrls, Buttons, QRCtrls,
  QuickRpt, ExtCtrls;type
  TForm1 = class(TForm)
    DataSource1: TDataSource;
    ADOQuery1: TADOQuery;
    ADOConnection1: TADOConnection;
    GroupBox1: TGroupBox;
    DateTimePicker1: TDateTimePicker;
    GroupBox2: TGroupBox;
    GroupBox3: TGroupBox;
    DBGrid1: TDBGrid;
    ComboBox1: TComboBox;
    BitBtn1: TBitBtn;
    Label1: TLabel;
    Label2: TLabel;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    Label5: TLabel;
    Label4: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
ADOConnection1.ConnectionString:='Provider=MSDASQL.1;Password=13531880960;Persist Security Info=True;User ID=inputer;Data Source=hlwl';
end;procedure TForm1.BitBtn3Click(Sender: TObject);
begin
  close;
end;procedure TForm1.BitBtn1Click(Sender: TObject);
var
  j,jh:integer;
   y,yj,d,ds,c,cp,w,wdx:double;
   sss:string;
begin
with adoquery1 do
  begin
    close;
    sql.Clear;
    sql.Add('select o.* , P.垫付款未收已付出票 as 垫付款未收已付出票');
    sql.Add('from (SeLECT m.*, n.授信余额 AS 授信余额,n.授信总额 as 授信总额 FROM (SELECT k.*, l.垫付款已收已付 AS 垫付款已收已付');
    sql.Add('FROM (SELECT i.*, j.垫付款已收未付 AS 垫付款已收未付');
    sql.Add('FROM (SELECT g.*, h.垫付款未收已付未出票 AS 垫付款未收已付未出票');
    sql.Add('FROM (SELECT e.*, f.垫付款未收未付 AS 垫付款未收未付');
    sql.Add('FROM (SELECT c.*, d .代收货款未收 AS 代收货款未收');
    sql.Add('FROM (SELECT a.*,b.代收货款已收 AS 代收货款已收 FROM (SELECT 目的地,收货人姓名 AS 客户名,SUM(总体积) AS 方量,SUM(总重量) AS 吨数,SUM(总运费) AS 总运费 ,(SUM(总运费)-SUM(实收运费)) as 未收运费');
    sql.Add('FROM 运单表 WHERE (开单日期 >= '''+datetostr(DateTimePicker1.Date)+''') and (开单日期 <= '''+datetostr(Date2.Date)+''') GROUP BY 目的地, 收货人姓名) a LEFT OUTER JOIN (SELECT 目的地,收货人姓名 AS 客户名,SUM(货款) AS 代收货款已收');
    sql.Add('FROM 运单表 WHERE (开单日期 >= '''+datetostr(DateTimePicker1.Date)+''') and (开单日期 <= '''+datetostr(Date2.Date)+''') AND (货款类型 = ''代收'') AND (实收货款总额 > 0)GROUP BY 目的地, 收货人姓名) b ON a.目的地 = b.目的地 AND a.客户名 = b.客户名) c LEFT OUTER JOIN');
    sql.Add('(SELECT 目的地, 收货人姓名 AS 客户名,SUM(货款) AS 代收货款未收');
    sql.Add('FROM 运单表 WHERE (开单日期 >=  '''+datetostr(DateTimePicker1.Date)+''') and(开单日期 <= '''+datetostr(Date2.Date)+''') AND (货款类型 = ''代收'') AND (实收货款总额 = 0)');
    sql.Add('GROUP BY 目的地, 收货人姓名) d ON c.目的地 = d .目的地 AND c.客户名 = d .客户名) e LEFT OUTER JOIN');
    sql.Add('(SELECT 目的地, 收货人姓名 AS 客户名, SUM(货款) AS 垫付款未收未付 FROM 运单表 WHERE (开单日期 >= '''+datetostr(DateTimePicker1.Date)+''') and(开单日期 <= '''+datetostr(Date2.Date)+''') AND (实收货款总额 = 0) AND (LEFT(货款类型,2)= ''垫付'') AND (实付金额 = 0)');
    sql.Add('GROUP BY 目的地, 收货人姓名) f ON e.目的地 = f.目的地 AND e.客户名 = f.客户名) g LEFT OUTER JOIN');
    sql.Add('(SELECT 目的地, 收货人姓名 AS 客户名, SUM(货款) AS 垫付款未收已付未出票 FROM 运单表');
    sql.Add('WHERE (开单日期 >=  '''+datetostr(DateTimePicker1.Date)+''') and(开单日期 <= '''+datetostr(Date2.Date)+''') AND (实收货款总额 = 0) AND (LEFT(货款类型, 2) = ''垫付'') AND (实付金额 > 0) and (支付日期>= getdate()-垫付天数)');//and (支付日期< now()-25)支票兑成钱的.
    sql.Add('GROUP BY 目的地, 收货人姓名) h ON g.目的地 = h.目的地 AND g.客户名 = h.客户名) i LEFT OUTER JOIN');
    sql.Add('(SELECT 目的地, 收货人姓名 AS 客户名, SUM(货款) AS 垫付款已收未付 FROM 运单表');
    sql.Add('WHERE (开单日期 >=  '''+datetostr(DateTimePicker1.Date)+''') and(开单日期 <= '''+datetostr(Date2.Date)+''') AND (实收货款总额 > 0) AND (LEFT(货款类型, 2) = ''垫付'') AND (实付金额 = 0)');
    sql.Add('GROUP BY 目的地, 收货人姓名) j ON i.目的地 = j.目的地 AND i.客户名 = j.客户名) k LEFT OUTER JOIN');
    sql.Add('(SELECT 目的地, 收货人姓名 AS 客户名, SUM(货款) AS 垫付款已收已付 FROM 运单表');
    sql.Add('WHERE (开单日期 >= '''+datetostr(DateTimePicker1.Date)+''') and(开单日期 <= '''+datetostr(Date2.Date)+''') AND (实收货款总额 > 0) AND (LEFT(货款类型, 2) = ''垫付'') AND (实付金额 > 0)');
    sql.Add('GROUP BY 目的地, 收货人姓名) l ON k.目的地 = l.目的地 AND k.客户名 = l.客户名) m LEFT OUTER JOIN');
    sql.Add('(SELECT 联系人 AS 客户名, 所在地 AS 目的地, (最高授信 - 已用授信) AS 授信余额, 最高授信 as 授信总额 FROM 客户表) n ON m.客户名 = n.客户名 AND m.目的地 = n.目的地 ) o ');
    sql.Add('LEFT OUTER JOIN (SELECT 目的地, 收货人姓名 AS 客户名, SUM(货款) AS 垫付款未收已付出票 FROM 运单表 where');
    sql.Add(' (开单日期 >= '''+datetostr(DateTimePicker1.Date)+''') and(开单日期 <= '''+datetostr(Date2.Date)+''') AND (实收货款总额 = 0) AND (LEFT(货款类型, 2) = ''垫付'') AND (实付金额 > 0) and (支付日期<= getdate()-垫付天数) GROUP BY 目的地, 收货人姓名) p ON o.客户名 = p.客户名 AND o.目的地 = p.目的地');
    if trim(combobox1.text)<>'' then
      begin
      sql.Add('WHERE (p.目的地 = '''+trim(combobox1.Text)+''')');
      sql.Add('ORDER BY 垫付款未收已付出票 desc');
      end else
      sql.Add('ORDER BY 垫付款未收已付出票 desc');
    open;
      while not eof do
        begin
         jh:=fieldbyname('方量').Asinteger;
         yj:=fieldbyname('总运费').AsFloat;
         ds:=fieldbyname('吨数').AsFloat;
         cp:=fieldbyname('垫付款未收已付出票').AsFloat;
         wdx:=fieldbyname('垫付款未收已付未出票').AsFloat;
         j:=j+jh;
         y:=y+yj;
         d:=d+ds;
         c:=c+cp;
         w:=w+wdx;
         next;
      end;
    end;
  groupbox2.Caption :='查询 结果  共  '+inttostr(adoquery1.RecordCount)+'  条';
  groupbox2.Font.Color:=clred;
  dbgrid1.Refresh;
  label4.Caption :='已兑现支票额:¥'+formatfloat('0,000.00',c);
  label5.Caption :='未兑现支票额:¥'+formatfloat('0.00',w);
  label3.caption :='总吨数:'+formatfloat('0.000',d)+ '   总方量:'+inttostr(j)+'     总运费:¥'+formatfloat('0,000.00',y);
end;
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  RlbeNF.Caption :='专线:'+combobox1.Text+'    时间:  '+datetostr(DateTimePicker1.Date)+ ' 到 '+datetostr(Date2.Date);
  QRLabel3.Caption :=label3.caption;
  QRLabel22.Caption := label4.Caption;
  QRLabel23.Caption := label5.Caption;
  quickrep1.Preview;
end;procedure TForm1.FormShow(Sender: TObject);
begin
  ADOConnection1.Connected:=True;
  with adoquery1 do
  begin
    close;
    sql.Clear;
    sql.Add('select * from 营业点表 ');
    open;
      while not Eof do
        begin
        combobox1.items.add(FieldbyName('简称').AsString);
        Next;
        end;
  end;
end;
end.
查询不到5月10号以后的数据
查询到的数据在4月24号以前的没有差额,24号以后的就有,一个一个客户对比时没有差额, 也不知道出错在哪里.....

解决方案 »

  1.   

    表结构:
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[运单表]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[运单表]
    GOCREATE TABLE [dbo].[运单表] (
    [编号] [bigint] IDENTITY (1, 1) NOT NULL ,
    [运单号] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [营业点] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [开单人] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [开单日期] [datetime] NULL ,
    [货物类型] [nvarchar] (4) COLLATE Chinese_PRC_CI_AS NULL ,
    [始发地] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [目的地] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [发货序号] [varchar] (12) COLLATE Chinese_PRC_CI_AS NULL ,
    [交货方式] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,
    [发货人姓名] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [收货人姓名] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [收货人手机] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
    [货物名称] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [包装] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [总重量] [money] NULL ,
    [总体积] [money] NULL ,
    [总件数] [int] NULL ,
    [中转地] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [货款] [money] NULL ,
    [货款类型] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,
    [总运费] [money] NULL ,
    [结算方式] [nvarchar] (4) COLLATE Chinese_PRC_CI_AS NULL ,
    [备注] [nvarchar] (254) COLLATE Chinese_PRC_CI_AS NULL ,
    [出车编号] [int] NULL ,
    [驾驶员编号] [int] NULL ,
    [状态] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [客户回单张数] [int] NULL ,
    [客户扣款] [money] NULL ,
    [实收货款1] [money] NULL ,
    [实收货款2] [money] NULL ,
    [实收货款总额] [money] NULL ,
    [退货金额] [money] NULL ,
    [货款差额] [money] NULL ,
    [货运扣款] [money] NULL ,
    [实付金额] [money] NULL ,
    [付款标志] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [客户标志] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [上单日期] [datetime] NULL ,
    [支付日期] [datetime] NULL ,
    [支付人] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [支付时间] [datetime] NULL ,
    [支票号] [nvarchar] (15) COLLATE Chinese_PRC_CI_AS NULL ,
    [车次号] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [方差] [float] NULL ,
    [到付运费] [money] NULL ,
    [已到货款上传标志] [bit] NULL ,
    [实收运价] [money] NULL ,
    [实收运费] [money] NULL ,
    [查款日期] [datetime] NULL ,
    [包装明细] [nvarchar] (230) COLLATE Chinese_PRC_CI_AS NULL ,
    [代收款备注] [nvarchar] (200) COLLATE Chinese_PRC_CI_AS NULL ,
    [货差货损情况] [nvarchar] (200) COLLATE Chinese_PRC_CI_AS NULL ,
    [已扣授信] [bit] NULL ,
    [批次号] [char] (2) COLLATE Chinese_PRC_CI_AS NULL ,
    [运费结清] [bit] NULL ,
    [垫付天数] [bigint] NULL ,
    [信用度] [bigint] NULL ,
    [配送码] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [打印次数] [int] NULL 
    ) ON [PRIMARY]
    GO
      

  2.   

    ... 能查出  DateTimePicker1.Date 到 NOw 之间的数据   就是查不出来5月10号以后的数据 ......  
      

  3.   

    把你的SQL语句整理一下贴上来看看
      

  4.   

    这就是了(出了点错我改了好久):
    SELECT o.*, p.垫付款未收已付出票 AS 垫付款未收已付出票
    FROM (SELECT m.*, n.授信余额 AS 授信余额, n.授信总额 AS 授信总额
            FROM (SELECT k.*, l.垫付款已收已付 AS 垫付款已收已付
                    FROM (SELECT i.*, j.垫付款已收未付 AS 垫付款已收未付
                            FROM (SELECT g.*, 
                                          h.垫付款未收已付未出票 AS 垫付款未收已付未出票
                                    FROM (SELECT e.*, 
                                                  f.垫付款未收未付 AS 垫付款未收未付
                                            FROM (SELECT c.*, 
                                                          d .代收货款未收 AS 代收货款未收
                                                    FROM (SELECT a.*, 
                                                                  b.代收货款已收 AS 代收货款已收
                                                            FROM (SELECT 目的地, 
                                                                          收货人姓名 AS 客户名, 
                                                                          SUM(总体积) AS 方量, 
                                                                          SUM(总重量) AS 吨数, 
                                                                          SUM(总运费) AS 总运费, 
                                                                          (SUM(总运费) 
                                                                          - SUM(实收运费)) 
                                                                          AS 未收运费
                                                                    FROM 运单表
                                                                    WHERE (开单日期 > '2006 - 3 - 1')
                                                                    GROUP BY 目的地, 收货人姓名) 
                                                                  a LEFT OUTER JOIN
                                                                      (SELECT 目的地, 
                                                                           收货人姓名 AS 客户名, 
                                                                           SUM(货款) 
                                                                           AS 代收货款已收
                                                                     FROM 运单表
                                                                     WHERE (开单日期 > '2006 - 3 - 1')
                                                                            AND (货款类型 = '代收') 
                                                                           AND (实收货款总额 > 0)
                                                                     GROUP BY 目的地, 
                                                                           收货人姓名) b ON 
                                                                  a.目的地 = b.目的地 AND 
                                                                  a.客户名 = b.客户名) 
                                                          c LEFT OUTER JOIN
                                                              (SELECT 目的地, 
                                                                   收货人姓名 AS 客户名, 
                                                                   SUM(货款) 
                                                                   AS 代收货款未收
                                                             FROM 运单表
                                                             WHERE (开单日期 >' 2006 - 3 - 1') AND 
                                                                   (货款类型 = '代收') AND 
                                                                   (实收货款总额 = 0)
                                                             GROUP BY 目的地, 收货人姓名) d ON 
                                                          c.目的地 = d .目的地 AND 
                                                          c.客户名 = d .客户名) 
                                                  e LEFT OUTER JOIN
                                                      (SELECT 目的地, 收货人姓名 AS 客户名, 
                                                           SUM(货款) AS 垫付款未收未付
                                                     FROM 运单表
                                                     WHERE (开单日期 >' 2006 - 3 - 1') AND 
                                                           (实收货款总额 = 0) AND (LEFT(货款类型, 
                                                           2) = ' 垫付 ') AND (实付金额 = 0)
                                                     GROUP BY 目的地, 收货人姓名) f ON 
                                                  e.目的地 = f.目的地 AND e.客户名 = f.客户名) 
                                          g LEFT OUTER JOIN
                                              (SELECT 目的地, 收货人姓名 AS 客户名, SUM(货款) 
                                                   AS 垫付款未收已付未出票
                                             FROM 运单表
                                             WHERE (开单日期 >' 2006 - 3 - 1') AND 
                                                   (实收货款总额 = 0) AND (LEFT(货款类型, 2) 
                                                   = '垫付') AND (实付金额 > 0) AND 
                                                   (支付日期 > getdate() - 25)
                                             GROUP BY 目的地, 收货人姓名) h ON 
                                          g.目的地 = h.目的地 AND g.客户名 = h.客户名) 
                                  i LEFT OUTER JOIN
                                      (SELECT 目的地, 收货人姓名 AS 客户名, SUM(货款) 
                                           AS 垫付款已收未付
                                     FROM 运单表
                                     WHERE (开单日期 > '2006 - 3 - 1') AND (实收货款总额 > 0) AND
                                            (LEFT(货款类型, 2) = '垫付') AND (实付金额 = 0)
                                     GROUP BY 目的地, 收货人姓名) j ON 
                                  i.目的地 = j.目的地 AND i.客户名 = j.客户名) 
                          k LEFT OUTER JOIN
                              (SELECT 目的地, 收货人姓名 AS 客户名, SUM(货款) 
                                   AS 垫付款已收已付
                             FROM 运单表
                             WHERE (开单日期 > '2006 - 3 - 1') AND (实收货款总额 > 0) AND 
                                   (LEFT(货款类型, 2) = '垫付') AND (实付金额 > 0)
                             GROUP BY 目的地, 收货人姓名) l ON k.目的地 = l.目的地 AND 
                          k.客户名 = l.客户名) m LEFT OUTER JOIN
                      (SELECT 联系人 AS 客户名, 所在地 AS 目的地, (最高授信 - 已用授信) 
                           AS 授信余额, 最高授信 AS 授信总额
                     FROM 客户表) n ON m.客户名 = n.客户名 AND m.目的地 = n.目的地) 
          o LEFT OUTER JOIN
              (SELECT 目的地, 收货人姓名 AS 客户名, SUM(货款) AS 垫付款未收已付出票
             FROM  运单表 where (开单日期 > '2006 - 3 - 1') AND (实收货款总额 = 0) AND 
                   (LEFT(货款类型, 2) = '垫付') AND (实付金额 > 0) AND (支付日期 < getdate() - 25)
             GROUP BY 目的地, 收货人姓名) p ON o.客户名 = p.客户名 AND 
          o.目的地 = p.目的地
    WHERE 1=1
    ORDER BY p.目的地, p.客户名
      

  5.   

    我已晕倒.........
    建议写成存储过程,然后把脚本拿到SQL区问问
    另外,可以试着按以下方法检测代码:
    1、既然可以查到DateTimePicker到Now的数据,设DateTimePicker日期为5月10日,或改下系统时间测试
    2、注意该字段的数据类型
    3、仔细检查拼写与时间的格式问题,包括中英文区别、空格等(可以直接从数据库里复制个日期试下)
    4、代码没时间仔细看,上面说的可能都是错的^-^
      

  6.   

    从中间的sql语句由里到外一点一点的跟,这样问题估计能分析出来究竟错在哪儿!
      

  7.   

    建议贴出表结构,提出需求,回复者直接贴SQL语句就行了,在这里面找错太难了。
      

  8.   

    直接调试这样一个sql,我觉得太困难了,建议楼主可以先写一个比较简单点的sql,调试通过后再一点一点的添加,
    另外也赞同使用存储过程,一来便于调试,二来也使程序代码大大简洁
    注:我是菜鸟,昨天才开始学习使用存储过程,但觉得很好!
      

  9.   

    能查出  DateTimePicker1.Date 到 NOw 之间的数据  就是查不出来5月10号以后的数据 ......  
    AND (支付日期 < getdate() - 25) NOW是在5/10之前还是之后哦? 你说的NOW是指导GETDATE()?
      

  10.   

    头晕 @_@,,,,,
    建议 ,把SQL语句一段一段的放到查询分析器里面去分析,能不能得到你想要的数据,然后再一个一个联合的拼起来。
    不要一下子进去查。
      

  11.   

    看你前面的日期格式都只取到天,SO是不是GETDATE()-25要转换一下哦,支付日期 < formatdatetime('yyyy-M-D',getdate() - 25)
      

  12.   

    楼主这样写SQL是挺奇怪的,确实是奇怪的SQL语句
      

  13.   

    帮你顶,也帮我看看我的问题。http://topic.csdn.net/u/20080614/15/ce390720-d636-4192-baff-35163ee7a2b3.html