AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi UPDATE OR INSERT INTO - Problem
Thema durchsuchen
Ansicht
Themen-Optionen

UPDATE OR INSERT INTO - Problem

Ein Thema von RWarnecke · begonnen am 31. Jul 2011 · letzter Beitrag vom 1. Aug 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

UPDATE OR INSERT INTO - Problem

  Alt 31. Jul 2011, 17:09
Datenbank: Firebird • Version: 2.1 • Zugriff über: UniDAC
Hallo zusammen,

mit dem folgenden Quelltext füge ich neue Datensätze hinzu oder ändere diese.
Delphi-Quellcode:
  with UniQuery_Ansprechpartner do
  begin
    SQL.Clear;
    SQL.Add('UPDATE OR INSERT INTO');
    SQL.Add('Ansprechpartner (Kundennr, Vorname, Nachname, Telefon1, Telefon2, Fax, Mobil, EMail)');
    SQL.Add('VALUES (:Kundennr, :Vorname, :Nachname, :Telefon1, :Telefon2, :Fax, :Mobil, :EMail)');
    SQL.Add('MATCHING (Kundennr, Vorname, Nachname)');
    ParamByName('Kundennr').AsString := Klasse.KundenNr;
    ParamByName('Vorname').AsString := Klasse.Vorname;
    ParamByName('Nachname').AsString := Klasse.Nachname;
    ParamByName('Telefon1').AsString := Klasse.Telefon1;
    ParamByName('Telefon2').AsString := Klasse.Telefon2;
    ParamByName('Fax').AsString := Klasse.Fax;
    ParamByName('Mobil').AsString := Klasse.Mobil;
    ParamByName('EMail').AsString := Klasse.EMail;
    Execute;
  end;
Nur bei der Änderung gibt es ein kleines Problem. Wenn ich jetzt den Nachnamen ändern muss, wird ein neuer Datensatz angelegt mit dem neuen Namen und der alte Datensatz bleibt bestehen. Da ich in der Tabelle keinen Index habe, ist dafür aus meiner Sicht der MATCHING-Teil schuld. Jetzt ist die Frage, wie kann ich es trotzdem realisieren, dass im bestehenden Datensatz der Nachname oder Vorname geändert werden kann ?

Meine Tabelle sieht so aus :

Code:
/******************************************************************************/
/****                                Tables                               ****/
/******************************************************************************/


CREATE GENERATOR GEN_ANSPRECHPARTNER_ID;

CREATE TABLE ANSPRECHPARTNER (
    ID       INTEGER NOT NULL,
    KUNDENNR VARCHAR(15) NOT NULL,
    VORNAME  VARCHAR(50) NOT NULL,
    NACHNAME VARCHAR(75) NOT NULL,
    TELEFON1  VARCHAR(30),
    TELEFON2  VARCHAR(30),
    FAX      VARCHAR(30),
    MOBIL    VARCHAR(30),
    EMAIL    VARCHAR(100)
);




/******************************************************************************/
/****                               Triggers                              ****/
/******************************************************************************/


SET TERM ^ ;



/******************************************************************************/
/****                         Triggers for tables                         ****/
/******************************************************************************/



/* Trigger: ANSPRECHPARTNER_BI */
CREATE OR ALTER TRIGGER ANSPRECHPARTNER_BI FOR ANSPRECHPARTNER
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_ANSPRECHPARTNER_id,1);
end
^


SET TERM ; ^
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: UPDATE OR INSERT INTO - Problem

  Alt 31. Jul 2011, 17:16
Das matching zeigt ja an, wann ein neueinzufügender Datensatz als vorhandener erkannt wird. In deinem Fall sollte doch Kundennr als alleiniger Wert schon für Eindeutigkeit ausreichen.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#3

AW: UPDATE OR INSERT INTO - Problem

  Alt 31. Jul 2011, 20:28
Hallo Markus,

nein, Kundennr reicht nicht als alleiniger Wert aus, da es für eine Kundennummer auch mehrere Ansprechpartner geben kann.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#4

AW: UPDATE OR INSERT INTO - Problem

  Alt 31. Jul 2011, 20:34
Hallo...

in deinem Falle ohne ID nicht möglich.
Zitat:
Jetzt ist die Frage, wie kann ich es trotzdem realisieren, dass im bestehenden Datensatz der Nachname oder Vorname geändert werden kann ?
... in dem du selbst entscheidest ob Insert oder Update und getrennte Statements absetzt.
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#5

