Diferenciar campo numerico de 0.00 a vacio?

989 views
Skip to first unread message

Miguel Ab

unread,
Oct 30, 2013, 8:23:36 AM10/30/13
to publice...@googlegroups.com
Hola.

Tengo un problemilla con un campo que se modifica en una tabla. El campo es de tipo numeric y permite 2 decimales. El caso es que cuando hago un select me muestra algo como esto:

SELECT nregistro, valor, ISBLANK(valor) AS _blank, ISNULL(valor) AS _null, EMPTY(valor) AS _empty
FROM ordentrab
WHERE valor=0.00

nregistro     valor     _blank     _null     _empty
a123          0.00      F          F         T
a124                    F          F         T


El caso es que los que tienen el valor a 0.00 en vez de vacio son los que me causan problemas porque se han modificado y hay que revisarlos, PERO no logro diferenciarlos registros que tienen el 0.00 y los que no tienen nada.

Y esa es la pregunta, ¿alguien conoce alguna forma de diferenciar estos resgistros (los que tienen 0.00 y los que no tienen nada)?

Muchas gracias.
Saludos.

Luis Maria Guayan

unread,
Oct 30, 2013, 8:30:48 AM10/30/13
to publice...@googlegroups.com
Este es un buen caso para utilizar valores NULL

¿Si tienes un registro diario de temperaturas de tu ciudad, el valor 0, es que ese día no hay datos ó se registro 0° C de temperatura?

Mira estos artículos de PortalFox:

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

-- Manipular valores NULL en VFP --
http://www.portalfox.com/index.php?name=Sections&req=viewarticle&artid=110

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

Fidel Charny

unread,
Oct 30, 2013, 8:35:14 AM10/30/13
to publice...@googlegroups.com
Luis María, bienvenido al rodeo con nueva imagen marina!!

HernanCano

unread,
Oct 30, 2013, 3:30:18 PM10/30/13
to publice...@googlegroups.com
Hola, Miguel.
Hace algún tiempo hice un estudio al respecto basado en la info de
http://fox.wikis.com/wc.dll?Wiki~IsNullIsBlankEmpty

Y encontré ese problema en los tipos Currency e Integer:
Justo cuando se agregan (cuando aún deberían estar "blancos"), la función ISBLANK() devuelve .f.

Como dice Luis M, quizá debas utilizar nulos, claro según la necesidad específica.

Chao.

Miguel Ab

unread,
Oct 31, 2013, 3:44:18 AM10/31/13
to publice...@googlegroups.com
Hola.
Gracias por las respuestas.

El problema es que se trata de una aplicación ya desarrollada, por lo que emplear un "null" tendrá seguramente efectos no deseados. Tocará meter un código adicional que marque los registros que se van cambiando y cuales no para luego rectificarlos.

Es una pena, porque he comprobado que son los registros que tienen el 0.00 los que se han cambiado, pero la verdad es que no he logrado diferenciarlos.

Saludos y reitero las gracias.

Miguel Ab

unread,
Oct 31, 2013, 3:45:34 AM10/31/13
to publice...@googlegroups.com
Luis Maria

Bienvenido, enhorabuena y esperamos que nos cuente que tal fue el congreso.

Saludos.

Fernando D. Bozzo

unread,
Oct 31, 2013, 4:23:40 AM10/31/13
to publice...@googlegroups.com
Hola Miguel:

De ese SELECT-SQL que hiciste arriba, ¿podrías hacer un LIST TO FILE datos.txt y adjuntar el archivo en este foro?
Si pudieras adjuntar una tabla creada con ese mismo SELECT, sería todavía mucho más útil.


Saludos.-

Miguel Ab

unread,
Oct 31, 2013, 1:29:23 PM10/31/13
to publice...@googlegroups.com
Hola.

He intentado varias veces subir un .dbf pero no hya forma (se queda pillada la página y tengo que cerrarla).

De todas formas es muy sencillo de generar: con Ctrl+Y (APPEND BLANK) de crea el registro en blanco, luego en el campo numeric valor pulsar Supr (borrar el contenido del campo).

Saludos y buen fin de semana largo.

Fernando D. Bozzo

unread,
Oct 31, 2013, 2:34:32 PM10/31/13
to publice...@googlegroups.com
Miguel, creo que te tengo una solución (en FoxPro 9.0!).
Hice esta prueba, y mirá el resultado:

*-- Creo el cursor
CREATE CURSOR test_bk (valor N(13,2) )
APPEND BLANK   && Primer registro en blanco y sin valor
APPEND BLANK   && Segundo registro en blanco y luego le pongo 0
REPLACE valor WITH 0
cVar = ''

GOTO RECORD 1
=CURSORTOXML('test_bk',"cVar",1,0,1,"")
? STREXTRACT(cVar,'<valor>','</valor>') && Muestra '0'

GOTO RECORD 2
? CURSORTOXML('test_bk',"cVar",1,0,1,"")
? STREXTRACT(cVar,'<valor>','</valor>') && Muestra '0.00'

Los resultados con de tipo carácter, pero al menos podés preguntar si es '0' ó '0.00'


Saludos!

Miguel Ab

unread,
Nov 4, 2013, 11:50:08 AM11/4/13
to publice...@googlegroups.com
Muchas gracias Fernando.

Tiene pinta de funcionar, a ver si mañana lo puedo probar (hoy estoy reunido con un tal gripe, creo que se llama así y no me deja ni pensar ;-)

Saludos.

HernanCano

unread,
Nov 4, 2013, 7:43:06 PM11/4/13
to publice...@googlegroups.com
Hola.
Permiso chicos hablo un momento con Fernando, extratema.

Fernando: cuando mencionas
>>>...Los resultados con de tipo carácter....
me parece que debería ser "los resultados con de tipo caracter" (sin tilde en la segunda a, y acento --pronunciación-- sobre la e).

He visto que VFP en español está escrito así (carácter), pero la tilde no va.

¿Me aclaras?

HERNAN CANO M


Fer

unread,
Nov 5, 2013, 1:43:01 AM11/5/13
to publice...@googlegroups.com

Hola Hernán:

Realmente lleva ese acento, según la Real Academia Española. Www.rae.es
Otra cosa es que nosotros pronunciamos varias palabras de forma distinta.

Fidel Charny

unread,
Nov 5, 2013, 8:27:46 AM11/5/13
to publice...@googlegroups.com
Perdón Hernán y Fernando, me meto para hacerme el sabihondo. Del diccionario de la R.A.E.

La palabra caracter no está registrada en el Diccionario. La que se muestra a continuación tiene formas con una escritura cercana.

carácter.

(Del lat. character).

1. m. Señal o marca que se imprime, pinta o esculpe en algo.

2. m. Signo de escritura o de imprenta. U. m. en pl.

3. m. Estilo o forma de los signos de la escritura o de los tipos de la imprenta. Carácter redondo. Caracteres elzevirianos.

4. m. Señal o figura mágica.

5. m. Marca o hierro con que los animales de un rebaño se distinguen de los de otro.

6. m. Conjunto de cualidades o circunstancias propias de una cosa, de una persona o de una colectividad, que las distingue, por su modo de ser u obrar, de las demás. El carácter español. El carácter insufrible de Fulano.

7. m. Condición dada a alguien o a algo por la dignidad que sustenta o la función que desempeña. El carácter de juez, de padre. Medidas de carácter transitorio.

8. m. Señal espiritual que queda en una persona como efecto de un conocimiento o experiencia importantes, como, en la religión católica, la dejada por los sacramentos del bautismo, confirmación y orden. Imprimir, imponer carácter.

9. m. Fuerza y elevación de ánimo natural de alguien, firmeza, energía. Un hombre de carácter.

10. m. Modo de decir, o estilo.

~ adquirido.

1. m. Cada uno de los rasgos anatómicos o funcionales no heredados, sino adquiridos por el animal durante su vida.

~ heredado.

1. m. Cada uno de los rasgos funcionales o anatómicos que se transmiten de una generación a otra, en los animales y plantas.

~ sexual.

1. m. Cada uno de los rasgos anatómicos o funcionales que distinguen al organismo del macho y al de la hembra.

de medio ~.

1. loc. adj. coloq. Sin cualidades bien definidas, como la música de un género entre el grave y el cómico.

imprimir ~ un cargo, un empleo o un honor.

1. loc. verb. Dar o dotar de ciertas condiciones esenciales y permanentes a alguien o a algo.

Ricardo Pina

unread,
Nov 5, 2013, 8:44:46 AM11/5/13
to Grupo VFP
Despues de ber las vurradas cotidianas del grupo un tilde no es la gran cosa, yo también estaba convencido que eran dos palabras distintas caracter (letra) a carácter (cualidad), me he desasnado pero de ahí a que lo escriba bien es otro tema.

Saludos

--
            

                   Ricardo Pina

Desarrollo y Servicios Informáticos

                  Profesionales
               www.dsip.com.ar

 

 

Fer

unread,
Nov 5, 2013, 8:59:19 AM11/5/13
to publice...@googlegroups.com

Pues Fidel, por eso puse el link a la RAE, porque lleva acento :-)

Fer

unread,
Nov 5, 2013, 9:04:19 AM11/5/13
to publice...@googlegroups.com

Igualmente no se preocupen, que llevo desasnando a mí Android desde hace más de un año enseñándole Argentino
B-)

Fidel Charny

unread,
Nov 5, 2013, 9:42:34 AM11/5/13
to publice...@googlegroups.com
- Pues Fernando, qué mal cáráctér!!. Que yo sóláménté quéría figurar en el VronSe!! 
- Q... q...yy... q´adónde??

Miguel Ab

unread,
Nov 6, 2013, 3:14:34 AM11/6/13
to publice...@googlegroups.com
Hola.

Funcionó perfectamente.

Muchas gracias.
Saludos.

Fernando D. Bozzo

unread,
Nov 6, 2013, 5:53:02 AM11/6/13
to publice...@googlegroups.com
Genial :-)

HernanCano

unread,
Nov 6, 2013, 11:40:03 AM11/6/13
to publice...@googlegroups.com
Sí, Ricardo.
Estamos igual.

HernanCano

unread,
Nov 6, 2013, 11:42:17 AM11/6/13
to publice...@googlegroups.com
Miguel:
O sea que para saber si un campo Currency o Double (Numeric con decimales) está "blank" o se le "escribió" cero, entonces debo recurrir a generar un XML y verifiar si tiene un 0 o si tiene 0.00 . Interesante!!!

Considero que Rick nos ayudará más con ésto en VFrP. Hablaré con él.

Rick C. Hodgin

unread,
Nov 6, 2013, 1:15:51 PM11/6/13
to publice...@googlegroups.com
Visual FreePro introduces "dot functions" which attach themselves to table fields or memory variables.  They reference certain information about the contents.  See the end of this page:  http://www.visual-freepro.org/wiki/index.php/Variable_Types

Visual FreePro introduce "funciones de punto", que se unen a los campos de tabla o variables de memoria. Ellos hacen referencia a cierta información acerca de los contenidos. Consulte el final de esta página: http://www.visual-freepro.org/wiki/index.php/Variable_Types

Ejemplo:
LOCAL k
? k.isChanged()    && .F.
? k.isPopulated()  && .F.

k = 2
? k.isChanged()    && .T.
? k.isPopulated()  && .T.

k = 4
? k                && 4
? k.prior          && 2
? k == k.prior     && .F.

k = k.prior
? k                && 4
? k.prior          && 2

Saludos cordiales,
Rick C. Hodgin

Rick C. Hodgin

unread,
Nov 6, 2013, 1:19:24 PM11/6/13
to publice...@googlegroups.com
* " Referencias de puntos " adicionales pueden ser etiquetados en todas las variables (ver VXB + cambios +, memoria protegida para el uso ) :
? foo.isPopulated()    && Informa si la variable nunca ha tenido ningún valor explícito almacenado en ella
? foo.isFromField()    && Devuelve si la variable se ha modificado desde que fue inicialmente poblada de un campo de tabla
? foo.isReadonly()     && informes si la memoria ha sido marcado como de sólo lectura
? foo.isProtected()    && informa si la memoria se borra con el comando ALL CLEAR
? foo.isSecure ()      && Devuelve si esta memoria es seguro (es decir, que es permanentemente cifrada en la memoria)
? foo.secureHash()     && Devuelve el hash original utilizado para asegurar esta memoria
? foo.isChanged()      && Devuelve si la memoria ha cambiado desde la última vez que esta función se llama
? foo.isAccessed()     && Devuelve si se ha accedido a la memoria ya que la última vez que se llama a esta función
? foo.isNull()         && Devuelve si la memoria es nulo
? foo.sha1()           && Devuelve el SHA- 1 en uso de memoria segura
? foo.min()            && Devuelve el valor mínimo asignado para esta memoria
? foo.max()            && Devuelve el valor máximo asignado para esta memoria
? foo.default()        && Devuelve el valor por defecto asignado para esta memoria se utiliza con foo.init ()
? foo.underflow()      && Devuelve nombre del objeto / programa completo para el método / código para llamar a condición de agotamiento
? foo.overflow()       && Devuelve nombre del objeto / programa completo para el método / código para llamar a condición de desbordamiento
? foo.changed()        && Devuelve nombre del objeto / programa completo para el método / código para llamar cuando se cambia
? foo.accessed()       && Devuelve nombre del objeto / programa completo para el método / código para llamar cuando se accede
? foo.destroyed()      && Devuelve nombre del objeto / programa completo para el método / código para llamar cuando se destruye
? foo.size()           && Devuelve el tamaño del objeto en bytes
? foo.supplanted()     && Si LGLOBAL o LTGLOBAL , devuelve la variable que suplantó cuando llegó a existir
? foo.foreColor()      && Si se ha establecido una foreColor , se muestra                \
? foo.backColor()      && Si se ha establecido una backColor , se muestra                |
? foo.fontName()       && Si se ha establecido un nombre de fuente , se muestra          | --- alterará la exhibición en el depurador, y así como en las entradas de control estándar.
? foo.fontSize()       && Si se ha establecido un tamaño de fuente , se muestra          |
? foo.fontBold()       && Si se ha establecido un tipo de letra negrita , que se muestra /

Rick C. Hodgin

unread,
Nov 6, 2013, 1:31:15 PM11/6/13
to publice...@googlegroups.com
Visual FreePro also lets you attach functions to a variable.  These functions can be called whenever the memory variable is accessed, changed, or destroyed.  These help with debugging.  It lets you see exactly which lines of code referenced the variable, and you can find out, for example, exactly how it was used in a computation, or in a report, etc.

Visual FreePro también le permite conectar las funciones de una variable. Estas funciones pueden ser llamados cada vez que se accede a la variable de memoria, cambiar, o destruidos.  Esto ayuda con la depuración. Le permite ver exactamente qué líneas de código hace referencia a la variable, y se puede encontrar, por ejemplo, tal y como fue utilizada en los cálculos, o en un informe, etc.

Daniel Sánchez

unread,
Nov 6, 2013, 9:02:50 PM11/6/13
to Comunidad de Visual Foxpro en Español
Según veo estas usando el tipo de dato objeto para todos los tipos conocidos, tal como lo usa .net y java, el dato conteniendo todas sus funciones relacionadas con el tipo que le corresponde, muy interesante.

Saludos

Google Translate 

As I see you are using the object data type for all known types, as used. NET and Java, the data containing all functions related to the type that corresponds, very interesting.

regards

-- 
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047
Trujillo - Perú

HernanCano

unread,
Nov 6, 2013, 10:21:36 PM11/6/13
to publice...@googlegroups.com
Sí, Daniel.
Y lo más plausible es que no necesitas nada para usarlo cuando lo quieras usar: empiezas a usar VFrP, sigues usando VFrP y cuando decidas dar el salto, empiezas a usar estas nuevas funciones sin cambiar nada en tu código.

¿Cierto Rick?

Desde mi punto de vista sólo se necesita de nuestro apoyo para que Rick pueda avanzar.

¿Listo Daniel?

Miguel Ab

unread,
Nov 7, 2013, 3:06:51 AM11/7/13
to publice...@googlegroups.com
Para HernanCano.

El abrir un hilo para las críticas y loas a VFP creo que es algo MUY interesante. Tenía una contestación mucho más larga, pero pido perdón pues creo que no es el lugar.

Solo reiterar las gracias a Fernando por el ejemplo que me ha ayudado a resolver un problema que de otra forma hubiese sido mucho más complejo.

Saludos.

Rick C. Hodgin

unread,
Nov 7, 2013, 4:56:12 AM11/7/13
to publice...@googlegroups.com
On Wednesday, November 6, 2013 10:21:36 PM UTC-5, HernanCano wrote:
> Sí, Daniel.
> Y lo más plausible es que no necesitas nada para usarlo cuando lo quieras usar: empiezas a usar VFrP, sigues usando VFrP y cuando decidas dar el salto, empiezas a usar estas nuevas funciones sin cambiar nada en tu código.
>
> ¿Cierto Rick?

Si.

Saludos cordiales,
Rick C. Hodgin


Juan Alvaro Hernández Godínez

unread,
Jul 26, 2017, 1:52:52 PM7/26/17
to Comunidad de Visual Foxpro en Español
El miércoles, 30 de octubre de 2013, 6:23:36 (UTC-6), Miguel Ab escribió:
Hola.

Tengo un problemilla con un campo que se modifica en una tabla. El campo es de tipo numeric y permite 2 decimales. El caso es que cuando hago un select me muestra algo como esto:

SELECT nregistro, valor, ISBLANK(valor) AS _blank, ISNULL(valor) AS _null, EMPTY(valor) AS _empty
FROM ordentrab
WHERE valor=0.00

nregistro     valor     _blank     _null     _empty
a123          0.00      F          F         T
a124                    F          F         T


El caso es que los que tienen el valor a 0.00 en vez de vacio son los que me causan problemas porque se han modificado y hay que revisarlos, PERO no logro diferenciarlos registros que tienen el 0.00 y los que no tienen nada.

Y esa es la pregunta, ¿alguien conoce alguna forma de diferenciar estos resgistros (los que tienen 0.00 y los que no tienen nada)?

Muchas gracias.
Saludos.


Mi estimado Miguel Ab, no te la quiebres tanto, agrega un campo de tipo LOGICAL (boleano) a tu tabla y abriéndola desde el IDLE de VFP lo llenas con: 
REPLACE ALL nombre_campo_agregado WITH .T. FOR ISBLANK(valor)   -- si intentas hacerlo con el UPDATE de SQL no podrás porque no te reconoce el ISBLANK como lo sabes --

Después simplemente utilizas: 
SELECT nregistro, valor FROM ordentrab WHERE nombre_campo_agregado == .T. (esto te traerá sólo los campos que NO tienen 0.00 o le pones .F. en lugar de .T. y te traerá sólo los que SI tienen 0.00) 

Ojo los comandos y sintaxis empleada es de VFP y no de SQL estándar. A veces nos la queremos complicar de más al tratar de resolver problemas sencillos y no faltan gentes 
bien intencionadas que contribuyan a enredarnos aún más...
 

Juan Alvaro Hernández Godínez

unread,
Jul 26, 2017, 1:57:56 PM7/26/17
to Comunidad de Visual Foxpro en Español
sorry, dije ... te ttraerá sólo lo campos que ... y debe ser registros

Carlos Miguel FARIAS

unread,
Jul 26, 2017, 4:49:48 PM7/26/17
to Grupo Fox
Para que ISNULL te retorne verdadero o falso es fundamental que el campo de la tabla este definido para que admita nulos.
Tener en cuenta que VFP los campos de caracteres los rellena con blancos, por lo que no son nulos, "tienen" blancos.
Los campos numéricos no son blank, lo raro es que en el segundo registro no te muestra nada.
Saludos: Miguel, La Pampa (RA)
Larga Vida y Prosperidad
Que la Fuerza los acompañe
Reply all
Reply to author
Forward
0 new messages