Toon posts:

[ASP.Net] DataColumn.Compute filter valt over Null values

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik vermoed dat ik weer is tegen een bug aanloop. Ik probeer om met compute een summary samen te stellen. Echter de gemiddelden moeten alleen worden berekend indien er een waarde aanwezig is.

Hij struikelt over het filter "UrenKwartaalPercentage>0", als ik het filter weglaat treed er geen probleem op en wordt de AVG uitgevoerd over alle DataRows.

Ik heb al ISNULL() geprobeerd, vergelijking met System.DBNull, Convert naar System.Double etc. maar hij heeft er echt geen zin in. Iemand een suggestie?

In de Expression van een DataColumn zit ook een bug met betrekking tot werken met values van het type Decimal, dus wie weet zitten we hier weer met een bug te klooien.

Framework versie is 1.1.4322.2032; ASP.NET Version:1.1.4322.2032
Object cannot be cast from DBNull to other types.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidCastException: Object cannot be cast from DBNull to other types.

Source Error:


Line 68: avgUrenKwartaal = Convert.ToDouble(dt.Compute("Avg(UrenKwartaalPercentage)","UrenKwartaalPercentage>0"));
Line 69: }

[ Voor 5% gewijzigd door Verwijderd op 16-11-2005 15:10 ]


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 20:41
Je hebt ISNULL() geprobeerd?
Dat bestaat niet, naar mijn weten is het ISNULL(field, alternatief), in jou geval dus Avg(ISNULL(UrenKwartaalPercentage, 0)) ofzo.

Edit: wat voor DB gebruik je? Het verhaal hierboven gaat alleen op voor SQL Server volgens mij, in MySQL bestaat er wel een ISNULL() functie.


Edit2: heb er even over nagedacht, en bovenstaande slaat nergens op. :X
Het probleem is het 2e argument toch (het filter argument)?

[ Voor 54% gewijzigd door sig69 op 16-11-2005 15:53 ]

Roomba E5 te koop


  • Niek.NET
  • Registratie: Oktober 2005
  • Laatst online: 08:58
Verwijderd schreef op woensdag 16 november 2005 @ 15:04:

Ik heb al ISNULL() geprobeerd, vergelijking met System.DBNull, Convert naar System.Double etc. maar hij heeft er echt geen zin in. Iemand een suggestie?

[...]
Heb je al geprobeert te vergelijken met System.DBNull.Value of alleen met System.DBNull?

Verwijderd

Topicstarter
Eh.. deze methodes worden binnen de scope van een DataSet uitgevoerd, niet op database server niveau. Dus een DB staat hier los van. :P

Verder een ISNULL kan je niet toepassen op dat vlak, de Compute functie verwacht een DataColumn.Name en niet een value.

De Convert.Double was ook al geprobeerd, primair omdat expressions niet goed werken met Decimals :)

Verwijderd

Topicstarter
Niek.NET schreef op woensdag 16 november 2005 @ 15:48:
[...]


Heb je al geprobeert te vergelijken met System.DBNull.Value of alleen met System.DBNull?
Ja, echter zijn ze niet toegestaan binnen een filter. Je krijgt dan netjes een EvaluateException voorgeschoteld.

edit:

Na een hoop gekloot opeens wel response met onderstaande filter string :? 8)7

avgUrenKwartaal = Convert.ToDouble(dt.Compute("Avg(UrenKwartaalPercentage)","NOT UrenKwartaalPercentage IS NULL OR UrenKwartaalPercentage <= 0"));

De eerdere situatie was dus
avgUrenKwartaal = Convert.ToDouble(dt.Compute("Avg(UrenKwartaalPercentage)","NOT UrenKwartaalPercentage IS NULL AND UrenKwartaalPercentage > 0"));

En dan evalueert die het 2de statement alsnog, ondanks de null value.

[ Voor 48% gewijzigd door Verwijderd op 16-11-2005 16:06 ]


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 20:41
Heb even de docs erbij gepakt..
Dit moeten werken:
Avg(ISNULL(UrenKwartaalPercentage, 0))

Edit: (reactie op jouw edit)
ergens is dat logisch :) Maar je telt nu alleen regels met NULL-values niet mee in het gemiddelde. Is dat de bedoeling?

[ Voor 48% gewijzigd door sig69 op 16-11-2005 16:07 ]

Roomba E5 te koop


Verwijderd

Topicstarter
sig69 schreef op woensdag 16 november 2005 @ 16:06:
Heb even de docs erbij gepakt..
Dit moeten werken:
Avg(ISNULL(UrenKwartaalPercentage, 0))

Edit: (reactie op jouw edit)
ergens is dat logisch :) Maar je telt nu alleen regels met NULL-values niet mee in het gemiddelde. Is dat de bedoeling?
Lieve schat .. :> Dan pak je toch average op alle DataRows, en niet op alleen de DataRows die voldoen aan een filter :D

Verwijderd

Topicstarter
sig69 schreef op woensdag 16 november 2005 @ 16:06:
Edit: (reactie op jouw edit)
ergens is dat logisch :) Maar je telt nu alleen regels met NULL-values niet mee in het gemiddelde. Is dat de bedoeling?
Ja :D

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Overigens is dit geen bug. Je kunt een NULL value niet met = vergelijken. Je moet altijd IS gebruiken.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 20:41
Verwijderd schreef op woensdag 16 november 2005 @ 16:08:
[...]
Lieve schat .. :> Dan pak je toch average op alle DataRows, en niet op alleen de DataRows die voldoen aan een filter :D
Klopt, had het filter uit pure luiheid weggelaten.
Ok.

Overigens was je bedoeling mij in eerste instantie niet helemaal duidelijk, m'n .NET zit vastgeroest omdat ik al een half jaar op een Java project zit ( :( ) en het is al een lange dag geweest, dus als mijn suggesties niet helemaal to the point waren moet je me dat maar vergeven (de bedoeling was goed...).

[ Voor 44% gewijzigd door sig69 op 16-11-2005 16:17 ]

Roomba E5 te koop


Verwijderd

Topicstarter
P_de_B schreef op woensdag 16 november 2005 @ 16:08:
Overigens is dit geen bug. Je kunt een NULL value niet met = vergelijken. Je moet altijd IS gebruiken.
Uiteraard, maar ik ging er vanuit dat een filter statement daar wel mee om kon gaan. Als je in SQL Server alle rows pakt en daarop een filter met >= <= = <> etc. uitvoerd dan krijg je gewoon netjes alles terug waaraan wordt voldaan. Je werkt in expression ook met die specifieke syntax.

Zowiezo heb ik nu nog steeds een probleem, want die AND is wel nodig, heb je natuurlijk nooit een conditie. Ik vermoed toch dat er ergens een bugje zit want met deze conditie zou je nooit een DBNull error mogen krijgen, dus het lijkt erop dat er een evaluate wordt gedaan van de hele filter. :?

NOT UrenKwartaalPercentage IS NULL AND UrenKwartaalPercentage > 0

En deze werkt wel (maar wil je niet vanwege het doorlaten van 0 in je average berekening) 8)7

NOT UrenKwartaalPercentage IS NULL AND UrenKwartaalPercentage >= 0

[ Voor 33% gewijzigd door Verwijderd op 16-11-2005 16:45 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
UrenKwartaalPercentage IS NOT NULL AND UrenKwartaalPercentage > 0 ?

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Topicstarter
Nope, geen verschil :) Zowiezo bizar, want de waardes kunnen nooit NULL zijn, al niet vanuit de database. :)

[ Voor 66% gewijzigd door Verwijderd op 16-11-2005 17:13 ]

Pagina: 1