[SQL + Delphi] Left join read-only?

Pagina: 1
Acties:
  • 107 views sinds 30-01-2008
  • Reageer

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:25

Tomatoman

Fulltime prutser

Topicstarter
In een Delphi-applicatie maak ik via ADO verbinding met een Access database. Een van de detail query's is de volgende:
SQL:
1
2
3
4
SELECT SerialID, ProductID, tblSerials.LicenseeID, Serial
FROM tblSerials
LEFT JOIN tblLicensees ON tblSerials.LicenseeID = tblLicensees.LicenseeID
WHERE ProductID = :ProductID

:ProductID wordt via een master query opgezocht in een derde tabel.

Als ik de dataset met Edit in edit mode zet, zie ik dat de State keurig naar dsEdit verandert. Zodra ik echter de waarde van het veld LicenseeID verander, krijg ik een foutmelding dat de dataset niet in edit mode staat. Hoe zou ik LicenseeID (in de tblSerials tabel dus) toch eenvoudig kunnen veranderen?

[ Voor 14% gewijzigd door Tomatoman op 05-06-2003 23:54 . Reden: Zonder [norml] tags zie je een smiley in :ProductID. ]

Een goede grap mag vrienden kosten.


  • momania
  • Registratie: Mei 2000
  • Laatst online: 22:52

momania

iPhone 30! Bam!

Waarschijnlijk omdat je nu de LicenseID via de resultset gaat veranderen en dus ook probeert te doen in je tblLicensees. Daar is LicenseID waarschijnlijk de primary key en een autoincrement veld dat niet te wijzigen is.

Neem je whisky mee, is het te weinig... *zucht*


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:25

Tomatoman

Fulltime prutser

Topicstarter
Als ik je goed begrijp, verandert LicenseeID dus in beide tabellen? In tblLicensees is dat inderdaad de primary key, dus wat je zegt klinkt heel logisch. Daaruit volgt meteen dat mijn query effectief dus read-only is :|. Hoe zou ik die gemakkelijk naar een query kunnen ombouwen waarin tblSerials.LicenseeID te wijzigen is? De rest van de velden mag read-only blijven.

Een goede grap mag vrienden kosten.


  • tomato
  • Registratie: November 1999
  • Niet online
Kun je nog steeds editen als je een alias maakt voor het veld?

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:25

Tomatoman

Fulltime prutser

Topicstarter
Nee, dat werkt nog steeds niet. Maar de foutmelding is nu wel veranderd:
Project raised exception class EOleException with message 'Kan de bij te werken rij niet vinde. Sommige waarden zijn mogelijk veranderd sinds de rij voor het laatst is gelezen'.

De oude foutmelding was:
Project raised exception class EDatabaseError with message 'DataLicenses: Dataset not in edit or insert mode'. Deze foutmelding is nogal misleidend, want de dataset is wel degelijk in insert mode.

Een goede grap mag vrienden kosten.


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik gok dat het resultaat van een query uit meerdere tabellen altijd read-only is, omdat het voor de code lastig uit te vogelen is wat je nu precies zou willen editen.

  • VisionMaster
  • Registratie: Juni 2001
  • Laatst online: 18-07 20:32

VisionMaster

Security!

OlafvdSpek schreef op 06 June 2003 @ 01:49:
Ik gok dat het resultaat van een query uit meerdere tabellen altijd read-only is, omdat het voor de code lastig uit te vogelen is wat je nu precies zou willen editen.
Klopt als het resultaat er eenmaal is dan is het afgedaan. Zeker met Join's dat zijn resultsets die een kopie zijn van de waarde in de database.
Met zo'n 'table' component kan je de werkelijke waarden direct benaderen en veranderen. Maar dan is het geen resultset, maar de opgegeven tabel in edit-mode. afaicr :O

I've visited the Mothership @ Cupertino


  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

Een resultset van een query die joins bevat, kan je toch niet editten? Net zoals je niet kan wijzigen in een view, omdat die ook enkel weergeeft wat er zich in een aantal gejoinde tabellen bevindt. Je moet echt je updates doen op de originele tabellen.
Of zie ik dat nu verkeerd?

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
OlafvdSpek schreef op 06 juni 2003 @ 01:49:
Ik gok dat het resultaat van een query uit meerdere tabellen altijd read-only is, omdat het voor de code lastig uit te vogelen is wat je nu precies zou willen editen.
Dat is het inderdaad. Een query kan alleen maar 'live' (aanpasbaar) zijn, als er slechts data uit 1 tabel gehaald wordt.

https://fgheysels.github.io/


Verwijderd

Een join is wel degelijk te editen, met ADO is het alleen een beetje kut. Als ik het wel heb moet je locktype op batchoptimistic zetten. Maar dat is helaas niet alles. De flexibitliteit die je bij de BDE had om joins te editen (updatesql component) bestaat niet in ADO. Je hebt wel hebt dynamic property unique table (ADOQuery.Properties['Unique Table'].Value:= 'tblSerials' in jouw geval): Deze zorgt ervoor dat updates alleen in die tabel worden verwerkt. Als je meerdere tabellen wilt editen wordt het echt vreselijk lastig met ADO.
Wat ik altijd doe met ADO en joins is de resultset via een datasetprovider in een clientdataset trekken. Heb je tenminste een BeforeUpdateRecord event die je precieze controle geeft over de update statements die naar de database gaan. En kun je dus ook meerdere tabellen uit een resultset editen.
Pagina: 1