![]() |
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 |
Re: Problem mit UNION Select
Ich verstehe nicht ganz was du vorhast
|
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. |
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? |
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; |
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; |
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. |
Re: Problem mit UNION Select
Ja, man kann Bilder anhängen. Aber mit einem UNION kann man dein Problem nicht lösen.
|
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? |
Re: Problem mit UNION Select
Zitat:
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:
Aber die eigentliche Frage bleibt: Was ist mit verschiedenen Monaten/Jahren?
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 : : 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 |
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 |
Re: Problem mit UNION Select
Hier würde sich eine SP anbieten.
|
Re: Problem mit UNION Select
eine SP?
frag mich, was ist das? |
Re: Problem mit UNION Select
eine SP?
frag mich, was ist das? |
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 |
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 |
Re: Problem mit UNION Select
Heee Omata
sorry ich war gerade am Testen |
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 |
Re: Problem mit UNION Select
Ja kann man
|
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 |
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. |
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. |
Re: Problem mit UNION Select
Poste mal die (Test-Tabelle)
|
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? |
Re: Problem mit UNION Select
Stelle es doch hier ein
|
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 |
Re: Problem mit UNION Select
Das Problem ist gut lösbar, wenn man das Prinzip verstanden hat.
|
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. |
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? |
Re: Problem mit UNION Select
Poste doch mal eine Testdatenbank
|
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. |
Re: Problem mit UNION Select
Die Datenbank wird als nicht valid erkannt
Welche Serverversion? |
Re: Problem mit UNION Select
Firebird 1.5
|
Re: Problem mit UNION Select
Stell mal das Create-Skript ein
|
Re: Problem mit UNION Select
welches willst Du?
Wo ich die Daten im StrigGrid bereit stelle? Das steht schon auf der 1. Seite. |
Re: Problem mit UNION Select
Nein, ein Skript zum Erzeugen der Datenbank.
|
Re: Problem mit UNION Select
Die Datenbank wird mit IBExpert erzeugt. Ich muss mal suchen gehen.
|
Re: Problem mit UNION Select
Nützliches->Extrahiere Metadaten
Metadaten und Datentabellen auswählen |
Re: Problem mit UNION Select
Schau mal unter Metadaten.
|
Re: Problem mit UNION Select
Metadaten sagt mir nicht sehr viel. Werde mich aber mal belesen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:46 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-2025 by Thomas Breitkreuz