![]() |
Rave Reports Mirror per Event Script
Hallo zusammen,
Ich bin derzeit an einem Projekt dran, bei welchem ich eben nun 2 Reports erstellen muss. Diese beiden Reports gleichen sich bis auf 2 Sachen komplett, deswegen wollt ich dort gern einen mirror einbauen. Frage ist nun, wie setz ich den mirror programmatisch? Ich habe in Delphi eine Abfrage geschrieben, welche abfragt was für eine Reportart das ganze geben soll. Hierbei gibt es die Unterscheidung zwischen kaufmännisch und technisch(KDV und KDT) - wenn KDV in meiner Variablen steht, die ich übrigens per dataset übergebe, soll der Mirror auf die kaufmännische überschrift gehen, bei der technischen eben auf die technische. Mein ansatz wäre dieser:
Delphi-Quellcode:
Text1.Text ging auch nicht, er wirft mir folgende Exception: Error #22 - Unknown Identifier [Text1].
if DS_Aufkfm_REPORTART.AsString='KDT' then
Text1.Mirror := GlobalPage1.Text1; end; die Text1 komponente, die sich ändern soll, liegt auf dem Report in einem Band, welches eben in einer Region liegt, nun weiss ich leider nicht wie ich diese Komponente am besten ansprechen soll. Jemand vieleicht ne ahnung? Lieben Gruß alpha |
Re: Rave Reports Mirror per Event Script
noch keine lösung in sicht und ziemlich dringend!
|
Re: Rave Reports Mirror per Event Script
iam looking for an answer please :>
|
Re: Rave Reports Mirror per Event Script
Einfache Möglichkeit (ohne Mirror) wenn es nur eine Überschrift ist. Übergib den Text als Parameter und zeig diesen in einer Datatext - Komponente an
Delphi-Quellcode:
Wenn das so nicht geht, erkläre ich auch noch den komplizierten Weg.
if DS_Aufkfm_REPORTART.AsString='KDT' then RvProcet1.SetParam('Überschrift', 'gewünschter Text1');
if DS_Aufkfm_REPORTART.AsString='KDV' then RvProcet1.SetParam('Überschrift', 'gewünschter Text2'); |
Re: Rave Reports Mirror per Event Script
Danke erstmal für die Antwort.
Wie lese ich im Rave denn anschließend den Parameter aus? Die Threads rund um SetParam sagen mir grad relativ wenig darüber, da ich ja den Parameter so dann im Delphi programmatisch setze |
Re: Rave Reports Mirror per Event Script
Parameter für die jeweilige Page definieren
(rechtes Seitmenü-> RaveProject->ReportX->PageX->linkes Seitmenü->Parameters->DerNameDesParameters eintragen), DataText auf dem Report platzieren und Param.DerNameDesParameters als DataField zuweisen. Mit der Textzuweisung von Andreas (Überschrift is bei ihm der Parametername) geht das dann wunderbar. Edit: Wobei RvProcet1 wahrscheinlich RvProject1 heißen soll. |
Re: Rave Reports Mirror per Event Script
Also bei mir funktionierts nicht. Weder eine Exception noch irgend ein Text krieg ich hier.
Sprich das Feld bleibt einfach Leer. Nebenbei erzeuge ich alles was mit Rave zu tun hat im Code ohne die grafischen Elemente, was für mich auch bedeutet dass ich auf die Daten während das Programm nicht läuft auch nicht zugreifen kann. Sprich Design-Time ist tabu. Ich glaub ich versuch das ganze mal über datasets zusammenzuwurschteln, so wie ichs mit dem meißten anderen auch gemacht hab, wenns nicht anders geht. Gruß Edit: das mit dem RvProject ist schon berücksichtigt |
Re: Rave Reports Mirror per Event Script
Hm, die Reports selbst hab ich noch nie zur Laufzeit erzeugt.
Geht das so einfach mit Positionszuweisungen usw. ? Kannst ja mal ein Stückchen Code posten, wäre vielleicht auch für mich interessant. PS: Korrigiert mich wenn ich mich irre, aber hatte Rave nicht generell Probleme mit dynamischer Reportgestaltung? |
Re: Rave Reports Mirror per Event Script
möglich, ich schlag mich mit der Software seit Tagen rum. Muss aber sagen, dass bisher alles soweit geklappt hat, bis eben auf die Überschriften und jetzt grad die Positionen beim Technischen. Der ganze Spaß rund um die DataSets funktioniert. sobald ich mein Programmfenster offen hab, wähl ich meine DataSets aus dem Direct Data View und nutz die Daten. Wenn ich diese einmal drin hab, kann ich mir da bauen was ich will, dann brauch ich das Programm nurnoch zur erzeugung des reports.
Edit: willst du die projekterzeugung sehen oder was? dann kann ich dir gern mal den Create reinwerfen. DataSets auslesen aus der MSQL DB is ja denk ich klar ;) |
Re: Rave Reports Mirror per Event Script
Die Projekterzeugung wäre interessant.
Ich hab eben das Reportdesign bisher nur zur Designzeit gemacht. Wäre mal interessant, wie das so grundsätzlich zur Laufzeit aussieht. |
Re: Rave Reports Mirror per Event Script
hier mein constructor, der aufgerufen wird sobald die Form geöffnet wird.
Delphi-Quellcode:
Hier die GetCols/GetRow:
begin
adoConnectionString := adoConnectionString; raveSystem := TRvSystem.Create( self ); raveProject := TRvProject.Create( self ); ravePDFRender := TRvRenderPDF.Create( self ); raveDataSetConnection_Auf := TRvDataSetConnection.Create( self ); raveDataSetConnection_Pos := TRvDataSetConnection.Create( self ); raveDataSetConnection_Technik := TRvDataSetConnection.Create( self ); raveDataSetConnection_Design := TRvDataSetConnection.Create( self ); raveDataSetConnection_Flg := TRvDataSetConnection.Create( self ); raveDataSetConnection_VerAdr := TRvDataSetConnection.Create( self ); raveDataSetConnection_RecAdr := TRvDataSetConnection.Create( self ); raveDataSetConnection_TechPos := TRvDataSetConnection.Create( self ); raveDataSetConnection_UeberTechPos := TRvDataSetConnection.Create( self ); raveDataSetConnection_Revision := TRvDataSetConnection.Create( self ); dataSet_Auf := TADODataSet.Create( self ); dataSet_Pos := TADODataSet.Create( self ); dataSet_Technik := TADODataSet.Create( self ); dataSet_Design := TADODataSet.Create( self ); dataSet_Flg := TADODataSet.Create( self ); dataSet_VerAdr := TADODataSet.Create( self ); dataSet_RecAdr := TADODataSet.Create( self ); dataSet_RecLaen := TADODataSet.Create( self ); dataSet_VerLaen := TADODataSet.Create( self ); dataSet_E := TADODataSet.Create( self ); dataSet_TechPos := TADODataSet.Create( self ); dataSet_UeberTechPos := TADODataSet.Create( self ); dataSet_Revision := TADODataSet.Create( self ); raveProject.Engine := _raveSystem; raveProject.ProjectFile := '.\TestReport.rav'; raveProject.StoreRAV := true; //DataSet-Auf raveDataSetConnection_Auf.DataSet := dataSet_Auf; raveDataSetConnection_Auf.Name := 'Auf'; raveDataSetConnection_Auf.RuntimeVisibility := rtDeveloper; raveDataSetConnection_Auf.OnGetCols := raveDataSetConnection_AufGetCols; raveDataSetConnection_Auf.OnGetRow := raveDataSetConnection_AufGetRow; //Pos raveDataSetConnection_Pos.DataSet := dataSet_Pos; raveDataSetConnection_Pos.Name := 'Pos'; raveDataSetConnection_Pos.RuntimeVisibility := rtDeveloper; raveDataSetConnection_Pos.OnGetCols := raveDataSetConnection_PosGetCols; raveDataSetConnection_Pos.OnGetRow := raveDataSetConnection_PosGetRow; //Technik raveDataSetConnection_Technik.DataSet := dataSet_Technik; raveDataSetConnection_Technik.Name := 'Technik'; raveDataSetConnection_Technik.RuntimeVisibility := rtDeveloper; raveDataSetConnection_Technik.OnGetCols := raveDataSetConnection_TechnikGetCols; raveDataSetConnection_Technik.OnGetRow := raveDataSetConnection_TechnikGetRow; // raveDataSetConnection_Design.DataSet := dataSet_Design; raveDataSetConnection_Design.Name := 'Design'; raveDataSetConnection_Design.RuntimeVisibility := rtDeveloper; raveDataSetConnection_Design.OnGetCols := raveDataSetConnection_DesignGetCols; raveDataSetConnection_Design.OnGetRow := raveDataSetConnection_DesignGetRow; //AufträgeFlg raveDataSetConnection_Flg.DataSet := dataSet_Flg; raveDataSetConnection_Flg.Name := 'Flg'; raveDataSetConnection_Flg.RuntimeVisibility := rtDeveloper; raveDataSetConnection_Flg.OnGetCols := raveDataSetConnection_FlgGetCols; raveDataSetConnection_Flg.OnGetRow := raveDataSetConnection_FlgGetRow; raveDataSetConnection_VerAdr.DataSet := dataSet_VerAdr; raveDataSetConnection_VerAdr.Name := 'VerAdr'; raveDataSetConnection_VerAdr.RuntimeVisibility := rtDeveloper; raveDataSetConnection_VerAdr.OnGetCols := raveDataSetConnection_VerAdrGetCols; raveDataSetConnection_VerAdr.OnGetRow := raveDataSetConnection_VerAdrGetRow; raveDataSetConnection_RecAdr.DataSet := dataSet_RecAdr; raveDataSetConnection_RecAdr.Name := 'RecAdr'; raveDataSetConnection_RecAdr.RuntimeVisibility := rtDeveloper; raveDataSetConnection_RecAdr.OnGetCols := raveDataSetConnection_RecAdrGetCols; raveDataSetConnection_RecAdr.OnGetRow := raveDataSetConnection_RecAdrGetRow; raveDataSetConnection_TechPos.DataSet := dataSet_TechPos; raveDataSetConnection_TechPos.Name := 'TechPos'; raveDataSetConnection_TechPos.RuntimeVisibility := rtDeveloper; raveDataSetConnection_TechPos.OnGetCols := raveDataSetConnection_TechPosGetCols; raveDataSetConnection_TechPos.OnGetRow := raveDataSetConnection_TechPosGetRow; raveDataSetConnection_UeberTechPos.DataSet := _dataSet_UeberTechPos; raveDataSetConnection_UeberTechPos.Name := 'UeberTechPos'; raveDataSetConnection_UeberTechPos.RuntimeVisibility := rtDeveloper; raveDataSetConnection_UeberTechPos.OnGetCols := raveDataSetConnection_UeberTechPosGetCols; raveDataSetConnection_UeberTechPos.OnGetRow := raveDataSetConnection_UeberTechPosGetRow; raveDataSetConnection_Revision.DataSet := _dataSet_Revision; raveDataSetConnection_Revision.Name := 'Revision'; raveDataSetConnection_Revision.RuntimeVisibility := rtDeveloper; raveDataSetConnection_Revision.OnGetCols := raveDataSetConnection_RevisionGetCols; raveDataSetConnection_Revision.OnGetRow := raveDataSetConnection_RevisionGetRow;
Delphi-Quellcode:
procedure TForm_KundenauftragReport._raveDataSetConnection_AuftraegeVersandAdrGetCols( Connection: TRvCustomConnection); begin raveDataSetConnection_VerAdr.DoGetCols; raveDataSetConnection_VerAdr.WriteField('ADR',dtString, 20, 'ADR','ADR'); end; procedure TForm_KundenauftragReport._raveDataSetConnection_AuftraegeVersandAdrGetRow( Connection: TRvCustomConnection); begin _raveDataSetConnection_VerAdr.DoGetRow; Adr(); Last but Not least, das Dataset befüllen:
Delphi-Quellcode:
dataSet_Revision.Connection := adoConnection; dataSet_Revision.CommandText:= 'select * from Revision where nr=''xyz'''; dataSet_Revision.Open(); Der ado connection string wird aus einer DLL übergeben. Im Prinzip werden dann Alle DataConnections initalisiert beim start, da ich ja nen Create constructor hab. Die Form wird letztendlich über eine Funktion aufgerufen, dort wo meine datasets befüllt werden, und anschließend kann ich den Rave Dialog per druck auf nen button öffnen und damit halt weitermachen. ich habs jetzt so eingestellt dass er den Dialog nicht zeigt sondern direkt nen Preview ausgibt. Ist viel Tipperei, aber er hatte mit dem komponenten auf der oberfläche probleme, weswegen ich die sachen später erzeugen muss. Gruß |
Re: Rave Reports Mirror per Event Script
Uff, das ist ganz schön heftig.
Ich hab meine RvConnections in einem DataModule geparkt, RvProject und RvSystem liegen im RavePreview, das dann bei Bedarf dynamisch erzeugt wird. Mit dieser Kombination hatte ich noch nie Probleme. Rave macht bei mir nur Probleme, wenn RvDataSetConnections in verschiedenen Forms liegen. Die Reports wurden ebenfalls wie gesagt zur Designzeit erstellt. Ein Beispielaufruf:
Delphi-Quellcode:
(*******************************
** Procedure: Print_MenuClick ** *******************************) procedure TForm_Example.Print_MenuClick(Sender: TObject); var Form_RavePreview: TForm_RavePreview; begin Form_RavePreview := TForm_RavePreview.Create(self); Form_RavePreview.RvProject.ProjectFile := (AP_Path + '\DATA\REPORT\Example.rav'); Form_RavePreview.RvSystem.TitlePreview := 'Example-Preview'; Form_RavePreview.RvSystem.SystemPreview.FormState := wsMaximized; with Form_RavePreview.RvProject do begin Open; try SetParam('Caption_Example', 'Example-Caption'); SetParam( ... ); ExecuteReport('Report1'); finally Close; end; end; end; ![]() Gruß, alphaflight |
Re: Rave Reports Mirror per Event Script
ich hab mein problem übrigens nun so gelößt, dass ich ne funktion in delphi habe, die dann meinen string ins dataset reinschreibt. Funktioniert wunderbar.
|
Re: Rave Reports Mirror per Event Script
Hallo Zusammen,
grundlegend kann man wie folgt auf die Komponenten in einer *.rav-Datei zugreifen. var Report : TRavereport; Page : TRavePage; begin Report := RvReport.ProjMan.findravecomponent('Default' , nil) as TRavereport; Page := RvReport.ProjMan.findravecomponent('Main', Report) as TRavePage; end; über die TRavePage-Instanz (Page) kann man dann auf jedes Objekt auf der Rave-Seite zugreifen... ich hoffe das hilft euch weiter mfg Konchulio |
Re: Rave Reports Mirror per Event Script
Mir eröffnet sich derzeit ein ganz anderes problem:
Ich würde gerne ein DataBand spiegeln. sprich Databand von einer Globalen Seite soll auf meine Hauptseite gespiegelt werden. problem dabei ist wohl, dass die komponente keine Mirror eigenschaft hat. im Prinzip würde es reichen, wenn ich nur die Inhalte spiegele und dann den DataView per Event abfrage änder. Hier hab ich aber wohl syntaxprobleme, da ich in der OnBeforePrint bereits eine If Abfrage habe:
Delphi-Quellcode:
Hier werden die FontMaster Components gespiegelt.
if DS_pos_cposmodus.AsString='2' then
DataMemo8.FontMirror := FM_ArialBold; elseif DS_pos_cposmodus.AsString='1' then DataMemo8.FontMirror := FM_Arial; elseif DS_pos_cposmodus.AsString='3' then DataMemo8.FontMirror := FM_ArialStrikeout; end; Problem ist nur, wenn ich jetzt mit der syntax
Delphi-Quellcode:
drumsetzen will, krieg ich ne Zugriffsverletzung. problem ist dabei, wenn das DataView nicht auf DS_pos steht, krieg ich ebenfalls ne Zugriffsverletzung, weil die if's ja alle auf DS_pos gehen. Wie krieg ich den kram jetzt also sauber verkapselt?
if X then
DataBand.DataView:=DS_Whatever; if DS_pos_cposmodus.AsString='2' then DataMemo8.FontMirror := FM_ArialBold; elseif DS_pos_cposmodus.AsString='1' then DataMemo8.FontMirror := FM_Arial; elseif DS_pos_cposmodus.AsString='3' then DataMemo8.FontMirror := FM_ArialStrikeout; end; end; Gruß |
Re: Rave Reports Mirror per Event Script
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo alphanumeric,
das Spiegeln solcher Daten-Bänder geht wie folgt. Im Rave-Report-Designer... 1. Auf der Hauptseite die Komponente "DataMirrorSection" anlegen. 2. In der "DataMirrorSection"-Komponente die Eigenschaft "DataView" einstellen. (z.B. verbundenes Dataset aus Delphi) 3. In der "DataMirrorSection"-Komponente die Eigenschaft "DataField" einstellen. Dieses Feld wird für die Einschränkung/Bedingung herangenommen. 4. Anschließend über die "DataMirrors"-Eigenschaft den "Data Mirror Editor"(siehe Anhang) öffnen. Hier kann man nun die Bedingung(siehe auch Punkt 3) und die zu spiegelnde Section(z.B. DataBand auf Global Page) angeben. Die Default Einstellung wird dann herangezogen wenn keine Bedingung zutrifft. Das mit den FontMirror kann man dan aufs DataBand hinterlegen, oder wie oben beschrieben darauf zugreifen. Ich hoffe ich konnte weiter helfe.... mfg Konchulio |
Re: Rave Reports Mirror per Event Script
soweit ich das sehe, kann man mit dem dataMirror nur sections spiegeln oder? meine DataText krieg ich da nicht angezeigt.
edit: sry, zu blöd zum lesen ;) edit2: ich habe mir jetzt überlegt, einfach 2 reports anzufertigen und einen dritten von dem ich die daten, die sowieso gleich sind, herspiegeln kann. kann ich überhaupt von 1 Report zum anderen etwas spiegeln? Sprich meinetwegen nur die Elemente, nichtmal das databand. Also ich meine 2 Reports innerhalb von 1 Rave Project gruß |
Re: Rave Reports Mirror per Event Script
Hallo alphanumeric,
erst einmal was hast du den eigenglich vor. Im ersten Post wilst du ein DataBand spiegeln dann plötzlich ein DataText?! Schmeiß deine komponenten (egal ob datengebunden oder nicht und in deinem Fall dein DataText) in eine Section die auf einer Globale Seite liegt rein. Dann kannst du die Sections einfach spiegeln. Wenn du unterschiedliche Layouts willst, leg dir doch einfach noch eine Section an die du dann ensprechend lädts. Oder für ganz dynamische Reports kannst du gleich auf einer Globalen Seite alles realisieren und dann einfach nur noch auf deine Report-Seiten spieglen. Vorteil von Globalen Seiten --> man kann diese in mehreren Reports verwenden. Also...: 1. Auf eine Globale Seite legst du eine DataMirrorSection-Komponente an. 2. Dannach 2 Sechtion-Komponenten ebenfals auf die Globale Seite anlegen. 3. Eeine DataText-Komponente für jede Section-Komponente anlegen. 4. In Section1.DataText z.B. Fontmirror1; In Section2.DataText z.B. Fontmiror2 einstellen usw. 5. Die zwei Section kannst du nun wie im vorigen Post in die DataMirrorSection laden. 6. Nun kannst du das auf der globalen Seite liegende DataMirrorSection-Kompoenten wiederum auf deine Seit(en) spieglen. mfg Konchulio |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz