Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

contar campos vacios de un registro especifico

Estas en el tema de contar campos vacios de un registro especifico en el foro de Visual Basic clásico en Foros del Web. hola estoy muy contento con este foro por que siempre me saca las papas del fuego ejeje!! thx! a todos ! bueno a ora la ...
  #1 (permalink)  
Antiguo 06/07/2008, 16:01
 
Fecha de Ingreso: junio-2008
Mensajes: 4
Antigüedad: 15 años, 10 meses
Puntos: 0
contar campos vacios de un registro especifico

hola estoy muy contento con este foro por que siempre me saca las papas del fuego ejeje!! thx! a todos !
bueno a ora la consulta:
ne sitaria contar los campos que estan vacios de un registro en especifico
tambien que cuente los registros vacios del campo
la tabla esta echa en access y laberdad no tengo ni la minima idea como hacerlo

gracias des de ya
  #2 (permalink)  
Antiguo 06/07/2008, 17:01
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: contar campos vacios de un registro especifico

Hola!

El objeto Recordset tiene una propiedad que es Fields (campos), que es una colección en la que cada uno de sus elementos tiene a su vez la propiedad Value, entre otras, que es el contenido del campo dentro del registro actual.

Puedes obtener el número de campos que tiene la consulta mediante la propiedad <nombre del recordset>.Fields.Count, y luego el valor de cada campo mediante <nombre del recordset>.Fields(<indice>).Value.

¡Recuerda que un campo vacío es una cosa y que un valor nulo es otra! La distinción debes hacerla con la función IsNull, y es necesario hacerlo en dos comprobaciones distintas, más o menos así:

Código:
If IsNull(<nombre del recordset>.Fields(<indice>).Value) Then
    CuentaVacios = CuentaVacios + 1
ElseIf <nombre del recordset>.Fields(<indice>).Value="" Then
    CuentaVacios = CuentaVacios + 1
End If
Adelantándome a dudas , la razón de que lo siguiente no funcione:
Código:
If IsNull(<nombre del recordset>.Fields(<indice>).Value) Or <nombre del recordset>.Fields(<indice>).Value="" Then
    CuentaVacios = CuentaVacios + 1
End If
es que VB intenta evaluar todas las expresiones de un mismo If antes de decidir si se cumple por completo o no.

Por ejemplo, si das con un campo nulo, según este segundo ejemplo, la primera expresión ya sería cierta (la del IsNull), con lo que en teoría no haría falta evaluar la segunda. Sin embargo, VB sigue evaluando, y no se puede comparar un valor nulo con nada (una cadena vacía en este caso), ya que produce un error.
  #3 (permalink)  
Antiguo 06/07/2008, 17:23
 
Fecha de Ingreso: junio-2008
Mensajes: 4
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: contar campos vacios de un registro especifico

graxx lo intente de implementar pero a que te referis cunado pones (<indice>) el registro de donde enpiesa?
  #4 (permalink)  
Antiguo 06/07/2008, 18:53
 
Fecha de Ingreso: junio-2008
Mensajes: 4
Antigüedad: 15 años, 10 meses
Puntos: 0
Exclamación Respuesta: contar campos vacios de un registro especifico

sigo kon ese tema no encuentro solucion DDDD!!!!!!!!!
  #5 (permalink)  
Antiguo 07/07/2008, 01:16
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: contar campos vacios de un registro especifico

Cita:
Iniciado por dasslogan Ver Mensaje
sigo kon ese tema no encuentro solucion DDDD!!!!!!!!!
Puedes hacer una consulta de este tipo:

SELECT * FROM [LaTabla] WHERE IsNull(Nombre_del_Campo)

que te devolverá todos los registros nulos (vacíos) del campo "Nombre_del_Campo" y la propiedad RecordCount del recordset te devolverá el número de registros.

  #6 (permalink)  
Antiguo 07/07/2008, 01:56
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: contar campos vacios de un registro especifico

Donde pone "<indice>" debes poner el número del campo que quieras consultar, siendo 0 (cero) el primero.

Por ejemplo, a partir de la consulta "SELECT campo1, campo2, campo3 FROM tabla", el objeto Recordset te va a devolver:

<recordset>.Fields.Count = 3
<recordset>.Fields(0).Name = "campo1"
<recordset>.Fields(1).Name = "campo2"
<recordset>.Fields(2).Name = "campo3"

Si la tabla "tabla" contiene dos registros, con los valores "valor 1.1", "valor 1.2" y "valor 1.3" para el primer registro, y "valor 2.1", "valor 2.2" y "valor 2.3" para el segundo, nada más abrir el recordset, además, tendrás estos valores:

<recordset>.Fields(0).Value = "valor 1.1"
<recordset>.Fields(1).Value = "valor 1.2"
<recordset>.Fields(2).Value = "valor 1.3"

Si después de ver esto, hicieras un <recordset>.MoveNext, lo que verías en total, es esto:

<recordset>.Fields.Count = 3
<recordset>.Fields(0).Name = "campo1"
<recordset>.Fields(1).Name = "campo2"
<recordset>.Fields(2).Name = "campo3"
<recordset>.Fields(0).Value = "valor 2.1"
<recordset>.Fields(1).Value = "valor 2.2"
<recordset>.Fields(2).Value = "valor 2.3"

Observa que la propiedad Count siempre vale lo mismo y que las propiedades Name también, ya que son datos relativos a la definición de la consulta, no a su resultado (la instrucción SELECT es la misma mientras no la cambies explícitamente). Sin embargo, las propiedades Value sí cambian, porque contienen el valor del registro actual.

De todas formas, coméntanos si lo que quieres hacer es esto, o bien lo que dice Avellaneda, porque son cosas distintas. Por ejemplo, para una tabla que contuviera una única línea con los siguientes datos:

Campo1 = "hola"
Campo2 = null
Campo3 = null
Campo4 = null
Campo5 = "adios"

lo que yo te estoy proponiendo, te devolvería "3", mientras que según lo propone Avellaneda, (por ejemplo: "SELECT * FROM [LaTabla] WHERE IsNull(Campo2)") te devolvería "1".
  #7 (permalink)  
Antiguo 07/07/2008, 02:32
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: contar campos vacios de un registro especifico

Cita:
Iniciado por Txoco Ver Mensaje
De todas formas, coméntanos si lo que quieres hacer es esto, o bien lo que dice Avellaneda, porque son cosas distintas. Por ejemplo, para una tabla que contuviera una única línea con los siguientes datos:

Campo1 = "hola"
Campo2 = null
Campo3 = null
Campo4 = null
Campo5 = "adios"

lo que yo te estoy proponiendo, te devolvería "3", mientras que según lo propone Avellaneda, (por ejemplo: "SELECT * FROM [LaTabla] WHERE IsNull(Campo2)") te devolvería "1".
Hola Txoco, eso tendría fácil solucción:

SELECT * FROM [LaTabla] WHERE IsNull(Campo2) Or IsNull(Campo3) Or IsNull(Campo4)....

  #8 (permalink)  
Antiguo 07/07/2008, 03:50
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: contar campos vacios de un registro especifico

Cita:
Iniciado por Avellaneda Ver Mensaje
Hola Txoco, eso tendría fácil solucción:

SELECT * FROM [LaTabla] WHERE IsNull(Campo2) Or IsNull(Campo3) Or IsNull(Campo4)....

El SQL sólo te devuelve la cuenta de registros, no la cuenta de campos en el registro, por lo que incluso en ese caso sigue devolviendo 1 (una única fila), la otra rutina que he puesto es para devolver el número de campos nulos en cada fila.

Por ejemplo, si tenemos las filas:

1 - "hola", null, null, "adios"
2 - "hola 2", null, "bien", "adios"
3 - null, null, null, null
4 - null, null, "miau", "otra"

mediante SQL, sólo podríamos obtener el valor "4" (4 filas que contienen el valor null en algún campo), mientras que de la otra forma, obtendríamos respectivamente los valores "2", "1", "4" y "2", respectivamente, dependiendo de adónde apunte el cursor del recordset.

Aprovecho para saludarte y felicitarte por tus colaboraciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:28.