Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenbankfelder werden in datasource.onchange nicht gefunden (https://www.delphipraxis.net/41005-datenbankfelder-werden-datasource-onchange-nicht-gefunden.html)

buyden 24. Feb 2005 14:32

Datenbank: MySQL • Version: 4.1 • Zugriff über: Zeos

Datenbankfelder werden in datasource.onchange nicht gefunden
 
Hi,

Ich habe einen für mich nicht erklärbaren Effekt bei einer Prozedur in einem Datamodule.
Ich habe versucht in dem OnDataChange-Ereignis einer Datasource einen Wert aus einer, von der Datasource unabhängigen Tabelle auszulesen. Beim Compilieren bekomme ich aber jedesmal ne Fehlermeldung, das das Feld nicht gefunden werden konnte. :gruebel: Das Feld existiert aber definitiv.
Hat jemand ne Erklärung oder besser noch ne Lösung??

Jasocul 24. Feb 2005 14:39

Re: Datenbankfelder werden in datasource.onchange nicht gefu
 
Schonmal debuggt und genau nachgesehen, wann es passiert?

buyden 24. Feb 2005 14:56

Re: Datenbankfelder werden in datasource.onchange nicht gefu
 
Der Fehler muss in der Prozedur liegen.

Delphi-Quellcode:
procedure Tfrmdata.dsauftragDataChange(Sender: TObject; Field: TField);
begin
  frmmain.Panel1.Color:=frmdata.tbstatus.FieldValues['farbe'];
end;
Da bringt er mir ne Debugger Exception, dass das Feld "Farbe" nicht gefunden wird.

Jasocul 24. Feb 2005 15:04

Re: Datenbankfelder werden in datasource.onchange nicht gefu
 
Wenn du ganz sicher bist, dass das Feld existiert, kann ich nur vermuten, dass die Variant-Übergabe an color nicht funktioniert.
2 Versuche:
Lass dir den Inhalt des Feldes mal mit einem ShowMessage an dieser Stelle ausgeben, wenn das geht.
Bekommst du was angezeigt, solltest du die Übergabe mal mit TColor(FieldByName('farbe').AsInteger) probieren.

franktron 24. Feb 2005 15:07

Re: Datenbankfelder werden in datasource.onchange nicht gefu
 
Hast du auf Grosskleinschreibung geachtet

buyden 24. Feb 2005 15:11

Re: Datenbankfelder werden in datasource.onchange nicht gefu
 
Delphi-Quellcode:
procedure Tfrmdata.dsauftragDataChange(Sender: TObject; Field: TField);
begin
  showmessage(inttostr(frmdata.tbstatus.FieldValues['farbe']));
  //frmmain.Panel1.Color:=frmdata.tbstatus.FieldValues['farbe'];
end;
keine Veränderung, auch mit ".fieldbyname" geht's nicht.

shmia 24. Feb 2005 15:14

Re: Datenbankfelder werden in datasource.onchange nicht gefu
 
Zitat:

Zitat von buyden
Der Fehler muss in der Prozedur liegen.
Delphi-Quellcode:
procedure Tfrmdata.dsauftragDataChange(Sender: TObject; Field: TField);
begin
  frmmain.Panel1.Color:=frmdata.tbstatus.FieldValues['farbe'];
end;

Genau so ist es. Rat mal, warum der Parameter Field übergeben wird:
Delphi-Quellcode:
procedure Tfrmdata.dsauftragDataChange(Sender: TObject; Field: TField);
begin
  frmmain.Panel1.Color:= Field.AsInteger;
end;

Jasocul 24. Feb 2005 15:19

Re: Datenbankfelder werden in datasource.onchange nicht gefu
 
Man müsste doch trotzdem auf die andere Art auf die Felder zugreifen können. Auch, wenn es das Feld ist, dass sich gerade ändert.
Aber du hast schon recht. Wenn das Feld übergeben wird, kann man es ja auch benutzen. da hatte ich wohl ein Brett vor dem Kopf. *ganzintensivbrilleputzen*

buyden 24. Feb 2005 15:23

Re: Datenbankfelder werden in datasource.onchange nicht gefu
 
@shmia

ich komm jetzt mit deiner Aussage grad nicht ganz klar. :gruebel:
Der Sinn meiner Prozedur ist es, wenn sich in einem bestimmten Feld der tabelle auftrag etwas ändert, soll die Farbe des Panels, die in der verknüpften Tabelle status steht, geändert werden.

shmia 24. Feb 2005 16:28

Re: Datenbankfelder werden in datasource.onchange nicht gefu
 
Zitat:

Zitat von buyden
@shmia
ich komm jetzt mit deiner Aussage grad nicht ganz klar. :gruebel:
Der Sinn meiner Prozedur ist es, wenn sich in einem bestimmten Feld der tabelle auftrag etwas ändert, soll die Farbe des Panels, die in der verknüpften Tabelle status steht, geändert werden.

Also eher so:
Delphi-Quellcode:
procedure Tfrmdata.dsauftragDataChange(Sender: TObject; Field: TField);
begin
   if Field.FieldName='AStatus' then
   begin
      // in einem ganz bestimmten Feld (Name hier: 'AStatus') hat sich was geändert
      // jetzt müssen wir eine "Lookup" Aktion durchführen
      //

      Assert(tbstatus.Active); // Tabelle muss offen sein, sonst geht nix

      (*
       * Wichtig !!!
       * wenn man sich in der Klasse Tfrmdata befindet, darf man nicht auf frmdata
       * zugreifen.
       * dies kann ganz schwer zu findende Fehler verursachen
       *)

      // suche in Tabelle tbstatus nach dem passenden Datensatz
      if tbstatus.Locate('IdStatus', Field.Value) then
      begin
         // zusatztest:
         if tbstatus.FindField('farbe') = nil then
             ShowMessage('Feld farbe nicht vorhanden!'#13#10+
                 tbstatus.FieldList.Text);  // alle vorhandenen Felder anzeigen


         // Suche war erfolgreich, also Farbe übernehmen
         frmmain.Panel1.Color:=tbstatus.FieldByName('farbe').AsString;

      end
      else
         frmmain.Panel1.Color:=clRed;
   end;
end;

buyden 24. Feb 2005 17:28

Re: Datenbankfelder werden in datasource.onchange nicht gefu
 
Huh :shock:

so aufwendig hatte ich mir das nicht vorgestellt. ich werd das mal durchdenken und testen und meld mich dann nochmal.

erstmal dank an euch.

buyden 24. Feb 2005 17:42

Re: Datenbankfelder werden in datasource.onchange nicht gefu
 
ich denke so annähernd hab ich verstanden, was du da geschieben hast.
ich hab das jetzt auf mich angepasst und das ganze sieht jetzt so aus:

Delphi-Quellcode:
procedure Tfrmdata.dsauftragDataChange(Sender: TObject; Field: TField);
begin
  //showmessage(inttostr(frmdata.tbstatus.FieldValues['farbe']));
  //frmmain.Panel1.Color:=frmdata.tbstatus.FieldValues['farbe'];

  if Field.FieldName='Status' then
   begin
      Assert(tbstatus.Active);
      if tbstatus.Locate('status', Field.Value,[]) then
      begin
         if tbstatus.FindField('farbe') = nil then
             ShowMessage('Feld farbe nicht vorhanden!'#13#10+
                 tbstatus.FieldList.Text);  // alle vorhandenen Felder anzeigen
         // Suche war erfolgreich, also Farbe übernehmen
         frmmain.Panel1.Color:=tbstatus.FieldByName('farbe').asinteger;

      end
      else
         frmmain.Panel1.Color:=0;
   end;

end;
allerdings bekomme ich am Anfang bei
Delphi-Quellcode:
if Field.FieldName='Status' then
ne Zugriffsverletzung.

shmia 24. Feb 2005 18:40

Re: Datenbankfelder werden in datasource.onchange nicht gefu
 
Zitat:

Zitat von buyden
allerdings bekomme ich am Anfang bei
Delphi-Quellcode:
if Field.FieldName='Status' then
ne Zugriffsverletzung.

Dann muss man noch abfragen, ob Field = nil ist:
Delphi-Quellcode:
if Assigned(Field) then
   if Field.FieldName='Status' then
.......

buyden 24. Feb 2005 20:28

Re: Datenbankfelder werden in datasource.onchange nicht gefu
 
also mit dem code bekomme ich erstmal keine Fehlermeldung,

Delphi-Quellcode:
procedure Tfrmdata.dsauftragDataChange(Sender: TObject; Field: TField);
begin
if Assigned(Field) then
  if Field.FieldName='Status' then
   begin
      Assert(tbstatus.Active);
      if tbstatus.Locate('status', Field.Value,[]) then
      begin
         {if tbstatus.FindField('farbe') = nil then
             ShowMessage('Feld farbe nicht vorhanden!'#13#10+
                 tbstatus.FieldList.Text);  // alle vorhandenen Felder anzeigen
         // Suche war erfolgreich, also Farbe übernehmen }
         frmmain.Panel1.Color:=tbstatus.FieldByName('farbe').asinteger;

      end
      else
         frmmain.Panel1.Color:=0;
   end;

end;
allerdings verändert sich bei einer Statusänderung die Panelfarbe auch nicht.
Ich hab das Ganze jetzt spaßenshalber mal in ner anderen Prozedur versucht.
Ich hab ein extra dbedit mit dem Status in der tabelle auftrag verbunden und den folgenden code in dessen onchange-ereignis eingetragen:
Delphi-Quellcode:
procedure Tfrmmain.edstatuscontrolChange(Sender: TObject);
begin
Panel1.Color:=frmdata.tbstatus.fieldbyname('farbe').AsInteger;
end;
Das Ergebnis war das gleiche wie in dem datasouce.onchangedata - "das feld kann nicht gefunden werden".

buyden 26. Feb 2005 10:57

Re: Datenbankfelder werden in datasource.onchange nicht gefu
 
hat denn jemand ne ahnung, warum der Fehler auch in nem ttable.afterpost-ereignis kommt, da wird ja nun kein field übergeben.
auf andere Felder kann ich in der gleichen Prozedur problemlos zugreifen.


Delphi-Quellcode:
procedure Tfrmdata.tbauftragAfterPost(DataSet: TDataSet);
begin
frmmain.statusbar1.panels[0].text:=inttostr(tbauftrag.RecordCount)+ ' Datensätze';
//frmmain.Panel1.Color:=frmdata.tbstatus.fieldbyname('farbe').AsInteger;
if frmdata.tbauftrag.FieldByName('abgeschlossen').AsInteger=1 then
  frmmain.StatusBar2.Panels[0].Text:= 'Abgeschlossener Auftrag'
else
  frmmain.StatusBar2.Panels[0].Text:= 'Offener Auftrag';
end;

buyden 28. Feb 2005 15:29

Re: Datenbankfelder werden in datasource.onchange nicht gefu
 
:hello:

buyden 1. Mär 2005 20:24

Datenbankfelder werden in datasource.onchange nicht gefunden
 
Hat denn keiner ne Idee, wie ich es sonst umsetzen kann, dass bei einer Änderung des Datensatzpointers die Farbe eines Panels verändert wird, wie sie in der Datenbank festgelegt ist?? :wall:

buyden 7. Mär 2005 14:49

Re: Datenbankfelder werden in datasource.onchange nicht gefu
 
Hi nochmal,

mittlerweile hab ich das Problem auch selbst gelöst. Offenbar kann man in den Ereignissen einer datasource nur auf die Felder der dazugehörigen Tabelle zugreifen.

ich hab das Ganze jetzt über eine OnChange-Prozedur auf einem DBEdit, das mit der Statustabelle verbunden ist, gelöst - funzt genau wie ich das wollte.

:coder2:

DFN :twisted:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz