Autor |
Beitrag |
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Mo 13.09.21 17:12
Hallo Peter,
Nochmals Dank!!!
Mein Problem ist ein neuer Datensatz! Daher dieser Weg. Vielleicht gibt es ja noch einen??? " ADODataSet.Fields[<Feld-Index>].AsString" wäre schön!! Aber wenn ich einen leeren Datensatz erzeuge, gibt es Gemecker wegen "required". Wenn es da einen Weg gibt wäre ich begeistert!!
Grüße von der jetzt sonnigen Nordsee
Peter
Moderiert von Th69: Delphi-Tags hinzugefügt
|
|
jasocul
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Di 14.09.21 07:34
Vielleicht haber ich die ganze Zeit zu kompliziert gedacht.
Warum willst du einen leeren Datensatz erzeugen, um dann die Felder zu füllen?
Versetze die Tabelle in den Erfassen-Zustand:
Delphi-Quelltext
Dadurch ist der Datensatz noch nicht gespeichert (die DB hat dann nichts zu meckern), aber für die Feldzuweisungen verfügbar:
Delphi-Quelltext 1: 2:
| ADODataSet.Fields[<Feld-Index>].AsString := 'Hallo Welt'; ADODataSet.Fields[<anderer Feld-Index>].AsInteger := 4711; |
Wenn alle Zuweisungen gemacht wurden, kommt noch:
Delphi-Quelltext
Oder gibt es einen speziellen Grund, warum der Datensatz bereits existieren muss?
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 14.09.21 08:49
Das ist halt schwierig, wenn man ein einfaches Grid verwendet, bei dem der Benutzer aus der Zeile herauskommt ohne alles zu füllen wie bei einem DB-Grid.
Deshalb hatte ich ja im Juni geschrieben:
jaenicke hat folgendes geschrieben : | Die einzig sinnvolle Variante ist, wenn du das Verhalten deines StringGrids an das des DBGrids anpasst, sprich zwar eine Zeile mit Append anlegst, aber man die Zeile erst bei sinnvollen Eingaben verlassen kann, damit dann ein Post erfolgen kann... |
Es gibt nun einmal nicht viele Möglichkeiten, wenn man an einer bestimmten Eingabeweise und dann noch an einer uralten Delphiversion hängt. Ohne Kompromisse geht es dann eben nicht.
|
|
jasocul
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Di 14.09.21 10:24
jaenicke hat folgendes geschrieben : | Das ist halt schwierig, wenn man ein einfaches Grid verwendet, bei dem der Benutzer aus der Zeile herauskommt ohne alles zu füllen wie bei einem DB-Grid. |
Das ist schon richtig. Allerdings muss Peter18 ja irgendeinen Auslöser kennen, der ihn zum Speichern veranlasst. An der Stelle müssen dann das Append und die Zuweisungen, sowie der Post erfolgen.
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Mi 15.09.21 16:51
Hallo Peter,
nochmals Dank!!!
Genau da war ich schon einmal. Dann ist jedoch ein Fehler in "unit ADODataSet;" aufgetreten. Die "unit ADODataSet;" habe ich im Internet gefunden und sie enthält offenbar einen Fehler.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TADODataSet.InternalInitRecord(Buffer: PChar); begin DoMessage('InternalInitRecord'); FillChar(Buffer^, GetRecordSize, 0); try ADORecordSet.AddNew(0, null); except ADORecordSet.AddNew( ADORecordSet.Fields, EmptyParam ); end; PadoInfo(Buffer+StartInfo).BookmarkInt:=ADORecordSet.Bookmark; EMode:=False; end; |
"ADORecordSet.AddNew(0, null);" hat ein Problem mit "required".
"TADODataSet.Append" existiert nicht. Daher lande ich anscheinend in "InternalInitRecord".
Es muß doch auch in ADO die Möglichkeit geben einen Leeren Datensatz zum Bearbeiten zu erzeugen!
Auch Lazarus hat mich bisher nicht weiter gebracht. Vielleicht muß ich da mal ein Testprogramm schreiben.
Hallo jaenicke,
Wie schon erwähnt: Es gibt gute Gründe warum ich diesen Compiler verwende! Ich habe nicht die Absicht diese Gründe hier zu diskutieren!
Grüße von der regnerischen Nordsee
Peter
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 15.09.21 20:01
Peter18 hat folgendes geschrieben : | "TADODataSet.Append" existiert nicht. Daher lande ich anscheinend in "InternalInitRecord". |
Append existiert in jeder von TDataSet abgeleiteten Klasse, so auch in TADODataSet.
Und ein Blick in den Quelltext von Delphi 4 (Source\Vcl\db.pas, Zeile 8329) zeigt, dass dort in TDataSet.Append InitRecord (und darin InternalInitRecord) aufgerufen wird.
Bei mir funktioniert das TADODataSet.Append auch problemlos in Delphi 5 (mit den mitgelieferten Demo-Datenbanken). Delphi 4 kann ich leider nicht testen, da ich davon nur die Professional Edition habe, die keine ADO Komponenten hatte.
Vielleicht liegt das Problem auch am verwendeten OLE DB Provider oder dem verwendeten Datenbanksystem (was hier beides nicht bekannt ist). Damit gab es damals immer viel Spaß...
|
|
jasocul
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Do 16.09.21 07:16
Mir geht es ähnlich wie jaenicke. Irgendwo habe ich noch D5 und vielleicht sogar D3, aber D4 leider nicht. Ich kann das daher an dieser Stelle auch nicht weiter prüfen. Sorry.
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 16.09.21 08:33
Ich vermute allerdings, dass der Unterschied zwischen Delphi 4 und 5 nicht so groß ist. Ich vermute eher, dass sich die integrierten Demos durch die einfachen Datentypen (und vermutlich einem anderen Datenbanksystem) pflegeleichter verhalten.
Um dazu etwas zu sagen, fehlen aber die entsprechenden Informationen zum Datenbanksystem, dem verwendeten Provider für die Connection (im Zweifelsfall der Connection String) sowie zur Struktur der Tabelle und der Abfrage, um die es geht.
jasocul hat folgendes geschrieben : | Irgendwo habe ich noch D5 und vielleicht sogar D3 |
Ich habe mal, als es bei Ebay noch solche Angebote gab, ein paar Versionen ersteigert. Deshalb habe ich hier eine VM mit Windows XP, in der unter anderem von Delphi 1 bis 7 alles da ist, nur eben teilweise nur als Professional.
|
|
Th69
Beiträge: 4785
Erhaltene Danke: 1055
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 16.09.21 12:06
Peter18 hat folgendes geschrieben : | Die "unit ADODataSet;" habe ich im Internet gefunden und sie enthält offenbar einen Fehler. |
Könntest du mal den Link dazu hier posten?
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 16.09.21 12:10
Das hatte ich glatt überlesen. Ich war von dem mitgelieferten TADODataSet ausgegangen...
|
|
Th69
Beiträge: 4785
Erhaltene Danke: 1055
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 16.09.21 12:18
Die "ADO Express"-Komponenten gibt es (wohl) erst seit Delphi 5.
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Do 16.09.21 12:21
Hallo jaenicke, hallo Peter,
Dank Euch für die Antworten!!
jaenicke hat folgendes geschrieben : | Und ein Blick in den Quelltext von Delphi 4 (Source\Vcl\db.pas, Zeile 8329) zeigt, dass dort in TDataSet.Append InitRecord (und darin InternalInitRecord) aufgerufen wird. |
Das ist ja gerade mein Problem! Diese Quelldatei fehlt mir!
Ich glaube zwar nicht, dass es weiter hilft: "Provider=Microsoft.Jet.OLEDB.4.0" Die Testdatenbank ist "Nordwind.mdb" Tabelle: "Kunden".
Wenn aber "InternalInitRecord" dort aufgerufen wird, so muß der Fehler dort liegen. Dort wird "ADORecordSet.AddNew" aufgerufen und ein leerer Datensatz erstellt. Das führt zum Konflikt mit "required". Es sollte doch möglich sein einen leeren Datensatz zum editieren bereit zu stellen.
Delphi-Quelltext 1: 2:
| oDatSet.Edit; oDatSet.Append; | Hilft nicht.
Vielleicht hilft eine der Routinen: AppendRecord, DisableControls, InsertRecord oder eine Eigenschaft muß umgeschaltet werden?
Hallo Th69,
diese Unit habe ich nicht wieder gefunden, vielleicht ist sie nicht mehr im Internet. Im Kopf der Datei steht:
Zitat: | // ADO DataSet component v0.9
// Written by Larry Nezar (LarryN@nda.agric.za)
// Date of last modification: 28/7/1999 |
Grüße von der regnerischen Nordsee
Peter
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 16.09.21 12:43
Peter18 hat folgendes geschrieben : | Das ist ja gerade mein Problem! Diese Quelldatei fehlt mir! |
Dann hast du vermutlich das Häkchen für die Quelltexte, das es damals noch im Setup gab, nicht gesetzt. Von Delphi 4 gab es meines Wissens keine Version ohne die Quelltexte.
Peter18 hat folgendes geschrieben : | Ich glaube zwar nicht, dass es weiter hilft: "Provider=Microsoft.Jet.OLEDB.4.0" Die Testdatenbank ist "Nordwind.mdb" Tabelle: "Kunden". |
Access und Jet 4.0 Provider mit ADO... eigentlich habe ich da schon keine Lust mehr...
Wie wäre es, wenn du einfach eine DLL in einer aktuellen Delphiversion erstellst, die die Access-Datenbank anspricht, und diese in deine Software in Delphi 4 einbindest? Damit würdest du viel Zeit sparen und könntest die Software selbst weiter in Delphi 4 entwickeln.
Ansonsten bräuchte ich noch die Tabellenstruktur (ohne Daten) um das mit Delphi 5 mal zu testen.
|
|
Th69
Beiträge: 4785
Erhaltene Danke: 1055
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 16.09.21 13:02
@Peter18: Dann hänge doch mal diese Datei hier an (damit wir mal da reinschauen können).
Da das Feld "KundenCode" in der "Kunden"-Tabelle erforderlich ist (s. z.B. ER-Diagramm der Nordwind-Datenbank), mußt du dieses eben (wie von mir schon weiter oben als Code gezeigt) bei AddNew als Parameter hinzufügen!
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Do 16.09.21 14:52
Hallo,
hier die Datei ADODataSet. Es sind etliche Zeilen durch den Autor auskommentiert. Einige von mir, weil sie beim ersten compilieren zu Fehlern führten und für die benötigten Funktionen zunächst nicht nötig waren. Diese Zeilen muß ich noch heraussuchen. (Dauert etwas) Diese Datei ist das Original des Autors.
Daten einlesen und ändern geht wunderbar, nur neuer Datensatz nicht.
Dieses Programm will ich auf verschiedene Datenbanken loslassen, sonst könnte ich die Datentypen hart verdrahten.
Grüße von der Nordsee
Peter
Einloggen, um Attachments anzusehen!
|
|
Th69
Beiträge: 4785
Erhaltene Danke: 1055
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 16.09.21 16:00
Bist du sicher, daß das der Original-Code ist?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TADODataSet.InternalAddRecord(Buffer: Pointer; Append: Boolean); begin DoMessage('Add new record...'); EMode:=True; end;
procedure TADODataSet.InternalInitRecord(Buffer: PChar); begin DoMessage('InternalInitRecord'); FillChar(Buffer^, GetRecordSize, 0); ADORecordSet.AddNew(0, null); ADORecordSet.Update(EmptyParam, EmptyParam); PadoInfo(Buffer+StartInfo).BookmarkInt:=ADORecordSet.Bookmark; EMode:=False; end; |
Du hattest oben doch anderen Code gepostet...
Funktioniert es denn einwandfrei bei Tabellen ohne "required"-Felder?
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Do 16.09.21 16:41
Th69Hallo Th69,
selbstschmunzeln ist das das Original! Das von oben enthält meine Experimente.
Die übrigen Änderungen habe ich zurückgenommen, ohne ein anderes Verhalten zu erreichen.
Grüße von der Nordsee
Peter
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 16.09.21 17:23
Kannst du die Datenbankdatei vielleicht auch noch anhängen bitte? Daten brauche ich nicht darin.
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Do 16.09.21 17:43
Hallo an alle,
ich habe einen Verdacht!
Ich habe die Werte mit AsString ausgelesen. Es wird ein Feld "Kunden.Firma" angemeckert. Ein solches Feld sehe ich in meiner Tabelle und in der Datenbank nicht. In der Datenbank sind Verweise auf andere Tabellen enthalten. Ich vermute diese Verweise verursachen das Problem. Doch wie Erkenne ich sie und wie komme ich an das Feld? Oder die Information zu dem Schlüssel?
In der Entwurfsansicht bei Access erscheint nur ein Schlüssel, kein Feldname.
Auf besonderen Wunsch die Datenbank (hoffentlich alles nötige. (Vielleicht kannst Du mir ja auch die db.pas zukommen lassen))
Grüße von der Nordsee
Peter
Einloggen, um Attachments anzusehen!
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 16.09.21 20:30
Ich habe leider keinen Zugriff mehr auf so alte Access Versionen. Das .adp Format ist seit mehr als 10 Jahren nicht mehr in Access verwendbar...
Wenn ich die Datei versuche mit einem aktuellen Access Provider zu öffnen, geht da auch nichts.
Ich kann die Datei aber auch unter XP nicht mit dem Jet 4.0 Provider verwenden. Das Format wird da nicht erkannt, da gehen nur .mdb Dateien.
Keine Ahnung, das ist alles zu lange her als dass ich davon Ahnung hätte. Damals war ich noch in der Schule und habe mich mit solchen Dingen noch nicht beschäftigt...
Die db.pas wird dir ohne den Rest nicht viel helfen, denn ohne die nötigen Debug-DCUs usw. kannst du darin nicht debuggen. Insofern bliebe nur das entsprechend zu installieren (VCL Source ist der entscheidende Punkt):
Einloggen, um Attachments anzusehen!
|
|