Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem mit UNION Select (https://www.delphipraxis.net/113349-problem-mit-union-select.html)

mu8zeh 6. Mai 2008 15:13

Datenbank: Firebird 1.5 • Zugriff über: ZQuerry

Problem mit UNION Select
 
Hallo

Ich habe ein Problem beim erstellen einer UNION

Beisp.
Tabelle 1
Tag
1
2
3
4
5
6
.
.
31

Tabelle 2

TAG_______|MERKMAL|PERSNR
01.01.2008...String.....|String
02.01.2008
03.01.2008
04.01.2008
05.01.2008
06.01.2008
.
.
31.01.2008...|String.....|String



SQL.SELECT PERSNR, dTAG([Tag]) as Date, MERKMAL FROM TABELLE2
UNION 0 SELECT TAG, 0,0
FROM TABELLE1

Nun sollte das ganze so ausehen

DBGrid
PERSNR__1_2_3_4_5_6__31
001.....A..B..A..A..B..B..........C
002.....A..B..A..A..B..B..........C

In Access(Abfrage) funktioniert das.
Habe ich da einen Denkfehler? :wall:

Vielen Dank für eine Unterstützung

mkinzler 6. Mai 2008 15:20

Re: Problem mit UNION Select
 
Ich verstehe nicht ganz was du vorhast

mu8zeh 6. Mai 2008 15:35

Re: Problem mit UNION Select
 
Hallo und Danke


also Standartmässig werden die Daten unternander in Tabelle 2 gespeichert.
[u]Datum__|M|PERSNR
01.01.2008|A|001
02.01.2008|A|001
01.01.2008|B|002
02.01.2008|B|002
usw.

Für eine Ansicht in einem DBGrid brauche ich diese Daten aber nebeneinander.

PersNR|Datum|Datum|Datum >>> usw.

Ich hatte das mit einem StringGrid und SQL abgrage.
Wenn die Daten aber mehr als 100 sind ist das für eine optimale anzeige zu langsam.

mkinzler 6. Mai 2008 15:37

Re: Problem mit UNION Select
 
Das geht aber nicht mit einem UNION. Nennt man Übrigens Pivot.
is die Anzahl der Datensätze pro PersNr bekannt?

mu8zeh 6. Mai 2008 15:45

Re: Problem mit UNION Select
 
Hallo

die Anzahl ändert sich je nach eingabe

Mal noch ein bsp. wie ich's jetzt habe. Bis zu 5 PERSNR geht's ganz flott.

//**********************************
//Datum wird bereit gestellt
//**********************************

With Form1.StringGrid1 do begin
For NZ:= 4 to ColCount do begin
Cells[NZ,4]:= '';
Cells[NZ,0]:= FormatDateTime('ddd',dDatum);
Cells[NZ,1]:= FormatDateTime('dd',dDatum);
Cells[NZ,2]:= FormatDateTime('m',dDatum);
Cells[NZ,3]:= FormatDateTime('YYYY',dDatum);
Cells[NZ,5]:= FormatDateTime('mm',dDatum);
dDatum := dDatum +1;
end;
end;

//************************************************** ***************
//Daten werden geladen
//************************************************** ***************
procedure TForm1.LadeDaten(Sender: TObject; d,m,X,Y,Z,S: Integer);
begin

Z := 0;
while StringGrid2.Cells[0,Z]<> '' do begin
inc(S);
inc(Z);
end;

Z := 0;
with StringGrid2 do
while StringGrid2.Cells[0,Z]<> '' do begin
mxStatusBar1.Panels[3].ProgressBar.Min := 0;
mxStatusBar1.Panels[3].ProgressBar.Max := S;
mxStatusBar1.Panels[3].ProgressBar.Position := Z;

with DataModule1.ZTEMP2007 do begin
SQL.Clear;
SQL.Add('SELECT TEMP2007.DATUM, TEMP2007.TAG, TEMP2007.MONAT, '+
'TEMP2007.JAHR, TEMP2007.PERSONALNR, TEMP2007.URLAUB, '+
'TEMP2007.KURZZEICHEN, TEMP2007.MEMOTEXT, TEMP2007.AENDERUNG, '+
'TEMP2007.AENDERUNGVON, KATEGORIE.COLOR FROM TEMP2007 '+
'INNER JOIN KATEGORIE ON (TEMP2007.KURZZEICHEN = '+
'KATEGORIE.KURZZEICHEN) WHERE TEMP2007.PERSONALNR = '+
QuotedStr(StringGrid2.Cells[0,Z]) +' AND TEMP2007.MONAT >= '+
QuotedStr(StringGrid1.Cells[4,5]) +' AND TEMP2007.JAHR = '+
QuotedStr(StringGrid1.Cells[4,3])+
' AND TEMP2007.KURZZEICHEN <> '+ QuotedStr('-')+' ORDER BY MONAT, TAG');
Active := True;
with StringGrid1 do begin
For X := 4 to StringGrid1.ColCount -1 do begin
Datum := StrToDate(Cells[X,1] + '.' + Cells[X,5] + '.' + Cells[X,3]);
First;
While Not Eof do begin
if FieldValues['DATUM'] = DateToStr(Datum) then begin
with StringGrid3 do
StringGrid3.Cells[x-4,Z] := FieldValues['KURZZEICHEN'];
end;
Next;
end;
end;
end;
Next;
end;
Z := Z+1;
end;
mxStatusBar1.Panels[3].ProgressBar.Position := 0;
end;

mkinzler 6. Mai 2008 15:54

Re: Problem mit UNION Select
 
SQL-Code:
select
    distinct p.persnr,
    first 1 d.datum as datum1,
    first 1 skip 1 d.datum as datum2,
    first 1 skip 2 d.datum as datum 3,
    ...
from
    tabelle2 p
        left join tabelle2 d on d.persnr = p.persnr;

mu8zeh 6. Mai 2008 21:01

Re: Problem mit UNION Select
 
es will einfach nicht

habe es nochmal mit der Union versucht

select temp2007.personalnr, temp2007.tag As dTAG, temp2007.kurzzeichen, temp2007.monat, temp2007.jahr, temp2007.memo from temp2007
union select 0, DummyDay ,0,0,0,0
from dummy

das ist die Fehlermeldung :gruebel:

Column does not belong to referenced table.
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid command.
Data type unknown.

Bekommt man hier Bilder rein? Dann könnte ich mal zeigen wie ich es bräuchte.

mkinzler 6. Mai 2008 21:06

Re: Problem mit UNION Select
 
Ja, man kann Bilder anhängen. Aber mit einem UNION kann man dein Problem nicht lösen.

mu8zeh 6. Mai 2008 21:17

Re: Problem mit UNION Select
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich verstehe nich, wieso Funktioniert das in Access(SQL) und in Delphi nicht?

Kennst Du noch weitere Möglichkeiten?

omata 6. Mai 2008 21:20

Re: Problem mit UNION Select
 
Zitat:

Zitat von mu8zeh
Für eine Ansicht in einem DBGrid brauche ich diese Daten aber nebeneinander.

PersNR|Datum|Datum|Datum >>> usw.

Aus deinen Ausführungen werde ich nicht wirklich schlau.

Schön das dich mkinzler versteht, aber vielleicht kannst du nochmal genauer erklären was du eigentlich haben möchtest.

- Was ist z.B. mit verschiedenen Monaten und Jahren?
- Wieso Datum neben Datum, sollte da nicht das Merkmal stehen?

Das das Access kann ist klar, das hat aber rein gar nichts mit SQL zu tun, dafür hat man dann OLAP erfunden. Aber das das Firebird nicht kann hat nichts mit Firebird zu tun, sowas musst du selber machen (in deiner Anwendung) oder zum Beispiel mit Excel als Pivot-Tabelle (und SQL-Abfrage im Hintergrund), dann müssen die Daten nämlich auch anders (nämlich in Zeilen) vorliegen, so wie das eine Datenbank kann und normalerweise liefert.

Ich weiss das dir das jetzt nicht weiterhilft, aber deine Aussagen sind einfach nicht präzise genug, um dir wirklich helfen zu können.

Edit: hier nochmal ein Vorschlag...
SQL-Code:
SELECT DISTINCT persnr, t1.merkmal AS t1, t2.merkmal AS t2, t3.merkmal AS t3
FROM tabelle2 x
LEFT JOIN tabelle2 t1
  ON    x.persnr = t1.persnr
     AND EXTRACT(DAY FROM t1.tag) = 1
LEFT JOIN tabelle2 t2
  ON    x.persnr = t2.persnr
     AND EXTRACT(DAY FROM t2.tag) = 2
LEFT JOIN tabelle2 t3
  ON    x.persnr = t3.persnr
     AND EXTRACT(DAY FROM t3.tag) = 3
:
:
Aber die eigentliche Frage bleibt: Was ist mit verschiedenen Monaten/Jahren?

Du must dich von der Vorstellung lösen, das du die Spalten einer Tabelle variable durch die Zeilen einer Tabelle abbilden/bestimmen kannst. Das hat nichts mit SQL zu tun!

Gruss
Thorsten

mu8zeh 6. Mai 2008 21:40

Re: Problem mit UNION Select
 
Hallo Zusammen

Ich hatte einen Schichtplaner im Access erstellt. Auf Grund der Datenmenge ist die Anwendung aber mitlerweile recht langsam. Nun habe ich das Ganze mit Delphi erstellt wo alle Mitarbeiter oder nur Gruppen angezeigt werden können. Im Bild(Pl.jpg) wird dargestellt, wie die Daten angezeigt werden.

Das Ganze ist mit 3 StringGrids aufgebaut StrinGrit1 = Datumsanzeiger StringGrid2 = MA Anzeiger und StringGrid3 = Datenanzeiger. Wenn ich mir die Ansicht monatsweise erstelle, dann werden die Daten recht zügig ca(5 -15 sek) geladen. Nun wollte ich aber versuchen, dass die Daten auch tagesweise geladen werden und bin der Meinung, das das StringGrid3 welches die Daten anzeigt durch ein DBGrid ersetzt werden müsste. Ein DBGrid kann ja gleich mit der Datenbank verbunden bleiben. Hierzu muss ich aber die Daten, welche untereinander stehen nebeneinander hinbekommen. Wie schon beschrieben in Access ....

Ich dachte ich könnt mal schnell den Selben SQL befehl nehmen. :pale:

Vieleicht habt Ihr eine Iddee? Ich würde vor neid Platzen.

Vielen Dank

mkinzler 6. Mai 2008 21:43

Re: Problem mit UNION Select
 
Hier würde sich eine SP anbieten.

mu8zeh 6. Mai 2008 21:44

Re: Problem mit UNION Select
 
eine SP?

frag mich, was ist das?

mu8zeh 6. Mai 2008 21:44

Re: Problem mit UNION Select
 
eine SP?

frag mich, was ist das?

omata 6. Mai 2008 21:45

Re: Problem mit UNION Select
 
Schade, das du nicht auf meine Anregungen/Fragen/Kommentare eingegangen bist.

Naja, vielleicht versteht dich ja jemand anderes und kann dir helfen.

Viel Glück

mkinzler 6. Mai 2008 21:46

Re: Problem mit UNION Select
 
SP = Stored Procedure: Code der auf vom DBMS ausgeführt wird
@Thorsten: Ich glaube er versteht deinen Vorschlag nur nicht

mu8zeh 6. Mai 2008 21:48

Re: Problem mit UNION Select
 
Heee Omata

sorry ich war gerade am Testen

mu8zeh 6. Mai 2008 21:55

Re: Problem mit UNION Select
 
An Monat und Jahr habe ich erst einmal noch nicht gedacht. Währe froh, wenn es erst einmal inerhalb eines Monats Funktioniert. Es ist aber nur ein Versuch.

Können die Feldnamen eines DBGrids zur Laufzeit geändert werden? Dann hätte ich eine Iddee.

Vielen Dank

mkinzler 6. Mai 2008 22:05

Re: Problem mit UNION Select
 
Ja kann man

omata 6. Mai 2008 22:08

Re: Problem mit UNION Select
 
Ok, da hattest du noch gar nicht dran gedacht. Das ist aber wichtig zu wissen!

Also nochmal langsam...
UNION = Zeilen in dein Ergebnis einbauen, die so nicht in einer Tabelle zu finden sind
LEFT JOIN = Spalten in dein Ergebnis einbauen, die so nicht in einer Tabelle zu finden sind

Access baut auf deinen SQL-Abfragen auch eine eigene Struktur auf und realisiert damit eine Piviot-Tabelle, so wie es auch Excel durchführen kann. Wenn du das jetzt mit einer einfachen Query + DBGrid realisieren möchtest, dann wird das nicht gehen. Wenn du doch eine Lösung finden solltest, dann ist diese nur eine mit sehr großen Einschränkungen, mit der du übermorgen wieder am Poller bist.

Ich denke du müstest dort mit einem eigenen Grid arbeiten und dir im Hintergrund eine Struktur bauen, die dir die Daten aus der Datenbank so umformt, dass sie angezeigt werden können.

Ich realisiere gerne komplizirte SQL-Abfragen, hier sehe ich allerdings nicht viel Möglichkeiten, außer die die ich schon gepostet habe.

Edit: Und nochmal eine Frage: Kannst du das nicht nochmal genauer erklären. Dir ist das alles klar, ich kann aber leider nicht in deinen Kopf hineinsehen. Also noch eine Frage: Ist die Struktur an Spalten in deiner Ergebnismenge konstant?

Gruss
Thorsten

mu8zeh 6. Mai 2008 22:23

Re: Problem mit UNION Select
 
Vielen Dank erst einmal für die schnellen anregungen.
Ich geb's ja zu, war von Access geblendet.

@Thorsten
Die Datenmenge ist ansteigend, Struktur bleibt gleich
Könnte das gehen?

wenn ich das Datum nich als CHAR (01.01.2008) sondern als DateTime Format (39448) Speichere
und zur laufzeit den Spaltenname vom DBGrid auch 39448
vergebe.

Ich weis noch nicht ob das Funktoniert, aber ich könnte mir vorstellen, dass dann die Daten
in der DBGrid-Spalte angezeigt werden könnten.

Ich werde morgen mal einen Versuch starten.

omata 6. Mai 2008 22:30

Re: Problem mit UNION Select
 
Ich weiss nicht ob das geht (ich verstehe dich nicht).

Dein Bild der Tabelle hilft mir auch nicht. Kannst du nicht nochmal konkret, genau und präzise deine Wunsch-Tabelle erklären. Deine leere Tabelle (Bild) macht mir das einfach nicht klar genug. Sorry, ich bin nunmal so doof.

Aber du gehst da mit keinem einzigen Satzzeichen mal drauf ein, ich glaube ich gebe dann einfach auf. Ich Formuliere hier immer die gleichen Fragen.

Du wirst das schon hinkriegen.

mkinzler 6. Mai 2008 22:32

Re: Problem mit UNION Select
 
Poste mal die (Test-Tabelle)

mu8zeh 6. Mai 2008 22:37

Re: Problem mit UNION Select
 
@Torsten
ich könnte Dir mal das Projekt per Mail senden ca. 4 MB.
Ich kann mir vorstellen was ich möchte ab etwas schlecht beschreiben.

währe das OK?

mkinzler 6. Mai 2008 22:38

Re: Problem mit UNION Select
 
Stelle es doch hier ein

mu8zeh 6. Mai 2008 22:50

Re: Problem mit UNION Select
 
Ich habe es erst einmal aufgegeben. Die Idee war wohl doch nicht so gut.
Bleibe erst mal bei meinen leisten und Verwende die Monatliche anzeige.


aber Vielen Dank für Eure Bemühungen :-D

mkinzler 6. Mai 2008 22:51

Re: Problem mit UNION Select
 
Das Problem ist gut lösbar, wenn man das Prinzip verstanden hat.

mu8zeh 6. Mai 2008 22:58

Re: Problem mit UNION Select
 
Das das Problem lösbar ist kann ich mir gut vorstellen. Ich dacht aber es währe einfacher.
Ich muss mir erst mal einen Plan machen, um das Prinzip was ich möchte hier genauer einzustellen.
Habe aber heute erstmal keinen Plan mehr.

Morgen ist auch noch ein Tag.

Vielen Dank erst ein mal und Gut Nächtle.

mu8zeh 7. Mai 2008 11:33

Re: Problem mit UNION Select
 
Hallo Thorsten

nochmal vielen Dank für Deine Bemühungen

Ich habe mir nochmal alles durchgelesen. Naja, heute würde ich nicht ganz schlau werden.
Ich bin immer von Access ausgegangen.

Ich versuche es nochmal zubeschreiben.

ich habe Daten aus Firebird in Excel eingelesen.

Spalte A = Datum
Spalte B = Personalnr
Spalte C = Kurzzeichen

Anzahl Daten = 678

Dann habe ich eine Pivot-Tabelle erstellt

Zeile = PersonalNr
Spalte= Datum
Daten = Kurzzeichen

So etwas könnte ich in Delphi gebrauchen und habe aber keinen Plan.

Für das Tägliche anzeigen in Delphi müssten die Daten immer vorhanden sein nicht erst nachdem der SQL befehl eingestellt ist (Procedure ist auf Seite 1).
Ich hatte mal versucht, die Daten gefiltert nach Personalnummer bei Form1.OnActivate in einem StringGrid einzulesen. Dies hat funktioniert, aber bei einer großen Datenmenge (pro Persnr = 365 Tage) dauer etwa 35 min. Nun konnte ich aber im StringGrid mit Horizontaler ScrollBar hin und her wandern, die Daten waren schon geladen.

Kannst Du mir jetzt etwas folgen was ich erreichen möchte?

mkinzler 7. Mai 2008 11:39

Re: Problem mit UNION Select
 
Poste doch mal eine Testdatenbank

mu8zeh 7. Mai 2008 17:04

Re: Problem mit UNION Select
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe eine Testdatenbank erstellt.
Wobei die Tabelle "TEMP2007" die gewünschten Daten enthält.

mkinzler 7. Mai 2008 17:21

Re: Problem mit UNION Select
 
Die Datenbank wird als nicht valid erkannt
Welche Serverversion?

mu8zeh 7. Mai 2008 17:23

Re: Problem mit UNION Select
 
Firebird 1.5

mkinzler 7. Mai 2008 17:26

Re: Problem mit UNION Select
 
Stell mal das Create-Skript ein

mu8zeh 7. Mai 2008 17:29

Re: Problem mit UNION Select
 
welches willst Du?

Wo ich die Daten im StrigGrid bereit stelle?
Das steht schon auf der 1. Seite.

mkinzler 7. Mai 2008 17:32

Re: Problem mit UNION Select
 
Nein, ein Skript zum Erzeugen der Datenbank.

mu8zeh 7. Mai 2008 17:45

Re: Problem mit UNION Select
 
Die Datenbank wird mit IBExpert erzeugt. Ich muss mal suchen gehen.

mkinzler 7. Mai 2008 17:47

Re: Problem mit UNION Select
 
Nützliches->Extrahiere Metadaten
Metadaten und Datentabellen auswählen

DeddyH 7. Mai 2008 17:47

Re: Problem mit UNION Select
 
Schau mal unter Metadaten.

mu8zeh 7. Mai 2008 17:54

Re: Problem mit UNION Select
 
Metadaten sagt mir nicht sehr viel. Werde mich aber mal belesen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:40 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