Como puedo actualizar uno o varios registros con recordset u otro método.

Ms access.

Te comento que estoy haciendo un proyecto personal desde ya un buen tiempo, pero como mi orientación es finanzas me ha costado, es decir que mis conocimientos se han basado en manuales que es muy poco lo que aportan, voy de foro en foro a ver quien me ayuda.

Mi proyecto consiste en una base de access para el control de prestamos. Casi solo he elaborado los formularios, voy por la parte difícil que es la aplicación del préstamo y la amortización del mismo, la tabla de los créditos se llama "Prestamos" y la de amortización se llama PlanPago, ellas están relacionadas por la Clave "NumCre", gracias a "Sveinbjorn" he elaborado un código para que dependiendo del plazo, capital, tasa de interés me elabora un plan de pago, pero no se como hacer para que si existe un plan de pagos y el usuario quiere cambiar uno de los criterios me actualice al plan de pago existente.

Por ejemplo si el préstamo guardado es de 6 meses pero lo quiere cambiar a 12 mes, si aplico este cambio access me dice que "los cambios no se pueden hacer porque genera datos duplicados". Como es un poco complicado te dejo ver mi proyecto, espero que te parezca interesante para que me ayudes. Y por favor se condescendiente conmigo soy autodidacta y casi no le entiendo mucho de programación.

Descarga aquí. esta es SkyDrive \ Access \ Ejemplos \ Prestamos.rar

Si solo quieres ver mi medio código aquí esta.

Private Sub cmdAplicarPrest_Click()

Dim rst As Recordset
Dim Capital As Currency 'se toma del formulario prestamos

Dim Plazo As Integer 'se toma del formulario prestamos

Dim TasaInteres As Double 'se toma del formulario prestamos

Dim Cuota As Currency ' Cuota programada sin cargos extras.
Dim Frecuencia As Double ' sirve para convertir la tasa de interés anual según el plazo y calcular la fecha de pago

Dim Base As Double 'Base para calcular cuotas según se configure 360 o 365 días.

Dim DiaSemana As Integer 'Calcula el día de la semana, aumenta 1 si es domingo, aumenta 2 si es sábado.

Dim FechaPago As Date ' Calcula la fecha de pago para el plan de pago considerando el plazo.

Frecuencia = DLookup("[Frecuencias]", "Periodos", "[IdPeriodos]=" & Forms!Prestamos!Periodos)

Base = DLookup("[Base]", "Periodos", "[IdPeriodos]=" & Forms!Prestamos!Periodos)

If IsNull(Frecuencia) Then MsgBox "No se configuro la frecuencia del pago", vbInformation, "ERROR" Me.CrePlazo.SetFocus Exit Sub End If

If IsNull(Base) Then MsgBox "No se configuro la base del préstamo", vbInformation, "ERROR" Me.CrePlazo.SetFocus Exit Sub End If

Capital = Me.CreCap

Plazo = Me.CrePlazo

TasaInteres = (Me.CreTasa / (Base / Frecuencia))

Set rst = CurrentDb.OpenRecordset("PlanPago", dbOpenDynaset)

For i = 1 To Plazo

FechaPago = Me.FechaEntrega + (Frecuencia * i)

DiaSemana = Weekday(FechaPago)

rst.AddNew rst("CreNum") = Me.CreNum

rst("NumCuota") = i

If Me.TipoCalculo = 1 Then

Cuota = Pmt(TasaInteres, Plazo, -Capital)

Me.CuotaPago = Cuota

rst("PlanCapital") = Round(PPmt(TasaInteres, i, Plazo, -Capital), 2)

rst("PlanInteres") = Round(IPmt(TasaInteres, i, Plazo, -Capital), 2)

rst("PlanFecha") = IIf(DiaSemana = 1, FechaPago + 1, IIf(DiaSemana = 7, FechaPago + 2, FechaPago))

ElseIf Me.TipoCalculo = 2 Then

Me.CuotaPago = Round((Capital / Plazo), 2) + Round((Capital * TasaInteres), 2) rst("PlanCapital") = Round(Capital / Plazo, 2)

rst("PlanInteres") = Round(Capital * TasaInteres, 2)

rst("PlanFecha") = IIf(DiaSemana = 1, FechaPago + 1, IIf(DiaSemana = 7, FechaPago + 2, FechaPago))

'ElseIf Me.TipoCalculo = 3 Then

'Me.CuotaPago = Capital + (Capital * (Plazo * TasaInteres))

'rst("PlanCapital") = Capital 'rst("PlanInteres") = (Capital * (Plazo * TasaInteres)) 'rst("PlanFecha") =

End If

rst.Update

Next i

Me.Refresh

Me.CreNum.SetFocus

rst.Close

Set rst = Nothing

End Sub

1 Respuesta

Respuesta

Elemental mi estimado, tu problema es debido a que al momento de re-calcular las cuotas asignadas el sistema trata de crear la cuota nº 1 nuevamente y como ya existe te arroja el mensaje de que se crearían valores duplicados para las claves principales de con NumCre y NumCuota. Que haría yo en estos casos, pues utilizar un proceso que primero tome el total de la deuda verdad, luego elimine o guarde en otra tabla histórico la pactación actual de las cuotas, elimino las cutas con una consulta de eliminación y finalizo con ejecutar nuevamente el código que recalcula las cuotas. Es solo eso. Too esta bien, lo que es un proceso en el que debes eliminar el registros que ya existe porque no te dejará crear valores duplicados.

Resumen.

Paso 1. Calcular el valor total de la deuda a repactar.

Paso 2. Eliminar o respaldar en otra tabla la Pactasión vigente. Para tener un histórico (Opcional)

Paso 3: Eliminar del detalle la Pactasión con una consulta de eliminación.

Paso 4: Hacer correr el código que hará la nueva Pactasión de la deuda.

Paso 5: Hacer un requery al subformulario para ver los resultados.

Eso sería. A mi parecer es algo muy simple de resolver.

Hola, muchas gracias por tu tiempo.

Como te explique mi área es finanzas y soy autodidacta en access con vb, por lo que me cuesta mucho entender esto de programación. En fin encontré la repuesta en otro foro y gracias a Sveinbjorn, solo agregue esto en mi código. Aunque este código borra todo el plan del pago dependiendo de numero de crédito, pero esto se hará para créditos nuevos y que estén con estatus editable, no para aquellos que tienen registros relacionados como con pagos.

Parte de código final seria este.
Set rst = CurrentDb.OpenRecordset("PlanPago", dbOpenDynaset)

CurrentDb.Execute "DELETE * FROM PlanPago WHERE (CreNum)=" & Me.CreNum

If Me.TipoCalculo = 1

Then For i = 1 To Plazo

FechaPago = Me.FechaEntrega + (Frecuencia * i)

DiaSemana = Weekday(FechaPago)

rst.AddNew

rst("CreNum") = Me.CreNum

rst("NumCuota") = i

rst("PlanFecha") = IIf(DiaSemana = 1, FechaPago + 1, IIf(DiaSemana = 7, FechaPago + 2, FechaPago))

Cuota = Pmt(TasaInteres, Plazo, -Capital)

Me.CuotaPago = Cuota

rst("PlanCapital") = Round(PPmt(TasaInteres, i, Plazo, -Capital), 2)

rst("PlanInteres") = Round(IPmt(TasaInteres, i, Plazo, -Capital), 2)

rst.Update

Next i

GRACIAS NUEVAMENTE.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas