線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1168
推到 Plurk!
推到 Facebook!

有关sql语句

缺席
chamstar
一般會員


發表:24
回覆:36
積分:12
註冊:2004-10-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-04 09:53:13 IP:218.16.xxx.xxx 未訂閱
我数据库中有两个表,一个是应收款表(mf_arp),另一个是收款表tc_mon,字段栏位如下: 应收款表mf_arp: 应收日期 应收单号 应收金额 已收金额 (其中已收金额为收款回冲金额) bil_dd bil_no amt amt_rcv 2004/10/2 C04108 10000 9000 收款表tc_mon 收款日期 收款单号 收款金额 应收单号(其中应收单号对应的是应收款中的单号) rp_dd rp_no amt_cls arp_no 2004/10/6 T04201 5000 C04108 2004/10/31 T04288 4000 C04108 我想自已写一个语句,能综合显示出来应收与已收情况的表,我的语句如下: select a.bil_dd,a.bil_no,a.amt,a.amt_rcv,isnull(a.amt,0)-isnull(a.amt_rcv) as 未收金额,b.rp_dd,b.rp_no,b.amt_cls from mf_arp a left outer join t_mon b on b.arp_no=a.arp_no 我的结果如下显示: bil_dd bil_no amt amt_rcv rp_dd rp_no amt_cls 2004/10/2 C04108 10000 9000 2004/10/6 T04201 5000 2004/10/2 C04108 10000 9000 2004/10/31 T04288 4000 可我如何才能将结果按我所想的方法如下显示呢? bil_dd bil_no amt amt_rcv rp_dd rp_no amt_cls 2004/10/2 C04108 10000 9000 2004/10/6 T04201 5000 2004/10/31 T04288 4000 请各位前辈帮忙,谢谢!
chamstar
一般會員


發表:24
回覆:36
積分:12
註冊:2004-10-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-04 09:57:25 IP:218.16.xxx.xxx 未訂閱
可我如何才能将结果按我所想的方法如下显示呢?(发问有错,这个才是我想要的结果) bil_dd bil_no amt amt_rcv rp_dd rp_no amt_cls 2004/10/2 C04108 10000 9000 2004/10/6 T04201 5000 2004/10/31 T04288 4000
chamstar
一般會員


發表:24
回覆:36
積分:12
註冊:2004-10-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-04 10:00:38 IP:218.16.xxx.xxx 未訂閱
怎么又错了,我用----代替空格好了(不好意思) bil_dd bil_no amt amt_rcv rp_dd rp_no amt_cls 2004/10/2 C04108 10000 9000 2004/10/6 T04201 5000 ----------------------------2004/10/31 T04288 4000
chamstar
一般會員


發表:24
回覆:36
積分:12
註冊:2004-10-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-06 16:28:25 IP:218.16.xxx.xxx 未訂閱
请教各位前辈有没有什么好的方法,谢谢!
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-07 22:54:27 IP:220.134.xxx.xxx 未訂閱
個人淺見,有錯請指正 我想你的需求在SQL實作上來說可能相當麻煩,如果有其他先進提出簡易之作法,那小弟在此也同樣受教了。 如果你的用意在於介面顯示或報表列印時所要達成之效果,那個人建議是直接在
chamstar
一般會員


發表:24
回覆:36
積分:12
註冊:2004-10-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-10 09:35:58 IP:218.16.xxx.xxx 未訂閱
实在不好意思,我找了好久也没找到如何在DBGRID上將重覆之資料以空白顯示的办法,因我初学,还望多多替教。谢谢!
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-10 09:58:31 IP:218.165.xxx.xxx 未訂閱
select a.bil_dd,a.bil_no,a.amt,a.amt_rcv,isnull(a.amt,0)-isnull(a.amt_rcv) as 未收金額,b.rp_dd,b.rp_no,b.amt_cls from mf_arp a ,t_mon b WHERE b.arp_no=a.arp_no TRY TRY SEE
chamstar
一般會員


