AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datensatz per Button in eine Tabelle einfügen...
Thema durchsuchen
Ansicht
Themen-Optionen

Datensatz per Button in eine Tabelle einfügen...

Ein Thema von swoob · begonnen am 19. Jan 2003 · letzter Beitrag vom 20. Jan 2003
Antwort Antwort
swoob

Registriert seit: 19. Jan 2003
10 Beiträge
 
#1

Datensatz per Button in eine Tabelle einfügen...

  Alt 19. Jan 2003, 15:55
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]
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#2
  Alt 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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
swoob

Registriert seit: 19. Jan 2003
10 Beiträge
 
#3

PrimärIndex??

  Alt 19. Jan 2003, 16:13
Woher erkenne ich den PrimärIndex?
Muss ich das dann nur mit dem PrimärIndex prüfen??

mfg
swoob
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#4
  Alt 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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
swoob

Registriert seit: 19. Jan 2003
10 Beiträge
 
#5
  Alt 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.
  Mit Zitat antworten Zitat
Benutzerbild von Gollum
Gollum

Registriert seit: 14. Jan 2003
Ort: Boxberg
456 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6
  Alt 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;
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#7
  Alt 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? 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;
Albert
Live long and prosper


MrSpock
  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 14:29 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