如何切換Crystal Report 的DataBase |
尚未結案
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
hahalin
版主 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
|
crispin2k
初階會員 發表:7 回覆:42 積分:33 註冊:2002-07-24 發送簡訊給我 |
CrystalReport可以動態切換資料庫及資料表沒有問題,例如您有10家廠商,分別放在不同的資料庫(SQL Server及Access等資料庫均可),此時你可以利用程式透過ActiveX及VCL提供的功能切換資料庫,動態切換報表對應的資料庫來列印報表,這樣就可以達到一份報表給n家廠商使用的目的。 想找一下當初的資料給您,不過用了FastReport之後,已經很久沒用CrystalReport了,我再找一下NoteBook看看,若找到之前為某家資訊公司上課的資料,再傳給你。 發表人 - crispin2k 於 2003/11/29 10:33:41
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
不好意思~~最近忙了沒時間回應,
感謝兩位前輩熱心指導,
我有去試過動態Create ODBC但是列印的資料還是原來報表所指向的資料庫耶?? //自動建立ODBC
function TForm1.CreateClientODBC: boolean;
var
Reg: TRegistry;
DataSourceName, DataBaseName, ServerName: string;
begin
DataSourceName:='DB1';
DataBaseName:='DB1';
ServerName:='SQL1'; Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey('\Software\ODBC\', True) then
begin
Reg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', True);
Reg.WriteString(DataSourceName,'SQL Server');
Reg.OpenKey('\Software\ODBC\ODBC.INI\' DataSourceName, True);
Reg.WriteString('DataBase', DataBaseName);
Reg.WriteString('Driver', 'C:\WINNT\System32\SQLSRV32.dll');
Reg.WriteString('LastUser', 'sa');
Reg.WriteString('PassWord', 'xx');
Reg.WriteString('Server', ServerName);
end;
Reg.CloseKey;
Reg.Free;
Result:=true;
except
Result:=false;
end;
end;
------
ivankuo |
hahalin
版主 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
hahalin
版主 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
hahalin
版主 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
我的報表是用command去下的,我有將SQL那段都抓出來,直接改變他的DB1改為DB2,結果資料還是顯示出DB1的,很奇怪耶 SELECT "T7026"."F001", "T7026"."F005", "T7026"."F003", "T7026"."F004", "T7026"."F079_R", "T7026"."F080_R", "T7026"."F009", "T7026"."F010", "T7026"."F011", "T7026"."F012", "T7026"."F013", "T7026"."F006", "T7026"."F007", "T7026"."F008", "T7026"."F002"
FROM "DB2"."dbo"."T7026" "T7026"
ORDER BY "T7026"."F001"
------
ivankuo |
hahalin
版主 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
crispin2k
初階會員 發表:7 回覆:42 積分:33 註冊:2002-07-24 發送簡訊給我 |
關於此一問題,我終於找到當初某家ERP軟體公司向我詢問此一問題的解答,請連接至我的討論區(http://www.jane.com.tw),然後搜尋"[CrystalReport]的特異功能"即可找到解答,這個範例是使用SQL Server,也就是說使用SQL Server也可以動態切換資料表。此一功能我們公司在VB 2.0的時候就已經在使用,當時是使用ActiveX的介面,而這次呢? 我們發表的是VCL介面。 自從我使用Delphi FastReport以後,CrystalReport就很少使用了,不過我們公司可以說是全國最早使用CrystalReport的單位之一,而且用到的功能非常的深入,原因之一是當初我的組原有一位留美的碩士,原文的手冊都是她K的,然後再由內部教育訓練教導其他的組員,目前這位美女呢? 現在在某科技大學任教,不過她已經結婚了喔!
|
hahalin
版主 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
|
hahalin
版主 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
1.根據小弟前去搜尋的結果,發現與小弟建議的方式相似,不過,如果以 Crpe1.Tables.Retrieve; 的方式只能夠在cr的資料庫來源是table的情況才能使用,至於cr還能以sql server中的view或是stored procedure,就不敷使用了,所以動態切換還是以
crpe1.SQL.Retrieve;
crpe1.SQL.Query.Text:='...'; 的方式比crpe1.tables.retrieve的方式彈性較大,至於cr的vcl元件中則也提供了TCrpeDs可以指定tdataset的來源,根本不用這種要接收報表設定資訊然後run-time修改的方式. 要觀眾轉台去收看貴站,最好也自己做好功課再回答,至於又在貴站該篇post又發現所謂的: "當初我們公司就是由一位留美的閱讀Help後教大家的,所以我們得到的都是一手的資料,當初的文件目前還在我的手上呢" 所謂的看help應該算是programmer的基本功吧,不是只有所謂"留美"才看得懂help. 這個版小弟有一定的管轄權,下次如果發現這種只要觀眾轉檯不擇手段的將會有 "特別"的處置 必要的時候可以增修專屬閣下的專門條款.
|
No-where
一般會員 發表:31 回覆:53 積分:16 註冊:2002-09-05 發送簡訊給我 |
|
No-where
一般會員 發表:31 回覆:53 積分:16 註冊:2002-09-05 發送簡訊給我 |
|
crispin2k
初階會員 發表:7 回覆:42 積分:33 註冊:2002-07-24 發送簡訊給我 |
引言: 1.根據小弟前去搜尋的結果,發現與小弟建議的方式相似,不過,如果以 Crpe1.Tables.Retrieve; 的方式只能夠在cr的資料庫來源是table的情況才能使用,至於cr還能以sql server中的view或是stored procedure,就不敷使用了,所以動態切換還是以 crpe1.SQL.Retrieve; crpe1.SQL.Query.Text:='...'; 的方式比crpe1.tables.retrieve的方式彈性較大,至於cr的vcl元件中則也提供了TCrpeDs可以指定tdataset的來源,根本不用這種要接收報表設定資訊然後run-time修改的方式. 要觀眾轉台去收看貴站,最好也自己做好功課再回答,至於又在貴站該篇post又發現所謂的: "當初我們公司就是由一位留美的閱讀Help後教大家的,所以我們得到的都是一手的資料,當初的文件目前還在我的手上呢" 所謂的看help應該算是programmer的基本功吧,不是只有所謂"留美"才看得懂help. 這個版小弟有一定的管轄權,下次如果發現這種只要觀眾轉檯不擇手段的將會有 "特別"的處置 必要的時候可以增修專屬閣下的專門條款.一、CrystalReport在報表定義完成的時候,擷取資料的動作會由CRPE自動完成,所以並不一定需要再透過外部的資料提供,當然下SQL指令餵資料的動作也是多此一舉,但是為什麼VCL會提供此一功能呢? 無非是提供程式設計師多一點的控制,但是若真正討論在程式中下達SQL指令,你認為會比較好嗎? 我們舉個例子,若報表增加一個欄位的時候,在你的做法裡面,程式設計師要做什麼工作呢? 1.修改報表 2.修改程式中的SQL指令 3.重新分發你的程式 但是使用改變資料表的方式,只需下列的動作: 1.修改報表 2.分發報表 其中,分發報表只需數KB或數十KB就可以了,優劣立見。 二、之前提到留美碩士的事,可能我沒說清楚,主要我要表達的意思是現在程式設計的工作相當複雜,有些事是可以專業分工的,由適當的人做適當的事,然後透過教育訓練分享給大家(知識分享),這樣工作效率不是比較好嗎? 其實沒有任何炫耀之意,但是每個人的解讀不同,沒想到你的反應這麼大,真歹勢! 三、沒貼上程式碼與大家分享真抱歉,當初想法是網站已經討論過了,告訴大家多利用搜尋的方式檢索已經討論過的主題,這樣不是很好嗎? 若問過的問題隔一段時間又出現,這都非你我所願意看見的,所以利用此作檢索的教育訓練不是很好嗎? 凡是往好處想不是很好嗎? 何必生這麼大的氣呢? |
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
hahalin
版主 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
小弟更新了CR9的Service Pack 版本為9.2.3.787,目前還是一樣的問題??
難道就如crispin2k前輩所說的﹝下SQL指令餵資料的動作也是多此一舉﹞,這是真的嗎??這樣無法改變其SQL耶 小弟採用TCrpeDs來處理的時候,發現其DataSet的屬性只能用在TTable,用其他DataSet則不能使用,不知是我用法錯誤還是.........請前輩們在指導。 var
Table1 : TTable;
begin
Crpe1.ReportName := 'c:\company.rpt';
CrpeDS1.DataSet := Table1; {the field types must be in the correct order}
Crpe1.Tables[0].DataPointer := CrpeDS1.DataPointer;
Crpe1.Show;
end;
------
ivankuo |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |