Toon posts:

[Delphi] Insert probleem, query refreshed niet goed

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een DBGrid die via een datasource aan mijn query component hangt.
Ik wil in deze dataset (query) kunnen inserten, editen en verwijderen.

Voor delete doe ik:
query.Delete;

Voor edit doe ik:
query.edit;
//paar velden setten
query.FieldValues['blabla'] := 'blabla'
query.post

Deze werken perfect, maar bij het inserten is er iets vreemds aan de hand.

ik doe het gewoon op soortgelijke wijze als bij edit:
query.insert;
//paar velden setten
query.FieldValues['blabla'] := 'blabla'
query.post

het probleem is dat mijn dbgrid (dia via datasourde aan query hangt) de nieuwe toegevoegde record weergeeft op de plek waar cursor voor het inserten stond. En de record die eerst op de plek van de cursor stond wordt niet weergegeven.

Als ik de query opnieuw uitvoer is 't wel weer ok, maar dit lijkt me niet nodig...
Zowiezo gaat het bij editen en deleten wel prima.
Ik heb hier al te lang op zitten kloten, dus suggesties zijn welkom!

Oh jah.. ik kreeg steeds de boodschap dat ik niet kan editen en inserten in een read-only dataset en heb daarom request life aangezet, dan werkt het wel.
Maar is dit persee nodig, of is 'r een andere optie die ik graag zou weten?

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Als je op die manier records wilt toevoegen, dan is het nodig dat RequestLive op True staat van je query ja.
Een query is namelijk een 'view' op de data. Wil je er iets aanveranderen, dan moet hij requestLive zijn. (Weet wel dat je een query niet 'Live' kunt maken als hij gegevens uit meerdere tabellen haalt).

Verder over je probleem: Roep je de Refresh method op van je query na het posten?

https://fgheysels.github.io/


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 22:06
whoami schreef op 10 September 2003 @ 22:20:
Als je op die manier records wilt toevoegen, dan is het nodig dat RequestLive op True staat van je query ja.
Een query is namelijk een 'view' op de data. Wil je er iets aanveranderen, dan moet hij requestLive zijn. (Weet wel dat je een query niet 'Live' kunt maken als hij gegevens uit meerdere tabellen haalt).

Verder over je probleem: Roep je de Refresh method op van je query na het posten?
Je kan requestlive wel gebruiken alleen in combinatie met een UpdateSQL component. Daar kan je aangeven hoe de update sql en de insert sql moet uitzien.

Je kan misschien in je after post event van je dataset ook meteen gaan refreshen

Verwijderd

Topicstarter
Refresh aanroepen heb ik getest, maar dat kon om een of andere reden niet met de dataset. Dan kreeg ik een foutmelding, welke dat precies was kan ik even niet zeggen, aangezien ik nu niet thuis ben.

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Close en Open dan maar.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ja owk kan ook, maar lijkt me gewoon geen mooie oplossing.
Zijn er mensen waarbij een soortgelijk geval het wel goed weergeeft na de post? (zonder refresh of iets dergelijks).

  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 22:06
de procedure Refresh werkte volgens mij alleen maar als je Requestlive aan heb staan of anders moet je echt met Close en Open doen.

Verwijderd

Topicstarter
Requestlive staat aan. Overigens, daar had ik even niet over nagedacht, maar het grote probleem met een open is dat ik dan de correcte cursor kwijt ben. Om de cursor weer goed te positioneren zou ik dan de dataset moeten doorscannen en de cursor op de nieuwe toegevoegde record zetten. Niet echt goed qua performance natuurlijk en daarnaast zou dan steeds mijn datasetdatachange event afvuren, waar 't een en ander gebeurt.

Maar insert icm post en requestlive wordt toch vaak gebruikt lijkt me, d'r moet vast wel iemand zijn die dit probleem eerder is tegengekomen. Ik heb echt al zo veel geprobeerd
Iemand?

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 00:12

Tomatoman

Fulltime prutser

Quote uit Delphi Help:
Updating a read-only result set
Applications can update data returned in a read-only result set if they are using cached updates.
If you are using a client dataset to cache updates, the client dataset or its associated provider can automatically generate the SQL for applying updates unless the query represents multiple tables. If the query represents multiple tables, you must indicate how to apply the updates:
[list]• If all updates are applied to a single database table, you can indicate the underlying table to update in an OnGetTableName event handler.
• If you need more control over applying updates, you can associate the query with an update object (TUpdateSQL). A provider automatically uses this update object to apply updates:
[list=1]• Associate the update object with the query by setting the query's UpdateObject property to the TUpdateSQL object you are using.
• Set the update object's ModifySQL, InsertSQL, and DeleteSQL properties to SQL statements that perform the appropriate updates for your query's data.[/list][/list]If you are using the BDE to cache updates, you must use an update object.

Note: For more information on using update objects, see Using update objects to update a dataset.

[ Voor 4% gewijzigd door Tomatoman op 12-09-2003 00:15 . Reden: opmaak ]

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
Leuke quote, maar ik zie niet hoe dit van toepassing is op mijn probleem

Verwijderd

Topicstarter
Ik heb het nog even geprobeerd, dat Query.Refresh, maar dan krijg ik de melding dat de tabel niet uniek geindexeerd is. Dat klopt idd, heb op pk en fk een index, wat wel moet voor MySQL als je gebruik wilt maken van fk's.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 00:12

Tomatoman

Fulltime prutser

Verwijderd schreef op 12 September 2003 @ 11:43:
Leuke quote, maar ik zie niet hoe dit van toepassing is op mijn probleem
Wat ik wilde aangeven, is dat je het met cached updates zou moeten proberen.

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
Ik ben even bezig geweest met cached updates en het werkt idd, bedankt!
Ik snap alleen nog steeds niet waarom het zonder cached updates nou fout gaat.
Pagina: 1