[Delphi\TADOQuery.Parameters]

Pagina: 1
Acties:

  • Night-Reveller
  • Registratie: September 2000
  • Laatst online: 25-08 15:14
Als er meerdere dezelfde parameters zijn gedefinieerd, blijkt 'ie bij een toewijzing ze niet allemaal te hebben gepakt. bv:
code:
1
2
3
4
5
6
7
Select  *
from    A
where   A.B = :B
    and A.B not in 
        (Select C.B
        From C
        Where C.B = :B)


Weet iemand hoe het zit? Ik heb het nodig voor Master-detail sets, waarbij de detail, via TADOQuery.DataSource, automatisch gelijknamige parameters toegewezen krijgt. De DataSource levert een A.B, maar zet niet álle :B in de detail, waardoor ik 'Parameter object is improperly defined' aan m'n broek krijg. Heeft iemand een suggestie? Momenteel heb ik het anders opgelost, maar ik vindt dit een mooiere oplossing. Ik beschouw dit namelijk als een fout in TADOQuery of object pascal...het moet toch kunnen?

  • whoami
  • Registratie: December 2000
  • Nu online
Je query herschrijven:
code:
1
2
3
4
5
6
7
select *
from a
where a.b = :b
and a.b not in 
  (select c.b 
   from c
   where c.b = a.b)

Ik vermoed zelfs dat dit sneller zal zijn

Ik veronderstel dat je geen 2 parameters met dezelfde naam kunt gebruiken in 1 query. In een stuk code mag je ook geen 2 variabelen hebben met dezelfde naam.

[ Voor 45% gewijzigd door whoami op 16-01-2003 14:28 ]

https://fgheysels.github.io/


  • Night-Reveller
  • Registratie: September 2000
  • Laatst online: 25-08 15:14
Je query herschrijven:
code:
1
2
3
4
5
6
7
select *
from a
where a.b = :b
and a.b not in 
  (select c.b 
   from c
   where c.b = a.b)
Nou niet helemaal. Ik zoek een principiële oplossing. Soms is het niet mogelijk om de query aan te passen, zodat het wel lukt. bv:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/* Bestaat B in tabel A ? */
If  (Select A.B
    From A
    where A.B = :B
    ) is null
Begin
    /* Zo nee, pak dan alle C.B */
    Select C.B
    From C
    where C = :B
End
Else
Begin
    /* Zo ja, druk dan D.B af */ 
    Select D.B  
    From D
    where D.B = :B
End


Zo kan ik nog wel een paar bedenken die níet te herschrijven zijn, zodat er maar één parameter gevuld hoeft te worden. (Ik werk trouwens met SQLServer2K).

  • Night-Reveller
  • Registratie: September 2000
  • Laatst online: 25-08 15:14
Ik wil juist dat de compiler begrijpt dat ik dezelfde parameter bedoel. Als ik een variable zet, dan wordt die nieuwe waarde later ook weer gewoon gebruikt, als ik die variabele aanspreek.

  • whoami
  • Registratie: December 2000
  • Nu online
Bouw je dan je query dynamisch op ofzo?
Ik snap je hier niet helemaal meer....

Het probleem in je eerste voorbeeld is toch dat je 2 parameters hebt met dezelfde naam? Als je je query niet kunt herschrijven (naar een in dit geval correlated subquery), dan zul je je parameters andere namen moeten geven.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Nu online
Night-Reveller schreef op 16 January 2003 @ 14:36:
Ik wil juist dat de compiler begrijpt dat ik dezelfde parameter bedoel. Als ik een variable zet, dan wordt die nieuwe waarde later ook weer gewoon gebruikt, als ik die variabele aanspreek.


Ja, maar jij kunt binnen een functie ook niet 2 variablen hebben met dezelfde naam:

code:
1
2
3
4
5
6
var
   a : Integer; 
   a : Integer;
   a : string;
begin
end;


Zal ook niet werken....

https://fgheysels.github.io/


  • Night-Reveller
  • Registratie: September 2000
  • Laatst online: 25-08 15:14
OK. Anders gezegd: Als ik in een query een :B gebruik, dan wil ik bij een toewijzing van de parameter :B dat 'ie alle voorkomens van :B invult. Ik kan wel :B1 en :B2 gebruiken (Hé, dat doet me ergens aan denken :)), maar dan zijn in een master-detail de parameters niet meer gelijknamig

  • whoami
  • Registratie: December 2000
  • Nu online
Night-Reveller schreef op 16 January 2003 @ 14:43:
OK. Anders gezegd: Als ik in een query een :B gebruik, dan wil ik bij een toewijzing van de parameter :B dat 'ie alle voorkomens van :B invult. Ik kan wel :B1 en :B2 gebruiken (Hé, dat doet me ergens aan denken :)), maar dan zijn in een master-detail de parameters niet meer gelijknamig


Je moet die parameters ook niet gewoon als 'placeholders' oid zien. Zie ze eerder als objecten binnen die query.

https://fgheysels.github.io/


  • Night-Reveller
  • Registratie: September 2000
  • Laatst online: 25-08 15:14
Je moet die parameters ook niet gewoon als 'placeholders' oid zien. Zie ze eerder als objecten binnen die query.
Da's jammer dan. Je kunt hele leuke dingen doen met TADOQuery.Datasource. Mijn doel is om een mooie master-detail te maken, zonder dat ik code moet gaan maken (das eleganter en misschien sneller).

Nu heb ik het wel in code opgelost door idd. :B1, :B2 etc te gebruiken in de query (tsja, kan voorlopig niet anders) en deze te zetten bij het AfterScroll event van de master-query. Maar ik vind het geen mooie oplossing. Is er echt geen mooiere?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Nee, een parameter mag maar 1x voorkomen.

Je kan ook gewoon 2 TTables in designtime aan elkaar knopen voor een master/detail relatie (zie MasterSource, MasterFields). En ook resultaten uit een query gebruiken in een andere query (zie DataSource).

/edit: dat laatste had je dus al gezien :)

[ Voor 9% gewijzigd door LordLarry op 16-01-2003 19:48 ]

We adore chaos because we like to restore order - M.C. Escher


  • Night-Reveller
  • Registratie: September 2000
  • Laatst online: 25-08 15:14
Wil je het mooi doen...kan het niet :'(

  • whoami
  • Registratie: December 2000
  • Nu online
Night-Reveller schreef op 17 januari 2003 @ 03:33:
Wil je het mooi doen...kan het niet :'(


Tja, logisch dat het niet kan zoals jij het wilt...

https://fgheysels.github.io/

Pagina: 1