datos .NULL. manejo en cursores

1,215 views
Skip to first unread message

Edward Cifuentes

unread,
Feb 25, 2012, 2:46:55 PM2/25/12
to Comunidad de Visual Foxpro en Español
SELECT sum(venta) as total FROM ventas INTO CURSOR curventas

me devuelve una un cursor con un registor y el valor .NULL.

y al copiar el cursor a un textbox me lo llena con el valor .NULL. en
vez del valor 0 ya que necestio sumar el valor con otros del
formulario

dado que el cursor me devuelve un valor null me aparecera un
registro... y no podria decir que esta vacia la tabla como hago para
decir que esta vacia la tabla y que al textbox le asigen 0

Douglas Sánchez Guillén

unread,
Feb 25, 2012, 3:00:42 PM2/25/12
to publice...@googlegroups.com
holla, revisa la funcion ISNULL, creo que seria una solucion.
--
Ing. Douglas Sánchez Guillén
      Consultor Informatico
Movistar: 505 8759 - 5342
Claro: 505 88495476

Guillermo MDQ

unread,
Feb 25, 2012, 3:01:26 PM2/25/12
to Comunidad de Visual Foxpro en Español

Busca en la ayuda la referencia a la funcion NVL, que te devuelve el
valor que vos le indiques, en este caso un cero, si la expresion a
evalur retorna null.

Te quedaria asi para que te retorne un cero:

SELECT NVL(sum(venta),0) as total FROM ventas INTO CURSOR curventas

Saludos
Guillermo


On 25 feb, 16:46, Edward Cifuentes <edwardcifuentes...@gmail.com>
wrote:

Victor Espina

unread,
Feb 25, 2012, 3:09:15 PM2/25/12
to publice...@googlegroups.com
La unica forma que SUM(venta) arroje NULL es que:

a) El cursor original no este vacio
b) Uno o mas registros del cursor contenga NULL en la columna "venta"

La forma correcta de evitar esto es:

SELECT SUM(NVL(venta,0.00)) AS total FROM ....

Saludos

Victor Espina

Douglas Sánchez Guillén

unread,
Feb 25, 2012, 3:12:53 PM2/25/12
to publice...@googlegroups.com
Bueno nvl es una solucion pero ahora te pregunto para que usas SUM () SIN NO USAS GROUP BY, UMMMM
Esto es lo malo por eso el null

si no kieres usar nada de lo anterior hace esto simplemente... lol


SELECT codigo,sum(venta) as total  FROM venta GROUP BY codigo INTO CURSOR curventa

Saludes.

Victor Espina

unread,
Feb 25, 2012, 3:26:49 PM2/25/12
to publice...@googlegroups.com
SUM() se puede usar sin GROUP BY cuando lo que necesitas es totalizar TODOS los registros de la fuente de datos.  Sin importar si agrupas o no, el problema es el mismo: si uno o mas de los registros considerados en el SUM contienen el valor NULL en la columna que se esta sumando, el resultado final de la operacion sera NULL.

Victor Espina

Marco Plaza

unread,
Feb 25, 2012, 4:06:22 PM2/25/12
to Comunidad de Visual Foxpro en Español
A partir de vfp9 si no colocas el group by, y la consulta no devuelve
resultados para la función agregada ( sum,min,max etc), vfp siempre te
devolverá un registro con .null. como resultado de la función.

Coloca la cláusula group by y obtendrás un cursor vacío.

Marco Plaza




On 25 feb, 16:26, Victor Espina <vespi...@gmail.com> wrote:
> SUM() se puede usar sin GROUP BY cuando lo que necesitas es totalizar TODOS
> los registros de la fuente de datos.  Sin importar si agrupas o no, el
> problema es el mismo: si uno o mas de los registros considerados en el SUM
> contienen el valor NULL en la columna que se esta sumando, el resultado
> final de la operacion sera NULL.
>
> Victor Espina
>
>
>
>
>
>
>
> On Saturday, February 25, 2012 5:12:53 PM UTC-3, DSANCHEZ wrote:
>
> > Bueno nvl es una solucion pero ahora te pregunto para que usas SUM () SIN
> > NO USAS GROUP BY, UMMMM
> > Esto es lo malo por eso el null
>
> > si no kieres usar nada de lo anterior hace esto simplemente... lol
>
> > SELECT codigo,sum(venta) as total  FROM venta *GROUP BY codigo* INTO
> > CURSOR curventa
>
> > Saludes.
> > *Ing. Douglas Sánchez Guillén*
> > *      Consultor Informatico*
> > Movistar: 505 8759 - 5342
> > Claro: 505 88495476
>
> On Saturday, February 25, 2012 5:12:53 PM UTC-3, DSANCHEZ wrote:
>
> > Bueno nvl es una solucion pero ahora te pregunto para que usas SUM () SIN
> > NO USAS GROUP BY, UMMMM
> > Esto es lo malo por eso el null
>
> > si no kieres usar nada de lo anterior hace esto simplemente... lol
>
> > SELECT codigo,sum(venta) as total  FROM venta *GROUP BY codigo* INTO
> > CURSOR curventa
>
> > Saludes.
> ...
>
> leer más »

Victor Espina

unread,
Feb 25, 2012, 4:39:17 PM2/25/12
to publice...@googlegroups.com
Excelente acotacion Marco. No estaba al tanto de ese cambio en VFP 9. Dado esto, entonces la solucion correcta es una mezcla de ambas:

SELECT NVL(SUM(NVL(data,0.00)),0.00) AS total FROM ...


Saludos

Victor Espina

Carlos Miguel FARIAS

unread,
Feb 25, 2012, 5:12:00 PM2/25/12
to publice...@googlegroups.com
Una aclaración, un valor null es retornado si todos los valores sumarizados son nulos, si alguno/s tienen valor, retorna dicho valor o la suma de los no nulos. Si la tabla está vacia, por lógica, sus valores son null (ausencia de valor).

Prueba

CLEAR ALL
CREATE CURSOR pepe ( TOTAL N(6,0) NULL ) && esto se pone aqui para tener que adjuntar una tabla
INSERT INTO pepe VALUES ( 10 )
INSERT INTO pepe VALUES ( NULL )
BROWSE && muestra cursor de origen
SELECT NVL( SUM( TOTAL ), 0 ) FROM pepe INTO CURSOR pepo
WAIT WINDOW _TALLY && muestra cantidad registros recuperados (da siempre 1)
SELECT pepo
BROWSE && muestra los datos calculados (en el ejemplo 10)

Si comentan los insert, en pepo se almacena 0 (efecto de NVL en el SELECT), si quitan el NVL, si los insert, el valor almacenado es null

Saludos: Miguel, Santa Rosa (LP)

Victor Espina

unread,
Feb 25, 2012, 5:35:23 PM2/25/12
to publice...@googlegroups.com
Totalmente correcto, no solo en VFP sino tambien en SQL Server. La verdad, me sorprendio mucho esto.

Victor ESpina

Luis Maria Guayan

unread,
Feb 25, 2012, 6:57:50 PM2/25/12
to publice...@googlegroups.com
No es así Victor, SUM (como otras clausulas mas) no tiene en cuenta los valores Null, de allí la importancia en algunos casos de tener campos que acepten valores Null y su interpretación

Ej
CREATE CURSOR Temp (Valor i Null)
INSERT INTO Temp (Valor) VALUES (10)
INSERT INTO Temp (Valor) VALUES (Null)
INSERT INTO Temp (Valor) VALUES (20)
SELECT SUM(Valor) FROM Temp

Este artículo de J.Booth está muy bueno para comprender los valores Null

-- ¿Que es un valor NULL entre amigos? --
http://www.portalfox.com/index.php?name=Sections&req=viewarticle&artid=146

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

Luis Maria Guayan

unread,
Feb 25, 2012, 7:03:20 PM2/25/12
to publice...@googlegroups.com
Te retorna Null porque la tabla no tiene registros

Ej:
CREATE CURSOR Temp (Valor i)
SELECT SUM(Valor) FROM Temp

Mira las funciones NVL() e ISNULL()

También te aconsejo la lectura de este artículo de Janis Booth


-- ¿Que es un valor NULL entre amigos? --
http://www.portalfox.com/index.php?name=Sections&req=viewarticle&artid=146


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________


Carlos Miguel FARIAS

unread,
Feb 26, 2012, 9:40:33 AM2/26/12
to publice...@googlegroups.com
En realidad, todos los sistemas de gestión de base de datos que soportan datos null y sql se comportan de la misma manera.
El concepto de null (ausencia de valor) es importantísimo, si por ejemplo manejas sexo de personas, que puedas manejar datos null, ahora, es necesario, porque a veces para no ofender no podes poner masculino o femenino, entonces le pones null y mutis por el foro.
Con todo respeto.
Saludos: Miguel, La Pampa (RA)

