Access - ayuda con error de compilacion Loop sin Do

 
Vista:
sin imagen de perfil

ayuda con error de compilacion Loop sin Do

Publicado por Miguel (4 intervenciones) el 29/01/2024 05:14:13
Estimados, necesito ayuda en esta sub de access que hace 2 dias no encuentro el error que me da de compilacion Loop sin Do. He revisado que todos los If esten cerrados y no encuentro causa. agracezco su ayuda

Option Compare Database
Dim loteActualizarQuery As DAO.Recordset
Dim cuotaRetroactivo As DAO.Recordset
Dim refQuery As DAO.Recordset
Dim cuotaAplicacion As DAO.Recordset

Dim cuotascount As Integer
Dim valorCuotaReferencia As Variant
Dim totalCuotaReferencia As Variant
Dim nuevoTotal As Variant
Dim nuevoNeto As Variant
Dim tomoPrimerValorReferencia As Boolean
Dim numeroLote As Integer
Dim mensaje As String

' Variable para almacenar el mes y año de referencia
Dim mesReferenciaEncontrado As Boolean
' Variable para controlar si se mostró el mensaje de información
Dim mostradoMensaje As Boolean
' Obtener el mes y año del retroactivo desde la TextBox
Dim mesRetroactivo As Integer
Dim añoRetroactivo As Integer
Dim porcentajeRetroactivo As Double
Dim fechaRetroactivo As Date
Dim mesMasNuevo As Date


Private Sub btnActualizacionConRetroactivo_Click()
Dim db As DAO.Database
' Intenta convertir el valor del control a una fecha
If IsDate(txtmes_retroactivo.Value) Then
fechaRetroactivo = CDate(txtmes_retroactivo.Value)
' Extrae el mes y el año de la fecha
mesRetroactivo = Month(fechaRetroactivo)
añoRetroactivo = Year(fechaRetroactivo)
Else
mesRetroactivo = 0
añoRetroactivo = 0
End If

' Obtener el porcentaje del mes retroactivo desde la TextBox
txtPorcentajeRetroactivo.SetFocus
If Trim(txtPorcentajeRetroactivo.Text) <> "" Then
porcentajeRetroactivo = CDbl(Trim(txtPorcentajeRetroactivo.Text))
Else
porcentajeRetroactivo = 0
End If

' Verificar que las cajas de texto tengan datos
ind_incremento.SetFocus
If Trim(ind_incremento.Text) = "" Then
MsgBox "INDICE A INCREMENTAR está vacío"
Exit Sub
End If
txtmesyaño_aplicacion.SetFocus
If Trim(txtmesyaño_aplicacion.Text) = "" Then
MsgBox "MES DE APLICACIÓN está vacío"
Exit Sub
End If
txtmesyaño_referencia.SetFocus
If Trim(txtmesyaño_referencia.Text) = "" Then
MsgBox "MES DE REFERENCIA está vacío"
Exit Sub
End If

' Verificar que la fecha de referencia sea anterior a la fecha de aplicación
If CDate(Me.txtmesyaño_referencia.Value) >= CDate(Me.txtmesyaño_aplicacion.Value) Then
MsgBox "La fecha de referencia debe ser anterior a la fecha de aplicación."
Exit Sub
End If

' Preguntar al usuario si confirma Actualizar o SALE
Dim confirma As VbMsgBoxResult
Dim mensajeConfirmacion As String
mensajeConfirmacion = "ESTA OPERACION NO PODRA DESHACERSE" & vbCrLf & _
"" & vbCrLf & _
"ESTA SEGURO DE ACTUALIZAR" & vbCrLf

confirma = MsgBox(mensajeConfirmacion, vbYesNo + vbExclamation, "Confirmacion")
If confirma = vbNo Then
DoCmd.Close acForm, "Actualizacion"
DoCmd.OpenForm "VentanaOpciones"
Exit Sub ' Salir de la subrutina
End If

' Preguntar al usuario si desea ver las actualizaciones una a una
Dim verUnaAAUna As VbMsgBoxResult
verUnaAAUna = MsgBox("¿DESEA VER LOS VALORES DE CADA ACTUALIZACION UNO A UNO?", vbYesNo + vbQuestion, "Mostrar Actualizaciones")

