Jump to content
Pirtrafilla

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.

 

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

@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.

Share this post


Link to post
Share on other sites

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.

 

Share this post


Link to post
Share on other sites



×
×
  • Create New...

Important Information

Privacy Policy


CTA Templates.png