Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Fast Report - Leerzeile einfügen bei fehlendem Datensatz (https://www.delphipraxis.net/182998-fast-report-leerzeile-einfuegen-bei-fehlendem-datensatz.html)

Jens Hartmann 3. Dez 2014 07:45

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

Sir Rufo 3. Dez 2014 08:02

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.

DeddyH 3. Dez 2014 08:06

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.

Jens Hartmann 3. Dez 2014 08:28

AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
 
Zitat:

Zitat von Sir Rufo
Du musst diesen "leeren" Datensatz dem Report zur Verfügung stellen. Also einfach vor dem Report aktiv werden.

Das geht leider nicht, da es diesen leeren Datensatz nicht gibt. Ich habe eine Tabelle, in der Störmeldungen eingetragen sind. Technisch kann man hier 512 Stück/pro Störmeldeanlage anlegen. Existieren diese nicht, werden diese in der DB auch nicht angelegt.

Zitat:

Zitat von DeddyH
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.

Der Ansatz scheint mir logisch, aber doch sehr aufwendig. Eventuell sollte ich das DataSet für die Übergabe an den Report entsprechend erweitern.

Dejan Vu 3. Dez 2014 08:38

AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
 
Code:
select n.LaufendeNummer, d.* 
  from AlleNummern n
       left join MeineDaten d
         on n.LaufendeNummer = d.Nummer
  where n.LaufendeNummer between :Anfang and :Ende
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.

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.

jobo 3. Dez 2014 08:48

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.

Jens Hartmann 3. Dez 2014 09:14

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

Sir Rufo 3. Dez 2014 09:19

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.

jobo 3. Dez 2014 09:29

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.

Sir Rufo 3. Dez 2014 09:43

AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
 
Zitat:

Zitat von jobo (Beitrag 1282065)
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.

Das ist doch genau das was ich sage "dem Report entsprechende Informationen liefern". Wie und wann und wieso ist egal, der Report bekommt einfach alle Informationen übermittelt.

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.

Dejan Vu 3. Dez 2014 10:29

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.

Jens Hartmann 3. Dez 2014 19:17

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

Dejan Vu 3. Dez 2014 19:22

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.

Jens Hartmann 3. Dez 2014 19:25

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:
SELECT Meldergruppe, Adresse, Geschoss, Meldebereich, Meldergruppentyp, Melderanzahl, Melderart, TS_insert, TS_update FROM MGV_EMA WHERE Anlagennummer= :ID ORDER BY Meldergruppe
Das Feld Meldergruppe ist eventuell nicht fortlaufend...

Jens Hartmann 3. Dez 2014 19:31

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

jobo 3. Dez 2014 20:31

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..

Jens Hartmann 3. Dez 2014 21:22

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.

Sir Rufo 3. Dez 2014 23:21

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).
Value
1
2
:
255
256
Für die aktuelle Abfrage benötigst du davon die Zeilen
SQL-Code:
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
Das DataSet sieht dann schon mal so aus
ValueMeldegruppe
11
22
3NULL
4NULL
5NULL
6NULL
77
Damit kannst du ja schon mal weiter experimentieren

Jens Hartmann 4. Dez 2014 07:31

AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
 
Zitat:

Zitat von Sir Rufo
Das DataSet sieht dann schon mal so aus
Value Meldegruppe
1 1
2 2
3 NULL
4 NULL
5 NULL
6 NULL
7 7
Damit kannst du ja schon mal weiter experimentieren

Das ist mir ja alles soweit klar. Habe ich ja in meinem vorherigen Beitrag geschrieben.
Zitat:

Zitat von Jens Hartmann
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.

Jetzt habe ich das ganze in einem Dataset. Das ist bei mir die Komponenten tfrxDBDataSet. Ich sehe hier aber keine Möglichkeit der Bearbeitung mehr. Das heißt doch dann, das ich die Daten entweder direkt per SQL so fertig filtern muss oder z.B. in einen Record geben kann, dort bearbeiten und anschließend an ein tfrxUserDataSet geben muss.

