Autor Beitrag
NOS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 2

Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
BeitragVerfasst: Do 27.12.18 17:59 
Hallo zusammen und ein nachträglichen "Frohe Weihnachten",

ich nutze grad erstmalig ein Konstrukt aus TFDConnection -> tFDQuery (als DataSet) -> TDataSource -> TAdvDBGrid

Ich habe eine leere Tabelle mit einer mehreren Feldern. Das Anzeigen der Tabelle funktioniert. Nun möchte ich über eine Eingabemaske ein Record hinzufügen und versuche folgenden Code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
  CustomersDBGrid.DataSource.DataSet.Append;
  CustomersDBGrid.DataSource.DataSet.FieldValues['CUSTOMERNAME'] := edCustomerName.Text;
  CustomersDBGrid.DataSource.DataSet.FieldValues['CUSTOMERCITY'] := edCustomerCity.Text;
  CustomersDBGrid.DataSource.DataSet.Post;


Zum Anzeigen der Record im TAdvDBGrid nutze ich direkt davor folgenden Code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
 
 with ComfortCRMDataModule.FDCustomerDBQuery do
 begin
  Close;
  SQL.Clear;
  SQL.Add('SELECT * FROM CustomerTable ORDER BY CUSTOMERID ASC;');
  Open;
 end;


Nun kriege ich die Meldung "Operation bei geschlossener Datenmenge nicht ausführbar", also adde ich ein Open davor und der COde sieht so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  
 CustomersDBGrid.DataSource.DataSet.Open;
 CustomersDBGrid.DataSource.DataSet.Append;
 CustomersDBGrid.DataSource.DataSet.FieldValues['CUSTOMERNAME'] := edCustomerName.Text;
 CustomersDBGrid.DataSource.DataSet.FieldValues['CUSTOMERCITY'] := edCustomerCity.Text;
 CustomersDBGrid.DataSource.DataSet.Post;


Nun bekomme ich ständig die Fehlermeldung die Fields würden nicht existieren.

Habe es dann mal mit dieser Variante versucht, leider auch ohne Erfolg.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  
 CustomersDBGrid.DataSource.DataSet.Open;
 CustomersDBGrid.DataSource.DataSet.Append;
 CustomersDBGrid.DataSource.DataSet.FieldByName('CUSTOMERNAME').AsString := edCustomerName.Text;
 CustomersDBGrid.DataSource.DataSet.FieldByName('CUSTOMERCITY').AsString := edCustomerCity.Text;
 CustomersDBGrid.DataSource.DataSet.Post;


Sonst erledige ich alles per Connection oder Query aus dem Code und daher bin ich mit dem ganzen Kram in Kombi mit einem Grid total ohne Wissen wir mir scheint :-(

Please HELP! :)


Moderiert von user profile iconTh69: Topic aus Datenbanken (inkl. ADO.NET) verschoben am Do 27.12.2018 um 17:34
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 28.12.18 08:54 
Mir fallen da spontan 3 mögliche Fehlerquellen ein:

1. CustomersDBGrid.DataSource.DataSet zeigt nicht auf ComfortCRMDataModule.FDCustomerDBQuery
2. ComfortCRMDataModule.FDCustomerDBQuery enthält persistente Felder ohne die beiden gewünschten
3. CustomersDBGrid enthält persistente Felder ohne die beiden gewünschten

Möglicherweise noch eine Kombination aus 2 und 3.
NOS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 2

Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
BeitragVerfasst: Fr 28.12.18 12:49 
Hallo und guten Morgen,

also zugewiesen ist das alles richtig wie hier zu sehen

ausblenden volle Höhe 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:
 
 if ComfortCRMDataModule.FDGUIxWaitCursor = nil then
  ComfortCRMDataModule.FDGUIxWaitCursor := TFDGUIxWaitCursor.Create(self);
 if ComfortCRMDataModule.FDPhysFBDriverLink = nil then
  ComfortCRMDataModule.FDPhysFBDriverLink := TFDPhysFBDriverLink.Create(self);
 with ComfortCRMDataModule.FDPhysFBDriverLink do
 begin
  DriverID := 'FB';
  Embedded := true;
  VendorHome := '';
  VendorLib := TPath.Combine(ExtractFileDir(Application.ExeName),'dbms\fbclient.dll');
 end;
 if edCustomersDBFileName.Text <> '' then
 begin
  // create connection
  if ComfortCRMDataModule.FDCustomerDBConnection = nil then
   ComfortCRMDataModule.FDCustomerDBConnection := TFDConnection.Create(self);
  // create query
  if ComfortCRMDataModule.FDCustomerDBQuery = nil then
   ComfortCRMDataModule.FDCustomerDBQuery := TFDQuery.Create(self);
  ComfortCRMDataModule.FDCustomerDBQuery.FetchOptions.Mode := fmAll;
  ComfortCRMDataModule.FDCustomerDBQuery.FetchOptions.AutoFetchAll := afAll;
  ComfortCRMDataModule.FDCustomerDBQuery.FetchOptions.RowsetSize := 100000;
  // create datasource
  if ComfortCRMDataModule.FDCustomerDBQueryDataSource = nil then
   ComfortCRMDataModule.FDCustomerDBQueryDataSource := TDataSource.Create(self);
  // connect to fdquery
  ComfortCRMDataModule.FDCustomerDBQuery.Connection := ComfortCRMDataModule.FDCustomerDBConnection;
  // connect to datasource
  ComfortCRMDataModule.FDCustomerDBQueryDataSource.DataSet := ComfortCRMDataModule.FDCustomerDBQuery;
  // connect to dbgrid
  CustomersDBGrid.DataSource := ComfortCRMDataModule.FDCustomerDBQueryDataSource;


Wie löse ich das Problem mit den persistenten Feldern, wobei ich das im Kern noch nicht begriffen habe worum es da genau geht. Muss ich die Felddefinitionen und die Felderliste löschen?
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 28.12.18 13:30 
Ich habe den Source jetzt nur überflogen, konnte aber erstmal keinen Fehler entdecken.

Persistente Felder:
Damit legst du im Prinzip fest, welche Felder "nach außen" dauerhaft verfügbar sein sollen. Das beinhaltet dann auch Formatierungen, kalkulierte Felder, etc.
Das hat Vor- und Nachteile, was ich jetzt aber nicht großartig ausführen möchte.

Wenn du darauf verzichten kannst (zumindest für einen Test), solltest du diese Listen und Definitionen löschen. Funktioniert es dann mit deinen Zuweisungen, hast du das Problem eingegrenzt.

BTW:
Die Felder gibt es aber in der Datenbank-Tabelle, oder?
Nicht, dass das berechnete Felder sind.
NOS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 2

Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
BeitragVerfasst: Fr 28.12.18 13:44 
Also es ist ganz simpel ... ich habe das zum Testen auf nur die beiden Felder runtergefahren ... mehr ist nicht in der Tabelle außer der CUSTOMERID, drum verstehe ich das überhaupt nicht
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 28.12.18 14:05 
Du hast folgenden Code:
ausblenden Delphi-Quelltext
1:
2:
3:
  // create query
  if ComfortCRMDataModule.FDCustomerDBQuery = nil then
   ComfortCRMDataModule.FDCustomerDBQuery := TFDQuery.Create(self);

Wenn du den das zweite mal nutzt, ist der Zustand vermutlich nicht mehr nil. Dann kann dort auch ein altes SQL-Statement enthalten sein.


Wenn man dann noch diesen Source betrachtet:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
 
 with ComfortCRMDataModule.FDCustomerDBQuery do
 begin
  Close;
  SQL.Clear;
  SQL.Add('SELECT * FROM CustomerTable ORDER BY CUSTOMERID ASC;');
  Open;
 end;

Wo du beim "Append" auch noch die Meldung bekommst, dass das bei einer geschlossenen Datenmenge nicht möglich ist, ist der Fehler vielleicht doch ganz woanders zu suchen.
Da im nächsten Schritt ein zusätzliches Open den Fehler mit der geschlossenen Datenmenge behebt, gehe ich inzwischen davon aus, dass an irgendeiner Stelle etwas durcheinander gerät.

Nimm mal im Source das "With" raus. Das könnte vielleicht schon ein Problem sein.

Vor deinem zusätzlichen Open, lässt du dir am besten mal die SQL-Statements anzeigen. Und zwar von:
ComfortCRMDataModule.FDCustomerDBQuery und CustomersDBGrid.DataSource.DataSet.

Vielleicht suchst du den Fehler an einer völlig falschen Stelle im Source.
NOS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 2

Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
BeitragVerfasst: Fr 28.12.18 14:20 
Also ich habe nun das with xxx do rausgenommen und der Block ist nun wie folgt

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
 
 ComfortCRMDataModule.FDCustomerDBQuery.Close;
 ComfortCRMDataModule.FDCustomerDBQuery.SQL.Clear;
 ComfortCRMDataModule.FDCustomerDBQuery.SQL.Add('SELECT * FROM CustomerTable ORDER BY CUSTOMERID ASC;');
 ComfortCRMDataModule.FDCustomerDBQuery.Open;


Das SQL Statement des ComfortCRMDataModule.FDCustomerDBQuery ist 'SELECT * FROM CustomerTable;'

Im CustomersDBGrid.DataSource.DataSet existiert das SQL Statement nicht.

Ohne das Open funktioniert es auch hier nicht.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 28.12.18 14:40 
user profile iconNOS hat folgendes geschrieben Zum zitierten Posting springen:

ausblenden Delphi-Quelltext
1:
2:
 
 ComfortCRMDataModule.FDCustomerDBQuery.SQL.Add('SELECT * FROM CustomerTable ORDER BY CUSTOMERID ASC;');

Das SQL Statement des ComfortCRMDataModule.FDCustomerDBQuery ist 'SELECT * FROM CustomerTable;'

Ich weiß ja nicht, was da schief läuft, aber das kann eigentlich nicht sein. Dein komplettes "order by" geht verloren.

user profile iconNOS hat folgendes geschrieben Zum zitierten Posting springen:

Im CustomersDBGrid.DataSource.DataSet existiert das SQL Statement nicht.
Ohne das Open funktioniert es auch hier nicht.

Es existiert kein SQL-Statement, aber ein Open funktioniert?
Bist du sicher, dass das richtige Dataset zugewiesen ist? Nutzt du vielleicht TTable als Dataset, das du zuweist?

Um ehrlich zu sein, das ist jetzt inzwischen stochern im Nebel.
NOS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 2

Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
BeitragVerfasst: Fr 28.12.18 16:16 
Ich kann mir das auch überhaupt nicht erklären ... nein .. TTable nutze ich nicht

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
   
   // customer db
   FDCustomerDBConnection: TFDConnection;
   FDCustomerDBQuery: TFDQuery;
   FDCustomerDBQueryDataSource: TDataSource;
   // invoice db
   FDInvoiceDBConnection: TFDConnection;
   FDInvoiceDBQuery: TFDQuery;
   FDInvoiceDBQueryDataSource: TDataSource;
   // product db
   FDProductDBConnection: TFDConnection;
   FDProductDBQuery: TFDQuery;
   FDProductDBQueryDataSource: TDataSource;
   // offer db
   FDOfferDBConnection: TFDConnection;
   FDOfferDBQuery: TFDQuery;
   FDOfferDBQueryDataSource: TDataSource;
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 28.12.18 16:34 
Was steht denn in edCustomersDBFileName.Text drin?
Vielleicht schlägt ja deine komplette Initialisierung fehl.

Weiter oben vergleichst du nämlich darauf:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
 
...
 if edCustomersDBFileName.Text <> '' then
 begin
  // create connection
  if ComfortCRMDataModule.FDCustomerDBConnection = nil then
   ComfortCRMDataModule.FDCustomerDBConnection := TFDConnection.Create(self);
  // create query
  if ComfortCRMDataModule.FDCustomerDBQuery = nil then
   ComfortCRMDataModule.FDCustomerDBQuery := TFDQuery.Create(self);
  ComfortCRMDataModule.FDCustomerDBQuery.FetchOptions.Mode := fmAll;
  ComfortCRMDataModule.FDCustomerDBQuery.FetchOptions.AutoFetchAll := afAll;
  ComfortCRMDataModule.FDCustomerDBQuery.FetchOptions.RowsetSize := 100000;
  // create datasource
  if ComfortCRMDataModule.FDCustomerDBQueryDataSource = nil then
   ComfortCRMDataModule.FDCustomerDBQueryDataSource := TDataSource.Create(self);
  // connect to fdquery
  ComfortCRMDataModule.FDCustomerDBQuery.Connection := ComfortCRMDataModule.FDCustomerDBConnection;
  // connect to datasource
  ComfortCRMDataModule.FDCustomerDBQueryDataSource.DataSet := ComfortCRMDataModule.FDCustomerDBQuery;
  // connect to dbgrid
  CustomersDBGrid.DataSource := ComfortCRMDataModule.FDCustomerDBQueryDataSource;


Falls das leer ist, passiert dort nämlich nichts und du hast unter Umständen alte Zuweisungen von DataSource und DataSet.

Aber selbst wenn das so ist, verwirrt mich immer noch die Sache mit dem verschwundenen "order by" direkt nach der Zuweisung des neuen SQL-Statements.
NOS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 2

Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
BeitragVerfasst: Fr 28.12.18 16:41 
Also in dem TAdvEdit ist nur der Dateiname inkl. Pfad zur Datenbankdatei ... und wenn die nicht in den Settings gesetzt ist wird der Init-Bereich nicht durchlaufen und ein Flag gesetzt ...

Ich habe jetzt mal von Hand 5 Datensätze in die DB eingegeben ... alles drin und wird auch im DBGrid angezeigt
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 28.12.18 16:47 
Dann fällt mir auch nicht mehr viel ein, aber zwei Ideen habe ich doch noch:

