Formattare un valore null

martedì 08 maggio 2007 - 12.06

liuc Profilo | Junior Member

Nel mio db ho un campo numerico calcolato "AnniGuida" che può assumere valori null (quando ad esempio non è specificata la data di conseguimento della patente).

Nel mio report vorrei che per questi valori fosse visualizzata una stringa del tipo "nd".
Ora io ho scritto questa formula associata alla proprietà "displayString" del campo stesso (sul report) :
if isnull({DettagliIncidenti.AnniGuida}) then "nd" else cstr({DettagliIncidenti.AnniGuida})

Questo però non funziona infatti in corrispondenza dei valori null nel report non compare nulla, mentre compare una stringa con i valori numerici laddove sono disponibili.

Ammesso che funzionasse, poi, probabilmente avrei i record ordinati in modo alfanumerico (vero ?) e questo non andrebbe bene.

Come posso risolvere il problema?

Brainkiller Profilo | Guru

>Questo però non funziona infatti in corrispondenza dei valori
>null nel report non compare nulla, mentre compare una stringa
>con i valori numerici laddove sono disponibili.
>Ammesso che funzionasse, poi, probabilmente avrei i record ordinati
>in modo alfanumerico (vero ?) e questo non andrebbe bene.
>Come posso risolvere il problema?

In effetti la formula non funziona neanche a me, chiederemo a freeteo che è un esperto.
TI posso proporre un Workaround, se usi Access modifica la Query per recuperare i dati in questo modo:

select col1,col2,col3, IIf(IsNull([categoria]),'-1',[categoria]) from tabella

In questo modo se il campo che stai analizzando è NULL viene rimpiazzato con il valore -1.
Nel report quindi arriveranno dei -1 invece che il NULL.
Modifica la formula in Crystal Reports, se il valore della colonna è -1 allora stampa N.D.
Così funziona.Ciao


David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

freeteo Profilo | Guru

ciao,
sinceramente la funzione "IsNull" a me non ha mai dato problemi, pero' mi viene un dubbio, non è che come impostazioni del report c'e' fleggato il "converti valori nulli in default" (o una dicitura simile)?

hai provato a confrontare con qualche valore stringa, magari facendone il trim che non sia stringa vuota invece di nullo...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

liuc Profilo | Junior Member

Nel report non è impostata alcuna proprietà per convertire i null nel valore di default.

Per quanto riguarda la soluzione della conversione del dato direttamente dal db, mi andrebbe anche bene, ma vorrei capire il perchè non funziona con la funzione isnull.

Grazie

liuc Profilo | Junior Member

Ho provato a modificare il dato direttamente nel DB,
funziona ma nella legenda del grafico assocaito al report visualizza il valore -1 e non la label 'n.d.' che viene invece correttamente visualizzata nella tabella dei dati.

Potrei farmi restituire direttamente la string 'n.d.' dal db ma questo significherebbe impostare il campo come string e non come numero e questo farebbe saltare l'ordinamento dei dati nel report : sarebbe alfanumerico e non più numerico.

Possibile che non ci sia un altro modo?

Brainkiller Profilo | Guru

>Possibile che non ci sia un altro modo?

Parlando con teo a lui funziona, ma a me no, a me funziona praticamente come a te. Inoltre se io utilizzo una qualsiasi altra funzione, quando c'è un campo NULL non viene proprio neanche eseguita, neanche io riesco a spiegarmi il perchè. Ho cercato documentazione ma non ho trovato riferimenti. Io utilizzavo Access non ho fatto la prova con altri Database. Tu cosa usi ?
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

freeteo Profilo | Guru

Ragazzi da me va, non so come mai ma vi mostro:

526x422 63Kb

cmq io proverei a fare questa test:
- nella formula usare una variabile stringa e poi tornare quella, perche' mi viene in mente che potrebbe fare casino perche' è come un IIF, ovvero lui compila tutte e 2 le scelte e quindi andrebbe in errore convertendo in stringa un valore nullo, anche se è nell' "else" della condizione.

Tecnicamente, nella formula scrivi:
stringvar str := ""; if IsNull({confronti.mergesort}) then str := "nd" else str := Cstr({confronti.mergesort}); str

cmq ho allegato l'immagine del mio repotr e i risultati il campo è numerico di access lasciato nullo...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

liuc Profilo | Junior Member

Come DB usoo SQLServer 2005
Ho provato ad utilizzare la formula così come postata ma niente.
Mi viene un dubbio ... che possa essere un problema di CR ? io uso la versione fornita con .net 2005.

Non saprei cos'altro possa essere.

freeteo Profilo | Guru

ciao,
anche qeulla che vedi è la 2005...ho solo fatto un upgrade dal menu' Crystal ma ricordo che andava anche in 2003 e in vb6 sta cosa e con entrambi i db (access/sql)...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5