Generar x registros segun el valor que exista en el campo

Tengo una base de datos en access de una escuela y el monto que se paga anual algunos pagan todos junto y otros segun (puede ser 2, 3, 4, etc.) Lo que quiero por ej.

El valor anual es de 1000 un alumno lo va a pagar en 2 cuotas.

Tengo la tabla T_Cant_Cuot acá figura el valor que tiene cada cuota

En la tabla T_pago_Cuot figura el dni, valor total, cant de cuot (en cuantas lo va a pagar) y el valor mensual

Y en la tablaT_saldo_Cuot es donde deseo insertar tantos registros como cuota hay elegido

En un formulario llamado F_Cuotas con un boton quiero que me inserte segun en cuantas cuotas haya elegido.

Sino logro automatizarlo tengo que seguir haciendolo a mano uno por uno.

2 Respuestas

Respuesta
1

Otra alternativa. Como ya está establecido el monto y la cuota mensual en la tabla T_Pag_Cuot se puede tomar de esta los datos con base en el DNI del alumno, se debe tener cuidado en hacer el ajuste en la última cuota, por ejemplo cuando son $1000 a 3 cuotas, serían 2 de $333 y 1 de $334.

Voy a liquidar el primer alumno y el último, Obtengo:

Observe que el alumno DNI 68955015 la última cuota es de $334. Si dejamos a 333 no cuadrarían las cuotas con el valor anual.

Para hacer el registro utilizo una función en donde paso 2 parámetros, el DNI y la fecha de inicio de pago.

CÓDIGO DEL BOTÓN LIQUIDAR

Private Sub btnLiquidar_Click()
 On Error GoTo hay_error
 If IsNull(Me.cboDNI) Then
   Exit Sub
 End If
 If Not IsDate(Me.ctlFechaInicio) Then
   Exit Sub
 End If
 Call plan_pagos(Me.cboDNI, Me.ctlFechaInicio)
 If Err.Number = 0 Then
   MsgBox "DNI liquidado satisfactoriamente!", vbInformation, "Le cuento"
 End If
hay_error_exit:
  Exit Sub
hay_error:
   MsgBox "Ocurrió el error " & Err.Number & vbCrLf & Err.Description, vbCritical, "Error..."
   Resume hay_error_exit
End Sub

CÓDIGO DE LA FUNCIÓN PLAN_PAGOS

Public Function plan_pagos(lnDNI As Long, fecha_inicio As Date)
  Dim strSQl As String
  Dim rs As Recordset
  Dim dni As Long
  Dim vranual As Long
  Dim ncuotas As Byte
  Dim cuotames As Long
  Dim x As Integer
  Dim strAux As String
  Dim intresto As Integer
  strSQl = "SELECT T_Pag_Cuot.Alumn_Dni AS DNI" & vbCrLf
  strSQl = strSQl & "           , T_Pag_Cuot.Alumn_Valor_Anual AS ANUAL" & vbCrLf
  strSQl = strSQl & "           , T_Pag_Cuot.Alumn_Cant_Cuot AS CUOTAS" & vbCrLf
  strSQl = strSQl & "           , T_Pag_Cuot.Alumn_Valor_Mens AS MES" & vbCrLf
  strSQl = strSQl & "        FROM T_Pag_Cuot" & vbCrLf
  strSQl = strSQl & "       WHERE T_Pag_Cuot.Alumn_Dni=" & lnDNI & ";"
  Set rs = CurrentDb.OpenRecordset(strSQl)
  dni = rs!dni
  vranual = rs!ANUAL
  ncuotas = rs!cuotas
  cuotames = rs!MES
  intresto = vranual Mod ncuotas
  For x = 1 To ncuotas
   'Ajuste para la última cuota
   If x = ncuotas And intresto > 0 Then
     cuotames = cuotames + intresto
   End If
    strAux = "INSERT INTO T_Saldo_Cuot(cant_dni,cant_fecha_vence,cant_import, cant_id_cant)" & vbCrLf
    strAux = strAux & " VALUES(" & lnDNI & "," & "#" & Format(DateAdd("m", x - 1, fecha_inicio), "mm/dd/yyyy") & "#" & "," & cuotames & ",'" & x & "-" & ncuotas & "')"
     CurrentDb.Execute strAux
  Next x
Respuesta
2

En el evento del botón:

---------------------------------------------

Dim Bucle As long
For Bucle = 1 To Me.N_Cuotas ' n_cuotas campo del formulario con las cuotas previstas
CurrentDb.Execute "Insert into T_Saldo_Cuot (Cant_dni, Cant_fecha_venc, Cant_importe, Cant_id_cant) Values(" & Me.Dni & ", " & Cdbl(DateAdd("m", Bucle -1, Me.Fecha_inicio)) & ", " & Me.Importe / Me.N_Cuotas & ", " & Bucle & "-" & Me.N_cuotas & ")"
Next Bucle

--------------------------------------------------------

.- El dato 'Cant_id' se auto-genera (es un autonumérico).
.- La fecha de pago es desconocida (previsible pero desconocida): un NULL.
.- El vencimiento: en formato numérico (se evita la dependencia de la configuración regional).
.- El importe fraccionado (la cuota) se calcula.
.- El numero de cuota también es calculado.

Los datos que comienzan por 'Me' se presupone que son los cuadros de texto del formulario con los datos básicos recién introducidos.

Estimado Enrique, muchas gracias por tu aporte, mirando lo que me pusiste me faltaron colocar datos, voy a terminar de acomodar todo y te vuelvo a preguntar.

Hola, gracias por aporte.

Estuve probando lo que me mandaste pero no logré hacer andar que me inserte 1-3, 2-3, 3-3.

También si sin querer quiero liquidar nuevamente me crea dos veces lo mismo.

Es correcto hay un error: el dato que numera las cuotas es de texto y se le esta tratando como numero.
Le faltan unas comillas simples que lo definan como texto, reescribo el final de la línea (la diferencia esta en las comillas simples):
---- Original---

 ....... a_inicio)) & ", " & Me.Importe / Me.N_Cuotas & ", " & Bucle & "-" & Me.N_cuotas & ")"

-- Corregida ---
.......  a_inicio)) & ", " & Me.Importe / Me.N_Cuotas & ", '" & Bucle & "-" & Me.N_cuotas & ")"

La duplicación de datos:
Se puede crear una marca que delate si ya esta finalizado el proceso, pero lo que evitara repeticiones es crear un índice en la tabla.
Un índice es similar a una llave sin las restricciones que impone sobre todo si la llave esta compuesta por varios campos.
Si se crea un índice en la tabla tomando los campos [Cant_dni], + [Cant_fecha_venc] + [Cant_importe] y se le indica que la combinación es única, podrá haber otro crédito del mismo DNI en diferente fecha o con diferente importe  o el mismo crédito con otro DNI, pero sin repeticiones indeseadas (uno de los tres elementos ha de ser diferente).
Si se diese el caso de que se modifica el crédito (otra fecha, otro importe porque se modifican los plazos ...) se crearan los nuevos registros y solo habrá que borrar los anteriores (no se sobrescriben pues son diferentes)
Si encuentras alguna dificultad para crear el índice (proceso sencillo 'después de la primera vez' ) coméntalo e intentare guiarte.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas