AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Query kopieren und Zeilen löschen
Thema durchsuchen
Ansicht
Themen-Optionen

Query kopieren und Zeilen löschen

Ein Thema von Kaarsten · begonnen am 23. Okt 2013 · letzter Beitrag vom 11. Nov 2013
Antwort Antwort
Seite 1 von 2  1 2      
Kaarsten

Registriert seit: 29. Aug 2013
5 Beiträge
 
#1

Query kopieren und Zeilen löschen

  Alt 23. Okt 2013, 21:07
Datenbank: Postgres • Version: 9.1 • Zugriff über: Delphi
Bei einer Abfrage über mehrere Tabellen mit FULL OUTER JOIN kann es zu doppelten Spaltenwerten kommen. Diese Query füttert eine DBGrid und dort sollen diese Zeilen ausgefiltert werden.

Meine Idee: Ich lade mir eine tempQuery und bearbeite diese. Danach kopiere ich sie in die eigentliche Query.

Ist das so machbar? Falls ja, dann stellen sich für mich folgende Fragen.

Wie kann man eine Query am einfachsten kopieren?
Wie kann man eine Zeile aus der Query löschen, oder aus einer anderen Kopie zufügen?

Wie gesagt, die Queries sind vom Aufbau her identisch.

Scheinbar ist diese Vorgehensweise vollkommen ungewöhnlich, da ich beim googlen nichts darüber finden konnte.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Query kopieren und Zeilen löschen

  Alt 23. Okt 2013, 21:48
Mmh, die Beschreibung klingt seltsam, kann mir vorstellen, dass es da bei google nichts zu holen gibt.
Zuallererst:
Wie wär es denn, die Query so zu schreiben, dass keine doppelten Spaltenwerte ausgeworfen werden.
Dann:
Eine Query enthält den Abfragetext (SQL) und beim Öffnen der Abfrage wird ein Dataset erzeugt (Ergebnis)
Was davon willst Du kopieren und bearbeiten?

Falls Du ernsthaft ein unpassendes Ergebnis zurechtfiltern willst. Mit SQL geht das sicher besser.
Gruß, Jo
  Mit Zitat antworten Zitat
Kaarsten

Registriert seit: 29. Aug 2013
5 Beiträge
 
#3

AW: Query kopieren und Zeilen löschen

  Alt 24. Okt 2013, 00:31
Das Dataset möchte ich bearbeiten, oder komplett kopieren.

Geht das auch zeilenweise?

Mein Problem. Ich brauche fast alle Infos aus mehreren Tabellen. Verbunden werden die durch eine/zwei ID's. In den Tabellen kann diese ID allerdings potentiell mehrfach vorkommen. Daher bekomme ich potentiell mehrere Ergebnisse für diese ID. Das ist ja ok. Ein Group By mit Postgres ist echt aufwendig.

Daher ist diese Lösung eventuell ein Weg?

Das Ergebnis des SQL liefert mir z.B. 4 Ergebnisse für die gleiche ID. Diese werden dann in der DBGrid angezeigt. Ich möchte dort aber nur ein Ergebnis.

DISTINCT hilft nicht, da die Datensätze unterschiedlich sind.
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Query kopieren und Zeilen löschen

  Alt 24. Okt 2013, 07:12
Ich denke deine Lösungsansatz ist nicht ganz der richtige Weg. Versuche die SQL-Abfrage so zu gestalten, dass sie dir genau das liefert was du haben möchtest. Es gibt hier genügend SQL-Experten, die dir dabei gerne helfen.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.737 Beiträge
 
Delphi 6 Enterprise
 
#5

AW: Query kopieren und Zeilen löschen

  Alt 24. Okt 2013, 08:25
Das Ergebnis des SQL liefert mir z.B. 4 Ergebnisse für die gleiche ID. Diese werden dann in der DBGrid angezeigt. Ich möchte dort aber nur ein Ergebnis.

DISTINCT hilft nicht, da die Datensätze unterschiedlich sind.
Entweder sind die Datensätze für die gleiche ID unterschiedlich (also die anderen relevanten Felder) dann sollten sie doch auch angezeigt werden, oder aber sie sind doch gleich, d.h. du bekommst einen Datensatz zu einer ID mehrfach (ggf. aus verschiedenen Quellen). In dem Fall reicht es doch ein Select Distinct um dein bisheriges SQL zu packen ala:

Code:
Select Distinct * From (Deine bisheriges SQl)
Zu deiner Idee und warum niemand mMn darauf eingeht:
a) es ist glaub ich nicht klar worauf die hinauswillst
b) du solltest glaub ich bestimmte Datensätze aus deinem Ergebnis rausfiltern (die die du nicht brauchst) willst aber stattdessen den anderen Weg gehen und die Datensätze, die du brauchst aus dem Ergebnis raus in ein anderes Grid beispielsweise kopieren. Das ist doch viel zu aufwendig und kompliziert, weswegen jeder hier vorschlägt doch einfach direkt die Ergebnisdatenmenge einzuschränken. Und auch wenn das deiner Meinung nach vllt. nicht geht, ist es vllt. mit Hilfe des Forums doch möglich, wir bräuchten nur mehr Infos dazu. Denn generell, wenn du deiner Lösung folgen würdest müsstest du doch auch die "brauchbaren" Datensätze irgendwie identifizieren können. Und diese Kriterien kann man doch sicher auch schon vorher im SQL unterbringen.
Ralph
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#6

AW: Query kopieren und Zeilen löschen

  Alt 24. Okt 2013, 08:35
1. Lade die Daten per normalem TQuery (oder was auch immer Du dafür verwendest)
2. Nimm ein TClientDataset, falls Du es hast, oder ein TkbMemTable. Oder TdxMemData, wenn Du DevExpress hast. Das sind In-Memory Datasets.
3. Überführe nur die eindeutigen Datensätze. Zum schnellen Prüfen eignet sich eine Dictionary am besten.

Aber wie schon alle vor mir gesagt haben: Mach es mit SQL. Das ist ein klassisches Problem, das z.B. mit Subselects oder Aggregaten (statt der JOINS) einfach zu lösen ist.

Kann aber auch sein, das deine Query einfach 'falsch herum ist'. Das wäre dann aber ein LEFT/RIGHT JOIN, was Du offenbar nicht hast.

Zeig den SQL-Code und dein spezifisches Problem (also Beispieldaten) und dir kann geholfen werden.
  Mit Zitat antworten Zitat
Kaarsten

Registriert seit: 29. Aug 2013
5 Beiträge
 
#7

AW: Query kopieren und Zeilen löschen

  Alt 8. Nov 2013, 21:59
Was mich interessieren würde ist einfach:
Kann man den Inhalt einer Query auf eine andere übertragen?

Geht so etwas wie: ZQueryTemp:= ZQuery ??
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Query kopieren und Zeilen löschen

  Alt 8. Nov 2013, 23:18
Na klar
Query1.SQL.Text:=Query2.SQL.Text ist aber wohl nicht was Du erreichen willst.

Wie wäre es wenn du mal eine Tabellenbeschreibung und eine Beschreibung des gewünschten Ergebnisses posten würdest?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#9

AW: Query kopieren und Zeilen löschen

  Alt 9. Nov 2013, 08:31
Kann man den Inhalt einer Query auf eine andere übertragen?

So sollte das funktionieren:
Delphi-Quellcode:
Procedure AppendDataset(aSource, aDestination : TDataSet);
Var
  bookmark : TBookmark;

  Procedure _AppendRow();
  Var
    field,dest : TField;

  Begin
    aDestination.Append;
    For field in aSource.Fields do begin
      dest := aDestination.FindField(field.FieldName);
      if dest <> nil then
        dest.Value = field.Value;
    end;
    aDestination.Post;

  End;

Begin
 bookmark = aSource.GetBookmark;
 aSource.DisableControls;
 Try
   aSource.First;
   while not aSource.Eof do begin
     _AppendRow();
     aSource.Next;
   end;
 Finally
    aSource.GotoBookmark(bookmark);
    aSource.FreeBookmark(bookmark);
    aSource.EnableControls;
 End;
End;
(Getippt und nicht getestet)

DAs ist natürlich so nicht das schnellste, weil jedes Mal 'FindField' aufgerufen wird. Wenn man sich das in einer Dictionary merkt, wird das viel flotter. Zudem sollte man wissen, das bei einem TDataset, welches an eine Datenbank gebunden ist, die neuen Zeilen sofort persitiert werden.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.737 Beiträge
 
Delphi 6 Enterprise
 
#10

AW: Query kopieren und Zeilen löschen

  Alt 11. Nov 2013, 09:30
Ich hab letztens mal eine FireDac Demo gesehen. Da sah das so aus, als könnte man damit das Ergebnis einer Query als Basisdatenmenge für eine weitere Query nutzen, das könnte vllt. dann sowas sein.

Wobei auch ich mich den Vorrednern anschließe, dass das sicher (mit dem richtigen SQL-Statement) auch einfacher geht.
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:11 Uhr.
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