![]() |
Datenbank: Access • Version: 2007 • Zugriff über: ADO
Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Hallo zusammen,
ich erstelle mit FastReport einen Report, in dem eine Tabelle über eine MasterDataBand angezeigt weird. Funktioniert auch echt gut. Die Tabelle die ich Anzeigen möchte, verfügt über einen Primärschlüssel, den ich nicht zur Anzeige bringen. Es gibt aber eine weiteres Feld, welches eine fortlaufende Nummerierung enthält (z.B. 1 - 100). Es kann vorkommen, das die Wert 1 - 5 enthalten sind, der Wert 6 fehlt und dann der Wert 7-22 wieder vorhanden ist. Beispiel: 1 Feld(1) Feld(2) Feld(3) 2 Feld(1) Feld(2) Feld(3) 3 Feld(1) Feld(2) Feld(3) 4 Feld(1) Feld(2) Feld(3) 5 Feld(1) Feld(2) Feld(3) 7 Feld(1) Feld(2) Feld(3) 8 Feld(1) Feld(2) Feld(3) Bei der Ausgabe kann man somit nicht auf einen Blick erkennen, das Zeile 6 noch zur Verfügung steht. Wie kann ich hier im Report eine Leerzeile generieren lassen. So sollte es dann aussehen: Beispiel: 1 Feld(1) Feld(2) Feld(3) 2 Feld(1) Feld(2) Feld(3) 3 Feld(1) Feld(2) Feld(3) 4 Feld(1) Feld(2) Feld(3) 5 Feld(1) Feld(2) Feld(3) 7 Feld(1) Feld(2) Feld(3) 8 Feld(1) Feld(2) Feld(3) Vorab vielen Dank und Gruß Jens |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Du musst diesen "leeren" Datensatz dem Report zur Verfügung stellen. Also einfach vor dem Report aktiv werden.
|
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Nur eine Idee, und dafür müsstest Du im Report ein wenig programmieren: Definiere Dir eine lokale Variable für die fortlaufende Nummer. Bei jedem Datensatz schaust Du nun, ob dessen Nummer der gemerkten + 1 entspricht. Falls nicht, müsste die Höhe aller Komponenten der Zeile des Bandes verdoppelt und die Ausgabe am unteren Rand ausgerichtet werden. Falls doch, dann wieder auf Standard zurückstellen. Anschließend die Variable in jedem Fall mit der aktuellen Nummer belegen.
|
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Zitat:
Zitat:
|
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Code:
So könnte man die Reportquelle erweitern, so daß Lücken entstehen. Ich persönlich bevorzuge die Variante, so wenig wie möglich Logik im Report selbst zu haben. Der ist für die Formatierung zuständig. Wobei...hmmm.. die Leerzeichen auch eine Formatierung sein könnten.
select n.LaufendeNummer, d.*
from AlleNummern n left join MeineDaten d on n.LaufendeNummer = d.Nummer where n.LaufendeNummer between :Anfang and :Ende In jedem Fall ist imho o.g. Variante die einfachste. @DeddyH: Bei deinem Lösungsansatz müsstest Du eventuell aus dem 'verdoppeln' ein 'ver-N-fachen' machen, denn wenn z.B. die Eintrage 6-123 fehlen, sind das dann u.U. mehr Lücken. Kommt aber drauf an. Allgemein würde ich sagen: Eine Lücke konstanter Größe, egal wie viele Nummern fehlen => DeddyH. Für jede fehlende Nummer eine Lücke => vielleicht meine. |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Der Ansatz von Dejan Vu scheint mir auch am sinnvollsten und kann notfalls auch so aufgeblasen werden, dass große Lücken wieder auf eine Zeile eingedampft werden.
Aus der Anforderung ist mir allerdings nicht klar, was "am Ende" der Liste geschehen soll, hier ist ja auch eine "Lücke" bis 512. Davon abhängig müsste man sich überlegen, wie man "AlleNummern " aus dem Beispiel SQL befüllt bzw handhabt. |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Die Variante von Dujan Vu werden ich mal probieren. ich persönlich würde das auch gerne aus dem Report rauslassen und im Programm verarbeiten.
Ich benötige eigentlich egal wie groß die Lücke ist nur einen einzige Leerzeile. Sinn ist es nur auf einen Blick erkennen zu können, ob noch Reserve Meldungen vorhanden sind. Wie viele, spielt hier erstmal keine Rolle. Gruß Jens |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Meiner Meinung nach ist es schlecht den Report dafür derart zu verbiegen. Da ist es besser zwischen der Abfrage und dem Report diese Lücken, je nach Gusto, in die Datenmenge einzufügen. Dadurch ergibt sich der geringste Aufwand bei der Abfrage und der Report-Gestaltung.
|
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Der Report wird ja mit eine geänderten Datenquelle nicht verbogen.
2 verschiedene Datenquellen (Views) 1 Report Je nach Datenquelle zeigt er Lücken an oder nicht. |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Zitat:
Das Verbiegen bezog sich auf den Vorschlag von DeddyH, wo der Report umständlich dahingehend programmiert werden muss. Das würde ich nur dann in Erwägung ziehen, wenn ich nur Zugriff auf den Report und nicht auf die Datenmenge habe. Das scheint hier aber nicht der Fall zu sein. Und eine andere View muss es nicht sein, geht aber logischerweise auch. Je nach Datenbank kann das von trivial bis schwierig sein. Darum wäre mein Favorit ein Vorbereiten der Datensätze in der Anwendung selber und diese dann dem Report zu übergeben. |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Ein wenig richtet sich das auch danach, wie einfach ich die Forderung umsetzen kann und wie flexibel ich auf Erweiterungen reagieren muss. Zeit ist schließlich Geld und die kürzeste Verbindung zwischen zwei Punkten ist nun einmal eine Gerade (ja ja, die Kugel, aber auch da ist es eine Gerade).
Ergo würde ich 'AlleNummern' (natürlich mit einem sinnvollen Namen) als Tabelle anlegen. Das geht ratzfatz per Hand (die 512 Nummern eingegeben -pah-) oder mit einem Skript in 1-2 Minuten. Report-SQL angepasst => fertig. Ändert sich irgend die maximale Anzahl der Störmeldungen? Tabelle anpassen. Arbeitszeit? 10 Minuten in total. Bietet mir das Reporting-Framework etwas ähnlich Effizientes an? Dann lieber über das Framework. Das schöne an der SQL-Lösung ist -finde ich- das ich bei Änderungen an einer Stelle eingreife, nämlich an der Report-View (die ich ja angelegt habe). Wenn ich natürlich eine Reporting-Server-Lösung verwende, kann ich auch den Report pimpen, neu einspielen, fertig. Kommt aufs Gleiche raus. Habe ich dagegen Client-Lösungen mit z.B. FastReport... tja, dann wird die Erweiterung des Reports schon ein kleiner Klimmzug. etc. etc. |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Also so richtig weiter komme ich nicht. Ich muss immer nur einen Leere Zeile zufügen, wenn die Meldenummer nicht fortlaufend ist. Irgendwie geht das mit SQL aber nicht. Daher vermute ich, muss ich das im Dataset machen. Geht das irgendwie?
Gruß jens |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Mit SQL geht das in jedem Fall. Welcher Dialekt?
Mit FastReport geht das auch. Such es dir aus. Du kannst natürlich die Daten auch in ein Dataset einlesen, dann in ein ClientDataset kopieren und im CDS einzelne Zeilen einfügen, überall dort, wo eine Lücke ist. Wie es Dir beliebt. |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Am liebsten wäre mir SQL. Also direkt in der TADOQuery.
Hier meine aktuelle Abfrage...
Code:
Das Feld Meldergruppe ist eventuell nicht fortlaufend...
SELECT Meldergruppe, Adresse, Geschoss, Meldebereich, Meldergruppentyp, Melderanzahl, Melderart, TS_insert, TS_update FROM MGV_EMA WHERE Anlagennummer= :ID ORDER BY Meldergruppe
|
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Das Problem ist ja auch, das ich das Ergebnis nach dem Feld Meldergruppe sortieren lasse. Das würde ja bedeuten, das die eingefügten Felder nach dem Sortieren nicht mehr an Ihrer Position sind. Es soll später wie folgt aussehen...
Meldergruppe Adresse Etage Meldebereich ... 1 12 EG Irgendwas 2 13 EG EtwasAnderes ... 7 14 EG Und hier geht es weiter |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Das Statement ist schon in Beitrag 5 genannt worden.
Du musst nur "meineDaten" durch "MGV_EMA" ersetzen und eine Tabelle "alleNummer" erzeugen, die Deine 256? 512? Leernummern enthält und Deine Spalten ausgeben. Der Outer Join muss mit der lückenhaften Nummer aufgebaut werden. Und gefragt war nicht SQL oder TADOQuery, sondern welchen SQL Dialekt Du nutzt, welches System, Firebird, mySQL.. Das wird dann später ggF spannend beim Umgang mit den Löchern und dem Ende.. |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Wie im Beitrag 1 geschrieben, nutze ich MSAccess "Kundendab.accdb".
Trotz allem versteh ich das nicht. Wenn ich das genannte SQL Statement verwenden würde, würde er mir ja immer aller 256/512 Zeilen ausgeben. Ich möchte aber doch nur wie im vorherigen Beispiel dargestellt, die tatsächlich vorhandenen Zeilen zzgl. jeweils einer einzigen, wenn die vorhandenen nicht fortlaufend sind. Am Ende muss gar nichts eingefügt werden. Es geht ja nur darum, den Report entsprechend übersichtlicher zu gestalten. |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Programmieren ist halt manchmal wie Billiard, wo auch nicht immer der direkte Stoss zum Ziel führt, sondern auch mal über eine oder mehr Banden und/oder mit weiteren Kugeln, die den Stoss weitertragen.
Also du hast da eine Hilfstabelle mit allen möglichen fortlaufenden Zahlen (1..256 whatever).
SQL-Code:
Das DataSet sieht dann schon mal so aus
select
Value, Meldergruppe, Adresse, Etage, Meldebereich from ValueTable left join MelderGruppen on Meldergruppe = Value where Value <= Max( Meldergruppe ) -- << könnte auch ein SubSelect benötigen! order by Value
|
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Zitat:
Zitat:
|
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Code:
Ich hab mal für ein Beispiel Sir Rufos Statement um einen Subselect erweitert, der (wenn ich keinen Denkfehler habe) anzeigt, ob die vorherige Spalte bereits leer ist (Evtl. problem beim 1. Datensatz?). Daraus ergibt sich nun:
select
V.Value, Meldergruppe, Adresse, Etage, Meldebereich, (Select count(Meldergruppe) From Meldergruppe Where Meldergruppe=V.Value-1) as VorherigeSpalteLeer from ValueTable V left join MelderGruppen on Meldergruppe = V.Value where V.Value <= Max( Meldergruppe ) -- << könnte auch ein SubSelect benötigen! order by V.Value Meldegruppe <> Null -> Anzeigen Meldegruppe = Null -> VorherigeSpalteLeer<>0 -> Anzeigen Meldegruppe = Null -> VorherigeSpalteLeer=0 -> Anzeigen Du must also entweder um das ganze Select noch einen äußeren Select legen, der diese Kriterien umsetzt oder mal probieren mit "HAVING" zu arbeiten. Hier weiß ich jetzt nicht was in Access SQL da so alles geht. Ist jetzt wahrsch. nicht sehr performant aber bei nur 256 Datensätzen... Edit: Gerade nochmal nachgedacht. HAVING ist ja quatsch, da keine Gruppierung vorliegt. Somit muss das ganze in die Where Klausel ala:
Code:
where
V.Value <= (Select Max(Meldergruppe) From Meldergruppe ) and ( Meldegruppe is not null or (Select count(Meldergruppe) From Meldergruppe Where Meldergruppe=V.Value-1)>0 ) |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Liste der Anhänge anzeigen (Anzahl: 2)
du kannst es auch einfach mit einem Script im Report machen
In den Report ein Masterband und ein Detailband einfügen Masterband Deinem Dataset zuordnen. Detailband nicht zugeordnet Anzahldatensätze auf 1 stellen Siehe Screenshot1 Das Ergebnis siehe Screenshot2
Delphi-Quellcode:
var
LastMeldergruppe : integer; procedure MasterData1OnBeforePrint(Sender: TfrxComponent); begin //leere Zeile ausblenden MasterData1.visible := False; if (LastMeldergruppe) <> <frxDBDataset1."Meldergruppe"> then begin //leere Zeile anzeigen MasterData1.visible := True; end; LastMeldergruppe := <frxDBDataset1."Meldergruppe"> + 1; end; procedure frxrprt1OnStartReport(Sender: TfrxComponent); begin MasterData1.DataSet.First; LastMeldergruppe := <frxDBDataset1."Meldergruppe">; end; |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Die Routine sollte doppelte Nullspalten entfernen (getippt und nicht getestet). D.h. Du liest die Query ein, jagst das DS durch die Methode und druckst anschließend aus.
Delphi-Quellcode:
Du gehst von hinten nach vorne durch und löschst eine leere Zeile, wenn die zuvor besuchte (also, die darunter) auch schon leer war.
Procedure RemoveDuplicateNUllRows (aDataSet : TDataSet; aFieldNameToCheckForNull : String);
var prevLineWasNull : Boolean; Begin aDataSet.Last; While not aDataSet.Bof do begin if VarIsNull(aDataSet[aFieldNameToCheckForNull]) then begin if prevLineWasNull then aDataSet.Delete; prevLineWasNull := Not prevLineWasNul; end else prevLineWasNull := false; aDataSet.Prior end end; |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
So, jetzt Doktor ich hier schon wieder etwas länger rum
Zitat:
Nach genauer Prüfung, kann das ja auch nicht gehen...
SQL-Code:
Im Left Join, wird ja abgefragt, ob der Wert Meldergruppe = Value ist
from
ValueTable left join MelderGruppen on Meldergruppe = Value -> Meldergruppe(1) = Value(1) = true Meldergruppe(?) = Value(2) = false |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Ein Left Join ist ein Outer Join, d.h. dass wenn es in der "rechten" Tabelle keine Entsprechungen gibt, werden deren Felder genullt.
|
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Ohne etwas am Report zu ändern und nur um nochmal das genannte zusammenzufasse, bzw. zu erweitern.
leere Dummy-Datensätze einfügen, für die fehlenden Datensätze k.A. warum man den Report extra wild verbiegen will. * entweder aus einem Generator an das Select dranUNIONen (nur die Indize, welche fehlen) * oder eine Sequenz/Dummytabelle 1 bis 256 (bzw. bis 255) erzeugen und dort die existierenden Daten anJOINen (siehe mein Vorredner) |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
SQL-Code:
SELECT ZahlerEMA.MG, MGV_EMA.Meldergruppe FROM ZahlerEMA left join MGV_EMA on MGV_EMA.Meldergruppe = ZahlerEMA.MG WHERE Anlagennummer = 325 ORDER BY ZahlerEMA.MG
Und was bitte ist dann daran falsch. Das Ergebnis der Abfrage liegt im Anhang |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Sicher, daß in MGV_EMA diese Datensätze wirklich nicht drin sind? :stupid:
|
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
SQL-Code:
Ich denke schon... Siege Abfrage und Anhang
SELECT Meldergruppe FROM MGV_EMA WHERE Anlagennummer = 325 ORDER BY Meldergruppe
|
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Ups, falsch geguckt. :oops:
Und wie sieht ZahlerEMA aus? |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Liste der Anhänge anzeigen (Anzahl: 1)
Wie vorgesehen
|
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
:gruebel:
Beim LEFT JOIN ist die linke Tabelle (FROM) vollständig enthalten und die andere Tabelle wird angehängt. Es werden maximal mehr Datensätze (wenn das ON pro linkem Datensatz rechts mehrere Datensätze trifft), aber nicht weniger. |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Ja, genau. So sitze ich aktuell auch hier.
|
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Ein Bug im LEFT JOIN? :shock:
[edit]
SQL-Code:
SELECT Meldergruppe, Adresse, Etage, Meldebereich
FROM MGV_EMA WHERE Anlagennummer = 325 UNION SELECT MG, NULL, NULL, NULL FROM ZahlerEMA WHERE MG <= (SELECT max(*) FROM MGV_EMA WHERE Anlagennummer = 325) AND NOT exists(SELECT true FROM MGV_EMA WHERE Anlagennummer = 325 AND Meldergruppe = ZahlerEMA.MG) ORDER BY Meldergruppe |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Liste der Anhänge anzeigen (Anzahl: 2)
Ändere ich das ganze in einen RIGHT JOIN sieht es aus wie im Anhang 1
SQL-Code:
SELECT ZahlerEMA.MG, MGV_EMA.Meldergruppe FROM ZahlerEMA right join MGV_EMA on MGV_EMA.Meldergruppe = ZahlerEMA.MG WHERE Anlagennummer = 325 ORDER BY ZahlerEMA.MG
SQL-Code:
Pass ich die Abfrage wieder an Rechte/Linke Tabelle wieder so...
ZahlerEMA right join MGV_EMA
SQL-Code:
MGV_EMA right join ZahlerEMA on MGV_EMA
|
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Preisfrage: Was macht ein WHERE in einem SQL-Statement?
Wer das beantworten kann, weiß auch warum das Ergebnis so aussieht. :mrgreen: Ob das wohl besser wäre ;)
SQL-Code:
SELECT
ZahlerEMA.MG, MGV_EMA.Meldergruppe FROM ZahlerEMA left join MGV_EMA on MGV_EMA.Meldergruppe = ZahlerEMA.MG AND Anlagennummer = 325 ORDER BY ZahlerEMA.MG |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Die "Anlagennummer" in der WHERE Klausel des SQL-Statement, ist nur dafür zuständig, das nur Meldergruppen von einer Anlage geladen werden. Soll heißen, in der Tabelle MGV_EMA sind viele Anlagen enthalten. Diese müssen natürlich gefiltert werden. |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Jetzt mal Denken einschalten:
Wenn in der Datentabelle eine Lücke gefunden wird, dann bekommst du durch den LEFT JOIN ja trotzdem eine Zeile, allerdings mit einem NULL Wert. Soweit verstanden? Preisfrage: Was steht denn dann wohl in dem Feld Anlagennummer? Etwa NULL? Und was macht dann das WHERE, womit du sagst, gib mir alles wo 325 drin steht? Erwartest du dann die Zeilen mit dem Wert NULL? Die filterst du damit schön wieder aus :lol: |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Damit wären in der rechten Spalte NULL-Werte. Aber in der rechten Spalte sind Werte, die es gar nicht gibt.
|
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
eventuell so:
Code:
SELECT MG.MG, MGV.MelderGruppe, MGV.Anlagennummer
FROM MG LEFT JOIN (select MelderGruppe, Anlagennummer from EMA_MGV where Anlagennummer =325) AS MGV ON MG.MG = MGV.MelderGruppe; |
AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
Liste der Anhänge anzeigen (Anzahl: 1)
So nach längerem Nachdenken, Ja die "WHERE" Klausel schränkt das ganze ein. Allerdings funktioniert die "AND" Verknüpfung im JOIN auch nicht.
Das ganze mit der Hilfstabelle, ist eigentlich auch nicht der richtige Weg. Betrachte ich das ganze nämlich auf das Gesamtsystem, wäre die Umsetzung über eine Hilfstabelle wahrscheinlich nicht sinnvoll. Es gibt System, die verfügen nicht nur über 256/512 Meldergruppen, sondern sind frei Konfigurierbar von z.B. 1 - 99999. Somit wird das ganze wieder eine Formatierungsaufgabe. Mein aktueller Lösungsansatz (So sollte es vermutlich funktioniere) sieht folgendermaßen aus: 1. Abrage der zugehörigen Meldergruppen zu der entsprechenden Anlagennummer:
SQL-Code:
2. Einen Record_Array oder eine Objekt erstellen und Query zuweisen
SELECT * FROM MGV_EMA WHERE Anlagennummer = 1
Delphi-Quellcode:
Jetzt stellt sich mir halt nur die Frage, kann es wirklich so aufwendig sein, eine einzelne däml... Leerzeile in eine Reporttabelle einzufügen, wenn die Spalte (1) nicht fortlaufend nummeriert ist.
type
T_MGV_EMA = record MG: string; Name: string; end; ... var F_MGV_EMA : array of T_MGV_EMA ... //Query dem Record über Schleife zuweisen ... //Record prüfen und bearbeiten ... //Record einem tfrxUserDataSet zuweisen //Report erstellen Im Anhang mal ein Beispiel, von den aktuellen Dokumenten (Wir lösen das zur Zeit über Excel, jedoch manuell) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 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 by Thomas Breitkreuz