2016-06-14 1 views
1

송장에 대한 리포트가 있습니다. 것은 데이터베이스에 저장하기 전에 미리보기를 위해 보고서를 표시해야한다는 것입니다. 이를 위해 TfrxDBDatasets에서 FastReport로 전달하는 모든 데이터를 TVirtualTables에 저장했습니다. 하지만 저축 후에는 데이터베이스에서 직접 필요한 모든 데이터를 가져오고 싶습니다. 이를 위해 내부 연결 및 데이터 집합이 있습니다. 해당 데이터 세트간에 전환하는 방법은 무엇입니까?FastReport, Delphi XE7 - 내부 및 외부 데이터 집합을 동시에 사용하는 방법

보고서가 Delphi 응용 프로그램에서 전달 된 TfrxDBDatasets의 데이터를 사용해야한다는 것을 의미합니다. 또는 일부 조건에 따라 응용 프로그램에서 전달 된 TfrxDBDatasets를 사용하지 않고 데이터베이스에서 직접 필요한 모든 데이터를 내부적으로 FastReport 보고서에서 가져와야합니다.

답변

1

당신은

procedure Clear; 

부하 다른 보고서

function LoadFromFile(const FileName: String ; ExceptionIfNotFound: 

Boolean = False): Boolean; 

명확한 보고서를 다른 보고서 (정의 된 데이터베이스 테이블과 사실 같은)를 정의하고 런타임에로드 할 수

가능성이 있습니까?

+0

인보이스에 대한 보고서는 다소 복잡합니다. 필자가해야 할 일이 없으면 두 배로 늘리지 않을 것입니다. –

+0

정확한 동일한 보고서 파일의 복사본을 만들어 디자이너에서 열 수 있습니다. 그런 다음 데이터 세트를 지정하고 저장하십시오. 그래도 두 파일을 모두 유지해야합니다 ... – rocksteady

1

당신이 몇 aproaches이, 하나는 TVirtualTable에 데이터베이스에서 TVirtualTable 또는 지정 데이터 이외의 다른 TfrxDBDataset 의 .DATA/.DataSource 속성을 변경 :

FDQueryThis.Data := FDQueryOther.Data; 

이 FireDac 예하지만 난입니다

VirtualTable1.Assign(UniQuery1); 

감사

,691 : Devart이를 acheve하는 .Assign 방법을 가지고 있다고 생각합니다
+0

응답 해 주셔서 감사합니다.하지만 여전히 델파이 애플리케이션 측에서 처리하고 있습니다. 나는 FastReport 측에서 그것을하기위한 해결책이 필요했다. 그 보고서는 데이터 세트, fileds 등에 관해서 아무것도 모르는 다른 프로그램에 의해 사용될 것이다. 그것은 데이터베이스를위한 ID와 연결 문자열을 알고있을 것이다. 어쩌면 제 질문이 구체적이지 않았을 수도 있습니다. –

+0

글쎄 사실 당신은 원래의 질문에 그 정보를 넣지 않았다 :) 그 경우에는 데이터베이스 컨트롤에 내장 된 FastReport를 사용합니다. – Vancalar

1

응답 해 주셔서 감사합니다. 나는 그것을 스스로하기로 결심했다. 그리고 그 해결책을 생각해 냈습니다 : 델파이 폼의 구성 요소 : TfrxADOComponents, TfrxDBDataset (테이블이나 쿼리에 "Dataset"속성 설정), TfsScript, TfsPascal. 두 개의 버튼 (TfrxDBDataset에서 데이터를 받고 두 번째 FastReport 스크립트 내부 데이터를 얻기위한 하나)에 대한

코드 : ADODatabase과 ADOQuery : 시트 "데이터"에 FastReport 디자이너에서 지금

procedure TForm2.BtnFromVirtualTablesClick(Sender: TObject); 
begin 
    frxReport1.PreviewOptions.Maximized := true; 
    frxReport1.PreviewOptions.Modal := true; 
    frxReport1.LoadFromFile('d:\fastrep\testdanychazaVirtual.fr3'); 
    frxReport1.Variables['id']:='''0'''; 
    frxReport1.Variables['ConnStr']:=''''''; 

    frxReport1.PrepareReport(); 
    frxReport1.ShowPreparedReport(); 
end; 

procedure TForm2.BtnFromDatabaseClick(Sender: TObject); 
begin 
    frxReport1.PreviewOptions.Maximized := true; 
    frxReport1.PreviewOptions.Modal := true; 
    frxReport1.LoadFromFile('d:\fastrep\testVirtual.fr3'); 
    frxReport1.Variables['id']:='''1'''; 
    frxReport1.Variables['ConnStr']:=''''+ 
    'Provider=SQLOLEDB.1;Persist Security Info=True;Initial Catalog='+MSConnection.Database+';'+ 
    'Data Source='+MSConnection.Server+';User Id='+MSConnection.Username+ 
    ';Password='+MSConnection.Password+''''; 
    frxReport1.PrepareReport(); 
    frxReport1.ShowPreparedReport(); 
end; 

을 우리는 두 가지 구성 요소가 필요합니다 . 해당 ADOQuery에 필요한 모든 열을 가져 오려면 데이터베이스에 대한 적절한 연결을 설정하고 쿼리를 열어야합니다. fastreport가 필요한 모든 열을 가져올 때 - ADODatabase1.DatabaseName 속성과 ADOQuery1.Database 속성을 지우십시오. 이러한 속성은 "frxReport1OnStartReport"이벤트의 스크립트에 채워 져야합니다. 그렇지 않은 경우 - 데이터베이스에 대한 연결을 찾을 수 없다는 오류가 발생합니다.

보고서에 ID, ConnStr이라는 두 개의 변수가 필요합니다 (보고서 -> 변수에 추가). -이 기본 설정됩니다 마스터 밴드를 추가하고 두 메모를 배치하고 TfrxDBDataset에 연결된 테이블에 연결 보고서에

procedure frxReport1OnStartReport(Sender: TfrxComponent); 
begin    
if <ID><>'0' then        
begin 
    ADODatabase1.databaseName:=<ConnStr>; 
    ADODatabase1.connected:=true; 
    ADOQuery1.database:=ADODatabase1;          
    ADOQuery1.open; 
    masterData1.dataset:=ADOQuery1;  
    memo1.memo.text:='[ADOQuery1."id"]'; 
    memo2.memo.text:='[ADOQuery1."name"]'; 
    end; 
end; 

begin 

end. 

:

여기 FastReport 파스칼 스크립트입니다.

해당 솔루션을 사용하면 만든 프로그램에서 FastReport * .fr3 파일을 사용할 수 있습니다. ID 및 연결 문자열을 가져와야합니다. 또는 필요한 데이터로 채워진 데이터 집합을 전달할 수 있습니다.

관련 문제