Ideen für einen Report Generator gesucht
-
Umfrage: haltet ihr so einen report generator für brauchbar?
Auswahl Stimmen Prozent ja 3 75.0% nein 1 25.0% schon, aber mit anderen features (diese schreibe ich in meiner antwort) 0 0.0% ich arbeite momentan an dem endgültigen konzept für einen report generator für mfc. möchte mit dem projekt einigen menschen das leben erleichtern.
wer wollte schon mal eine simple und übersichtliche bibliothek haben, die reporte (formulare, listen, etc.) optimal drucken kann, ohne vorher zig stunden damit zubringen sich durch die handbücher von crystal reports & co. zu wühlen, oder überhaupt so viel geld für eine derartige lizens auszugeben?
ich kenne einige solcher menschen. gehöre selber dazu.
deshalb hatte ich nach langen überlegungen die idee vom report generator marke eigenbau.
hierzu fehlen mir noch einige details, damit ich mein konzept komplettieren kann.
werde jetzt aber erst einmal berichten, wie das grobe design ausschaut:
--------------------------------------------------------------------------
1. teil: die bibliotheken:
storage:
das storage wird einem embeded dbms überlassen. diese schnittstelle ist soweit fertig geplan. diese methode ist robust, sicher, schnell, unkompliziert und erfordert wenig aufwand.
alle report daten werden typisiert in vorgegebenen sql tabellen in der datenbankdatei gespeichert.als beispiel:
die tabelle für textfelder hat folgende spalten:
id, text, posx, posy, dx, dy, default_color, default_size, default_face, default_valign, default_align,...
ein datensatz ist representativ für ein textfeld und wird von der core bibliothek "übersetzt"print:
wie bereits erwähnt werden daten aus der datenbank datei geladen und von der core bibliothek übersetzt.
übersetzt werden diese daten für die print bibliothek, damit aus den datenbankdaten etwas "druckbare" wird.api:
die schnittstelle soll dann so komfortabel wie möglich und trotzdem mächtig sein. mit der api wird der kern des report generators angesteuert und es ist möglich die übersetzten daten entweder in der vorschau anzuzeigen und/oder an den drucker zu schicken.2. teil: der designer: (eins nach dem anderen, erst ist teil 1 an der reihe)
der designer soll alle notwendigen funktionalitäten bieten. serienbrief, macros,...
--------------------------------------------------------------------------ich hoffe ich kann mit dieser beschreibung einige der leser interessieren.
falls irgendwelche fragen, anmerkungen oder kritiken zustande kommen, bitte ich um ausführliche antworten.und jetzt komme ich zum eigentlichen anliegen.
ich suche ideen für die detailiertere umsetzung.etwas was mir noch komplett schwebend vorkommt ist die tatsache, dass daten aus einer mfc anwendung dynamisch übergeben werden sollen.
eine statische variante wäre sicherlich einige nummern kleiner und dort hätte ich auch gewiss keine grösseren schwierigkeiten.allerdings weiss ich noch nicht genau, wie ich die dynamische verknüpfung herstellen soll. wie ich eine zeile mit einer datumsanzeige erzeuge, das ist denke ich mal das kleinste problem dieser dynamisierung.
das problem, wo ich bis heute nicht vorankomme und warum ich mich unter anderem an euch alle hier wende ist: wie übergebe ich eine variable anzahl von datensätzen z.b. an eine tabelle? ein beispiel wäre vielleicht eine schülerliste, auf der man die anwesenheit überprüfen würde. je nach klasse, würde sich die anzahl und der inhalt der datensätze ändern.
falls jemand von euch ideen zu diesem projekt, vielleicht speziell zu meiner letzten frage, hat, bitte ich herzlich um eine antwort.
-
Sowas ist sehr praktisch und ich plane gerade sowas ähnliches, allerdings mit wxWidgets. Aber deine Frage verstehe ich nicht ganz. Meinst du damit, wie du eine variable Anzahl aus der Datenbank liest und durch dein Programm darstellen lässt? Irgendwie wüsste ich jetzt nicht, wo dabei das Problem liegen könnte...vielleicht denke ich aber auch falsch?! Beschreib es vielleicht mal anders.
-
ich mache das mal an einem beispiel deutlich:
ich habe eine report datei in der eine anwesenheitsliste definiert ist. dort ist eine tabelle deklariert, die fortlaufend ist. also eine variable anzahl von zeilen. das ist noch kein problem.irgendwie muss ich bei der deklaration der tabelle angeben, dass die zeile variabel wiederholt wird, und das fortlaufend.
wenn ich dann in meinem programm bin und sagen wir mal ein grid habe in dem alle möglichen schüler zu sehen sind und entsprechend die, die auf der listes erscheinen sollen, auszuwählen sind, soll dann das report entsprechend generiert werden.
zu dem zusammenhang zwischen der tabellen deklaration und und dem report ist mir noch nicht ganz geheuer.
ausserdem möchte ich im report vielleicht solche macros wie summe(spalte) implementieren.
wenn ich dann eine tabelle mit n spalten habe dann soll in der letzten zeile nur die letzte zelle zu sehen sein und darin die summe dieser letzten spalte.
die darstellung der tabelle übernimmt übrigens die print bibliothek. darum mache ich mir da keine sorgen. das ist kein thema.es ist eher das design der klassen an sich, dass mir noch kopfzerbrechen macht.
CarstenJ, kannst du mir von deinem projekt etwas erzählen? oder ein paar tipps geben.
-
Ich kann dir gerne etwas von meinem Projekt erzählen, aber großartige Tipps kann ich dir nicht geben, da ich Anfänger bin. Naja, auf jeden Fall liegt der Schwerpunkt bei meinem Projekt auf Logfiles. Momentan exisitiert noch nicht mehr als ein Konsolenprogramm, was Logfiles einliest, die entsprechend aufspilittet und dann XML raushaut, was meine wxWidgets Komponente wiederum lesen kann. Aufgrund dieser Daten werden dann schön Diagramme erstellt. Also ähnlich dem hier:
http://www.analog.cx/Da ist noch nix mit Datenbanken, aber ich überlege auch, das irgendwie mit SQLite zu lösen. Denn die Schwierigkeit, die ich momentan habe, und wo ich etwas dran zu knacken habe, ist Performance. Denn bei mir gehts um Logfiles, die gut und gerne 500MB und mehr groß sind, und da dauert so eine Aufsplittung schon ein Weilchen. Ich möchte möglichst auch keine systemspezifischen Dinge nutzen, da es plattformunabhängig sein soll.
Wir können uns natürlich gerne austauschen, aber von der MFC hab ich überhaupt keine Ahnung. Ich weiss nur, dass das was von Microsoft ist.
-
da wärst du mit sqlite gut dran.
eine frage hätte ich da aber. was meinst du denn mit logfiles? heisst es du hast in den dateien statischen text? oder habe ich das falsch verstanden?klar können wir uns über die technik austauschen, genau das ist es doch was ich suche.
systemspezisch wird mein report generator nur im ersten schritt sein. ich plane zum ende des jahres mit einer neuen bibliothek anzufangen als mit mfc. kann mich bis heute nicht entscheiden für welche, denke qt wirds, obwohl die windows version von qt veraltet ist. aber das ist eine andere geschichte. das hat noch zeit.ich versuche den generator möglichst nicht in einem wurf zu schreiben, sondern alle einzelteile getrennt mit portablen schnittstellen zu entwickeln. die datenbank (damit auch das gesamte speichermanagment) ist ja schon portabel genug. wenn ichschliesslich die print lib auf ein anderes system portiere, dann hätte ich ein leichtes spiel um das ganze nicht nur für windows, sondern auch z.b. für linux anzubieten. das ist aber wieder zukunftsmusik.
wie speicherst du deine reporte? hast du zum thema entwicklung eines rg irgendwo lese stoff gefunden?
-
Mit Logfiles meine ich z. B. Snort-, Squid- und Apache-Logfiles....die sehen zwar unterschiedlich aus, aber haben auch einige Gemeinsamkeiten (z. B. IP-Source Adressen). Das sind Plain-Text Dateien, die ich dann halt entsprechend aufsplitte.
Ich hab das so aufgebaut, dass ich ein Stichwort und die Anzahl der Ergebnisse angebe, und der mir das dann entsprechend ausgibt:
... string option="SrcIP"; CurrentLogFile->top(option, 5); ...
Das würde mir z. B. die ersten 5 Quell IP Adressen aus dem aktuellen Logfile raussuchen und anzeigen. Oder sie würden in eine XML Datei gespeichert, aus welche mir mein wxWidgets Programm einen Report erstellen würde.
hast du zum thema entwicklung eines rg irgendwo lese stoff gefunden?
Nein, aber es existieren ja bereits einige Programme, an denen ich mich orientiere. Bei jedem fehlt allerdings irgendwas, was ich gebrauchen könnte, deswegen schreib ich das jetzt selbst.
-
ja gut, aber das ist jetzt bei dir eine eher statische auswertung von logfiles. d.h. du legst irgendwo fest wie etwas geparst wird, daraus dann prozent werte berechnet werden und z.b. diagramme angezeigt werden.
das ist ganz klar der prozentual grösste einsatz von report generatoren.
ich meine allerdings eine andere art von generatoren.was ich meine ist, dass du eine report datei hast, in der z.b. serienbriefe, rechnungen, geburtstagswünsche, anwesenheitslisten, ... vordefiniert sind.
dann bindest du eine bibliothek in deine anwendung ein, und kannst über die api so einen vordruck (report) laden und ihn mit daten füttern und anschliessend drucken.eine technische frage von mir wäre, wie man zum beispiel die problematik der daten übergabe lösen könnte.
was mir so auf die schnelle einfällt ist...
eine liste (CList) von CMapStringToString objekten für den tabelleninhalt.aber dann muss der benutzer vorher immer genau die definition seiner tabelle kennen. bei den objekten für den einfachen schriftzug oder für bilder ist das ja kein thema, allerding können in der tabelle ja z.b. alle 5 zeilen eine zeile mit nur einer zellevorkommen.
mein problem ist, dass es bei dieser version keine compiler fehler gibt, höchstens laufzeit fehler. es ist klar, dass so ein nachladbares modul sich nicht kontrollieren lässt.
aber vielleicht hat jemand eine andere idee wie man daten an einen report generaotor übergeben könnte. und zwar daten, die vielleicht an einigen stellen aus der tabelle herausfallen.
-
Warum übergibst du nicht die ganze Tablelle und das immer. Im Report wird nur das ausgelesen was du brauchst.
Ich habe das bei mir mit einem Zeiger aufs CListCtrl implementiert.
Unter Linux mit QT natürlich dann das Gegenstück dazu
-
@unix-tom:
ich komme nicht wirklich weiter mit meinen überlegungen.
ich versuche mal den kompliziertesten fall zu beschreiben:
ich habe eine anwendung in der ich einige optionen treffe und nach dem bestätigen werden je nach option daten aus der datenbank geladen. das shema der datensätze ist immer gleich. es ändert sich die die anzahl und die daten an sich auch. dann habe ich meine reportdatei in der das layout festgelegt ist. anzahl, position, art von textfeldern, bildern, tabellen,...jetzt kommt der generator ins spiel.
dieser läd die reportdatei.bis dahin ist bei mir alles gut geplant und sollte soweit auch klappen.
jetzt muss ich im report die seiten erstellen, und das am besten automatisch. deshalb ja auch generator.
wie kann ich in der reportdatei festlegen, welche datenstruktur ich im programm an den reportgenerator übergeben muss, damit die zuweisung von daten und vorgaben aus der reportdatei stimmen.
ich denke du hast schon recht und ich muss das nur noch auf meinen fall übertragen. d.h. die daten im programm in irgendeine festgelegte datenstruktur bringen und dann an den report generator übergeben. und dort intern natürlich ausnahmebehandlungen durchführen.
dazu noch etwas...
kannst du mir einen tipp geben, wie ich das mit tabellen löse.
ich will die tabelle über die spalten definieren.sagen wir mal eine tabelle mit den spalten:
vorname | nachname | adresse | konto | listen#wenn ich dann eine einfache datenstruktur auf eine sql tabelle übertrage habe ich auch keinerlei probleme mit.
schwierig wird es für mich wenn ich eine tabelle definieren will die anfangs genau so aussieht wie die obige, in den letzten zeilen aber so etwas folgen sollte wie:x | x | x | anzahl: | 123
wobei |x| dafür steht, dass die zellen verschmolzen sind.wie ich das in der reportdatei definiere ist mir klar.
aber wie das dann in der datenstruktur anweisen soll, da komme ich nicht weiter.ich denke mein problem ist nicht technischer sondern eher logischer natur.