Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler (https://www.delphipraxis.net/104969-left-outer-join-abfrage-ok-aber-insert-fehler.html)

hronny 13. Dez 2007 13:59

Datenbank: PostgreSQL • Version: 8.1 • Zugriff über: PostgresDAC

LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
 
Ich habe eine PostgreSQL Datenbank, die mehrere Tabellen enthält. In der Haupttabelle sind verschiedene Felder die die ID-Nummer einer anderen Tabelle beinhalten. Das läst sich ja auch prima mit LEFT OUTER JOIN selectieren, um das in einem DBGrid vernünftig darzustellen. Soweit nix neues.
Delphi-Quellcode:
'SELECT daten.*, kategorie.kname AS kname FROM daten '+
  'LEFT OUTER JOIN kategorie ON daten.kat = kategorie.id '+
  'ORDER BY nummer ASC';
Klappt auch wunderbar. Nur beim Einfügen eines neuen Datensatz stört sich das Programm an einer Varible, die ja nicht in der einen Tabelle existiert.
Zitat:

PostgreSQL Error Code 1 Fehler Spalte Kname von Relation daten existiert nicht.
Mache ich die JOIN Zeile raus, habe ich keine Probleme. Die PostgresDAC Komponente besitzt auch kein separates InsertObjekt um das Problem evtl zu umgehen.

DeddyH 13. Dez 2007 14:02

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
 
Wie versuchst Du denn, den Datensatz einzufügen? Das ist mir nicht ganz klar geworden.

mschaefer 13. Dez 2007 14:07

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
 
Moin, moin,

Inserts in Joins sind zwar prinzipiell über Updateojekte möglich aber eher schwierig zu händeln.
Neige dazu die Einzeltabelle mit einer zweiten Query zu öffnen (rw) und hier den Insert auszuführen
und anschliessend den Join zu refreshen. Die Join -Query braucht dann nur als readonly geöffnet zu werden.

Grüße // Martin



PS: Das mit dem 'wie' scheint mir doch eine Fangfrage zu sein.. :mrgreen:

hronny 13. Dez 2007 14:21

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
 
Den Insert starte ich mittels Button:
Delphi-Quellcode:
DM1.PSQLdaten.Append();
DM1.PSQLdaten.Edit;
DM1.PSQLdaten.FieldByName('artnew').AsBoolean:=true;
DM1.PSQLdaten.FieldByName('limited').AsInteger:=0;
Dann fülle ich die Textfelder aus und ein anschließendes
Delphi-Quellcode:
DM1.PSQLdaten.Post;
bringt das ganze dann in die Datenbank.

mschaefer 13. Dez 2007 17:57

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
 
Da gibt es drei Probleme

1. Wie generierst Du das Primärid-Feld der ersten Tabelle (AutoInc?)
2. Wie generierst Du das Primärid-Feld der zweiten Tabelle (AutoInc?)
3. Wie generierst Du das Referenzid-Feld der in der zweiten Tabelle
__ mit dem ID-Wert des neu generierten Primärid-Wertes aus der ersten Tabelle?

Grüße // Martin

hronny 13. Dez 2007 20:35

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
 
Ja beide Primary Keys sind Autoincrementale Felder unter PostgreSQL Sequenzen genannt.
SQL-Code:
-- 1. Tabelle:
CREATE TABLE daten
(
  id serial NOT NULL,
  nummer character varying(12) NOT NULL,
  name character varying(60) NOT NULL,
  kat integer,
  limited integer,
  CONSTRAINT daten_pkey UNIQUE (id)
)

-- 2. Tabelle
CREATE TABLE kategorie
(
  id serial NOT NULL,
  kname character varying(32) NOT NULL,
  bild character varying(32),
  CONSTRAINT kategorie_pkey PRIMARY KEY (id)
)
Ein Referenzid-Feld habe ich nicht erstellt bzw verbinde ich es mittels JOIN Abfrage.
SQL-Code:
SELECT daten.*, kategorie.kname AS kname FROM daten
LEFT OUTER JOIN kategorie ON daten.kat = kategorie.id
ORDER BY nummer ASC
In der 2. Tabelle stehen nur 10 Datensätze und die jeweilige ID davon übernehme ich bei einem neuen Datensatz der Tabelle >daten< als Feld >kat<. Ich versteh nicht wo das Problem ist, da es meiner Meinung so üblich ist Daten miteinander zu verknüpfen. Wobei ich mich auch gerne eines besseren belehren lasse.

mschaefer 13. Dez 2007 21:12

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
 
Eigentlich hatte ich auf ein vergessenes Referenzfeld gehofft. Aber dem ist nicht so.
Mit den Sequenzen (durfte ich mich neulich auch schon mal rumschlagen) ist alles in Ordnung.

Damit liegt das Problem daran, dass die Zugriffskomponente (wie üblich bei Delphi) das Insert-Statement nicht richtig generiert.
Ein typischer Knackpunkt ist die automatische generierung beim ID-Feld der zweiten Tabelle, wo viele Komponenten einfach den bisherigen Wert nochmal hineinschreiben möchten (ID-Crash), da die Komponenten nur das erste Feld als Autogeneriert annimmt. Manchmal ordnen Sie auch alle Felder der ersten Tabelle zu und kennen die zweite überhaupt nciht.

Entweder man probiert das InsertStatement selbst zu generieren und trägt es dann über die "UpdateSQL-Komponenten" selber ein oder man nimmt zum Eintragen konsequent nur Eintabellenqueries.

Grüße // Martin

hronny 13. Dez 2007 22:55

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
 
Ich habe jetzt nach langem Ausprobieren die "Selbstbau-Insert-Variante" genutzt. Dabei habe ich wieder einen Fehler entdeckt, wobei ich nicht weis, ob das ein allgemeiner Fehler oder von meiner Komponente ist. Alle Memofelder lassen sich komischerweise nicht automatisch einfügen, sondern müssen nochmal "gequoted" werden. Siehe Beispiel:
Delphi-Quellcode:
DM1.PSQLdatenUpdate.InsertSQL.Clear;
DM1.PSQLdatenUpdate.InsertSQL.Add(
  'INSERT INTO daten '+
  ' ("nummer", "name", "kat", '+
  '  "textde", '+
  '  "datechanged") '+
  'VALUES '+
  ' (:"nummer", :"name", :"kat", '+
  QuotedStr(DM1.PSQLdaten.FieldbyName('textde').AsString)+', '+
  '  :"datechanged") ');
Danach reicht ein einfaches
Delphi-Quellcode:
DM1.PSQLdaten.Post;
und die Daten werden eingepflegt. Würde man die QuotedStr wieder in eine :"textde" umwandeln, meckert das Programm rum, das man keine Variable übergeben hat. Das tritt aber wie gesagt nur bei Memofeldern auf, bei den anderen nicht.

McFarlane 14. Dez 2007 04:55

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
 
Ich kenn nur MySQL, daher weiß ich nicht, ob Postrgre vielleicht einen anderen Dialikt hat, aber wieso "LEFT OUTER JOIN"?
"LEFT JOIN" würde doch auch reichen.

Edit:
Außerdem wenn du willst, das die SekundärID aud jenen Primärschlüssel abgebildet wird und du keine Felder in der Tabelle hast, die keinen zuweisbaren IDWert haben, benutzt du am besten:
SQL-Code:
SELECT foo.bar, f.nord
FROM foo INNER JOIN f
ON foo.ID = f.ID

hronny 14. Dez 2007 09:47

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
 
Ohne das OUTER würde der Datensatz nicht mehr angezeigt, wenn keine Zuordnung zwischen den Beiden Tabellen wäre. Aber selbst wenn ich alle Zuordnungen hätte, auch bei deinem Beispiel kann ich keinen Datensatz mit Delphi erzeugen. Sobald 2 Tabellen in der Abfrage sind, kann er die Felder aus der 2. Datenbank nicht finden - zumindest bei meiner PostgreSQL Komponente. Ob das unter MySQL auch so ist kann ich nicht sagen. Grundsätzlich entwickle ich Software für Kunden aus Lizenzrechlichen Gründen nur mit PostgreSQL.


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