Autor Beitrag
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 486
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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 user profile iconTh69: Delphi-Tags hinzugefügt
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6373
Erhaltene Danke: 145

Windows 7 + Windows 10
Tokyo Prof + CE
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
ADODataSet.Append;					

Dadurch ist der Datensatz noch nicht gespeichert (die DB hat dann nichts zu meckern), aber für die Feldzuweisungen verfügbar:
ausblenden 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:
ausblenden Delphi-Quelltext
1:
ADODataSet.Post;					

Oder gibt es einen speziellen Grund, warum der Datensatz bereits existieren muss?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19054
Erhaltene Danke: 1699

W10 x64 (Chrome, Edge)
Delphi 10.4 Ent, Oxygene, C# (VS 2019), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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. :nixweiss:
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6373
Erhaltene Danke: 145

Windows 7 + Windows 10
Tokyo Prof + CE
BeitragVerfasst: Di 14.09.21 10:24 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconPeter18 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 486
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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.

ausblenden 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;
  //ADORecordSet.Update(EmptyParam, EmptyParam);
  PadoInfo(Buffer+StartInfo).BookmarkInt:=ADORecordSet.Bookmark;
//  NewRec:=PadoInfo(Buffer+StartInfo).BookmarkInt;
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19054
Erhaltene Danke: 1699

W10 x64 (Chrome, Edge)
Delphi 10.4 Ent, Oxygene, C# (VS 2019), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 15.09.21 20:01 
user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
"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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6373
Erhaltene Danke: 145

Windows 7 + Windows 10
Tokyo Prof + CE
BeitragVerfasst: Do 16.09.21 07:16 
Mir geht es ähnlich wie user profile iconjaenicke. 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19054
Erhaltene Danke: 1699

W10 x64 (Chrome, Edge)
Delphi 10.4 Ent, Oxygene, C# (VS 2019), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.

user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4475
Erhaltene Danke: 973

Win10
C#, C++ (VS 2015/17/19)
BeitragVerfasst: Do 16.09.21 12:06 
user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19054
Erhaltene Danke: 1699

W10 x64 (Chrome, Edge)
Delphi 10.4 Ent, Oxygene, C# (VS 2019), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 16.09.21 12:10 
Das hatte ich glatt überlesen. Ich war von dem mitgelieferten TADODataSet ausgegangen...
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4475
Erhaltene Danke: 973

Win10
C#, C++ (VS 2015/17/19)
BeitragVerfasst: Do 16.09.21 12:18 
Die "ADO Express"-Komponenten gibt es (wohl) erst seit Delphi 5.
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 486
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Do 16.09.21 12:21 
Hallo jaenicke, hallo Peter,

Dank Euch für die Antworten!!

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19054
Erhaltene Danke: 1699

W10 x64 (Chrome, Edge)
Delphi 10.4 Ent, Oxygene, C# (VS 2019), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 16.09.21 12:43 
user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconPeter18 hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4475
Erhaltene Danke: 973

Win10
C#, C++ (VS 2015/17/19)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 486
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4475
Erhaltene Danke: 973

Win10
C#, C++ (VS 2015/17/19)
BeitragVerfasst: Do 16.09.21 16:00 
Bist du sicher, daß das der Original-Code ist?
ausblenden 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...');
//  ADORecordSet.Bookmark:=PadoInfo(PChar(Buffer)+StartInfo).BookMarkInt;
//  ADORecordSet.AddNew(EmptyParam, EmptyParam);
//  PadoInfo(Buffer+StartInfo).BookMarkInt:=ADORecordSet.Bookmark;
  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;
//  NewRec:=PadoInfo(Buffer+StartInfo).BookmarkInt;
  EMode:=False;
end;

Du hattest oben doch anderen Code gepostet...

Funktioniert es denn einwandfrei bei Tabellen ohne "required"-Felder?
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 486
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19054
Erhaltene Danke: 1699

W10 x64 (Chrome, Edge)
Delphi 10.4 Ent, Oxygene, C# (VS 2019), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 16.09.21 17:23 
Kannst du die Datenbankdatei vielleicht auch noch anhängen bitte? Daten brauche ich nicht darin.
Peter18 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 486
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19054
Erhaltene Danke: 1699

W10 x64 (Chrome, Edge)
Delphi 10.4 Ent, Oxygene, C# (VS 2019), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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):

D4
Einloggen, um Attachments anzusehen!