Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensatz per Button in eine Tabelle einfügen... (https://www.delphipraxis.net/2355-datensatz-per-button-eine-tabelle-einfuegen.html)

swoob 19. Jan 2003 15:55


Datensatz per Button in eine Tabelle einfügen...
 
HI!
Also ich stehe mal wieder vor einem rießen problem.
Und zwar will ich aus einer Tabelle den markierten Datensatz in eine andere Tabelle einfügen. Dies ging mit der SQL Komponente gleich gar nicht. (read-only fehler).
Daher habe ich eine Table Komponente genommen.
Es klappt nun auch den markierten Datensatz in die andere Tabelle einzufügen. Versuche ich allerdings diesen Datensatz nochmals in die Tabelle einzufügen kommt eine "Key Violation".
Kann mir dabei jemand helfen?

Ich benutze diesen Programmcode:
Zitat:

procedure TForm4.Button2Click(Sender: TObject);
begin
Table1.edit;
Table1.Append;
Table1.Insert;
Table1Datum.Value := DateTimePicker1.Date;
Table1ArtikelNr.Value := Query1.FieldByName('ArtikelNr').AsInteger;
Table1Produktname.Value := Query1.FieldByName('Produktname').AsString;
Table1Produkttyp.Value := Query1.FieldByName('Produkttyp').AsString;
Table1KundenNr.Value := StrToInt(Label7.Caption);
Table1.Post;
Table1.Next;
end;

mfg
swoob

PS: weiß auch jemand ob man das nicht doch auch mit einer SQL Komponente machen kann? Kann man mit einer SQL Komponente den Datensatz auch bearbeiten, zb mit einem DBNavigator??[/quote]

MrSpock 19. Jan 2003 16:05

Hallo swob,

es ginge zwar auch mit einer TQuery Komponente, aber ein eTTable Komponente ist auch gut.

Das Problem ist, das für die Tabelle, in die du die Daten einfügst ein Index definiert ist. Dieser Primärindex muss eindeutig sein, deshalbkannst du denselben Satz nicht zweimal einfügen.

Angenommen das Datum sei der Index, dann kannst du vorher abfragen, ob der Datensatz bereits existiert:

Delphi-Quellcode:
...
if Table1.FindKey([DateTimePicker1.Date]) then
  { Datensatz existiert schon, also überschreiben }
  Table1.Edit
else
  { Datensatz existiert noch nicht, also neu anlegen }
  Table1.Insert;
Du kannst natürlich auch eine Fehlermeldung ausgeben, falls der Satz nicht überschrieben werden soll.

swoob 19. Jan 2003 16:13

PrimärIndex??
 
Woher erkenne ich den PrimärIndex?
Muss ich das dann nur mit dem PrimärIndex prüfen??

mfg
swoob

MrSpock 19. Jan 2003 17:57

Hallo swoob,

wenn du die Zieltabelle z.B.mit dem Datenbankexplorer öffnest und dann auf das "+" vor der Tabelle klickst, dann öffnet der Explorer die Informationen, u.a. erscheint der Block "Indizes", dort stellst du fest, ob und wenn ja welche Indizes definiert sind. Noch einfacher ist es, wenn du die Datenbankoberfläche stratest und dort Tools|Tabellenoperation|StrukturInfo... anklickst. In der Ansicht bilden alle Felder von oben beginnend, die ein Stern in der rechten Spalte haben den Primärindex.

Beim Einfügen kommt es in der Regel tatsächlich nur auf den Primärindex an. Ausnahme wäre nur, falls du einen Sekundärindex definiert hättest, der ebenfalls eindeutig sein muss, dann wird es schwieriger. Aber das ist selten der Fall.

swoob 19. Jan 2003 19:24

Hi!
Also irgendwie habe ich diese key violation noch nicht in den griff bekommen.
Mein programmcode sieht so aus:
Zitat:

procedure TForm4.Button4Click(Sender: TObject);
begin

Form3.Query2.edit;
Form3.Query2.Append;
Form3.Query2.Insert;
Form3.Query2Datum.Value := DateTimePicker1.Date;
Form3.Query2ArtikelNr.Value := Table1.FieldByName('ArtikelNr').AsInteger;
Form3.Query2Produktname.Value := Table1.FieldByName('Produktname').AsString;
Form3.Query2Produkttyp.Value := Table1.FieldByName('Produkttyp').AsString;
Form3.Query2KundenNr.Value := StrToInt(Label7.Caption);
Form3.Query2.Post;
Form3.Query2.Next;

Table1.Delete;
end;
Ich habe es leider nicht geschafft deinen Vorschlag einzubauen, da ich daüfr zu wenig Kenntnis habe.
Könntest du mir ein konkreteres Beispiel schreiben?
Bei mir können nicht mal 2 verschiedene Kunden, dh 2 verschiedene KundenNr, ein und denselben Artikel kaufen.
Was kann ich tun?

mfg
swoob.

Gollum 19. Jan 2003 22:07

Hallo,

so kann das auch nicht gehen:

Eine Query hat kein Edit, Append und Insert. Datensätze werden über "INSERT", das in einem SQL-Statemant übergeben werden muss, eingefügt.

Zurück zu Deinem Beispiel mit TTable:
Code:
procedure TForm4.Button2Click(Sender: TObject);
begin
{ Table1.edit; // Tabelle wird in den EditModus versetzt - hier nicht notwendig, da neuer Satz eingefügt wird }
Table1.Append; // neuer Datensatz angefügen
{ Table1.Insert; // An akt. Pos nochmals einen neuen Datensatz einfügen - überflüssig }
Table1Datum.Value := DateTimePicker1.Date;
Table1ArtikelNr.Value := Query1.FieldByName('ArtikelNr').AsInteger;
Table1Produktname.Value := Query1.FieldByName('Produktname').AsString;
Table1Produkttyp.Value := Query1.FieldByName('Produkttyp').AsString;
Table1KundenNr.Value := StrToInt(Label7.Caption);
Table1.Post; // Alles klar, Datensatz wird geschrieben
{ Table1.Next; // Wohin? bin doch am Ende - also überflüssig }
end;

MrSpock 20. Jan 2003 06:44

Hallo swoob,

@Gollum:
Zitat:

Eine Query hat kein Edit, Append und Insert. Datensätze werden über "INSERT", das in einem SQL-Statemant übergeben werden muss, eingefügt.
Grundsätzlich kennt die TQuery Komponente durchaus Edit, Append und Insert, es muss sich bei der zugrundeliegenden Datenmenge jedoch um eine sogenannte editierbare Datenmenge handeln und die Eigenschaft RequestLive muss True sein.

@swoob: Warum versuchst du nicht den Code, den ich oben gepostet habe? :mrgreen: Wenn du versuchst einen Datensatz einzufügen, dessen Key bereits existiert, erhälst du eine "Key Violation". Leider hast du noch nicht gesagt, welchen Primärindex deine Tabelle enthält. Deshalb nehme ich weiter an, es ist das Datum. Dann sähe der Code wie folgt aus:

Delphi-Quellcode:
procedure TForm4.Button2Click(Sender: TObject);
begin
  if Table1.FindKey([DateTimePicker1.Date]) then
  { Datensatz existiert schon, also überschreiben }
    Table1.Edit
  else begin
    { Datensatz existiert noch nicht, also neu anlegen }
     Table1.Insert;
     Table1Datum.Value := DateTimePicker1.Date;
  end;

  Table1ArtikelNr.Value := Query1.FieldByName('ArtikelNr').AsInteger;
  Table1Produktname.Value := Query1.FieldByName('Produktname').AsString;
  Table1Produkttyp.Value := Query1.FieldByName('Produkttyp').AsString;
  Table1KundenNr.Value := StrToInt(Label7.Caption);
  Table1.Post; // Alles klar, Datensatz wird geschrieben
end;


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