' Realizar la consulta para obtener los registros que cumplen con las condiciones
Set loteActualizarQuery = db.OpenRecordset("SELECT * FROM Cuotas ORDER BY num_lote ASC, num_cuo ASC")

' Recorrer los registros y aplicar las modificaciones necesarias
Do While Not loteActualizarQuery.EOF
' Puntero del mouse Reloj de arena
DoCmd.Hourglass True

' Obtener los valores total_cuota y valor_cuota del mes retroactivo
Set cuotaRetroactivo = db.OpenRecordset("SELECT total_cuota, valor_cuota FROM Cuotas WHERE num_lote = " & loteActualizarQuery!num_lote & " AND Format(fe_pago, 'mm/yyyy') = '" & Format(CDate(txtmes_retroactivo.Value), "mm/yyyy") & "'")

If Not cuotaRetroactivo.EOF Then
totalCuotaRetroactivo = cuotaRetroactivo!total_cuota
valorCuotaRetroactivo = cuotaRetroactivo!valor_cuota
Else
totalCuotaRetroactivo = 0
valorCuotaRetroactivo = 0
End If

' Cerrar el recordset de cuotaRetroactivo
cuotaRetroactivo.Close
Set cuotaRetroactivo = Nothing

' Verificar si es el primer registro del lote y tomar los valores de referencia
If (numeroLote <> loteActualizarQuery!num_lote) Then
tomoPrimerValorReferencia = False
mostradoMensaje = False
End If

' Obtener los valores de referencia si es el primer registro del lote
If (tomoPrimerValorReferencia = False) Then
' Verificar si existe un registro en el mes y año de referencia y si es cuota 1 o mayor
Set refQuery = db.OpenRecordset("SELECT * FROM Cuotas WHERE num_lote = " & loteActualizarQuery!num_lote & " AND Format(fe_venci, 'mm/yyyy') = '" & Format(CDate(txtmesyaño_referencia.Value), "mm/yyyy") & "'")

' Si encuentra cuota = 1 o mayor
If Not refQuery.EOF Then
' Tomar los valores de referencia del registro con num_cuo = 1 o mayor
valorCuotaReferencia = refQuery!valor_cuota
totalCuotaReferencia = refQuery!total_cuota
tomoPrimerValorReferencia = True
mesReferenciaEncontrado = True
Else
' Si no se encuentra un registro con num_cuo = 1 o mayor, buscar los registros posteriores al mes y año de referencia
Set refQuery = db.OpenRecordset("SELECT TOP 1 * FROM Cuotas WHERE num_lote = " & loteActualizarQuery!num_lote & " AND fe_venci > #" & Format(CDate(txtmesyaño_referencia.Value), "Short Date") & "# ORDER BY fe_venci ASC")

If Not refQuery.EOF Then
' Tomar los valores de referencia del primer registro posterior al mes y año de referencia
valorCuotaReferencia = refQuery!valor_cuota
totalCuotaReferencia = refQuery!total_cuota
tomoPrimerValorReferencia = True
mesReferenciaEncontrado = True
End If
End If
End If

' Aplicar las modificaciones solo si la fecha de vencimiento es posterior a la fecha de aplicación y fe_pago está vacío
If IsNull(loteActualizarQuery!fe_pago) And CDate(loteActualizarQuery!fe_venci) > CDate(txtmesyaño_aplicacion.Value) And CDate(loteActualizarQuery!fe_venci) > CDate(txtmesyaño_referencia.Value) Then
' Buscar el registro correspondiente al mes de aplicación
Set cuotaAplicacion = db.OpenRecordset("SELECT * FROM Cuotas WHERE num_lote = " & loteActualizarQuery!num_lote & " AND Format(fe_venci, 'mm/yyyy') = '" & Format(CDate(txtmesyaño_aplicacion.Value), "mm/yyyy") & "'")

If mesReferenciaEncontrado And Not mostradoMensaje Then
' Verificar si se muestra el mensaje de información
If verUnaAAUna = vbYes And cuotaAplicacion!num_cuo > 1 Then
mensaje = "Número de Lote: " & loteActualizarQuery!num_lote & vbCrLf & _
"Se encontró el mes de referencia" & vbCrLf & _
"Voy a modificar con los siguientes parámetros:" & vbCrLf & _
"Fecha de Referencia: " & txtmesyaño_referencia.Value & vbCrLf & _
"Número de cuota de referencia: " & refQuery!num_cuo & vbCrLf & _
"Número de cuota de Aplicación: " & loteActualizarQuery!num_cuo & vbCrLf & _
"Valor de Cuota de Referencia: " & totalCuotaReferencia & vbCrLf & _
"Valor de Cuota del Mes de Aplicación (antes de modificar): " & loteActualizarQuery!total_cuota & vbCrLf & _
"Incremento a aplicar: " & totalCuotaReferencia * ind_incremento / 100 & vbCrLf & _
"Porcentaje Retroactivo: " & porcentajeRetroactivo & vbCrLf & _
"Fecha Retroactivo: " & txtmes_retroactivo.Value & vbCrLf & _
"Valor de Cuota al mes Retroactivo: " & totalCuotaRetroactivo & vbCrLf & _
"Nuevo Valor Neto (a partir del Mes de Aplicación): " & nuevoNeto & vbCrLf & _
"Retroactivo $ = " & (totalCuotaRetroactivo * porcentajeRetroactivo / 100) & vbCrLf & _
"Nuevo Valor de Cuota (a partir del Mes de Aplicación): " & (loteActualizarQuery!total_cuota + (totalCuotaRetroactivo * porcentajeRetroactivo / 100))

MsgBox mensaje, vbInformation, "Información de Modificación"
mostradoMensaje = True
End If

If verUnaAAUna = vbYes And cuotaAplicacion!num_cuo = 1 Then
mensaje = "Número de Lote: " & loteActualizarQuery!num_lote & vbCrLf & _
"Mes de Aplicación es Cuota 1" & vbCrLf & _
"NO SE MODIFICA:" & vbCrLf

MsgBox mensaje, vbInformation, "Información de Modificación"
mostradoMensaje = True
End If
End If

' Ajustar el cálculo para el mes retroactivo
nuevoTotal = loteActualizarQuery!total_cuota + (totalCuotaReferencia * ind_incremento / 100) + (totalCuotaRetroactivo * porcentajeRetroactivo / 100)
nuevoNeto = loteActualizarQuery!valor_cuota + (valorCuotaRetroactivo * ind_incremento / 100) + (totalCuotaRetroactivo * porcentajeRetroactivo / 100)

If Not cuotaAplicacion.EOF And cuotaAplicacion!num_cuo > 1 Then
' Verificar si se ingresa el mes y el porcentaje
If Trim(mesRetroactivo) <> "" And porcentajeRetroactivo <> 0 Then
' Verificar si el mes de aplicación es el más nuevo
If txtmesyaño_aplicacion.Value = mesMasNuevo Then
' Ajustar solo los términos relacionados con la actualización
nuevoTotal = nuevoTotal + (totalCuotaReferencia * ind_incremento / 100) + (totalCuotaRetroactivo * porcentajeRetroactivo / 100)
nuevoNeto = nuevoNeto + (valorCuotaReferencia * ind_incremento / 100) + (valorCuotaRetroactivo * porcentajeRetroactivo / 100)
Else
' Ajustar solo los términos relacionados con la actualización
nuevoTotal = nuevoTotal + (totalCuotaReferencia * ind_incremento / 100)
nuevoNeto = nuevoNeto + (valorCuotaReferencia * ind_incremento / 100)
End If


Else
nuevoTotal = loteActualizarQuery!total_cuota + (totalCuotaReferencia * ind_incremento / 100)
nuevoNeto = loteActualizarQuery!valor_cuota + (valorCuotaReferencia * ind_incremento / 100)
End If

If Not cuotaAplicacion.EOF And cuotaAplicacion!num_cuo > 1 Then
' Verificar si se ingresa el mes y el porcentaje
If Trim(mesRetroactivo) <> "" And porcentajeRetroactivo <> 0 Then
' Verificar si el mes de aplicación es el más nuevo
If txtmesyaño_aplicacion.Value = mesMasNuevo Then
nuevoTotal = loteActualizarQuery!total_cuota + (totalCuotaReferencia * ind_incremento / 100) + (IIf(IsNull(cuotaAplicacion!total_cuota), 0, cuotaAplicacion!total_cuota) * porcentajeRetroactivo / 100)
End If
End If

