Autor Beitrag
Terra
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Mo 29.08.11 02:31 
Servuz zusammen !

ich benötige mal eure Hilfe !!!

Ich habe hier eine Access Datenbank, in der Kundendaten drinnstehen.
Habe jetzt erstmal mit DevExpress eine hübsche cxGrid Darstellung gezaubert, wo mittels ADO die Kundendaten in der Tabelle stehen. Ich möchte jetzt mittels Multiselect einige Kunden rauspicken (markieren) und denen dann mittels FastReport ein Serienbrief generieren.

Sprich, es gibt eine vorgefertigte .fr3 Datei, die bereits ein Logo, die Adressfelder für Vorname, Nachname, Straße usw. enthalten, die dann aus der Datenbank gelesen werden sollen.

Mit einem Kunden funktioniert alles toll ! ... Ich klicke den Kunden an, sage "erstelle Report" und er erstellt den Report mit dem Namen, der angeklickt wurde. Klicke ich jetzt aber mehrere Kunden an, wird mir nur der letzte dargestellt. Jedes mal nur 1x. Jetzt dachte ich, machste im ReportDesigner ein Band "Masterdaten". Dort werden mir dann aber alle Kunden aus der Datenbank im Report generiert. Egal, wieviel ich im Grid ausfilter oder markiere. Eine weitere Überlegung war dann, die markierten Kunden im Grid auszulesen und in ein Array zu verschieben. Nur wüsste ich jetzt auch nicht, wie ich das dann mit dem FastReport kombiniere.

Ach so, noch etwas ... FastReport soll mir alle generierten Briefe direkt untereinander anzeigen lassen, so das man diese als PDF abspeichern und zur Druckerei schicken kann. Also nicht 1000 Fenster mit jeweils einem Brief drinn.

Kann mir da bitte bitte bitte jemand Helfen?????

Vielen Dank,

Terra
haentschman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: Mo 29.08.11 06:49 
Hallo und guten Morgen...

mit dem Masterdata warst du schon nahe dran. Nur muß dein gesamter Brief, und nicht nur die Adressdaten in das Masterband. Desweiteren mußt du dem Report natürlich eine gefilterte Datenmenge übergeben. Nur markieren reicht nicht.
2 Möglichkeiten:
- die markierten Kunden in einer neuen Query aus der DB holen
- die markierten Kunden in ein MemDataset übertragen

:wave:
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Mo 29.08.11 13:48 
Danke für deine Antwort,

Ich habe es erstmal so gelöst, das in dem RichEdit von Fastreport aus Delphi heraus eine rtf Datei geladen wird, wo nur der Inhalt des Briefes drinn steht. Jetzt muss FastReport sich nur noch die markierten Kunden holen. Alles andere ist bereits vorhanden.

kurze Frage noch ... muss ich die Abfragen direkt in FastReport eintragen oder geht das auch über Delphi?
Delphi wäre mir da lieber, da ich zumindest noch die Syntaxkontrolle habe. Wenn ich was bei FastReport falsch mache, suche ich mir ein Wolf. :cry:

Könntest du mir ggf. ein kleines Beispiel geben, wie du das gedacht hast?

LG Terra
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Mo 29.08.11 21:06 
Kann mir da wer weiterhelfen?

habe das jetzt mit dem Masterband noch mal ausprobiert aber ich verstehe das irgendwie nicht.
Wie soll ich denn FastReport begreiflich machen, das ich nicht alle 9000 Kunden ausgewählt habe, sondern z.B. nur 50. Das Masterband nimmt ja von Haus aus die gesammte Kundendatenbank. Was genau muss ich machen???

Irgendwie sehe ich den Wald vor lauter Bäumen nicht mehr.

LG Terra
haentschman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: Mo 29.08.11 21:25 
Hallo...
du mußt dem Report nicht die gesamte Tabelle übergeben sondern ein seperates Dataset mit den "gefilterten" Kundendaten.
Zu den oben genannten Möglichkeiten kommt noch die clientseitige Filterung dazu. Properties Filter und Filtered.
Prinzip Variante 1:
- Tabelle durchlaufen und deine markierten Datensätze merken (z.B. die ID)
- in einer seperaten das SQL aus den ID`s zusammenbauen
- Query öffnen
- Query an Report übergeben (statt Tabelle) Im Masterband zuordnen.
Prinzip Variante 2
- MemDataset erstellen mit den gleichen Felder wie die Tabelle
- Tabelle durchlaufen und markierte Datensätze in das MemDataset übertragen
- MemDataset an Report übergeben (statt Tabelle) Im Masterband zuordnen.

Der Report zeigt alle Daten an die er bekommt ! Ihm mehr zu geben als er anzeigen soll und im Report herausfiltern halte ich für unperformant.

Wie wählst du die Kunden aus 9000 Kunden aus ? Per Klick ?
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Mo 29.08.11 21:45 
Die Kunden werden in dem cxGrid zuerst gefiltert. Zum Beispiel werden alle Kunden ausgewählt, die zwischen 18 und 99 Jahre sind. Danach werden Kunden mitgefiltert, die z.B. nur Frauen sind u.s.w.

Zum Schluss werden alle noch verbliebene Kunden automatisch markiert. So mit kann ich schnell sehen, wieviel Kunden insgesammt ausgewählt wurden. Kurz - es wird erst gefiltert, dann alle gefilterten markiert.
(Schaue Anhang)

Sorry, wenn ich blöde frage aber ist das MemDataSet eine Komponente oder ein Teil des Grids?
In beiden Fällen habe ich das nicht gefunden. Kann es sein, das der Befehl nur ein Teil von Lazarus ist?
Einloggen, um Attachments anzusehen!
haentschman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: Mo 29.08.11 22:11 
ok... wo filterst du die Daten ? Im Grid oder in der dazugehörigen Tabelle / Query ? Wo bekommst du die unteren Daten her ? (Anzahl Kunden / gefiltert )
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Mo 29.08.11 22:25 
Also gefiltert wird ausschließlich im Grid. Es gibt zwar oben paar Vereinfachungen um Sachen im Grid zu filtern und mittels Code an das Grid übergeben werden aber es bleibt allein das Grid, das mit die gefilterten Werte bereit stellt.

Die Daten im Grid selbst kommen aus einer Access DB, die mittels DataSource an das Grid gegeben werden.
Die Anzahl der gefilterten Kunden bekomme ich durch das gesamte Markieren im Grid herraus.
ausblenden Delphi-Quelltext
1:
KundenFilter.Controller.SelectedRecordCount;					


Ich habe bis jetzt fast alles immer die Komponenten machen lassen. Sei es eine Verknüpfung zur anderen Datenbank oder auch Rechenoperatorische (gibt es das Wort überhaupt) Funktionen ausführen lassen. Allgemeinen Quellcode für die Datenbanken habe ich vielleicht eine Hand voll Zeilen im gesamten Projekt. Von Daher ist für mich jetzt ein Query zu generieren etwas mühsam. Nicht weil ich dazu zu faul wäre, sondern, weil ich es nicht kann. Jetzt ist es raus. :oops:

Ich habe ja verstanden, das ich ja direkt im Report auch eine ADO Abfrage starten kann aber da komme ich genau so weit. Heul gleich ... :cry:
haentschman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: Mo 29.08.11 22:39 
Nachtrag: Was ich mit MemDataset meine ist eine Abkürzung für Memory Dataset oder Virtual Table. Diese gibt es nicht als Standardkomponente.

Zum Thema:
- da du quasi nur die Ansicht filterst (im Grid) und damit die Tabelle unberührt bleibt und alle Datensätze hällt kommst du nicht drumherum dir ein extra DataSet zu "bauen"

Noch eine Variante:
- eine 2. Table wie die die am Grid hängt. Die 2. Tabelle filterst du nach den Filterkriterien wie im Grid. Danach hat die 2. Tabelle nur die Datensätze welche dann am Schluß markiert sind. Diese Tabelle bindest du statt der 1. Tabelle an den Report.
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Mo 29.08.11 23:10 
Ich habe grade (nach 2 Tagen) etwas rausgefunden, was mich erlich gesagt im Boden versinken lässt.

Habe ja geschrieben, das ich alles die Komponenten machen lasse.
Warum nicht auch gleich das Filtern im DataSet? Hätte die Funktion nur aktivieren brauchen.

Habe dieses jetzt grade aber erst gesehen, das die cxGrid Komponente dieses auch anbietet. Ebend probiert und er macht es genau so, wie ich es haben möchte. Das ist sooooooooooooooooooooooooooooooo Peinlich.
Bekomme beim Geburtsdatum jetzt zwar ein Fehler, das der Typ nicht stimmt aber das wird wohl ein DB Problem sein, da von vorn herein alles per Hand gemacht wurde und erst von mir alles in Access Konvertiert wurde.

Habe die Funktion mal im Anhang im Bild markiert.

Ich danke trotzdem ganz ganz ganz doll für die Hilfe !!! :beer:

LG Terra
Einloggen, um Attachments anzusehen!
haentschman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: Di 30.08.11 19:05 
Siehst du ... :zwinker:
Es ist eigentlich ein ungeschriebenes Gesetz, daß man die Datenmenge filtert und nicht die Anzeige. (Ausnahmen bestätigen die Regel)
Deswegen hatte ich ein 2. Dataset im Visier um am Bestehenden so wenig wie möglich zu ändern.

...wieder was gelernt oder ? :zustimm:
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Mi 31.08.11 11:33 
Japp !

hätte mir zwar gewünscht, das man nur die markierten übernimmt und die weitergibt aber so geht es erstmal auch.
Es war wichtig, das die Kunden zumindest überhaupt irgendwie gefiltert werden konnten. Und das bietete mir ja die Komponente.

Der nächste Schritt ist es jetzt, so zu filtern, das nicht nur über die Kunden gefiltert werden kann, sondern zusätzlich auch die Rechnungen der Kunden, die mit der Kundendatenbank verknüpft sind. Ist aber meiner Meinung nach ne extrem komplizierte Sache, da die cxGrid Komponente nur die erste Ebene filtert.

z.B. von Kunde AAA bis ZZZ sollen nur die gefiltert werden, welche eine Rechnung zwischen dem 01.01.2011 und 01.08.2011 bekommen haben.

Bekomme ich irgendwann aber auch noch raus.

LG Terra