Toon posts:

[DELPHI / SQL ] COUNT(*) problemo

Pagina: 1
Acties:

Verwijderd

Topicstarter
Heb ik weer... ben ik rustig aan het proggen... krijg ik de meest foute memmory problemen... en dit alles komt door -> count(*) as VrijeUren' <- ... dit mag blijkbaar niet in SQL.add(' '); ... Kent iemand dit probleem? en beter nog.. is er een oplossing voor ???

[tag]
with qOverzicht do
begin
Close;
SQL.Clear;
SQL.Add('SELECT LokalenParent.LokaalNr, LokalenParent.AantalPlaatsen,');
SQL.Add('LokalenParent.Soort, LokalenParent.Ethernet, count(*) as VrijeUren');
SQL.Add('FROM Lokalen AS LokalenParent, Uren');
SQL.Add('WHERE Uren.Uur Not In (SELECT Uren.Uur');
SQL.Add('FROM Uren INNER JOIN Reservering ON Uren.Uur = Reservering.Uur');
SQL.Add('WHERE Reservering.LokaalNr = LokalenParent.LokaalNr');
SQL.Add('AND Reservering.Datum = ' + datum + ' )');
SQL.Add('GROUP BY LokalenParent.LokaalNr, LokalenParent.AantalPlaatsen,');
SQL.Add('LokalenParent.Soort, LokalenParent.Ethernet');
SQL.Add('ORDER BY LokalenParent.LokaalNr;');
Open;
end;
[/tag]

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
Geef eens wat meer info? Wanneer krijg je die fout? Bij het uitvoeren van de query?
welke foutmelding krijg je exact?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Project LokRes.exe raised excemption EAccessViolation with message 'Access violation at address !B041716 in module 'msjet40.dll'. Read of address 0003242E'.
Process stopped. Use Step or Run to continue.

// meer kan ik niet geven whoami :S

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
En wat gebeurt er als je die query gewoon eens in de query explorer uitvoert, dus niet via uw delphi programma?

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

En daarom zou Count(*) niet mogen?! Zo te zien is het een msjet fout en heeft het weinig met delphi te maken.

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


  • ProgrammerX
  • Registratie: Juli 2002
  • Laatst online: 26-02-2021
Ik zie dat je de jet engine gebruikt. Gebruik je toevallig access ?

Als ik me niet vergis (weet het niet zeker) kan de "as" constructie niet in access.

Verwijderd

Topicstarter
hij doet het wel in access.. hij doet het ook als SQL TString.. maar zodra ik hem in de code bak met SQL.ADD ... begint het gezeur pas...

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Kijk eens voor dat je Open; doet wat er in SQL.Text staat. Klopt dat met wat je verwacht?

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


  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
En als je het zonder COUNT() doet, dan werkt het wel? Zeer vreemd.
Ik denk ook dat je er moet voor zorgen dat er spaties staan tussen bepaalde items.
Als je doet
code:
1
2
SQL.Add('SELECT *');
SQL.Add('FROM tabel');

dan denk ik dat je:
SELECT *FROM tabel
bekomt, terwijl je toch een spatie moet hebben tussen * en FROM.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ook gecontroleer... klopt perfect :S

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Verwijderd schreef op 29 oktober 2002 @ 15:44:
Ook gecontroleer... klopt perfect :S
dus het werkt nu of niet? Of bedoel je dat als antwoord op mijn vraag?

whoami: Dan zou het ook fout moeten gaan als ie het designtime invult. En als het component zich gedraagd en via SQL.Text de hele query uitleest moet ook dat niet foutgaan, want dan komt er #13#10 tussen de regels te staan. Maar je weet maar nooit :)

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


Verwijderd

Topicstarter
mijn SQL.text klopt maar de fout blijft...

SQL.Add('SELECT LokalenParent.LokaalNr, LokalenParent.AantalPlaatsen,');
SQL.Add('LokalenParent.Soort, LokalenParent.Ethernet, "COUNT(*)" as VrijeUren ');

nu krijg ik geen melding.. helaas staat er in vrijeuren dan wel "COUNT(*)" .. ipv een getal.. hierdoor kan ik toch redelijk afleiden dat het alleen hier aan ligt (COUNT(*))