Hast du schon ein komplett neues Build der Anwendung gemacht? Vielleicht vorher noch alle DCU-Dateien löschen.

Ist das vielleicht ein kopiertes Projekt und die Pfade auf die Sourcen zeigen auf die falschen Verzeichnisse?

Ab jetzt bin ich aber auch raus aus dem Thema, da ich gleich nicht mehr online sein kann.

Für diesen Beitrag haben gedankt: NOS
NOS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 2

Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
BeitragVerfasst: Fr 28.12.18 17:10 
Ich checke das weiter ... das Projekt ist komplett neu erstellt ... also alle Pfade etc. passen

Ich sage zunächst einmal vielen lieben Dank und schau ml wie ich weiterkomme ...

falls wir und nicht mehr lesen Dir einen guten Rutsch und ein schönes Wochenende !!!!!
haentschman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: Sa 29.12.18 08:53 
Moin... 8)
Zitat:
Wenn man dann noch diesen Source betrachtet:

...da habe ich mein Frühstück verloren. :puke: :D

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
 
 with ComfortCRMDataModule.FDCustomerDBQuery do
 begin
  Close;
  SQL.Clear;
  SQL.Add('SELECT * FROM CustomerTable ORDER BY CUSTOMERID ASC;');
  Open;
 end;

Warum dieses WITH! Das nimmt dir beim Debuggen die Inhalte der Variablen... :? Warum sieht man immer das SQL.Clear + SQL.Add... :gruebel: Es geht auch besser. :zwinker:

ausblenden Delphi-Quelltext
1:
2:
3:
 
  ComfortCRMDataModule.FDCustomerDBQuery.SQL.Text := 'SELECT * FROM CustomerTable ORDER BY CUSTOMERID ASC';
  ComfortCRMDataModule.FDCustomerDBQuery.Open;

...5 Zeilen weniger!

Und wenn du diesen Code im Datamodule ComfortCRMDataModule ausführst, da reicht auch:
ausblenden Delphi-Quelltext
1:
2:
3:
 
  FDCustomerDBQuery.SQL.Text := 'SELECT * FROM CustomerTable ORDER BY CUSTOMERID ASC';
  FDCustomerDBQuery.Open;


Schreib dir eine Function im ComfortCRMDataModule mit der Initialisierung der du den Connectionstring übergiebst. Damit hast du in der GUI oder besser Logik nur einen Zeile. :zustimm: ...Trennung von Logik/Daten und GUI. :zwinker:
PS: Dem User über ein Editfeld die Eingabe zu erlauben halte ich für bedenklich!

:wave:


Zuletzt bearbeitet von haentschman am So 30.12.18 08:22, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: NOS
NOS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 183
Erhaltene Danke: 2

Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
BeitragVerfasst: Sa 29.12.18 12:14 
Guten Morgen :-)

hoffe Du hast Dein Frühstück wiedergefunden und bereits vertilgt ;-)

ich habe die letzte Nacht damit verbracht das ganze in ein nagelneues und blitzeblankes Projekt zu packen ... also alles Units und Forms neu erstellt und Code und Compos einfach nur reinkopiert.

Gegen kurz nach 4 heute Morgen war es dann soweit ... es läuft ... so wie der Code war ... mal abgesehen davon dass ich das with xxx do weg gemacht habe ...

Das ist mir absolut unbegreiflich wenn ich ehrlich bin ...

In diesem Sinne Euch Beiden lieben Dank, ein schönes Wochenende und einen guten Rutsch ins Jahr 2019

Viele Grüße aus Selm,

Andreas
haentschman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: So 30.12.18 08:31 
Moin... 8)
Zitat:
ein schönes Wochenende und einen guten Rutsch ins Jahr 2019

...dir auch. :zwinker:

Zum Thema:
Zitat:
mal abgesehen davon dass ich das with xxx do weg gemacht habe

:dance2: ... ist aber nicht die Ursache für dein damaliges Problem...auch wenn ich es möchte. :zwinker: Ich kann dir nur als Tipp mitgeben, die Datenbanksachen immer in eine Unit oder Datamodule zu packen und nicht über das gesamte Projekt zu verteilen. Das gilt u.a. auch für Queryies. Lieber in der Datenbank Unit eine function, für das Laden der Kundendaten z.B., die dir TDataset zurückgibt. Die Anwendung kennt dann nur TDataSet und nicht TSchießMichTotQuery. Das erleichtert dir A: die Suche nach z.B. Statements oder B. auch den Austausch der DB Zugriffskomponenten.
... und ist definitiv übersichtlicher für die Fehlersuche. :zustimm: