Porque accces me pone registros en chino

Tengo un formulario que usa un botón de guardar compra pero los registro que ya están anteriormente se va poniendo en chino cada campo

El código que utilizo es este

Private Sub btnGuardarCompra_Click()
On Error GoTo Err_Handler

Dim IDCompra As Long
Dim Descripcion As String
Dim FechaCompra As Date
Dim TotalNeto As Currency
Dim CuentaGasto As String, CuentaPago As String
Dim IDCuentaGasto As Long, IDCuentaPago As Long
Dim FormaPago As String, Observaciones As String
Dim aplicarPago As Boolean
Dim cuentaProveedor As String, IDCuentaProveedor As Long, NombreProveedor As String
Dim esSinProveedor As Boolean

' === VALIDACIONES ===
If Me.Procesado = False Then
MsgBox "Debe marcar la compra como procesada.", vbExclamation
Exit Sub
End If

If Nz(DLookup("[Imp]", "Compras", "ID_Compra = " & Me.ID_Compra), 0) = 1 Then
MsgBox "Esta compra ya fue procesada anteriormente.", vbExclamation
Exit Sub
End If

If Nz(Me.TotalNeto, 0) = 0 Then
MsgBox "Debe ingresar el monto total de la compra.", vbExclamation
Exit Sub
End If

' === DATOS ===
IDCompra = Me.ID_Compra
FechaCompra = Me.Fecha
TotalNeto = Nz(Me.TotalNeto, 0)
CuentaGasto = LimpiarTextoSQL(Nz(Me.CuentaCont, ""))
CuentaPago = LimpiarTextoSQL(Nz(Me.CuentaPago, ""))
FormaPago = LimpiarTextoSQL(Nz(Me.FormaPago, ""))
Observaciones = LimpiarTextoSQL(Nz(Me.Observaciones, ""))
aplicarPago = Me.chkAplicarPago
esSinProveedor = (Nz(Me.CodigoProv, "") = "" Or Me.CodigoProv = "80000" Or Me.CodigoProv = "80001")

' === VALIDAR COMBOS ===
If CuentaGasto = "" Or InStr(CuentaGasto, "?") > 0 Then
MsgBox "Debe seleccionar una cuenta contable válida.", vbExclamation
Exit Sub
End If

If esSinProveedor And (CuentaPago = "" Or InStr(CuentaPago, "?") > 0) Then
MsgBox "Debe seleccionar una cuenta de pago válida para compras sin proveedor.", vbExclamation
Exit Sub
End If

IDCuentaGasto = Nz(DLookup("ID_Cuenta", "CuentasContables", "CodigoCuenta = '" & CuentaGasto & "'"), 0)
If CuentaPago <> "" Then
IDCuentaPago = Nz(DLookup("ID_Cuenta", "CuentasContables", "CodigoCuenta = '" & CuentaPago & "'"), 0)
End If

If Not IsNull(Me.ID_Proveedor) Then
cuentaProveedor = LimpiarTextoSQL("2-" & Me.CodigoProv)
NombreProveedor = LimpiarTextoSQL(Nz(Me.NombreProv, ""))
IDCuentaProveedor = Nz(DLookup("ID_Cuenta", "CuentasContables", "CodigoCuenta = '" & cuentaProveedor & "'"), 0)
End If

' === DESCRIPCIÓN ===
Descripcion = "COMPRA/SERVICIO FACT-" & Nz(Me.NumeroFactura, "S/N")
If esSinProveedor Then
Descripcion = Descripcion & " - " & Observaciones
Else
Descripcion = Descripcion & " PROVEEDOR - " & NombreProveedor
End If
Descripcion = LimpiarTextoSQL(Descripcion)

' === ASIENTO ENCABEZADO ===
CurrentDb.Execute "INSERT INTO Asientos (Fecha, TipoAsiento, ID_Documento, Descripcion) VALUES (" & _
"#" & Format(FechaCompra, "yyyy-mm-dd") & "#, 'COMPRA', " & IDCompra & ", '" & Descripcion & "')"
Dim IDAsiento As Long
IDAsiento = DMax("ID_Asiento", "Asientos")

' === DEBE: GASTO ===
CurrentDb.Execute "INSERT INTO DetalleAsiento (ID_Asiento, ID_Cuenta, Cuenta, Debe, Haber, Descripcion, NombreCuenta) VALUES (" & _
IDAsiento & ", " & IDCuentaGasto & ", '" & CuentaGasto & "', " & TotalNeto & ", 0, '" & Descripcion & "', '" & _
LimpiarTextoSQL(Nz(DLookup("NombreCuenta", "CuentasContables", "CodigoCuenta = '" & CuentaGasto & "'"), "")) & "')"

' === ESCENARIOS ===
If esSinProveedor Then
CurrentDb.Execute "INSERT INTO DetalleAsiento (ID_Asiento, ID_Cuenta, Cuenta, Debe, Haber, Descripcion, NombreCuenta) VALUES (" & _
IDAsiento & ", " & IDCuentaPago & ", '" & CuentaPago & "', 0, " & TotalNeto & ", '" & Descripcion & "', '" & _
LimpiarTextoSQL(Nz(DLookup("NombreCuenta", "CuentasContables", "CodigoCuenta = '" & CuentaPago & "'"), "")) & "')"
ElseIf aplicarPago Then
CurrentDb.Execute "INSERT INTO DetalleAsiento (ID_Asiento, ID_Cuenta, Cuenta, Debe, Haber, Descripcion, NombreCuenta) VALUES (" & _
IDAsiento & ", " & IDCuentaProveedor & ", '" & cuentaProveedor & "', 0, " & TotalNeto & ", '" & Descripcion & "', '" & NombreProveedor & "')"
CurrentDb.Execute "INSERT INTO DetalleAsiento (ID_Asiento, ID_Cuenta, Cuenta, Debe, Haber, Descripcion, NombreCuenta) VALUES (" & _
IDAsiento & ", " & IDCuentaProveedor & ", '" & cuentaProveedor & "', " & TotalNeto & ", 0, '" & Descripcion & "', '" & NombreProveedor & "')"
CurrentDb.Execute "INSERT INTO DetalleAsiento (ID_Asiento, ID_Cuenta, Cuenta, Debe, Haber, Descripcion, NombreCuenta) VALUES (" & _
IDAsiento & ", " & IDCuentaPago & ", '" & CuentaPago & "', 0, " & TotalNeto & ", '" & Descripcion & "', '" & _
LimpiarTextoSQL(Nz(DLookup("NombreCuenta", "CuentasContables", "CodigoCuenta = '" & CuentaPago & "'"), "")) & "')"
Else
CurrentDb.Execute "INSERT INTO DetalleAsiento (ID_Asiento, ID_Cuenta, Cuenta, Debe, Haber, Descripcion, NombreCuenta) VALUES (" & _
IDAsiento & ", " & IDCuentaProveedor & ", '" & cuentaProveedor & "', 0, " & TotalNeto & ", '" & Descripcion & "', '" & NombreProveedor & "')"
End If

' === REGISTRAR PAGO SI SE APLICA ===
If aplicarPago And Not esSinProveedor Then
CurrentDb.Execute "INSERT INTO PagosCXP (ID_Compra, FechaPago, MontoPagado, FormaPago, Observaciones, CuentaPago, tipo, DesdeCompras) VALUES (" & _
IDCompra & ", #" & Format(FechaCompra, "yyyy-mm-dd") & "#, " & TotalNeto & ", '" & FormaPago & "', '" & Observaciones & "', '" & CuentaPago & "', 'AUTOMATICO', True)"
ElseIf Not aplicarPago And Me.Condicion = "CONTADO" Then
Me.Condicion = "CREDITO"
CurrentDb.Execute "UPDATE Compras SET Condicion = 'CREDITO' WHERE ID_Compra = " & IDCompra
End If

CurrentDb.Execute "UPDATE Compras SET [Imp] = 1 WHERE ID_Compra = " & IDCompra

MsgBox "Compra guardada correctamente.", vbInformation
Me.Requery
Exit Sub

Err_Handler:
MsgBox "Error al guardar la compra: " & Err.Description, vbCritical
End Sub

2 Respuestas

Respuesta

Los registros anteriores ¿se dañan o solo se muestran 'raros'?
Considero importante una copia de seguridad para no arrepentirse mas tarde.

Algunas notas:
Se utilizan muchas variables, una mas no será un problema.
Se utilizaría para guardar en ella el resultado de la función 'LimpiarTextoSQL' de forma previa a la ejecución de la SQL de inserción en lugar de ejecutarla 'dentro' de ella.
(No creo que sea el problema, pero la SQL será menos intrusiva).

La fecha se guarda como un número, utilizar las funciones de conversión (CDate + Cdbl) lograrían una adaptación a cualquier localismo (utilizar el formato japonés solo garantiza no intercambiar día y mes).

Hay cuadros de texto del formulario que cambian de valor por asignación directa, si no se guarda el registro antes de ejecutar 'Requery' se pueden perder valores.

Al final se ejecutan dos SQLs de actualización sobre la misma tabla y con la misma condición, se pueden actualizar los dos valores en la misma SQL.

Respuesta

Es posible que su base de datos esta corrupta, haga una copia cuanto antes de respaldo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas