frxReport 怎麼取得 FrxDBDataSet 的過濾後的資料? |
尚未結案
|
tokiama
一般會員 發表:34 回覆:60 積分:23 註冊:2009-04-19 發送簡訊給我 |
在發表這一篇之前,曾經問過相關的問題,雖然這次問題跟上一次差不多,但是照上次的寫法後面問題很多...
而且...找不到上次所寫的程式... 所以再次來尋求前輩的專業正確教導。 把 frxDBdataset 的 DataSet 指到要的 ADOTable 達成連結。 由 ADOtTable 篩選記錄後, frxDBdataset 不是應該會取得篩選後的資料嗎? 可是...我預覽列印後並沒有取得資料,請問一下前輩們知道原因? [code delphi] procedure TForm1.FormCreate(Sender: TObject); begin ADOConnection1.ConnectionString:= 'Provider=Microsoft.Jet.OLEDB.4.0;' 'Data Source=' GetCurrentDir '\日記帳.mdb;' 'Persist Security Info=False'; ADOConnection1.LoginPrompt:=False; ADOConnection1.Open; ADOTable1.Connection:=ADOConnection1; ADOTable1.TableName:='日記帳'; ADOTable1.Open; DataSource1.DataSet:=ADOTable1; DBGrid1.DataSource:=DataSource1; ADOTable1.Filtered:=True; ADOTable1.Filter:='日期 = ''' Edit1.Text ''''; end; procedure TForm1.Button1Click(Sender: TObject); begin frxReport1.Clear; frxReport1.LoadFromFile(GetCurrentDir '\日記帳.fr3'); frxReport1.PrepareReport(); frxReport1.ShowReport(); end; [/code] |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
tokiama
一般會員 發表:34 回覆:60 積分:23 註冊:2009-04-19 發送簡訊給我 |
感謝前輩,找到原因了,是 frxDBdataset 在接收 ADOTable 資料中的問題。
frxDBdatase在指向 ADOTable 的問題。 可是後面確變成了,我只能接收一次資料說,之後在怎麼過慮還是顯示第一次過慮出來的資料說。 請問一下這問題是我值沒清掉?是用 frxDBDataset.Clear 嗎? ===================引 用 P.D. 文 章=================== 從你po的code來判斷, 你有把 ADOTable 指向你設置的 frxDBdataset.dataset 中嗎? 否則你說的情況在fr中是不可能發生的,只要你的ADOTable有正確的濾出資料(請先確認) |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
tokiama
一般會員 發表:34 回覆:60 積分:23 註冊:2009-04-19 發送簡訊給我 |
ADOTable 用 Filtered 來過慮資料,然後 frxDBDataset 的 Dataset 屬性指向 ADOTable 然後,frxReport 就可以得到過慮後資料。
然後以後只要改變 Fitered 就可以改變挑選的資料。 以上的觀念對嗎? 現在我遇到的問題是我沒觸發過慮條件的那段程式碼,直接觸發預覽列印的那段程式碼。 顯示的結果是我之前用過的過慮條件,那結果還是上次開起程式所輸入的過慮條件。 請問一下前輩,那過慮後的結果是不是會被某個東西記起來? fr3檔? >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>分格線 有新的發現...重新在檢查了一次,發現我過慮的條件是寫在 fr3 檔裡的 ADOTable 裡。 而不是 Delphi 裡表單上的 ADOTable ,所以不管我怎麼用才沒反應。 所以又退回原點了...請問下 P.D.前輩您說的 ADOTable 是指 fr3 裡的 ADOTable 嗎? ===================引 用 P.D. 文 章=================== frxDBDataset 只是一個很單純的介面, 把你程式原生的dataset 指向 fr 的 dataset, 再指向給 frxReport 連結到報表, 所以我認為一切的問題還是在於你原生的 ADOTable, 請朝這方向去找bug!
編輯記錄
tokiama 重新編輯於 2011-01-14 02:03:13, 註解 無‧
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
tokiama
一般會員 發表:34 回覆:60 積分:23 註冊:2009-04-19 發送簡訊給我 |
問一下,我這樣理解對不對:
要做到挑出部份資料來列印要用到五個原件如下。 ADOConnection 、 ADOTable 、 DataSource 、 frxADOComponents 、 frxReport 、frxDBDataset 。 ADOConnection 是用來連接資料庫的, frxADOComponents 則是讓 fr3 檔連上資料庫用的。 連上資料庫後,用 ADOTable 來連接資料表並對資料做新增、刪除、修改等等, DataSource 則是將資料顯示到其他原件上。 frxDBDataset 的功用與 DataSource 功用相似,只是是把資料傳給 frxReport , frxReport 則從 fr3 檔取得排版。 接著把 frxDBDataset 傳過來的料填入 fr3 檔的排版裡印出來? 這樣的關念對嗎? ===================引 用 P.D. 文 章=================== 把fr3 檔裡的 ADOTable FILTER 改回到 DELPHI中再試試看吧! 我一直強調的, 把 FR 的 DATASET 當成一個最簡單的中介就好了 |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
tokiama
一般會員 發表:34 回覆:60 積分:23 註冊:2009-04-19 發送簡訊給我 |
有實作,可是做出來的結果都跟別人說的不一樣,這時常讓我想到是不是方向走錯了。 ←經常發生
下面就是看完別人教導後寫出來的東西。↓ [code delphi] procedure TForm1.FormCreate(Sender: TObject); begin //--------------------------------------------------------------------資料庫連線 ADOConnection1.ConnectionString:= 'Provider=Microsoft.Jet.OLEDB.4.0;' 'Data Source=' GetCurrentDir '\日記帳.mdb;' 'Persist Security Info=False'; ADOConnection1.LoginPrompt:=False; ADOConnection1.Open; ADOTable1.Connection:=ADOConnection1; ADOTable1.TableName:='日記帳'; ADOTable1.Open; DataSource1.DataSet:=ADOTable1; DBGrid1.DataSource:=DataSource1; //------------------------------------------------------------------------------ ADOTable1.sort:='日期 ASC'; // 欄位名稱 升序排列ASC 降序排列DESC 皆大寫 ShortDateFormat:='yyyy-MM-dd'; //設定日期顯示格式為yyyy-MM-dd DateTimePicker1.Date:=Now; DateTimePicker2.Date:=Now; frxDBDataset1.DataSet:=ADOTable1; frxReport1.DataSet:=frxDBDataset1; end; procedure TForm1.Button1Click(Sender: TObject); var FilterString: string; begin if RadioGroup1.ItemIndex<>0 then FilterString:=RadioGroup1.Items.Strings[RadioGroup1.ItemIndex] '>(0) and '; if Edit1.Text<>'' then FilterString:='事項 = ''' Edit1.Text ''' and '; FilterString:=FilterString '日期 >= ' DateToStr(DateTimePicker1.Date) ' and 日期 <= ' DateToStr(DateTimePicker2.Date); ADOTable1.Filtered:=True; ADOTable1.Filter:=FilterString; end; procedure TForm1.Button2Click(Sender: TObject); begin frxReport1.Clear; frxReport1.LoadFromFile(GetCurrentDir '\日記帳.fr3'); frxReport1.ShowReport(); end; [/code] ===================引 用 P.D. 文 章=================== 你是否實作過, 針對你所提出的問題? 我個人認為 懷疑->實作->求證->確認->提問->解決->實作.... 這是學習的不二法門 依樓主的討論看下來, 並不是在於不會設計, 而是缺乏實作實證的動作, |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
你要不要嘗試改用 adoquery 來實作
其實與adotable 很類似 只要把button1 中 filterstring 改到 adoquery 中即可 ShortDateFormat:='yyyy-MM-dd'; //設定日期顯示格式為yyyy-MM-dd ADOConnection1.ConnectionString:= ... 這段不變 ADOquery1.Connection:=ADOConnection1; ADOquery1.SQL.Text:= 'select * from 日記帳 order by 日期 ASC'; DataSource1.DataSet:=ADOuyer1; DBGrid1.DataSource:=DataSource1; //------------------------------------------------------------------------------ DateTimePicker1.Date:=Now; DateTimePicker2.Date:=Now; frxReport1.DataSet:=frxDBDataset1; frxDBDataset1.DataSet:=ADOQuery1; end; procedure TForm1.Button1Click(Sender: TObject); var FilterString: string; begin if RadioGroup1.ItemIndex<>0 then FilterString:=RadioGroup1.Items.Strings[RadioGroup1.ItemIndex] '>(0) and '; if Edit1.Text<>'' then FilterString:='事項 = ''' Edit1.Text ''' and '; FilterString:=FilterString '日期 >= ' DateToStr(DateTimePicker1.Date) ' and 日期 <= ' DateToStr(DateTimePicker2.Date); ADOQuery.Close; ADOQuery1.SQL.Text= 'select * from 日記帳 where ' FilterString ' order by 日期' ADOquery1.Open; end; ==============引 用 tokiama 文 章=================== 有實作,可是做出來的結果都跟別人說的不一樣,這時常讓我想到是不是方向走錯了。 ←經常發生 下面就是看完別人教導後寫出來的東西。↓ [code delphi] procedure TForm1.FormCreate(Sender: TObject); begin //--------------------------------------------------------------------資料庫連線 ? ADOConnection1.ConnectionString:= ??? 'Provider=Microsoft.Jet.OLEDB.4.0;' ??? 'Data Source=' GetCurrentDir '\日記帳.mdb;' ??? 'Persist Security Info=False'; ? ADOConnection1.LoginPrompt:=False; ? ADOConnection1.Open; ? ADOTable1.Connection:=ADOConnection1; ? ADOTable1.TableName:='日記帳'; ? ADOTable1.Open; ? DataSource1.DataSet:=ADOTable1; ? DBGrid1.DataSource:=DataSource1; //------------------------------------------------------------------------------ ? ADOTable1.sort:='日期 ASC'; // 欄位名稱 升序排列ASC 降序排列DESC 皆大寫 ? ShortDateFormat:='yyyy-MM-dd'; //設定日期顯示格式為yyyy-MM-dd ? DateTimePicker1.Date:=Now; ? DateTimePicker2.Date:=Now; ? frxDBDataset1.DataSet:=ADOTable1; ? frxReport1.DataSet:=frxDBDataset1; end; procedure TForm1.Button1Click(Sender: TObject); var FilterString: string; begin ? if RadioGroup1.ItemIndex<>0 then FilterString:=RadioGroup1.Items.Strings[RadioGroup1.ItemIndex] '>(0) and '; ? if Edit1.Text<>'' then FilterString:='事項 = ''' Edit1.Text ''' and '; ? FilterString:=FilterString '日期 >= ' DateToStr(DateTimePicker1.Date) ' and 日期 <= ' DateToStr(DateTimePicker2.Date); ? ADOTable1.Filtered:=True; ADOTable1.Filter:=FilterString; end; procedure TForm1.Button2Click(Sender: TObject); begin ? frxReport1.Clear; ? frxReport1.LoadFromFile(GetCurrentDir '\日記帳.fr3'); ? frxReport1.ShowReport(); end; [/code] ===================引 用 P.D. 文 章=================== 你是否實作過, 針對你所提出的問題? 我個人認為 懷疑->實作->求證->確認->提問->解決->實作.... 這是學習的不二法門 依樓主的討論看下來, 並不是在於不會設計, 而是缺乏實作實證的動作,
編輯記錄
P.D. 重新編輯於 2011-01-18 03:52:53, 註解 無‧
|
tokiama
一般會員 發表:34 回覆:60 積分:23 註冊:2009-04-19 發送簡訊給我 |
嘗試過,但在篩選階段就會出錯,原因是SQL子句錯誤。
原因是下面這句。 [code delphi] FilterString:='select * from 日記帳 where 日期 between ''' '2010-11-01''' ' and ' '''2010-11-30'''; [/code] 用 ADOQuery 我很常出現這問題。 為了確保我 SQL 沒錯 select * from 日記帳 where 日期 between '2010-11-01' and '2010-11-30' 我有貼到Access 裡去試過。 是可以執行的,放到 Delphi 裡卻不行。 Compile 沒問題,可是執行那行程式碼會出錯,至今找不出原因,有哪位前輩知道我哪裡弄錯了?或是漏了甚麼? ===================引 用 P.D. 文 章=================== 你要不要嘗試改用 adoquery 來實作 其實與adotable 很類似 只要把button1 中 filterstring 改到 adoquery 中即可 ShortDateFormat:='yyyy-MM-dd'; //設定日期顯示格式為yyyy-MM-dd ADOConnection1.ConnectionString:= ... 這段不變 ADOquery1.Connection:=ADOConnection1; ADOquery1.SQL.Text:= 'select * from 日記帳 order by 日期 ASC'; DataSource1.DataSet:=ADOuyer1; DBGrid1.DataSource:=DataSource1; //------------------------------------------------------------------------------ DateTimePicker1.Date:=Now; DateTimePicker2.Date:=Now; frxReport1.DataSet:=frxDBDataset1; frxDBDataset1.DataSet:=ADOQuery1; end; procedure TForm1.Button1Click(Sender: TObject); var FilterString: string; begin if RadioGroup1.ItemIndex<>0 then FilterString:=RadioGroup1.Items.Strings[RadioGroup1.ItemIndex] '>(0) and '; if Edit1.Text<>'' then FilterString:='事項 = ''' Edit1.Text ''' and '; FilterString:=FilterString '日期 >= ' DateToStr(DateTimePicker1.Date) ' and 日期 <= ' DateToStr(DateTimePicker2.Date); ADOQuery.Close; ADOQuery1.SQL.Text= 'select * from 日記帳 where ' FilterString ' order by 日期' ADOquery1.Open; end;
編輯記錄
tokiama 重新編輯於 2011-01-18 23:03:25, 註解 無‧
|
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
不管是 ADOTable1.Filter 還是 ADOQuery1.Filter
這東西我還從來不知道可以放SQL指令 或許是我孤陋寡聞 但我印象中都是拿來做篩選資料用的 怎麼會是下SQL指令.... 就連你的Button1Click中的ADOTable1.Filter 也都是下篩選的方式 怎麼會到最後卻又變成是下SQL指令咧: FilterString:='select * from 日記帳 where 日期 between ''' '2010-11-01' ' and ' '''2010-11-30'''; 因為又還沒運行程式 此時只是編譯程式 假如有語法上的錯誤才會出現錯誤訊息 所以在Compile 當然不會錯 當程式真正運行的時候才會有錯誤 ===================引 用 tokiama 文 章=================== 嘗試過,但在篩選階段就會出錯,原因是SQL子句錯誤。 原因是下面這句。 [code delphi] FilterString:='select * from 日記帳 where 日期 between ''' '2010-11-01''' ' and ' '''2010-11-30'''; [/code] 用 ADOQuery 我很常出現這問題。 為了確保我 SQL 沒錯 select * from 日記帳 where 日期 between '2010-11-01' and '2010-11-30' 我有貼到Access 裡去試過。 是可以執行的,放到 Delphi 裡卻不行。 Compile 沒問題,可是執行那行程式碼會出錯,至今找不出原因,有哪位前輩知道我哪裡弄錯了?或是漏了甚麼?
編輯記錄
老大仔 重新編輯於 2011-01-18 23:13:11, 註解 無‧
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
老大仔可能看錯回帖
樓主使用的是ADOtable.filter , 這一類的做法常會引發過濾時機的問題, 所以我才回帖請樓主改用 ADOquery.SQL 方式來直接過濾, 所以 ADOquery 並不是用filter 來做的 filter 的用法必須是在Table 開啟的狀況下才有效, 當table.close 時, 設定 filter 是沒有用的, 而 sql.text 剛好相反, 必須在query 關閉下重新指定sql語法, 再重新open才會進行過濾, 但這是萬無一失的做法 ===================引 用 老大仔 文 章=================== 不管是 ADOTable1.Filter 還是 ADOQuery1.Filter 這東西我還從來不知道可以放SQL指令 或許是我孤陋寡聞 但我印象中都是拿來做篩選資料用的 怎麼會是下SQL指令.... 就連你的Button1Click中的ADOTable1.Filter 也都是下篩選的方式 怎麼會到最後卻又變成是下SQL指令咧: FilterString:='select * from 日記帳 where 日期? between ''' '2010-11-01' ' and ' '''2010-11-30'''; 因為又還沒運行程式 此時只是編譯程式 假如有語法上的錯誤才會出現錯誤訊息 所以在Compile 當然不會錯 當程式真正運行的時候才會有錯誤 |
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
哈哈 可能吧
但~ P.D. 大大 您的SQL指令是指向給ADOxxx.SQL.Text 但tokiama 應該是把SQL指令指向到ADOxxxx.Filter 所以才出錯XD 我是這個意思>"< 不是這樣子嗎@@? ===================引 用 P.D. 文 章=================== 老大仔可能看錯回帖 樓主使用的是ADOtable.filter , 這一類的做法常會引發過濾時機的問題, 所以我才回帖請樓主改用 ADOquery.SQL 方式來直接過濾, 所以 ADOquery 並不是用filter 來做的 filter 的用法必須是在Table 開啟的狀況下才有效, 當table.close 時, 設定 filter 是沒有用的, 而 sql.text 剛好相反, 必須在query 關閉下重新指定sql語法, 再重新open才會進行過濾, 但這是萬無一失的做法 ===================引 用 老大仔 文 章=================== 不管是 ADOTable1.Filter 還是 ADOQuery1.Filter 這東西我還從來不知道可以放SQL指令 或許是我孤陋寡聞 但我印象中都是拿來做篩選資料用的 怎麼會是下SQL指令.... 就連你的Button1Click中的ADOTable1.Filter 也都是下篩選的方式 怎麼會到最後卻又變成是下SQL指令咧: FilterString:='select * from 日記帳 where 日期? between ''' '2010-11-01' ' and ' '''2010-11-30'''; 因為又還沒運行程式 此時只是編譯程式 假如有語法上的錯誤才會出現錯誤訊息 所以在Compile 當然不會錯 當程式真正運行的時候才會有錯誤 |
tokiama
一般會員 發表:34 回覆:60 積分:23 註冊:2009-04-19 發送簡訊給我 |
我有改,那地方。
ADOQuery1.SQL.Text 改成了 ADOQuery1.SQL.Add( ); 子句問題處裡好了,原因是我不太習慣直接在原件上做設定,都寫在程式裡。 因為這樣,所以以為一開始裡面就沒有值,所以在一開始先清一次就好了。 回到原本的問題,過慮後怪怪的...沒有過慮成我要的結果,可是它也沒有全部資料印出來,有少一兩筆記錄。 (找到原因了,因為一頁顯示的資料筆數的關係,也就是要印的東西超過兩頁,不會跳第二頁。) 嗯?P.D.前輩不是建議我用 ADOQuery 去試試?所以就去試了。 不過過慮兩次好像會出錯。 [code delphi] procedure TForm1.FormCreate(Sender: TObject); begin //--------------------------------------------------------------------資料庫連線 ConnectionPath:= 'Provider=Microsoft.Jet.OLEDB.4.0;' 'Data Source=' GetCurrentDir '\§Þ¨Î.mdb;' 'Persist Security Info=False'; ADOConnection1.ConnectionString:=ConnectionPath; ADOConnection1.LoginPrompt:=False; ADOConnection1.Open; ADOQuery1.Connection:=ADOConnection1; ADOQuery1.SQL.Text:= 'select * from ¤é°O±b order by ¤é´Á ASC'; ADOQuery1.Open; DataSource1.DataSet:=ADOQuery1; DBGrid1.DataSource:=DataSource1; //------------------------------------------------------------------------------ ShortDateFormat:='yyyy-MM-dd'; DateTimePicker1.Date:=Now; DateTimePicker2.Date:=Now; frxDBDataset1.DataSet:=ADOQuery1; frxReport1.DataSet:=frxDBDataset1; end; procedure TForm1.Button1Click(Sender: TObject); var FilterString: string; begin FilterString:=''; if RadioGroup1.ItemIndex<>0 then FilterString:=RadioGroup1.Items.Strings[RadioGroup1.ItemIndex] '>(0) and '; if Edit1.Text<>'' then FilterString:='¨Æ¶µ = ''' Edit1.Text ''' and '; FilterString:=FilterString '¤é´Á between ''' DateToStr(DateTimePicker1.Date) ''' and ''' DateToStr(DateTimePicker2.Date) ''''; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Text:='select * from ¤é°O±b where ' FilterString ' order by ¤é´Á'; ADOQuery1.Open; end; procedure TForm1.Button2Click(Sender: TObject); begin frxReport1.Clear; frxReport1.LoadFromFile(GetCurrentDir '\¤é°O±b.fr3'); frxReport1.ShowReport(); end; [/code] ===================引 用 老大仔 文 章=================== 哈哈 可能吧 但~ P.D. 大大 您的SQL指令是指向給ADOxxx.SQL.Text 但tokiama 應該是把SQL指令指向到ADOxxxx.Filter 所以才出錯XD 我是這個意思>"< 不是這樣子嗎@@? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |