[Delphi] TDataSet.Post probleem

Pagina: 1
Acties:

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:53
Ik ben vandaag op volgende 'anomalie' gebotst; misschien weet één van jullie de oorzaak hiervan en misschien wel de oplossing...

Ik heb een detailscherm met een aantal TDBEdit controls, een OK-knop, een Annuleren knop en een Toepassen-knop.
De OK-knop bewaart de gegevens en sluit het detailscherm, de toepassenknop bewaart de gegevens maar laat het detailscherm open staan.

Alle TDBEdit controls zijn gelinkt aan een TQuery, waarvan de RequestLive property op True staat. De query ziet er als volgt uit:
code:
1
SELECT * FROM tblPatient WHERE PatientId = ?

Achter m'n toepassen-knop zit volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TfrmDetPatient.ApplyButtonClick(Sender : TObject)
begin
  try
    dmStd.dbStd.StartTransaction();

    if PrimKey = -1 then begin
    PrimKey := MaakNieuweSleutel(qryNewKey);
    qryRecord.FieldByName('PatientId').AsInteger := PrimKey;
    end;

    qryRecord.Post();

    dmStd.dbStd.Commit();

    ApplyButton.Enabled := False;
  except
    on EDatabaseError do begin
    dmStd.dbStd.Rollback();
    MessageDlg(...);
    Abort();
    end;
  end;
end;

Wat is het probleem nu: Als ik een nieuw record toevoeg en ik klik op 'Toepassen', dan wordt de data gepost naar de databank. Tot zover geen probleem. Het scherm blijft dus openstaan en de gegevens die ik ingebracht heb, blijven op het detailscherm zichtbaar. Als ik nu terug gegevens ga wijzigen van dit net aangemaakte record, en ik klik op toepassen, dan zijn m'n gegevens weggeschreven maar is m'n dataset-cursor veranderd, maw, de gegevens zijn niet meer zichtbaar in mijn scherm, er is een ander [nieuw, leeg] record actief gemaakt.
Als ik bovenstaande handeling toepas op een bestaand record (dus, een bestaand record wijzigen), dan werkt alles wel perfect.

Iemand die ook al eens op dit probleem gebotst heeft? En zoja, hoe heb je het aangepakt?

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:53
Het werken met Bookmarks enzo heeft geen uitkomst, want m'n record bestaat natuurlijk nog niet.

Op groups.google.com heb ik iemand gevonden die hetzelfde probleem heeft bij Paradox tables (ik gebruik Access) maar niemand die een oplossing wist. Een iemand reageerde en ging er vanuit dat zijn table corrupt was, wat het geval niet was, en dat is bij mij ook niet het geval. Ik krijg het nl. op al m'n tables.

https://fgheysels.github.io/


Verwijderd

Nergens zie ik je één van de volgende methodes aanroepen:
Append, Edit, Insert

Post volgt altijd op één van deze acties. Je start nu een transactie doet een post en commit de transactie en dit is sowieso al fout. Doe dan meer het volgende:
1) Scherm openen.
2) Transactie starten.
3) Insert/Edit record
4) Post record
5) Commit of Rollback
6) Scherm sluiten of terug naar stap 2.

Er zijn meer variaties denkbaar (bijv. alle inserts/edits in 1 transactie maar de wijze waarop je het nu doet is in ieder geval fout.

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:53
Zelfs als ik er een Edit() doe voor m'n post, krijg ik die fout. Trouwens, wat jij zegt dat je eerst een edit moet doen klopt volgens mij niet. Volgens de Delphi help zorgt Edit er ook voor dat Post() aangeroepen wordt:
TDataSet implements a virtual method to write a modified record to the database. Dataset methods that change the dataset state, such as Edit, Insert, or Append, or that move from one record to another, such as First, Last, Next, and Prior automatically call Post.
M'n gegevens worden gewoon goed opgeslagen, zonder gebruik te maken van Edit, Insert of Append.

https://fgheysels.github.io/


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 16:08

Delphi32

Heading for the gates of Eden

Op dinsdag 19 februari 2002 17:43 schreef whoami het volgende:

M'n gegevens worden gewoon goed opgeslagen, zonder gebruik te maken van Edit, Insert of Append.
Dat ligt aan het gebruik van Data-aware controls.. die zetten de records automatisch in edit/insert state.

Ik zou zo snel ook geen oplossing weten voor je probleem, maar ik ben bang dat je van dat RequestLive af moet. Dat werkt lang niet altijd correct, en met RequestLive is je TQuery ineens stiekum een TTable-achtig ding geworden.

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:53
Ja, als je AutoEdit := True hebt staan op je TQuery zet hij dat zelf in Edit() mode.

Ik weet dat die RequestLive een 'writable' dataset aflevert en dat het opeens is gelijk een TTable, maar ik heb er maar max. 1 record in zitten, dus dat valt wel mee.

Ik heb het voorlopig opgelost door na m'n Commit(), de Query te sluiten en terug te openen. Het is wel geen mooie oplossing maar ik blijf nu wel m'n data zien.

https://fgheysels.github.io/


Verwijderd

Op woensdag 20 februari 2002 08:23 schreef whoami het volgende:
Ja, als je AutoEdit := True hebt staan op je TQuery zet hij dat zelf in Edit() mode.

Ik weet dat die RequestLive een 'writable' dataset aflevert en dat het opeens is gelijk een TTable, maar ik heb er maar max. 1 record in zitten, dus dat valt wel mee.

Ik heb het voorlopig opgelost door na m'n Commit(), de Query te sluiten en terug te openen. Het is wel geen mooie oplossing maar ik blijf nu wel m'n data zien.
Denk dan toch dat je maar eens heel goed op je transactieverloop moet gaan letten. Waar start je de transactie? Is een transactie wel nodig?

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:53
Op woensdag 20 februari 2002 09:34 schreef hvdberg het volgende:

[..]

Denk dan toch dat je maar eens heel goed op je transactieverloop moet gaan letten. Waar start je de transactie? Is een transactie wel nodig?
In het voorbeeld dat ik gegeven heb is een transactie niet nodig, omdat ik niet de volledige source gepost heb:

wat m'n programma doet:

ik start m'n transactie
ik post gegevens in m'n master - table
ik bewaar gegevens in tabellen die relaties hebben met m'n master table
ik commit m'n transactie
Bij een exception doe ik een rollback.

Het saven enzo (dus ook de transactie), verloopt prima.

https://fgheysels.github.io/


Verwijderd

Op woensdag 20 februari 2002 13:11 schreef whoami het volgende:

[..]

In het voorbeeld dat ik gegeven heb is een transactie niet nodig, omdat ik niet de volledige source gepost heb:

wat m'n programma doet:

ik start m'n transactie
ik post gegevens in m'n master - table
ik bewaar gegevens in tabellen die relaties hebben met m'n master table
ik commit m'n transactie
Bij een exception doe ik een rollback.

Het saven enzo (dus ook de transactie), verloopt prima.
Ok, maar start je wel weer je transactie als je deze gecommit/gerollbacked hebt?
Een Refresh op je TQuery wil ook nog wel eens helpen!

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:53
M'n Transactie start ik altijd voor er gegevens bewaard worden, en de enige plaats waarop gegevens worden weggeschreven is in de OnClick event-handler van m'n Toepassenknop.
Maar die Transacties hebben niets te maken met m'n probleem, die zijn de oorzaak niet.

https://fgheysels.github.io/

Pagina: 1