AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler
Thema durchsuchen
Ansicht
Themen-Optionen

LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler

Ein Thema von hronny · begonnen am 13. Dez 2007 · letzter Beitrag vom 14. Dez 2007
Antwort Antwort
hronny

Registriert seit: 4. Mai 2006
Ort: Thüringen
97 Beiträge
 
Delphi 2007 Professional
 
#1

LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler

  Alt 13. Dez 2007, 13:59
Datenbank: PostgreSQL • Version: 8.1 • Zugriff über: PostgresDAC
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.
grep -ri shit /usr/src/linux/*
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler

  Alt 13. Dez 2007, 14:02
Wie versuchst Du denn, den Datensatz einzufügen? Das ist mir nicht ganz klar geworden.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#3

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler

  Alt 13. Dez 2007, 14:07
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..
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
hronny

Registriert seit: 4. Mai 2006
Ort: Thüringen
97 Beiträge
 
Delphi 2007 Professional
 
#4

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler

  Alt 13. Dez 2007, 14:21
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ßendesDM1.PSQLdaten.Post; bringt das ganze dann in die Datenbank.
grep -ri shit /usr/src/linux/*
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#5

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler

  Alt 13. Dez 2007, 17:57
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
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
hronny

Registriert seit: 4. Mai 2006
Ort: Thüringen
97 Beiträge
 
Delphi 2007 Professional
 
#6

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler

  Alt 13. Dez 2007, 20:35
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.
grep -ri shit /usr/src/linux/*
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#7

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler

  Alt 13. Dez 2007, 21:12
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
Martin Schaefer
Phaeno
  Mit Zitat antworten Zitat
hronny

Registriert seit: 4. Mai 2006
Ort: Thüringen
97 Beiträge
 
Delphi 2007 Professional
 
#8

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler

  Alt 13. Dez 2007, 22:55
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 einfachesDM1.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.
grep -ri shit /usr/src/linux/*
  Mit Zitat antworten Zitat
McFarlane

Registriert seit: 28. Nov 2007
5 Beiträge
 
#9

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler

  Alt 14. Dez 2007, 04:55
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
Die Trunkenheit von gestern löscht den Durst von heute.
  Mit Zitat antworten Zitat
hronny

Registriert seit: 4. Mai 2006
Ort: Thüringen
97 Beiträge
 
Delphi 2007 Professional
 
#10

Re: LEFT OUTER JOIN Abfrage ok, aber INSERT Fehler

  Alt 14. Dez 2007, 09:47
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.
grep -ri shit /usr/src/linux/*
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:39 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