of niet ??

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Tja, lijkt van wel. vreemd hoor. Kijk anders even op www.tamaracka.com of iemand anders hetzelfde probleem heeft. (Je hebt wel de laatste updates van delphi en ado?)

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


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:26

Tomatoman

Fulltime prutser

code:
1
COUNT(Lokalen.*) as VrijeUren
zou de oplossing kunnen zijn. Wat ik echter eerder verwacht is dat je as moet weglaten, as is een typische Access-constructie. Dus:
code:
1
COUNT(Lokalen.*) VrijeUren

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
Hmm alle updates er overheen gegooid.. enne tja blijft kut... enne dat AS weglaten is ook niet echt een optie.. het gekke is nogsteeds als ik de code invoer bij SQl. TString dat ie het wel pakt...

Verwijderd

SQL.Add('SELECT LokalenParent.LokaalNr, LokalenParent.AantalPlaatsen,');
SQL.Add('LokalenParent.Soort, LokalenParent.Ethernet, "COUNT(*)" as VrijeUren ');
Maak hier is van :
code:
1
sql.add('select count(*) from LokalenParent vrijeuren')


Dit zou namelijk direct moeten werken.

Verwijderd

Topicstarter
:S ... VrijeUren is een Alias... natuurlijk heb ik wel getest.. want op den duur geloof je alles.. maareh.. zelfde error.. 't zit hem echt in de count ///

Verwijderd

Topicstarter
Nah misschien wordt het onduidelijk.. hieronder een gestripte versie...
1 plaatjes zegt meer dan 1000 woorden ....

http://members.chello.nl/c.houwing/LOKALENRES.zip

Verwijderd

M'n Delphi-kennis is inmiddels een beetje roestig geworden en bedekt onder een dikke laag stof, maar er staat me iets van bij dat zogenaamde "aggregate functions" (zoals count en sum) niet mogelijk zijn op de manier zoals jij dat wilt. Ik wil 't voor de zekerheid nog wel ff nakijken, maar ik denk dat je 't op een andere manier zult moeten oplossen...

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
Verwijderd schreef op 29 oktober 2002 @ 19:08:
M'n Delphi-kennis is inmiddels een beetje roestig geworden en bedekt onder een dikke laag stof, maar er staat me iets van bij dat zogenaamde "aggregate functions" (zoals count en sum) niet mogelijk zijn op de manier zoals jij dat wilt. Ik wil 't voor de zekerheid nog wel ff nakijken, maar ik denk dat je 't op een andere manier zult moeten oplossen...


Waarom zou dat niet mogelijk zijn op de manier waarop hij dat wil en wat is er dan wel verkeerd aan?
Ik zie op 't eerste -vluchtige- zicht niet iets dat fout zou zijn.

https://fgheysels.github.io/


Verwijderd

Verwijderd schreef op 29 oktober 2002 @ 17:59:
:S ... VrijeUren is een Alias... natuurlijk heb ik wel getest.. want op den duur geloof je alles.. maareh.. zelfde error.. 't zit hem echt in de count ///
Als je het zo doet zie delphi de vrijeuren ook als een alias en as is alleen nodig voor oracle.

code:
1
sql.add('select count(*) from LokalenParent vrijeuren')


Wat gebeurt er als je je query in the BDE test gaat ie dan wel goed ?

Vang anders de execute van je query af in een try except en gooi de e.message error dan even door in een showmessage. Zodat je weet wat er precies fout gaat.

Verwijderd

Zet eens een SQL.BeginUpdate en een SQL.EndUpdate om de SQL.Clear/Adds.

Als de SQL object (TStringList) verandert, wordt de query meteen geupdate, dit wil je pas als je alle wijzigingen hebt gedaan.

  • Aetje
  • Registratie: September 2001
  • Laatst online: 18-12-2025

Aetje

Troubleshooting met HAMERRR