Marco Plaza

unread,
Feb 26, 2012, 10:59:35 AM2/26/12
to Comunidad de Visual Foxpro en Español
Retorna Null porque no tiene registros y no tienes un group by. Si
colocas group by <campo> retornará un cursor vacío, si no usas group
by, te retorna un registro nulo.

Ej:

CREATE CURSOR Temp (valor1 i,Valor i)
SELECT SUM(Valor) FROM Temp GROUP BY valor1 && cusor vacío
SELECT SUM(Valor) FROM Temp && cursor con un solo registro nulo

de manera que para el problema que tiene Edward la solución es
simplemente colocar el group by en la petición.
otra solución es usar set nulldisplay to '' , y la consulta sin group
retornará un campo en blanco en lugar de .null.



On 26 feb, 10:40, Carlos Miguel FARIAS <carlosmiguelfar...@gmail.com>
wrote:
> En realidad, todos los sistemas de gestión de base de datos que soportan
> datos null y sql se comportan de la misma manera.
> El concepto de null (ausencia de valor) es importantísimo, si por ejemplo
> manejas sexo de personas, que puedas manejar datos null, ahora, es
> necesario, porque a veces para no ofender no podes poner masculino o
> femenino, entonces le pones null y mutis por el foro.
> Con todo respeto.
> Saludos: Miguel, La Pampa (RA)
>
> El 25 de febrero de 2012 21:03, Luis Maria Guayan
> <luismar...@gmail.com>escribió:
>
>
>
>
>
>
>
> >  Te retorna Null porque la tabla no tiene registros
>
> > Ej:
> > CREATE CURSOR Temp (Valor i)
> > SELECT SUM(Valor) FROM Temp
>
> > Mira las funciones NVL() e ISNULL()
>
> > También te aconsejo la lectura de este artículo de Janis Booth
>
> > -- ¿Que es un valor NULL entre amigos? --
> >http://www.portalfox.com/index.php?name=Sections&req=viewarticle&arti...
>
> >  * Luis María Guayán
> > Tucumán, Argentina
> > _________________________
> >http://www.PortalFox.com<http://www.portalfox.com>
> > Nada corre como un zorro
> > _________________________
> > *

Carlos Miguel FARIAS

unread,
Feb 26, 2012, 2:55:44 PM2/26/12
to publice...@googlegroups.com
Y un cursor vacio que representa? que no habia nada para sumar o que la selección fue muy estricta o que hubo un error?
Ademàs, que le cargas al campo de agrupamiento, si tiene algún valor, tendría que ser para todos igual, o todos null,
si no es un dato emergente de los datos originales, es un cuerpo extraño.
Si tiene valores diferentes, va a tirar un registro por cada valor diferente.
Creo que lo correcto es sumar sin pasar a cero los nulos.
Si el total en el cursor es un valor nulo, no habia valores válidos para sumar, y si no, es la suma de los datos conocidos.

Saludos: Miguel, La Pampa (RA)


Marco Plaza

unread,
Feb 26, 2012, 5:52:42 PM2/26/12
to Comunidad de Visual Foxpro en Español
Bueno Carlos, eso ya es algo de cada quien con su diseño y su lógica.
Espero que haya servido la aclaración y porqué ocurre ese problema. Yo
no entro a discutir si está bien o no la lógica de otro, mientras los
resultados que obtenga sean correctos - Aunque para mi por ejemplo
tiene mas lógica que si una tabla está vacía, el resultado de la suma
de sus registros sea 0 o un cursor vacío en este caso, no nulo pues
nulo es = 'no lo se'.



On 26 feb, 15:55, Carlos Miguel FARIAS <carlosmiguelfar...@gmail.com>
wrote:
> Y un cursor vacio que representa? que no habia nada para sumar o que la
> selección fue muy estricta o que hubo un error?
> Ademàs, que le cargas al campo de agrupamiento, si tiene algún valor,
> tendría que ser para todos igual, o todos null,
> si no es un dato emergente de los datos originales, es un cuerpo extraño.
> Si tiene valores diferentes, va a tirar un registro por cada valor
> diferente.
> Creo que lo correcto es sumar sin pasar a cero los nulos.
> Si el total en el cursor es un valor nulo, no habia valores válidos para
> sumar, y si no, es la suma de los datos conocidos.
> Saludos: Miguel, La Pampa (RA)
>
Reply all
Reply to author
Forward
0 new messages