AW: UPDATE OR INSERT INTO - Problem

  Alt 1. Aug 2011, 04:24
Wie mein Vorredner schon sagte, benötigst Du zur Unterscheidung, was den die Eindeutigkeit eines Ansprechpartners ausmacht, die "ID" als Kriterium. Dafür ist sie schließlich gedacht (mir fehlt allerdings noch das PK-Contstraint in der Tabellendefinition).
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: UPDATE OR INSERT INTO - Problem

  Alt 1. Aug 2011, 06:15
Hi,

muss der Anwender nicht um etwas zu ändern den Ansprechpartner / also den Datensatz erstmal aus einer Liste wählen? Dann hättest du doch alle Daten für Dein Update.
Er müsste dann nur einen Datensatz wählen für eine Änderung oder einen "Knopf" o.ä. für einen neuen Datensatz drücken. Kenn ich in fast allen Datenverarbeitungsanwendungen so. Wäre also meines Erachtens nicht schlimm. Aber ich kenne den genauen Anwendungsfall auch nicht.

Was für ein quatsch am Montag morgen Sorry - war noch nicht richtig wach

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules

Geändert von ChrisE ( 1. Aug 2011 um 06:17 Uhr) Grund: Montagmorgen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#7

AW: UPDATE OR INSERT INTO - Problem

  Alt 1. Aug 2011, 06:16
Man könnte doch über ein SubSelect versuchen eine ID zu finden und wenn keine gefunden wurde, dann eben NULL verwenden?

Nur die Frage ist, was man für dieses SubSelect für die eindeutige Erkennug nutzt, wenn was geändert wurde

Also eigentlich sollte ja eine ID für die Eindeutigkeit da sein und wenn man einen Datensatz ändert, mußte man ihn doch vorher ausgelesen haben?
Da sollte man sich die ID gleich mitnehmen und schon gibt es beim Absenden keine Probleme mehr, mit dem Insert or Update.


Wobei ID ja aktuell noch nicht eindeutig ist. Also PrimaryKey und Co. wären da ganz angebracht.
Also dürfte hier doch immer das Insert zuschlagen, egal was man angibt, da nirgendwo eine eindeutige Kennzeichnung möglich ist?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#8

AW: UPDATE OR INSERT INTO - Problem

  Alt 1. Aug 2011, 07:21
Guten Morgen zusammen,

erstmal danke für die vielen Antworten. Das Feld ID ist ein AutoInc und wird über einen Trigger gefüllt. Die ID vorher auszulesen und dann mitzugeben, wäre kein Problem. Das werde ich heute Abend mal ausprobieren.

Ein geteiltes Update und Insert wollte ich eigentlich gerne vermeiden. Deshalb habe ich den Befehl UPDATE OR INSERT gewählt.

Wenn ich einen Primary Key setze, könnte ich doch mir die MATCHING-Anweisung sparen ? Oder muss ich die Anweisung trotzdem benutzen ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: UPDATE OR INSERT INTO - Problem

  Alt 1. Aug 2011, 07:28
In der MATCHING-Klausel gibst Du ja die Felder an, die einen Datensatz eindeutig identifizieren (sollen). Wenn sich nun also der Nachname ändert und dieser Teil der MATCHING-Klausel ist, wird logischerweise ein neuer Datensatz angelegt. Wenn Du nun irgendein Feld/eine Kombination von Feldern als UNIQUE deklarieren kannst, bietet sich dieses dann auch als Kandidat für die MATCHING-Klausel an.
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
Neumann

Registriert seit: 6. Feb 2006
Ort: Moers
529 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: UPDATE OR INSERT INTO - Problem

  Alt 1. Aug 2011, 07:38
Denke, dass hier 2 Tabellen gebraucht werden, also eine mit den Kunden-Basisdaten (Adresse, Bank usw). Daraus kann man dann die KundenNr als Fremdschlüssel verwenden.

Außerdem würde ich "Update or Insert" bei der direkten Bearbeitung der D nicht verwenden. Entweder ändern oder neu, das sollte der Bearbeiter entscheiden. Die Nr für den Ansprechpartner kann automatisch über den Trigger generieren. Ein Primärschlüssel auf AnsprechpartnerNr würde die Sache dann noch perfekt machen.
Ralf
Gruß vom Niederrhein
  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 18:43 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