Verwijderd schreef op 29 oktober 2002 @ 15:29:
hij doet het wel in access.. hij doet het ook als SQL TString.. maar zodra ik hem in de code bak met SQL.ADD ... begint het gezeur pas...
Probeer het volgende eens: Zet al je code vooraf in een TStringList, dan assign je die stringlist naar je SQL.
De plek van de AV doet me nl. sterk denken aan een string die wordt toegevoegd aan een niet bestaande line van de TStrings van dat queryobject, iets waar ik ook last van gehad heb.

Overigens, als je toevallig de execute in een multithreaded applicatie wil zetten: Vergeet het maar. Jet ondersteund multithreading NIET.

Forget your fears...
...and want to know more...


Verwijderd

Topicstarter
Multi threading zal ik ook niet aan beginnen voor dit suffe projectje.. ben er trouwens via via via.. achter gekomen..
Blijkbaar vind ADO het niet leuk als je met Add SQL toevoegt aan je strings (weer een reden om geen dynamische queries te gebruiken). Als ik onderstaande code gebruik i.p.v. je Add statements werkt het wel.

code:
SQL.Text :=
'SELECT LokalenParent.LokaalNr, LokalenParent.AantalPlaatsen, ' +
'LokalenParent.Soort, LokalenParent.Ethernet, count(*)AS VrijeUren ' +
'FROM Lokalen AS LokalenParent, Uren ' +
'WHERE Uren.Uur Not In (SELECT Uren.Uur ' +
'FROM Uren INNER JOIN Reservering ON Uren.Uur = Reservering.Uur ' +
'WHERE Reservering.LokaalNr = LokalenParent.LokaalNr ' +
'AND Reservering.Datum = ' + datum + ' ) ' +
'GROUP BY LokalenParent.LokaalNr, LokalenParent.AantalPlaatsen, ' +
'LokalenParent.Soort, LokalenParent.Ethernet ' +
'ORDER BY LokalenParent.LokaalNr; ';
[*edit] dit komt van onze goede vrienden van nldelphi forum [*/edit]

Verwijderd

Topicstarter
THXS EVERY BODDDDY :D

Verwijderd

Verwijderd schreef op 30 oktober 2002 @ 21:00:
ben er trouwens via via via.. achter gekomen..
AFAIK mag je hier best zeggen dat je het via het nldelphi-forum hebt... :)

Maar waarom gaat het dynamisch toevoegen dan alleen mis in het count(*) geval? Ik denk toch dat 't iets met aggregation te maken heeft... Er was in delphi toch ook iets van een TAggregate ofsow? :?
/me moet Delphi 7 maar weer eens gaan installeren... :)

Verwijderd

Topicstarter
Klopt... maareh nadat ik 1 maal ergens heb verwezen naar een andere forum ... ben ik zowat met de dood bedreigd.... alle lof iid voor nldelphi ...

ps .. ( klopt )

TAggregate represents a maintained aggregate in a client dataset.

Unit

dbclient

Description

Use TAggregate to specify the formula for an aggregate that can be used by a client dataset. Each aggregate object describes a calculation that summarizes the data in a set of records. The group of records that is summarized is part of the aggregate object. Thus, if a client dataset is performing the same summary calculation over subgroups of records and over the entire dataset, it must use two separate TAggregate objects.

When aggregates summarize data over a group of records (rather than the entire client dataset), they must be associated with an index. The fields in the index define the possible groups of records. When a client dataset changes its index, any aggregate not associated with the new index becomes unavailable, and any active aggregate associated with the new index becomes available.

Aggregate objects can be created and used directly in code at runtime. At design time, you can use the Fields editor to add aggregate fields to a client dataset. When you define aggregate fields at design time, the Fields editor automatically creates the TAggregate objects for them.

Verwijderd

Niet om het 1 of het ander, maar volgens mij had ik al gezegd waar het aan lag.

Als je deze SQL uitvoert zul je dezelfde fout krijgen:

SQL:
1
2
SELECT LokalenParent.LokaalNr, LokalenParent.AantalPlaatsen,
LokalenParent.Soort, LokalenParent.Ethernet, count(*)AS VrijeUren

Probleem is een combinatie van een bug van Microsoft en een rare implementatie van Delphi.
Pagina: 1