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

ADO連結SQL將資料呈現TreeView及DBGrid後,以Rave列印的問題

答題得分者是:st33chen
boss1215
一般會員


發表:6
回覆:10
積分:3
註冊:2009-03-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-10 17:09:40 IP:220.132.xxx.xxx 訂閱
求救於各位大大~
工作的關係,對於完全不懂程式的我,相當頭痛,看書本研究仍沒辦法做到我想要的結果。

我想以TADO元件連結SQL Server資料庫,並且以Delphi呼叫Rave Report報表列印
資料庫中會用到 TF. UKS 三個資料表格,Primary Key = BOM_NO
From上放入
  • TLabel & TEdit <供輸入NO 作查詢>
  • 兩個Button <一個查詢,一個列印>
  • TreeView
  • DBGrid
  • ADOConnection‧DataSouse‧RvSystem‧RvProject
  • 3個 ADOQuery <分別為 ADOMFB , ADOTFB, ADOUKS >
  • 3個 RvDataSetConnection <分別為 RvDataSetMFB , RvDataSetTFB , RvDataSetUKS>
想要結果為例如 : 輸入A > 按查詢後
> TreeView出現 A
|-- A01
|---A001
|---A0011
|---A002
|-- B01
|---B011
|-- C

(父節點由MF得來,子節點由TF得來)

>且滑鼠點選的節點,資料都可在DBGrid呈現供檢查
>之後由TreeView點選到的資料列印

問題一 各位大大..我Code該怎麼寫???
問題二 父節點列印的格式與子節點列印的格式不同,要如何能夠將父節點與子節點連接一起列印?
不然頁碼無法連結。

希望各位大大能懂我的需求,雖然似乎也講不太清楚~有勞各位
------
Wa
boss1215
一般會員


發表:6
回覆:10
積分:3
註冊:2009-03-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-12 16:47:32 IP:220.132.xxx.xxx 訂閱
以下是我試著學習看來的文章以及書本寫的Code..還沒完成
但是
1.一直有ADOTFB:Parameter'bom_no' not found 的錯誤訊息,但我不知道原因
2.TreeView..有跑..但都沒顯現出來.且Form都不動了..會不會是因為資料太多筆??
麻煩各位大大請幫我看一下~~~<第一次寫Code.錯誤很多~煩請大大們指教>


[code delphi]
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, ComCtrls, RpCon, RpConDS, RpBase, RpSystem,
RpDefine, RpRave, DB, ADODB;

type
TForm1 = class(TForm)
TreeView1: TTreeView;
DBGrid1: TDBGrid;
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
ListBox1: TListBox;
DataSource1: TDataSource;
ADOConnection1: TADOConnection;
ADOMFB: TADOQuery;
ADOTFB: TADOQuery;
ADOUKS: TADOQuery;
RvProject1: TRvProject;
RvSystem1: TRvSystem;
RvDataSetMFB: TRvDataSetConnection;
RvDataSetTFB: TRvDataSetConnection;
RvDataSetUKS: TRvDataSetConnection;
procedure Button2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ListBox1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure TreeView1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }

end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
Newnode: TTreeNode;
begin
with adoMFB do
begin
sql.clear;
sql.add('select BOM_NO,PRD_NO,NAME,SPC,QTY from MF_BOM where BOM_NO Like ''%' edit1.Text '%''');
close;
open;
first;
while not (adoMFB.eof) do
Newnode:=treeview1.items.add(nil,adomfb.fieldbyname('BOM_NO').ASString '>' (adomfb.FieldByName('NAME')).asstring);
begin
with adoTFB do
begin
sql.Clear;
sql.Add('select distinct T.BOM_NO,T.PRD_NO,T.NAME,U.UNIT,T.QTY,U.PRD_KND,U.USEIN_NAME');
sql.Add(' from TF_BOM AS T,TF_UKS AS U, MF_BOM AS M ');
sql.Add(' where T.BOM_NO=:BOM_NO');
Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
close;
open;
first;
while not adoTFB.Eof do
begin
treeview1.Items.AddChild(newnode,adoTFB.fieldbyname('PRD_NO').value);
next;
end;
end;
next;
end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
RvProject1.Execute;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
try
ADOConnection1.Connected:=true;
except
showmessage('無法中斷連線!');
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
try
ADOConnection1.Connected:=true;
except
showmessage('無法連線!');
end;

Rvproject1.Open;
Rvproject1.getreportlist(Listbox1.items,true);
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
Rvproject1.selectreport(listbox1.Items[listbox1.itemindex],true);
end;