發表:24
回覆:36
積分:12
註冊:2004-10-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-10 10:09:13 IP:218.16.xxx.xxx 未訂閱
不行呀,这种方式出来的只是将收过款的内容列出来了,没收到的就列不出来。而且也没有解决我说的相同资料显示为穸的问题呀
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-11-10 10:30:19 IP:218.165.xxx.xxx 未訂閱
select a.bil_dd,a.bil_no,a.amt,a.amt_rcv,isnull(a.amt,0)-isnull(a.amt_rcv) as 未收金額,b.rp_dd,b.rp_no,b.amt_cls from mf_arp a ,t_mon b WHERE a.bil_no=b.arp_no TRY TRY SEE 發表人 - chih 於 2004/11/10 10:32:59
chamstar
一般會員


發表:24
回覆:36
積分:12
註冊:2004-10-16

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-11-10 11:01:21 IP:218.16.xxx.xxx 未訂閱
这种方法仍没有解决我说的相同资料显示为空的问题呀
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-11-10 11:50:34 IP:218.165.xxx.xxx 未訂閱
引言: 这种方法仍没有解决我说的相同资料显示为空的问题呀
如果你Default為空,顯示就為空,要看你一開始怎麼存入
chamstar
一般會員


發表:24
回覆:36
積分:12
註冊:2004-10-16

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-11-10 15:41:42 IP:218.16.xxx.xxx 未訂閱
实在不好意思,我找了半天,也没找出“Default為空”在那里,我是这样设的,在表单form1上有ADOConnection1,ADOQuery1,DBGrid1,DataSource1和Button1,其它没作什么设定,代码见下,还请帮忙看一下: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls, DB, Grids, DBGrids, ADODB; type TForm1 = class(TForm) ADOConnection1: TADOConnection; ADOQuery1: TADOQuery; DBGrid1: TDBGrid; DataSource1: TDataSource; Button1: TButton; BitBtn1: TBitBtn; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); VAR a,b,d,m:string; begin d:=edit1.Text; a:='SELECT A.BIL_DD,a.bil_no,a.amt,a.amt_rcv,isnull(a.amt,0)-isnull(a.amt_rcv,0) as 未收,b.rp_dd,b.rp_no,b.amt_cls from mf_arp a,tc_mon b where a.arp_no=b.arp_no and rp_id='; b:='1'; with adoquery1 do begin close; sql.clear; m:=a d b d; sql.Add(m); OPEN; end; end; procedure TForm1.FormCreate(Sender: TObject); begin end; end.
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-11-10 16:48:32 IP:218.165.xxx.xxx 未訂閱
procedure TForm1.Button1Click(Sender: TObject);
VAR
a,b,d,m:string;
begin
        
  d:=edit1.Text;
  a:='SELECT A.BIL_DD,a.bil_no,a.amt,a.amt_rcv,isnull(a.amt,0)-isnull(a.amt_rcv,0) as 未收,' 
  'b.rp_dd,b.rp_no,b.amt_cls from mf_arp a,tc_mon b where a.arp_no=b.arp_no ' 
  'and rp_id=' #39 edit1.Text #39;//增加紅色部份
  b:='1';
  
  with adoquery1 do
  begin
    close;
    sql.clear;
    m:=a d b d;//不清楚你的b 為什麼要等於d???
    sql.Add(a);
    OPEN;
  end;
  
end;
TRY TRY SEE
發表人 - chih 於 2004/11/10 17:01:11
chamstar
一般會員


發表:24
回覆:36
積分:12
註冊:2004-10-16

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-11-10 17:15:13 IP:218.16.xxx.xxx 未訂閱
procedure TForm1.Button1Click(Sender: TObject); VAR a:string; begin a:='SELECT A.BIL_DD,a.bil_no,a.amt,a.amt_rcv,isnull(a.amt,0)-isnull(a.amt_rcv,0) as 未收,' 'b.rp_dd,b.rp_no,b.amt_cls from mf_arp a,tc_mon b where a.arp_no=b.arp_no ' 'and rp_id=' #39 edit1.Text #39;//增加紅色部份 with adoquery1 do begin close; sql.clear; sql.Add(a); OPEN; end; end; 我已改过,可还是不对呀,显示结果如图,相同的内容同样会重复显示
chamstar
一般會員


發表:24
回覆:36
積分:12
註冊:2004-10-16

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-11-10 17:19:17 IP:218.16.xxx.xxx 未訂閱
见图档
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-11-10 17:24:46 IP:218.165.xxx.xxx 未訂閱
a好像沒有arp_no,應該改為bil_no 吧?? 所以.. a:='SELECT A.BIL_DD,a.bil_no,a.amt,a.amt_rcv,isnull(a.amt,0)-isnull(a.amt_rcv,0) as 未收,' 'b.rp_dd,b.rp_no,b.amt_cls from mf_arp a,tc_mon b where a.bil_no =b.arp_no ' 'and rp_id=' #39 edit1.Text #39; 這樣看看..
chamstar
一般會員


發表:24
回覆:36
積分:12
註冊:2004-10-16

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-11-10 17:27:00 IP:218.16.xxx.xxx 未訂閱
    
chamstar
一般會員


發表:24
回覆:36
積分:12
註冊:2004-10-16

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-11-10 17:52:44 IP:218.16.xxx.xxx 未訂閱
不好意思,前面有点错。见下. 应收日期 应收单号 立帐单号 应收金额 已收金额 (其中已收金额为收款回冲金额) bil_dd arp_no bil_no amt amt_rcv 2004/10/2 C04108 C04108 10000 9000 收款表tc_mon 收款日期 收款单号 收款金额 应收单号(其中应收单号对应的是应收款中的单号) rp_dd rp_no amt_cls arp_no 2004/10/6 T04201 5000 C04108 2004/10/31 T04288 4000 C04108 我的意思是想将图中的蓝色部分C04510 4500 4500重复的部分不显示出来,因这是一张应收款单,对应有两笔收款RT49100002/RT47190003其显示结果为如下: C04510 4500 4500 2004-9-10 RT49100002 3600 ------ ---- ---- 2004-7-19 RT47190003 900
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#19 引用回覆 回覆 發表時間:2004-11-10 18:31:39 IP:220.134.xxx.xxx 未訂閱
你是要列印出報表,所以你的需求應該要在QuickReport的DataChange裡面去下手了
chamstar
一般會員


發表:24
回覆:36
積分:12
註冊:2004-10-16

發送簡訊給我
#20 引用回覆 回覆 發表時間:2004-11-11 08:49:18 IP:218.16.xxx.xxx 未訂閱
真的没办法从dbgrid入手吗?我看过一些软件是可以的
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#21 引用回覆 回覆 發表時間:2004-11-13 02:52:34 IP:220.134.xxx.xxx 未訂閱
個人建議個笨方法,有錯請指正。 利用Calculated方式,先建立一個暫時編號的fkCalculated欄位,然後在 ONCalcFields事件上作處理,然後記得在DBGRID及報表上均利用該欄位取代原先之正式編號欄位
Var vField : String;
Begin
  If Trim(vField) = '' Then
    Begin
      vField := DataSet.FieldByName('正式編號').AsString;
      DataSet.FieldByName('暫時編號').AsString := vField;
    End
  Else
    Begin
      If DataSet.FieldByName('正式編號').AsString = vField Then
        DataSet.FieldByName('暫時編號').AsString := '--'
      Else
        Begin
          vField := DataSet.FieldByName('正式編號').AsString;
          DataSet.FieldByName('暫時編號').AsString := vField;
        End;
    End;
End;
========================= 讀萬卷書~不如來K.TOP走一遭 =========================
chamstar
一般會員


發表:24
回覆:36
積分:12
註冊:2004-10-16

發送簡訊給我
#22 引用回覆 回覆 發表時間:2004-11-13 10:04:00 IP:218.16.xxx.xxx 未訂閱
我看了半天,不知从何下手,水平实在太低,还请likush前辈按我的栏位写得更详细一些,拜托了,谢谢!
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#23 引用回覆 回覆 發表時間:2004-11-19 10:43:23 IP:218.163.xxx.xxx 未訂閱
Var vField : String;
利用FIELD EDITOR建立bil_dd1的kCalculated欄位,然後再
procedure TForm1.Query1CalcFields(DataSet: TDataSet);
Begin
  If Trim(vField) = '' Then
    Begin
      vField := DataSet.FieldByName('bil_dd').AsString;
      DataSet.FieldByName('bil_dd1').AsString := vField;
    End
  Else
    Begin
      If DataSet.FieldByName('bil_dd').AsString = vField Then
        DataSet.FieldByName('bil_dd1').AsString := '-'
      Else
        Begin
          vField := DataSet.FieldByName('bil_dd').AsString;
          DataSet.FieldByName('bil_dd1' ).AsString := vField;
        End;
    End;
End;
然後記得取應收日期欄位時,不取原bil_dd欄位改取bil_dd1欄位,如有多數欄位亦要作此處理則在該事件內再加入預設之欄位。如此不僅grid可顯示你要的結果,在報表上亦同作法。
========================= 讀萬卷書~不如來K.TOP走一遭 =========================
chamstar
一般會員


發表:24
回覆:36
積分:12
註冊:2004-10-16

發送簡訊給我
#24 引用回覆 回覆 發表時間:2004-11-23 08:34:28 IP:219.130.xxx.xxx 未訂閱
"利用FIELD EDITOR建立bil_dd1的kCalculated欄位,然後再" 具体是怎么操作的?谢谢
likush
高階會員


發表:5
回覆:235
積分:103
註冊:2002-10-08

發送簡訊給我
#25 引用回覆 回覆 發表時間:2004-12-03 04:30:11 IP:220.134.xxx.xxx 未訂閱
首先利用FIELD EDITOR建立bil_dd1的kCalculated欄位, 然後在 procedure TForm1.Query1CalcFields(DataSet: TDataSet); Begin ....輸入上述之程式碼(您可視需求再作修正) End; 如果對該方式有問題者,建議參考delphi相關之資料庫書籍或搜尋站上相關文章應有助益。 ========================= 讀萬卷書~不如來K.TOP走一遭 =========================
peterpcc
一般會員


發表:6
回覆:37
積分:13
註冊:2004-09-27

發送簡訊給我
#26 引用回覆 回覆 發表時間:2004-12-04 09:49:01 IP:221.239.xxx.xxx 未訂閱
我曾做過一種方式,也類似此畫面. 其實不難,我們換種概念來看,顯示是需要兩種方式,所以可以改用兩個SQL 按理來說,t_mon 應該是會有個流水序號的欄位(這兒的序號是自己產生的). select '1',a.bil_dd,a.bil_no,a.amt,a.amt_rcv,isnull(a.amt,0)-isnull(a.amt_rcv) as 未收金额,b.rp_dd,b.rp_no,b.amt_cls from mf_arp a left outer join t_mon b on b.arp_no=a.arp_no AND 表身序號第一筆 UNION select '2','','','','',0 未收金额,b.rp_dd,b.rp_no,b.amt_cls from mf_arp a left outer join t_mon b on b.arp_no=a.arp_no AND 表身序號<>第一筆 ORDER BY 1,2,3 1','2' 是為了排序用,這樣就能排得正確了 不過這樣的顯示,讓我想到了以前我在DOS也是這樣的寫法. 跟客戶對帳,也許把t_mon內的資料放置於報表的上頭會好些. 如果是要顯示銷貨明細項,當然此法就很好.
系統時間:2024-06-02 17:22:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!