loteActualizarQuery!total_cuota = nuevoTotal
nuevoNeto = loteActualizarQuery!valor_cuota + (valorCuotaReferencia * ind_incremento / 100)
loteActualizarQuery!valor_cuota = nuevoNeto
loteActualizarQuery!g_a_f = nuevoTotal - nuevoNeto
loteActualizarQuery.Update
End If

cuotascount = cuotascount + 1

End If

' quito reloj de arena a puntero normal
DoCmd.Hourglass False

' Actualiza el número de lote solo si cambia
numeroLote = loteActualizarQuery!num_lote

' Avanzar al siguiente registro
loteActualizarQuery.MoveNext

Loop

' Cerrar el recordset
loteActualizarQuery.Close
Set loteActualizarQuery = Nothing
refQuery.Close
Set refQuery = Nothing
cuotaAplicacion.Close
Set cuotaAplicacion = Nothing


' Mostrar mensaje de finalización
MsgBox "Proceso de actualización completado. Se actualizaron " & cuotascount & " cuotas.", vbInformation, "Proceso Completado"
DoCmd.Close acForm, "Actualizacion"

End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

ayuda con error de compilacion Loop sin Do

Publicado por Eduardo Pérez Fernández (317 intervenciones) el 29/01/2024 17:21:58
Falta abir la base de datos (db) antes de usarla en su código, algo como

1
2
Dim db As DAO.Database
    Set db = CurrentDb ' Abre la base de datos actual
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

ayuda con error de compilacion Loop sin Do

Publicado por Miguel (4 intervenciones) el 29/01/2024 18:30:49
Gracias por el aporte, ya lo agregue, pero no es eso el error Loop sin Do
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ayuda con error de compilacion Loop sin Do

Publicado por Anonimo (3316 intervenciones) el 29/01/2024 17:56:33
Tienes un IF sin su correspondiente End IF que comienza a continuación de esta línea:

' Aplicar las modificaciones solo si la fecha de vencimiento es posterior a la fecha de aplicación y fe_pago está vacío

Si comentas ese IF lo apreciaras y si ubicas en donde corresponda su final, solucionas el problema.

(no he analizado el código, lo he concluido en base a casar los IF con sus End If)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

ayuda con error de compilacion Loop sin Do

Publicado por Miguel (4 intervenciones) el 29/01/2024 18:38:13
Un millon de gracias, se me habia pasado uno al casar los If, yo copio el codigo al block de notas y voy eliminado los cerrados, Pero este se me escapo. Me sugeris algun metodo mejor para casarlos? . Me salvaste !!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ayuda con error de compilacion Loop sin Do

Publicado por Anonimo (3316 intervenciones) el 29/01/2024 19:58:13
Por simple metodología simplifico el código y reutilizo las variables, muchas de esas líneas las escribiría sin el End IF (en una sola línea y si hay mas una acción: las encadeno para que sobre el End IF).

El código al ser mas compacto es mas rápido.

(Hay algo que me pareció curioso, el envío del foco a los objetos por si desea abortar y que se quede en el objeto causante del aborto).

En mi opinion es una perdida de eficiencia, una rutina de error con el parámetro del objeto causante haría lo mismo solo en caso de error.
.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

ayuda con error de compilacion Loop sin Do

Publicado por Miguel (4 intervenciones) el 29/01/2024 20:13:59
Entiendo, lo tuyo es profesional optimizando al maximo. Te cuento soy Ing Electronico, de hace muuuchos años y solo vi diagramacion y Fortran, y si he pregramado bien con el Assembler (de esa epocahace mas de 30 años), cuando salieron los Pics, pero de lenguajes nada de nada. El Access lo use para hacer un sistema de cobranzas de cuotas para mi inmobiliaria, o sea uso casero y con la ayuda de chat GPT que me asisitio en lo que vba se refiere, que sabieno la diagramacion puede corregir los muchos errores que hace la IA. Hasta hice envio masivo de whatsapp. Hace meses que lo uso y lo tenia terminado, pero la actualizacion de cuotas que venia usando se medifico al incluir la posiblidad de retroactivos (ajusto las cuotas segun paritarias) y ahi tuve que modiificar el formulario de actualizacion anterior y en eso estoy. No quiero tener que agregar mas cosas, en mis condiciones de no ser profesional del tema es demasiado agotador. Vere lo que me sugeris respecto del foco. Muchas gracias. Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar