Saltar al contenido

Problema con UPDATE registro vacío o nulo


Recommended Posts

Hola a todos de nuevo.

De nuevo con un problema con una consulta SQL desde Excel a Access. Pongo el código y explico.

'macro para grabar los datos en tabla Checklist
Fin = ListBox1.ListCount
For i = 0 To Fin - 1
xxx = ListBox1.List(i, 0)
Conexión
If IsNull(ListBox1.List(i, 9)) Then
Sql = "UPDATE Tb_Checklist SET Importe='" & ListBox1.List(i, 4) & "',Contable='" & ListBox1.List(i, 7) & _
"', Previsto='" & ListBox1.List(i, 6) & "', En_Curso='" & ListBox1.List(i, 8) & _
"' WHERE ID =" & xxx
Else
Sql = "UPDATE Tb_Checklist SET Importe='" & ListBox1.List(i, 4) & "',Contable='" & ListBox1.List(i, 7) & _
"', Previsto='" & ListBox1.List(i, 6) & "', En_Curso='" & ListBox1.List(i, 8) & _
"', ID_Contable='" & ListBox1.List(i, 9) & "' WHERE ID =" & xxx
End If

Tengo un listbox en un formulario, donde voy modificando datos. En algunos casos he de dejar un campo vacío, o nulo. Es el datos que hay en el ListBox1.List(i, 9).

Como me daba error he puesto un IF THEN que al final lo que hago es que si el valor de ListBox1.List(i, 9) es nulo no lo incluyo en el UPDATE.

Pero lo que pasa es que si quiero actualizar el registro cuando el valor es nulo en el listbox a la tabla Tb_Checklist en el registro ID_Contable.

No consigo hacerlo, y tampoco encuentro en Internet justo este problema.

Agradezco si podéis ayudarme.

Moisés.

 

Enlace a comentario
Compartir con otras webs

según se aprecia, los datos del listbox1 deben ser tratados como números (?), prueba de esta forma:

1) agrega dos variables a tu procedimiento (asumo que lo acostumbras)

  dim valorOnulo, num as string

2) llama a tu procedimiento de conexión donde te sea más conveniente (yo lo he omitido)

3) usa unas instrucciones +/- como las siguientes:

  with listbox1
    for i = 0 to .listcount - 1
      valorOnulo = .list(i, 9): num = "'" ' se asume que .list(i, 9) tiene dato (se considera el apóstrofo) '
      if valorOnulo = "" then valorOnulo = " null ": num = "" ' si .list(i, 9) no tiene dato, cambian las variables '
      sql = "update tb_checklist set importe='" & .list(i, 4) $ "',contable='" & .list(i, 7) & "',previsto ='" & _
        .list(i, 6) & "',en_curso='" & .list(i, 8) & "',id_contable=" & num & valorOnulo & num & " where id =" & .list(i, 0)
    next
  end with

saludos,
hector.

Enlace a comentario
Compartir con otras webs

@Héctor Miguel, muchas gracias por responder.

He probado y funciona SOLO si el campo no es nulo. En cuanto el campo está vacío me salta el error de "No coinciden los tipos"

Te copio la macro integra como la tengo.

Private Sub CommandButton4_Click()

Dim i, valorOnulo, num As String

'macro para grabar los datos en tabla Checklist
Conexión

    For i = 0 To ListBox1.ListCount - 1
      valorOnulo = ListBox1.List(i, 9): num = "'" ' se asume que .list(i, 9) tiene dato (se considera el apóstrofo) '
      If valorOnulo = "" Then valorOnulo = " null ": num = "" ' si .list(i, 9) no tiene dato, cambian las variables '
      Sql = "update Tb_Checklist set Importe='" & ListBox1.List(i, 4) & "',Contable='" & ListBox1.List(i, 7) & "',Previsto ='" & ListBox1.List(i, 6) & _
      "',En_Curso='" & ListBox1.List(i, 8) & "',ID_Contable=" & num & valorOnulo & num & " where ID =" & ListBox1.List(i, 0)
    
    Rst.Open Sql, Conn, 3, 3, 1
    Next
Conn.Close
ListBox1.ListIndex = -1

'macro para grabar el Saldo_Pendiente en tabla Contable
Conexión
Sql = "UPDATE Contable SET Saldo_Pendiente='" & TextBox12.Value & "' WHERE ID_Contable =" & TextBox5
'
Rst.Open Sql, Conn, 3, 3, 1
Conn.Close
Set Rst = Nothing: Set Conn = Nothing

'refrescamos el listbox1 desde este formulario
With UserForm3
it = .ListBox1.ListIndex
.ListBox1.ListIndex = -1
.ListBox1.ListIndex = it
End With
'
End Sub

Por cierto, con el With Listbox1, En With...., me daba error.

He probado primero quitándolo para ver que primero funcione la sentencia SQL y luego intentaré solucionar esto otro.

Si me puedes echar una mano con esto te lo agradezco.

Moisés.

Enlace a comentario
Compartir con otras webs

Hola de nuevo.

Para simplicar el código y siguiendo tu consejo he modificado por With, pero poniendo el "me" delante a ver si así evito el error que me daba antes.

With Me.ListBox1
    For i = 0 To .ListCount - 1
      valorOnulo = .List(i, 9): num = "'" ' se asume que .list(i, 9) tiene dato (se considera el apóstrofo) '
      If valorOnulo = "" Then valorOnulo = " null ": num = "" ' si .list(i, 9) no tiene dato, cambian las variables '
      Sql = "update Tb_Checklist set Importe='" & .List(i, 4) & "',Contable='" & .List(i, 7) & "',Previsto ='" & .List(i, 6) & _
      "',En_Curso='" & .List(i, 8) & "',ID_Contable=" & num & valorOnulo & num & " where ID =" & .List(i, 0)
    
    Rst.Open Sql, Conn, 3, 3, 1
    Next
End With

El error que me da sigue siendo el de "No coinciden los tipos", si el valor es nulo.

Moisés.

 

Enlace a comentario
Compartir con otras webs

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.