Reemplazar todos los valores NULL de las columnas numericas por 0

362 views
Skip to first unread message

integral

unread,
Feb 6, 2023, 8:35:22 PM2/6/23
to Comunidad de Visual Foxpro en Español
Que tal Amigos :

Quiero reemplazar todos los valores NULL de un Cursor que aparecen en las columnas de tipo numerico.

Aqui lo avanzado...

 SELECT Cur_Total_Stock

     _totCols = FCount()                                               && Contar el total de columnas
     ** Aqui empiezo a contar desde la columna 1 y verifico si es tipo numerica
     FOR _nCol = 1 To _totCols
        _columna = field( _nCol )                                      &&  sacamos el nombre de la columna para el replace
        IF Type( Field( _nCol) ) = "N" .OR. ISNULL(_nCol)              &&  Si el Tipo de Dato de ese numero de campo es numerico
           Replace All &_columna with 0                                &&  se usa la macrosustitucion "&" para extraer el nombre del campo actual
        ENDIF
     NEXT
   
Agradezco sus comentarios y sugerencias.

PD : Ver imagen adjunta...

Saludos.

Integral
(Lima-Perú)
CURSOR_VALORES_NULL.jpg

Cristian Novoa

unread,
Feb 6, 2023, 9:31:25 PM2/6/23
to Comunidad de Visual Foxpro en Español
se ve bien el código, pero creo que el .OR. debe ser .AND.

integral

unread,
Feb 6, 2023, 10:55:11 PM2/6/23
to Comunidad de Visual Foxpro en Español
Que tal Amigo :
Te comento :

Si utilizo .OR. todas las columnas numericas les pone el valor de 0 
  IF Type( Field( _nCol) ) = "N" .OR. ISNULL(_nCol)        

Si utilizo .AND. no reemplaza los NULL por 0
  IF Type( Field( _nCol) ) = "N" .AND. ISNULL(_nCol)     

La idea es  solamente reemplazar todos los NULL por 0

Agradezco vuestra ayuda

Atte.,

Integral
CURSOR_VALORES_AND_NULL.jpg
CURSOR_VALORES_OR_0.jpg

ZeRoberto

unread,
Feb 6, 2023, 11:07:24 PM2/6/23
to publice...@googlegroups.com
Prueba con esto

Replace All Total With Nvl(Total, 0) 

Saludos

Ze






--
Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/ec5fe735-a134-4353-b429-334c87a5d587n%40googlegroups.com.

integral

unread,
Feb 6, 2023, 11:24:20 PM2/6/23
to Comunidad de Visual Foxpro en Español
Que tal Amigo ZeRoberto

No funciono con el NVL como lo espones en tu ejemplo.

Estuve buscando informacion y pude ver como el siguiente ejemplo...

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

atte.,

HernanCano

unread,
Feb 6, 2023, 11:28:23 PM2/6/23
to Comunidad de Visual Foxpro en Español
Uy !!! que bien !!!

HernanCano

unread,
Feb 6, 2023, 11:28:54 PM2/6/23
to Comunidad de Visual Foxpro en Español
Colega integral:
Estás bien encaminado.

Sin embargo lo sgte en el IF:

if ...... .OR. ISNULL(_nCol)

sólo funciona si el primer registro (o el registro donde esté ubicado cuando ejecutas) es nulo.

El IF debieras hacerlo así:

SELECT Cur_Total_Stock

local arrCampos(1)
_totCols = afields(arrCampos)            && Contar el total de columnas

** Aqui empiezo a contar desde la columna 1 y verifico si es tipo numerica
FOR _nCol = 1 To _totCols
   _columna = arrCampos( _nCol,1 )       &&  sacamos el nombre de la columna para el replace
   IF Type( arrCampos( _nCol,1 ) ) = "N" .and. arrCampos(_nCol,5)  &&  Si el Tipo de Dato de ese numero de campo es numerico y acepta nulos
    **Replace All &_columna with 0       &&  se usa la macrosustitucion "&" para extraer el nombre del campo actual
      local M.cCmd
      M.cCmd = " replace all "+_columna+" with 0 for isnull("+_columna+") "
      &cCmd
   ENDIF
NEXT


Pero también pudieras hacer

local arrCampos(1)
_totCols = afields(arrCampos)          && Contar el total de columnas

** Aqui empiezo a contar desde la columna 1 y verifico si es tipo numerica
FOR _nCol = 1 To _totCols
   _columna = arrCampos( _nCol,1 )     &&  sacamos el nombre de la columna para el replace
   local M.cCmd
   M.cCmd = " blank all fields " + _columna + " for isnull("+_columna+") nooptimize"
   &cCmd
NEXT



jmn...@gmail.com

unread,
Feb 7, 2023, 12:53:14 AM2/7/23
to publice...@googlegroups.com

Prueba con este Código

 

 

 

SELECT Cur_Total_Stock

 

local ListaCampos(1)

ntotCols = afields(ListaCampos)

For nCol = 1 To ntotCols

   cNombreCol = ListaCampos(nCol,1)

   If Type(cNombreCol) = "N"

      Replace ALL &cNombreCol WITH NVL(&cNombreCol,0)

   EndIf

EndFor

 

 

 

Saludos cordiales,

 

Manuel Navarro

--

Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.

HernanCano

unread,
Feb 7, 2023, 9:00:15 AM2/7/23
to Comunidad de Visual Foxpro en Español
Un ajuste a mi primera propuesta:
pero sinceramente me gusta más la segunda.

SELECT Cur_Total_Stock

local arrCampos(1)
_totCols = afields(arrCampos)            && Contar el total de columnas

** Aqui empiezo a contar desde la columna 1 y verifico si es tipo numerica
FOR _nCol = 1 To _totCols
   _columna = arrCampos( _nCol,1 )       &&  sacamos el nombre de la columna para el replace
 **IF Type( arrCampos( _nCol,1 ) ) = "N" .and. arrCampos(_nCol,5)  
   IF Type( arrCampos( _nCol,1 ) ) $ "NIBYF" .and. arrCampos(_nCol,5)  

    **Replace All &_columna with 0       &&  se usa la macrosustitucion "&" para extraer el nombre del campo actual
      local M.cCmd
      M.cCmd = " replace all "+_columna+" with 0 for isnull("+_columna+") "
      &cCmd
   ENDIF
NEXT

Y también un ajuste a mi segunda propuesta:

SELECT Cur_Total_Stock
local arrCampos(1)
_totCols = afields(arrCampos)          && Contar el total de columnas

** Aqui empiezo a contar desde la columna 1
FOR _nCol = 1 To _totCols
   _columna = arrCampos( _nCol,1 )     && sacamos el nombre de la columna para el blank
   IF arrCampos(_nCol,5)               && sólo si acepta nulos se ejecuta el blank  

      local M.cCmd
      M.cCmd = " blank all fields " + _columna + " for isnull("+_columna+") nooptimize"
      &cCmd
   endif
NEXT

Zarlu

unread,
Feb 7, 2023, 10:08:44 AM2/7/23
to Comunidad de Visual Foxpro en Español
Buenos días Integral!

Mencionas que la información está en un cursor. Asumiré que proviene de una consulta Select SQL...
Quizá puedas sustituir eso valores nulos desde la consulta.

Algo así:
Select recep.nombre, recep.expediente,IIF(ISNULL(recep.status),"",recep.status) As Estado FROM recep....

Suerte
zarlu
Chetumal, Quintana Roo, México

integral

unread,
Feb 7, 2023, 10:16:11 PM2/7/23
to Comunidad de Visual Foxpro en Español
Gracias a todos por sus aportes y sugerencias.

Pude resolver mi consulta.

Hice la prueba con todos los códigos expuestos. Solo tres de los códigos funcionaron según lo esperado.

Aquí los Códigos :

SELECT Cur_Total_Stock                                                        && Funciona Correctamente. Reemplaza las columnas numericas  .Null. x 0
LOCAL ListaCampos(1)
ntotCols = Afields(ListaCampos)
FOR nCol = 1 To ntotCols
   cNombreCol = ListaCampos(nCol,1)
   IF Type(cNombreCol) = "N"

      Replace ALL &cNombreCol WITH NVL(&cNombreCol,0)
   EndIf
ENDFOR

* ******** *

SELECT Cur_Total_Stock
local arrCampos(1)                                                                  && Funciona, reemplaza las columnas numericas  Null x 0
_totCols = afields(arrCampos)                                               && Contar el total de columnas

** Aqui empiezo a contar desde la columna 1 y verifico si es tipo numerica
FOR _nCol = 1 To _totCols
   _columna = arrCampos( _nCol,1 )                                       && sacamos el nombre de la columna para el replace
   IF Type( arrCampos( _nCol,1 ) ) = "N" .and. arrCampos(_nCol,5)        && Si el Tipo de Dato de ese numero de campo es numerico y acepta nulos
    **Replace All &_columna with 0                                         && se usa la macrosustitucion "&" para extraer el nombre del campo actual
      LOCAL m.cCmd
      m.cCmd = " replace all "+_columna+" with 0 for isnull("+_columna+") "
      &cCmd
   ENDIF
NEXT

* ********** *

SELECT Cur_Total_Stock                                                        && Funciona Correctamente. Reemplaza las columnas numericas .Null. x 0
local arrCampos(1)
_totCols = afields(arrCampos)                                              && Contar el total de columnas
** Aqui empiezo a contar desde la columna 1 y verifico si es tipo numerica
FOR _nCol = 1 To _totCols
   _columna = arrCampos( _nCol,1 )                                     &&  sacamos el nombre de la columna para el replace
 **IF Type( arrCampos( _nCol,1 ) ) = "N" .and. arrCampos(_nCol,5)  
   IF Type( arrCampos( _nCol,1 ) ) $ "NIBYF" .and. arrCampos(_nCol,5)  
    **Replace All &_columna with 0                                       &&  se usa la macrosustitucion "&" para extraer el nombre del campo actual
      local M.cCmd
      M.cCmd = " replace all "+_columna+" with 0 for isnull("+_columna+") "
      &cCmd
   ENDIF
NEXT

Buscando ademas información sobre el tema halle una instrucción de VFP que realiza casi la misma función, solo que requiere que cada control ComboBox numérico se alinie 
a la derecha.

SET NULLDISPLAY TO "0"                            
  
Mil Gracias...

Saludos,

Integral

integral

unread,
Feb 8, 2023, 9:44:16 AM2/8/23
to Comunidad de Visual Foxpro en Español
Que tal Amigos :

Muy Buenos Días

Les escribo solo para informarles que en mi ultima respuesta...

Donde Dice :

Solo que requiere que cada control ComboBox numérico...

Debe Decir :

Solo que requiere que cada control TextBox numérico

Hecha la aclaración

Hasta pronto.

Saludos,

Integral
(Lima-Perú)

HernanCano

unread,
Feb 16, 2023, 10:48:10 PM2/16/23
to Comunidad de Visual Foxpro en Español
No funcionó el BLANK.......

Y saberlo a treinta años de programar en Fox.............



El martes, 7 de febrero de 2023 a la(s) 09:00:15 UTC-5, HernanCano escribió:
Reply all
Reply to author
Forward
0 new messages