procedure TForm1.TreeView1Click(Sender: TObject);
begin
if treeview1.Selected.Level=1 then
begin
with ADOMFB DO
begin
SQL.Clear;
sql.add('select BOM_NO,PRD_NO,NAME,SPC,QTY from MF_BOM where BOM_NO''%' edit1.Text '%''');
Parameters.ParamByName('BOM_NO').Value:=copy(treeview1.Selected.Text,4,2);
showmessage(copy(treeview1.Selected.Text,4,2));
CLOSE;
open;
//treeview1.Selected:=nil;
end;
if treeview1.Selected.Level=2 then
With ADOMFB DO
begin
Close;
SQL.Clear;
SQL.Add('select BOM_NO,PRD_NO,NAME,SPC,QTY from ADOMFB');
if Edit1.Text<>'' then
sql.Add('where BOM_NO LIKE ''%' Edit1.text '%'' ');
Parameters.ParamByName('BOM_NO').Value:=copy(treeview1.Selected.Text,2,4);
showmessage(copy(treeview1.Selected.Text,2,4));
Open;
end;
end;
end;


end.

[/code]




------
Wa
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-13 13:03:34 IP:122.116.xxx.xxx 未訂閱
with adoTFB do begin  
sql.Clear;
sql.Add('select distinct T.BOM_NO,T.PRD_NO,T.NAME,U.UNIT,T.QTY,U.PRD_KND,U.USEIN_NAME');
sql.Add(' from TF_BOM AS T,TF_UKS AS U, MF_BOM AS M ');
// 可能是動態給 sql.text, 參數沒處理好 , 如果是 design time 就把 sql.text 寫到 adoTFB 應該也可以解決 .
// sql.Add(' where T.BOM_NO=:BOM_NO');
// Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
sql.Add(' where T.BOM_NO=''' copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2) '''');
close;
open;
first;
while not adoTFB.Eof do begin
treeview1.Items.AddChild(newnode,adoTFB.fieldbyname('PRD_NO').value);
next;
end;
end;
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
BOSS
中階會員


發表:70
回覆:79
積分:64
註冊:2006-11-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-03-15 22:46:52 IP:123.194.xxx.xxx 訂閱

  1. sql.Clear;
  2. sql.Add('select distinct T.BOM_NO,T.PRD_NO,T.NAME,U.UNIT,T.QTY,U.PRD_KND,U.USEIN_NAME');
  3. sql.Add(' from TF_BOM AS T,TF_UKS AS U, MF_BOM AS M ');
  4. sql.Add(' where T.BOM_NO=:BOM_NO');
  5. Parameters.ParamByName('BOM_NO').datatype:=ftstring
  6. Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
  7. close;
  8. open;
  9. first;
  10. while not adoTFB.Eof do
  11. begin
  12. treeview1.Items.AddChild(newnode,adoTFB.fieldbyname('PRD_NO').value);
  13. next;
  14. end;
  15. end;
編輯記錄
BOSS 重新編輯於 2009-03-15 22:49:24, 註解 無‧
BOSS 重新編輯於 2009-03-15 22:51:14, 註解 無‧
boss1215
一般會員


發表:6
回覆:10
積分:3
註冊:2009-03-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-03-16 17:49:17 IP:220.132.xxx.xxx 訂閱
TO st33chen
不好意思~我不太懂你的意思.
請問一下..Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
這行Code有什麼意思??


===================引 用 st33chen 文 章===================
with adoTFB do begin
sql.Clear;
sql.Add('select distinct T.BOM_NO,T.PRD_NO,T.NAME,U.UNIT,T.QTY,U.PRD_KND,U.USEIN_NAME');
sql.Add(' from TF_BOM AS T,TF_UKS AS U, MF_BOM AS M ');
// 可能是動態給 sql.text, 參數沒處理好 , 如果是 design time 就把 sql.text 寫到 adoTFB 應該也可以解決 .
// sql.Add(' where T.BOM_NO=:BOM_NO');
// Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
sql.Add(' where T.BOM_NO=''' copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2) '''');
close;
open;
first;
while not adoTFB.Eof do begin
treeview1.Items.AddChild(newnode,adoTFB.fieldbyname('PRD_NO').value);
next;
end;
end;
------
Wa
boss1215
一般會員


發表:6
回覆:10
積分:3
註冊:2009-03-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-03-16 17:53:04 IP:211.72.xxx.xxx 訂閱
TO BOSS大大
請教一下加入的這行 Parameters.ParamByName('BOM_NO').datatype:=ftstring 有什麼意思??
麻煩您說明一下.程式方面我很不懂
我試過.加入後好像沒任何變動


===================引 用 BOSS 文 章===================

  1. sql.Clear;
  2. sql.Add('select distinct T.BOM_NO,T.PRD_NO,T.NAME,U.UNIT,T.QTY,U.PRD_KND,U.USEIN_NAME');
  3. sql.Add(' from TF_BOM AS T,TF_UKS AS U, MF_BOM AS M ');
  4. sql.Add(' where T.BOM_NO=:BOM_NO');
  5. Parameters.ParamByName('BOM_NO').datatype:=ftstring
  6. Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
  7. close;
  8. open;
  9. first;
  10. while not adoTFB.Eof do
  11. begin
  12. treeview1.Items.AddChild(newnode,adoTFB.fieldbyname('PRD_NO').value);
  13. next;
  14. end;
  15. end;
------
Wa
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-03-16 18:07:49 IP:122.116.xxx.xxx 未訂閱

您的程式片段 :
with adoTFB do begin
sql.Clear;
sql.Add('select distinct T.BOM_NO,T.PRD_NO,T.NAME,U.UNIT,T.QTY,U.PRD_KND,U.USEIN_NAME');
sql.Add(' from TF_BOM AS T,TF_UKS AS U, MF_BOM AS M ');
sql.Add(' where T.BOM_NO=:BOM_NO');
Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
其中 sql.Add(' where T.BOM_NO=:BOM_NO'); 是說 這一個 sql statement 有參數, 名為 bom_no (用 : 帶頭的就是 sql 的參數)
而 Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
就是 給這個參數值

我建議的解法是不要寫 sql.Add(' where T.BOM_NO=:BOM_NO'); 這一句
這樣就沒有參數, 所以 Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
也不用寫,
直接改成給值的語法
sql.Add(' where T.BOM_NO=''' copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2) ''''); <---注意單引號的數目

或是在 designtime 就把
select distinct T.BOM_NO,T.PRD_NO,T.NAME,U.UNIT,T.QTY,U.PRD_KND,U.USEIN_NAME
from TF_BOM AS T,TF_UKS AS U, MF_BOM AS M
where T.BOM_NO=:BOM_NO
寫進 adoTFB 的 sql 屬性中, delphi 會幫您建 bom_no 這個參數,
這樣, 您的程式就改成
with adoTFB do begin
close;
Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
open;
... (以下照原程式, 沒改)


就可以了

提醒一下, delphi 中 // 代表註解, 也就是不會 compile 的句子, 這您知道吧.
Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
這一句是您寫的, 不是我.


===================引 用 boss1215 文 章===================
TO st33chen
不好意思~我不太懂你的意思.
請問一下..Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
這行Code有什麼意思??

------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2009-03-16 18:10:58, 註解 無‧
st33chen 重新編輯於 2009-03-16 18:13:40, 註解 無‧
st33chen 重新編輯於 2009-03-16 18:15:08, 註解 無‧
st33chen 重新編輯於 2009-03-16 18:16:47, 註解 無‧
boss1215
一般會員


發表:6
回覆:10
積分:3
註冊:2009-03-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-03-19 17:39:39 IP:211.72.xxx.xxx 訂閱
to st33chen 大大
非常感謝你花了時間說明給我...讓我多懂一些了
我先試著修改看看

===================引 用 st33chen 文 章===================

您的程式片段 :
with adoTFB do begin
sql.Clear;
sql.Add('select distinct T.BOM_NO,T.PRD_NO,T.NAME,U.UNIT,T.QTY,U.PRD_KND,U.USEIN_NAME');
sql.Add(' from TF_BOM AS T,TF_UKS AS U, MF_BOM AS M ');
sql.Add(' where T.BOM_NO=:BOM_NO');
Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
其中 sql.Add(' where T.BOM_NO=:BOM_NO'); 是說 這一個 sql statement 有參數, 名為 bom_no (用 : 帶頭的就是 sql 的參數)
而 Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
就是 給這個參數值

我建議的解法是不要寫 sql.Add(' where T.BOM_NO=:BOM_NO'); 這一句
這樣就沒有參數, 所以 Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
也不用寫,
直接改成給值的語法
sql.Add(' where T.BOM_NO=''' copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2) ''''); <---注意單引號的數目

或是在 designtime 就把
select distinct T.BOM_NO,T.PRD_NO,T.NAME,U.UNIT,T.QTY,U.PRD_KND,U.USEIN_NAME
from TF_BOM AS T,TF_UKS AS U, MF_BOM AS M
where T.BOM_NO=:BOM_NO
寫進 adoTFB 的 sql 屬性中, delphi 會幫您建 bom_no 這個參數,
這樣, 您的程式就改成
with adoTFB do begin
close;
Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
open;
... (以下照原程式, 沒改)


就可以了

提醒一下, delphi 中 // 代表註解, 也就是不會 compile 的句子, 這您知道吧.
Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
這一句是您寫的, 不是我.


===================引 用 boss1215 文 章===================
TO st33chen
不好意思~我不太懂你的意思.
請問一下..Parameters.ParamByName('BOM_NO').value:=copy(adoMFB.fieldbyname('BOM_NO').asstring,1,2);
這行Code有什麼意思??
------
Wa
系統時間:2024-05-07 21:58:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!