Calcular resultado en campo calculado Access 2019

Agradecer antes que nada vuestra sabiduría y ayuda. Estoy haciendo una base de datos para controlar inmuebles en alquiler. En ocasiones, los suministros (luz, gas, agua, etc) los paga el propietario y los inquilinos los pagan después, al pagar el alquiler. En otras ocasiones, el precio del alquiler, durante los meses de julio y agosto, se reduce a la mitad por acuerdo entre las partes. Dicho esto, necesito una fórmula que me calcule la cantidad que tengo que ingresarle al propietario en función de estos campos:

- PrecioPt (Alquiler que inicialmente recibe el propietario)

- PagoLuz (Gasto de Luz)

- PagoAgua

- PagoGas

- Otros (otros gastos)

- Reducción50 (se aplica a algunos inmuebles y algunos meses, no todos) (campo Sí/No)

- CantidadIngreso (Cantidad final que debo ingresarle al propietario según esta fórmula:

CantidadIngreso=(PrecioPt / (Recuccion50))-PagoLuz-PagoAgua-PagoGas-Otros

No sé si he sabido explicarme bien. En esa fórmula necesito una condición de aplicar una división al PrecioPt en función del valor del campo Reduccion50. Al resultado, restarle el resto de los conceptos.

De nuevo agradeceros la ayuda.

2 respuestas

Respuesta
1

Lo puedes hacer de muchas formas, dependiendo de como tengas construidas las tablas y como contabilices los gastos de luz, agua, gas, etc. Por ejemplo, supongamos que tengo una tabla Inquilinos con los datos del inquilino, si se paga el la luz(campo Paga), si tiene reducción y el alquiler que debe pagar.

Supongamos que tengo una tabla Gastos como en la imagen

En un formulario, aunque podría ser en cualquier otro lado, incluso en el propio formulario de pagos, le pongo un botón que me va a crear los recibos de cada mes

Al pulsarlo, si ese mes ya estuviera creado te lo avisaría. Al pulsarlo me crea en la tabla Pagos, los registros correspondientes a ese mes, con esos inquilinos. Al abrir el formulario Pagos

Es decir, en aquellos inquilinos que se pagan ellos la luz, agua y gas les pone un 0 y el control queda bloqueado. Te he puesto un cuadro de texto, aunque no sirve para nada, que te muestra la fecha del sistema.

Cuando voy rellenando datos y el cursor llega al control CantidadIngresar(ya que no sé como trabajas) me va poniendo la cantidad de cada inquilino ese mes.

Puedes ver que los que tiene reducción, por ser Agosto pagan la mitad del alquiler. Cuando pasamos a septiembre

Ya no les hace reducción.

Lógicamente esto se podría automatizar un poco más, por ejemplo, suprimiendo el botón y que el primer día de cada mes te cree los registros, etc. O poniendo el botón de Crear en el propio formulario Pagos y que sólo te muestre los nuevos registros.

El código del botón es

Private Sub Comando0_Click()
If DCount("*", "pagos", "month([fechagasto])=month(Date())") >= 1 Then
MsgBox "Este mes ya está creado", vbOKOnly + vbCritical, "No querrás cobrarle dos veces"
Else
DoCmd.RunSQL "Insert into pagos(fechagasto,idinquilino,alquiler,paga,reduccion) select date(),idinquilino,alquiler,paga,reduccion from inquilinos"
DoCmd.RunSQL "update pagos set luz=0,agua=0,gas=0 where paga=-1"
End If
End Sub

Y el código del formulario Pagos es

Private Sub CantidadIngresar_GotFocus()
If Month([FechaGasto]) = 7 Or Month([FechaGasto]) = 8 And Reduccion = -1 Then
CantidadIngresar = (Alquiler / 2) + Nz([Luz]) + Nz([Agua]) + Nz([Gas]) + Nz([Otros])
Else
CantidadIngresar = Alquiler + Nz([Luz]) + Nz([Agua]) + Nz([Gas]) + Nz([Otros])
End If
End Sub
Private Sub Luz_GotFocus()
If Paga = -1 Then
Luz.Locked = True
Else
Luz.Locked = False
End If
End Sub

¡ Pero, si es el dueño el que paga la luz, el agua, etc., tendrás que repercutirlo al inquilino !

De todas formas si quieres, repito, si quieres, mándame un mensaje (sólo el mensaje) a [email protected] y te mando el ejemplo. Si lo haces, en el asunto del mensaje pon tu alias Eduardo, ya que si no sé quien me escribe ni los abro.

Respuesta
1

Creo que su pregunta es sobre un campo calculado. Le preparé ese ejemplo:

Tabla

Formulario

Observe como la fecha "Mes liquida" esta en el mes de agosto, se aplican los descuentos.

Ahora voy a cambiar el descuento del id=3 correspondiente a Teresa del 20 al 50 y obtengo:

El ingreso que era 7.690 pasó a 4.690. Ahora cambio de mes, septiembre y obtengo.

Se va actualizando el campo cantidad de ingreso. Como está diseñado puede cambiar cualquier valor y se actualiza el total.

Código del formulario.

Utilizo una función y un procedimiento para llamar después de actualizar cada campo numérico.

Código de la función

 Function cant_ingreso(dbalquiler As Single, dbluz As Single, dbagua As Single, _
Dbgas As Single, dbotros As Single, porc_desc As Single, Optional mfecha As Date) As Single
    Dim neto_alquiler As Single
    If CLng(mfecha) = 0 Then
        mfecha = Date
    End If
    If porc_desc > 0 Then
      If Month(mfecha) = 7 Or Month(mfecha) = 8 Then
        neto_alquiler = dbalquiler - Round(dbalquiler * porc_desc / 100, 0)
        cant_ingreso = neto_alquiler - dbluz - dbagua - dbgas - dbotros
      Else
        cant_ingreso = dbalquiler - dbluz - dbagua - dbgas - dbotros
      End If
    Else
     cant_ingreso = dbalquiler - dbluz - dbagua - dbgas - dbotros
    End If
End Function

Código del procedimiento Actualiza()

Sub actualiza()
  If Not IsDate(Me.ctlmes) Then Exit Sub
  Me.cantingreso = cant_ingreso(Me.alquiler, Me.luz, Me.agua, Me.gas, Me.otros, Me.deduccion, Me.ctlmes)
  Me.fechaliquida = Me.ctlmes
  Me.Recalc
End Sub

Para ampliar las posibilidades adicioné un botón para actualizar todo. Esto solo es necesario si no se llama el procedimiento Actualiza() en el evento Después de actualizar de cada campo.

Private Sub btnActualiza_Click()
  Dim db As Database
  Dim rs As Recordset
  If Not IsDate(Me.ctlmes) Then Exit Sub
  Set db = CurrentDb
  Set rs = db.OpenRecordset("tblinquilinos")
  Do Until rs.EOF
    rs.Edit
    rs!cantingreso = cant_ingreso(rs!alquiler, rs!luz, rs!agua, rs!gas, rs!otros, rs!deduccion, Me.ctlmes)
    rs!fechaliquida = Me.ctlmes
    rs.Update
   rs.MoveNext
  Loop
  Me.Requery
  rs.Close
  db.Close
  Set rs = Nothing
  Set db = Nothing
End Sub

Observe que lo hago con DAO recorriendo el recordset. Puede cambiar este código para insertar los datos en otra tabla con el fin de guardar las liquidaciones mensuales.

Código eventos después de actualizar de los controles.

Private Sub ctlmes_AfterUpdate()
 Call btnActualiza_Click
End Sub
Private Sub deduccion_AfterUpdate()
  Call actualiza
End Sub
Private Sub gas_AfterUpdate()
  Call actualiza
End Sub
Private Sub luz_AfterUpdate()
  Call actualiza
End Sub
Private Sub otros_AfterUpdate()
  Call actualiza
End Sub
Private Sub agua_AfterUpdate()
  Call actualiza
End Sub
Private Sub alquiler_AfterUpdate()
 Call actualiza
End Sub

Se pueden hacer muchas mejoras pero creo que es suficiente para su pregunta "Campo Calculado"

Puede solicitar el ejemplo a [email protected] favor en el asunto anotar la consulta.

En el ejemplo asumí que si no se cobran servicios se anotaría CERO, pero es mejor incluir un campo para definir si se cobran.

Tabla

Adicioné el campo "nopaga", en donde 1 por defecto es Si paga y 2 es No paga. Trate en lo posible no utilizar campos Si/No.

Formulario

Observe que "TERESA" tiene "No paga" pero se le asignó un descuento del 50% entonces se le cobra el 50% del alquiler, es decir 1.500.

Código cuadro combinado PAGA NO/SI.

Private Sub cboPaga_AfterUpdate()
  Call actualiza
End Sub

Nuevo código de la función

 Function cant_ingreso(dbalquiler As Single, dbluz As Single, dbagua As Single, _
Dbgas As Single, dbotros As Single, porc_desc As Single, byNopaga As Byte, Optional mfecha As Date) As Single
    Dim neto_alquiler As Single
    Dim servicios As Single
    If CLng(mfecha) = 0 Then
        mfecha = Date
    End If
    If byNopaga = 2 Then
      servicios = 0
    Else
      servicios = dbluz + dbagua + dbgas + dbotros
    End If
    If porc_desc > 0 Then
      If Month(mfecha) = 7 Or Month(mfecha) = 8 Then
        neto_alquiler = dbalquiler - Round(dbalquiler * porc_desc / 100, 0)
        cant_ingreso = neto_alquiler - servicios
      Else
        cant_ingreso = dbalquiler - servicios
      End If
    Else
     cant_ingreso = dbalquiler - servicios
    End If
End Function

Código del botón Actualizar Todo (Este código es opcional)

Private Sub btnActualiza_Click()
  Dim db As Database
  Dim rs As Recordset
  If Not IsDate(Me.ctlmes) Then Exit Sub
  Set db = CurrentDb
  Set rs = db.OpenRecordset("tblinquilinos")
  Do Until rs.EOF
    rs.Edit
    rs!cantingreso = cant_ingreso(rs!alquiler, rs!luz, rs!agua, rs!gas, rs!otros, rs!deduccion, rs!nopaga, Me.ctlmes)
    rs!fechaliquida = Me.ctlmes
    rs.Update
   rs.MoveNext
  Loop
  Me.Requery
End Sub

Esta es la única modificación. Puede solicitar el ejemplo a [email protected] favor en el asunto anotar la consulta.

Disculpe la función tiene un error. Considere este código de la función.

 Function cant_ingreso(dbalquiler As Single, dbluz As Single, dbagua As Single, _
Dbgas As Single, dbotros As Single, porc_desc As Single, byNopaga As Byte, Optional mfecha As Date) As Single
    Dim neto_alquiler As Single
    Dim servicios As Single
    If CLng(mfecha) = 0 Then
        mfecha = Date
    End If
    If byNopaga = 2 Then
      servicios = 0
    Else
      servicios = dbluz + dbagua + dbgas + dbotros
    End If
    If Month(mfecha) = 7 Or Month(mfecha) = 8 Then
       If porc_desc > 0 Then
         neto_alquiler = dbalquiler - Round(dbalquiler * porc_desc / 100, 0)
         cant_ingreso = neto_alquiler - servicios
       Else
        cant_ingreso = dbalquiler - servicios
       End If
    Else
      cant_ingreso = dbalquiler - servicios
    End If
End Function

Subí la función que no es, mil disculpas.

 Function cant_ingreso(dbalquiler As Single, dbluz As Single, dbagua As Single, _
Dbgas As Single, dbotros As Single, porc_desc As Single, byNopaga As Byte, Optional mfecha As Date) As Single
    Dim neto_alquiler As Single
    Dim servicios As Single
    If CLng(mfecha) = 0 Then
        mfecha = Date
    End If
    If byNopaga = 2 Then
      servicios = 0
    Else
      servicios = dbluz + dbagua + dbgas + dbotros
    End If
    If Month(mfecha) = 7 Or Month(mfecha) = 8 Then
       If porc_desc > 0 Then
         neto_alquiler = dbalquiler - Round(dbalquiler * porc_desc / 100, 0)
         cant_ingreso = neto_alquiler + servicios
       Else
        cant_ingreso = dbalquiler + servicios
       End If
    Else
      cant_ingreso = dbalquiler + servicios
    End If
End Function

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas