[Delphi] Subquery in TADOQuery.filter mogelijk?

Pagina: 1
Acties:

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Topicstarter
Mensen.....

om een aantal standaard overzichten in mijn software te kunnen gooien, heb ik een qryOverzichten gemaakt. Deze query wordt diverse malen gebruikt, elke keer anders gefilterd aan de hand van de gekozen criteria voor het rapport.

Nu heb ik een rapport die sorteert op groepniveau, en dat is een waarde die niet in qryOverzicht zit. Dit omdat ik anders dubbele regels krijg (mensen kunnen in meerdere groepen zitten). Wel is er een tabel om tagNummer (die zit wel in qryOvericht) te koppelen aan een GroepsNummer.

Ik dacht dit probleem dus heel snel op te kunnen lossen door op qryOverzicht een filter te zetten:
tagNummer in (select tagNummer from tblRelaties where tblRelaties.GroepsNummer = 7)
De subquery is goed, de resultset is goed en van het juiste type, en toch krijg ik een melding "Arguments are of the wrong type, out ...."

Ben ik hier tegen een limitatie aan gelopen? (In TADOQuery.Filter kunnen geen subqueries) of doe ik iets gigantisch mis?

Echt relevante code is er niet echt, de vraag is vooral of iemand met dit probleem bekend is en of er een workaround/oplossing voor is...?

De search op zowel GoT als Google (Groups) heeft me helaas niet kunnen helpen. MSDN en de Delphi help al evenmin.

My personal website


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

Uit de Delphi help
Description

Use Filter to specify a recordset filter. When filtering is applied to a recordset by setting the Filtered property to True, only those records that meet a filter’s conditions are available to the application. Filter contains the expression used to evaluate the rows in the recordset. At design-time, enter the filter expression into the editing cell for the Filter property within the Object Inspector. At runtime, assign astring containing the filter expression to the Filter property.

The filter expression below displays only those rows where the State field is "CA" or "MA":

State = 'CA' OR State = 'MA'

The following runtime example shows how to assign that filter expression to the Filter property and activate the filtering.

with ADODataSet1 do begin

Filtered := False;
Filter := 'State = ' + QuotedStr('CA') + ' OR ' +
'State = ' + QuotedStr('CA');
Filtered := True;

end;
Je kan dus geen queries in de filter property kwijt.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Topicstarter
Eerlijk gezegd haal ik daar niet keihard uit dat het niet mogelijk is om queries in een filter te zetten. (en ik heb het echt vier keer goed gelezen ;))

Ik haal er wel uit dat datgene wat in de filter staat de conditie is. Ze leggen uit wat het in ieder geval WEL aankan. Dat wil niet zeggen dat, omdat er geen subqueries instaan, dit NIET kan. Toch?
Als de Delphi help daarmee bedoelt dat het dus een soort WHERE-vervanger is, dan is het inderdaad niet mogelijk...

[ Voor 16% gewijzigd door OZ-Gump op 11-06-2003 15:03 ]

My personal website


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

OZ-Gump schreef op 11 June 2003 @ 15:02:
Eerlijk gezegd haal ik daar niet keihard uit dat het niet mogelijk is om queries in een filter te zetten. (en ik heb het echt vier keer goed gelezen ;))

Ik haal er wel uit dat datgene wat in de filter staat de conditie is. Ze leggen uit wat het in ieder geval WEL aankan. Dat wil niet zeggen dat, omdat er geen subqueries instaan, dit NIET kan. Toch?
Als de Delphi help daarmee bedoelt dat het dus een soort WHERE-vervanger is, dan is het inderdaad niet mogelijk...
Het is een soort where vervanger jah.. er word puur op die expressie gefilterd.

En dat niet is aangegeven dat er geen query in kan, er staat ook niet aangegeven dat het WEL kan :Y)
Als alles wat niet explicitiet zou staan aangegeven zou kunnen, dan zou Delphi ineens een super ontwikkelomgeving zijn waarin bijna alles mogelijk is :)

edit:

Nu iets minder krom?? ;)

[ Voor 3% gewijzigd door Creepy op 11-06-2003 15:15 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Topicstarter
Als alles wat niet explicitiet zou staan aangegeven, dan zou Delphi ineens een super ontwikkelomgeving zijn waarin bijna alles mogelijk is :)
Ondanks de enigszins kromme zinsconstructie (:P) heb je daar natuurlijk wel weer gelijk in. Tis gewoon jammer, omdat ik nu eerst met een loopje door de recordset van de subquery heenmoet om de filter dan zelf maar op te bouwen.
Thanks voor je reactie in ieder geval, ik ga ff een loopje bakken.

My personal website


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Topicstarter
OK, om mensen die met hetzelfde zitten vooruit te kunnen helpen EN omdat ik er een enorme schurfthekel aan heb als iemand zijn oplossingen niet post bij deze mijn workaround voor deze limit van Delphi:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var fltr : string;
  With DMod.qryGroepen do //Dit is de eerdere subquery
  begin
    filtered := False;
    filter := 'NUMMER = 7'; //where van subquery, kan dynamisch gemaakt worden
    Active := True;
    Filtered := True;
    if RecordCount > 0 then //alleen doorgaan als er gegevens zijn
    begin

      //Eerste record in de fltr variabele zetten als filter
      fltr := 'tagNummer = ' + FieldByName('TagNummer').asString;
      Next;

      while not DMod.qryGroepen.Eof do
      begin
        //voor alle records een "or tagnummer = nr" toevoegen
        fltr := fltr + ' OR tagNummer = ' + FieldByName('TagNummer').asString;
        Next;
      end;

      Active := False;
      Filtered := False;
      Filter := '';

      //de filter toekennen aan de query
      DMod.qryOverzichten.Filter   := fltr;
      DMod.qryOverzichten.Filtered := True;

      [ ...knip... ]
    end;  
  end;

[ Voor 7% gewijzigd door OZ-Gump op 11-06-2003 15:48 ]

My personal website


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

OZ-Gump schreef op 11 June 2003 @ 15:47:
OK, om mensen die met hetzelfde zitten vooruit te kunnen helpen EN omdat ik er een enorme schurfthekel aan heb als iemand zijn oplossingen niet post bij deze mijn workaround voor deze limit van Delphi:
_/-\o_

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


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

Tomatoman

Fulltime prutser

In de categorie 'mosterd na de maaltijd' nog suggestie voor een alternatieve oplossing. Je kunt in de SQL statement van de dataset de tekst WHERE tagNummer = :tagNummer opnemen. De DataSource property van de dataset koppel je aan een master query die een waarde voor :tagNummer moet leveren. Daarvoor moet je IndexFileNames instellen op tagNummer en MasterFields instellen op de veldnaam in de master query (waarschijnlijk heet 'ie daar ook gewoon tagNummer).

Deze oplossing is ook geschikt voor luie mensen, want je moet er welgeteld nul regels code voor schrijven ;)

Een goede grap mag vrienden kosten.


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Topicstarter
tomatoman, heeft iemand je wel eens gezegd dat mosterd na de maaltijd soms ERG lekker kan zijn...? ;) Lijkt me een erg gave oplossing, kijk ik morgen meteen even naar, kijken of ik het voor elkaar krijg, maar dat zal wel lukken...
Hiermee stel je dus eigenlijk een master-detail relatie op...?

My personal website


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Topicstarter
En dan nu in de categorie "oude koeien" nog even het volgende.
Zoals het nu blijkt is het ook niet mogelijk om een between in een filter te zetten. Dat vind ik op zich vreemd, omdat je die wel in een 'normale' where clausule kunt plaatsen. Ik heb er een DTM >= a AND DTM <= b van gemaakt, maar het is wel vreemd dat je ook een between niet in een filter kunt frommelen...
Ga ik even verder uitzoeken. Mocht ik nog iets tegenkomen...

My personal website


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Een filter wordt niet direct vertaald naar een where clause in een query. Het kan heel goed zijn dat between niet wordt ondersteund. Zo'n probleem is het niet echt dacht ik :)

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


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Topicstarter
Een probleem is het ook niet. Ik dacht alleen: laten we er dan maar een compleet topic van maken :*)

Met de >= AND <= is het ook gewoon netjes opgelost en ondertussen heb ik alles werkend, dus ik ben een gelukkig gumpie...

My personal website


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Topicstarter
Nu we dan toch bezig zijn met het compleet maken van dont's betreffende filters:
Je kunt (zelfs) geen haak-constructies gebruiken in een filter.

Ik had een leuk filtertje gemaakt, waarin een veld 1 of 2 mocht zijn EN de datum tussen datumA en datumB moest liggen. Dat gaat blijkbaar ook niet heel simpel met een filter.
SQL:
1
BepaaldVeld = 1 or BepaaldVeld = 2 AND (DTM >= datumA AND DTM <= datumB)
werkt dus gewoon niet. :(

Ik krijg weer rare meldingen over de criteria. Deze zouden niet goed zijn en dergelijke. Ik dacht minder werk te hebben door een hoofdquery te maken en deze met behup van filters aan mijn behoefte aan te passen, maar helaas gaat dat dus blijkbaar niet werken. Ik ga het nu nog 1 keer proberen door de twee datumcriteria in parameters te zetten en de filters alleen voor 1 veld te gebruiken, maar als ook dat niet soepel wil komen er gewoon 5 queries...

My personal website


  • Just_a_Gamer
  • Registratie: November 2001
  • Laatst online: 22:10
Misschien kan je BETWEEN DatumA AND datumB gebruiken ipv (DTM >= datumA AND DTM <= datumB)

edt: sorry niet goed doorgelezen :D

[ Voor 22% gewijzigd door Just_a_Gamer op 12-06-2003 20:20 ]


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

Topicstarter
OZ-Gump schreef op 12 juni 2003 @ 09:12:
En dan nu in de categorie "oude koeien" nog even het volgende.
Zoals het nu blijkt is het ook niet mogelijk om een between in een filter te zetten. Dat vind ik op zich vreemd, omdat je die wel in een 'normale' where clausule kunt plaatsen. Ik heb er een DTM >= a AND DTM <= b van gemaakt, maar het is wel vreemd dat je ook een between niet in een filter kunt frommelen...
Ga ik even verder uitzoeken. Mocht ik nog iets tegenkomen...
Just_a_Gamer: niet meer eerst 34 uur Quaken en dan een al geroepen oplossing roepen he... ;) Oftewel: daar hadden we al over gedacht en dat bleek ook niet juist te zijn...

[ Voor 3% gewijzigd door OZ-Gump op 12-06-2003 20:18 ]

My personal website

Pagina: 1