Jumpy 4. Dez 2014 07:54

AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
 
Code:
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
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:
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
       )

EarlyBird 4. Dez 2014 07:55

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;

Dejan Vu 4. Dez 2014 08:03

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:
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;
Du gehst von hinten nach vorne durch und löschst eine leere Zeile, wenn die zuvor besuchte (also, die darunter) auch schon leer war.

Jens Hartmann 4. Dez 2014 20:00

AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
 
So, jetzt Doktor ich hier schon wieder etwas länger rum

Zitat:

Zitat von Sir Rufo
SQL-Code:
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
 
Value Meldegruppe
1 1
2 2
3 NULL
4 NULL
5 NULL
6 NULL
7 7

Ich frage mich dir ganze Zeit, wie Du die NULL in das Ergebnis bekommst. Ich habe das jetzt mehrfach versucht und in verschiedenen Varianten. Aber nie werden die NULL Spalten angezeigt.

Nach genauer Prüfung, kann das ja auch nicht gehen...
SQL-Code:
from
  ValueTable
left join MelderGruppen
  on Meldergruppe = Value
Im Left Join, wird ja abgefragt, ob der Wert Meldergruppe = Value ist

->

Meldergruppe(1) = Value(1) = true
Meldergruppe(?) = Value(2) = false

DeddyH 4. Dez 2014 20:13

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.

himitsu 4. Dez 2014 20:13

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)

Jens Hartmann 4. Dez 2014 20:23

AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von DeddyH
Ein Left Join ist ein Outer Join, d.h. dass wenn es in der "rechten" Tabelle keine Entsprechungen gibt, werden deren Felder genullt.

Ich weiß, nur irgendwas geht halt nicht... Folgend mal die Abfrage...

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

himitsu 4. Dez 2014 20:29

AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
 
Sicher, daß in MGV_EMA diese Datensätze wirklich nicht drin sind? :stupid:

Jens Hartmann 4. Dez 2014 20:33

AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von himitsu
Sicher, daß in MGV_EMA diese Datensätze wirklich nicht drin sind?

SQL-Code:
SELECT Meldergruppe FROM MGV_EMA WHERE Anlagennummer = 325 ORDER BY Meldergruppe
Ich denke schon... Siege Abfrage und Anhang

himitsu 4. Dez 2014 20:36

AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
 
Ups, falsch geguckt. :oops:

Und wie sieht ZahlerEMA aus?

Jens Hartmann 4. Dez 2014 20:38

AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wie vorgesehen

himitsu 4. Dez 2014 20:40

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.

Jens Hartmann 4. Dez 2014 20:43

AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
 
Ja, genau. So sitze ich aktuell auch hier.

himitsu 4. Dez 2014 20:47

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

Jens Hartmann 4. Dez 2014 20:56

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:
ZahlerEMA right join MGV_EMA
Pass ich die Abfrage wieder an Rechte/Linke Tabelle wieder so...

SQL-Code:
MGV_EMA right join ZahlerEMA on MGV_EMA

Sir Rufo 4. Dez 2014 21:23

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

Jens Hartmann 4. Dez 2014 21:34

AW: Fast Report - Leerzeile einfügen bei fehlendem Datensatz
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Sir Rufo
Preisfrage: Was macht ein WHERE in einem SQL-Statement?

Wer das beantworten kann, weiß auch warum das Ergebnis so aussieht.

Wer das beantworten kann, weiß das nicht.

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.

Sir Rufo 4. Dez 2014 21:43

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:

Dejan Vu 5. Dez 2014 06:45

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.

EarlyBird 5. Dez 2014 07:57

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;

Jens Hartmann 5. Dez 2014 08:07

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:
SELECT * FROM MGV_EMA WHERE Anlagennummer = 1
2. Einen Record_Array oder eine Objekt erstellen und Query zuweisen

Delphi-Quellcode:
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
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.

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 19:30 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz