Entwickler-Ecke

Datenbanken - Datensatz in TTable aktualisieren?


mi-frank - Fr 04.11.05 16:16
Titel: Datensatz in TTable aktualisieren?
Hallo,

programmiere erst seit einigen Tage mit Delpbi und komm' einfach nicht weiter!!

Problem: Möchte meine TTable aktualisieren, aber es funktioniert einfach nicht!!


Delphi-Quelltext
1:
2:
3:
4:
5:
Sql := 'Select* From Bogen.DB where SYS = '+  frmAzubiBeurteilungsbogen.TableAzubis.FieldByName('SYS').AsString;

frmAzubiBeurteilungsbogen.SQLBogen.Sql.Clear;
frmAzubiBeurteilungsbogen.SQLBogen.Sql.Add(Sql);
frmAzubiBeurteilungsbogen.SQLBogen.Active := True;


Der SQL funktioniert!

Hoff, ihr könnt mir weiterhelfen??

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.


jasocul - Fr 04.11.05 18:21

Dann erkläre jetzt bitte mal ganz genau, was du mit Aktualisieren meinst.
Ich werde aus deiner Formulierung nämlich nicht schlau.


mi-frank - So 06.11.05 23:38

Versuch 2:

ich habe eine TQuery-, eine TDatasource und eine TTable-Komponenten in meinem Formular!

Mittels der TQuery-Komponenten lass ich mir mittels einer SQl-Anweisung, z.B select * from Tabelle; einen Datensatz auslesen, den ich dann an meine TTable weitergebe!

Wie kann ich nun zur laufzeit meiner TTable einen neuen Datensatz zuweisen, z.B. select* from Tabelle where Nachname='Mustermann';???


Ich hoff, dass diesmal klar ist, wo mein Problem genau liegt!!


jasocul - Mo 07.11.05 09:29

Ja, ich glaube, ich weiß jetzt, was du meinst.
Mir entzieht sich im Moment zwar der Sinn deines Vorgehens, aber ich habe da eine kleine Routine für dich:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
Function DBEmpty(dts : TDataSet) : Boolean; // Wird von der eigentlichen Prozedur aufgerufen.
begin
  Result := not dts.Active;
  if not Result then
  begin
    Result := dts.eof and dts.bof;
  end;
end;

// Das ist das, was du vermutlich benötigst.
// qQuelle ist dein TQuery, qZiel dein TTable.
// Wenn der Datensatz auch sofort gespeichert werden soll, musst du bei Speichern True übergeben.
procedure KopiereAktuellenDatensatzMitAppend(qQuelle, qZiel : TDataset; Speichern : Boolean);
var
  cnt : Integer;
  arr : array of variant;
begin
  if qQuelle.Active and (not DBEmpty(qQuelle)) then
  begin
    SetLength(arr, qQuelle.FieldCount);
    for cnt := 0 to qQuelle.FieldCount - 1 do
    begin
      arr[cnt] := qQuelle.Fields[cnt].AsVariant;
    end;
    qZiel.Append;
    for cnt := 0 to qZiel.FieldCount - 1 do
    begin
      qZiel.Fields[cnt].AsVariant := arr[cnt];
    end;
    if Speichern then
    begin
      qZiel.Post;
    end;
  end;
end;

Voraussetzungen für diese Prozedur:
- Die Ziel-Tabelle darf nicht ReadOnly sein.
- In qZiel müssen mindestens soviele Felder sein, wie in qQuelle.
- Die Felder sollten vom selben Typ sein. (Variant prüft den Typ nicht)


mi-frank - Mo 07.11.05 11:30

ich glaub, du hast mich wieder falsch Verstanden!

Ich möchte doch einfach nur zur Laufzeit meiner TTable einen neuen DS zuordnen, indem ich in meiner TQuery-Komponenten einen neuen SQL-Befehl eingebe:


Delphi-Quelltext
1:
2:
3:
4:
  frmMain.QueryBogen.Close;
  frmMain.QueryBogen.Sql.Clear;
  frmMain.QueryBogen.Sql.Add(Sql);
  frmMain.QueryBogen.Open;



SQL ist hier mein neuer SQL-Befehl!!

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.


jasocul - Mo 07.11.05 11:39

Scheinbar verstehe ich dich wirklich nicht.
Irgendwo einen neuen Datensatz zuweisen heißt für mich den Datensatz in irgendeiner Form erfassen.

Wenn du mit TQuery und TTable auf die selbe DB-Tabelle zugreifst, dann würde ein Aufruf der Methode Refresh bei TTable genügen. Abr ich glaube nicht wirklich, dass du das meinst.

Da du mit Delphi (und vrmtl. auch Datenbanken) gerade erste angefangen hast, denke ich, das du einen konzeptionellen Fehler im Programm hast.
Bitte erkläre doch mal ein bisschen von dem, was du erreichen willst. Unabhängig vom aktuellen Problem.


mi-frank - Mo 07.11.05 12:22

Hi,

bin jetzt selbst drauf gekommen!

War echt dumm von mir! Musste einfach nur zur Laufzeit einen neuen Filter-Wert eingeben!


Delphi-Quelltext
1:
2:
3:
4:
5:
  TTable.Active := False;
  TTable.Filtered := False;
  TTable.Filter :=  'Feldname = Wert'
  TTable.Filtered := True;
  TTable.Open;


Trotzdem vielen Dank für deine Hilfe!

Hab bestimmt bald wieder ein anderes Problem

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.