Autor |
Beitrag |
NOS
Beiträge: 183
Erhaltene Danke: 2
Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
|
Verfasst: Do 27.12.18 16: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:
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:
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:
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.
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 Th69: Topic aus Datenbanken (inkl. ADO.NET) verschoben am Do 27.12.2018 um 17:34
|
|
jasocul
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Fr 28.12.18 07: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
Beiträge: 183
Erhaltene Danke: 2
Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
|
Verfasst: Fr 28.12.18 11:49
Hallo und guten Morgen,
also zugewiesen ist das alles richtig wie hier zu sehen
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 if ComfortCRMDataModule.FDCustomerDBConnection = nil then ComfortCRMDataModule.FDCustomerDBConnection := TFDConnection.Create(self); 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; if ComfortCRMDataModule.FDCustomerDBQueryDataSource = nil then ComfortCRMDataModule.FDCustomerDBQueryDataSource := TDataSource.Create(self); ComfortCRMDataModule.FDCustomerDBQuery.Connection := ComfortCRMDataModule.FDCustomerDBConnection; ComfortCRMDataModule.FDCustomerDBQueryDataSource.DataSet := ComfortCRMDataModule.FDCustomerDBQuery; 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
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Fr 28.12.18 12: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
Beiträge: 183
Erhaltene Danke: 2
Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
|
Verfasst: Fr 28.12.18 12: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
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Fr 28.12.18 13:05
Du hast folgenden Code:
Delphi-Quelltext 1: 2: 3:
| 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:
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
Beiträge: 183
Erhaltene Danke: 2
Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
|
Verfasst: Fr 28.12.18 13:20
Also ich habe nun das with xxx do rausgenommen und der Block ist nun wie folgt
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
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Fr 28.12.18 13:40
NOS hat folgendes geschrieben : |
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.
NOS hat folgendes geschrieben : |
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
Beiträge: 183
Erhaltene Danke: 2
Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
|
Verfasst: Fr 28.12.18 15:16
Ich kann mir das auch überhaupt nicht erklären ... nein .. TTable nutze ich nicht
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| FDCustomerDBConnection: TFDConnection; FDCustomerDBQuery: TFDQuery; FDCustomerDBQueryDataSource: TDataSource; FDInvoiceDBConnection: TFDConnection; FDInvoiceDBQuery: TFDQuery; FDInvoiceDBQueryDataSource: TDataSource; FDProductDBConnection: TFDConnection; FDProductDBQuery: TFDQuery; FDProductDBQueryDataSource: TDataSource; FDOfferDBConnection: TFDConnection; FDOfferDBQuery: TFDQuery; FDOfferDBQueryDataSource: TDataSource; |
|
|
jasocul
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Fr 28.12.18 15:34
Was steht denn in edCustomersDBFileName.Text drin?
Vielleicht schlägt ja deine komplette Initialisierung fehl.
Weiter oben vergleichst du nämlich darauf:
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 if ComfortCRMDataModule.FDCustomerDBConnection = nil then ComfortCRMDataModule.FDCustomerDBConnection := TFDConnection.Create(self); 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; if ComfortCRMDataModule.FDCustomerDBQueryDataSource = nil then ComfortCRMDataModule.FDCustomerDBQueryDataSource := TDataSource.Create(self); ComfortCRMDataModule.FDCustomerDBQuery.Connection := ComfortCRMDataModule.FDCustomerDBConnection; ComfortCRMDataModule.FDCustomerDBQueryDataSource.DataSet := ComfortCRMDataModule.FDCustomerDBQuery; 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
Beiträge: 183
Erhaltene Danke: 2
Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
|
Verfasst: Fr 28.12.18 15: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
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Fr 28.12.18 15: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
Beiträge: 183
Erhaltene Danke: 2
Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
|
Verfasst: Fr 28.12.18 16: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
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: Sa 29.12.18 07:53
Moin...
Zitat: | Wenn man dann noch diesen Source betrachtet: |
...da habe ich mein Frühstück verloren.
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... Es geht auch besser.
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:
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. ...Trennung von Logik/Daten und GUI.
PS: Dem User über ein Editfeld die Eingabe zu erlauben halte ich für bedenklich!
Zuletzt bearbeitet von haentschman am So 30.12.18 07:22, insgesamt 1-mal bearbeitet
Für diesen Beitrag haben gedankt: NOS
|
|
NOS
Beiträge: 183
Erhaltene Danke: 2
Win XP, Win Vista Ultimate, Win 7 Ultimate
Delphi 19.4 - Sydney
|
Verfasst: Sa 29.12.18 11: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
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: So 30.12.18 07:31
Moin...
Zitat: | ein schönes Wochenende und einen guten Rutsch ins Jahr 2019 |
...dir auch.
Zum Thema:
Zitat: | mal abgesehen davon dass ich das with xxx do weg gemacht habe |
... ist aber nicht die Ursache für dein damaliges Problem...auch wenn ich es möchte. 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.
|
|