Generar un registro por cada registro de la tabla

Les comento que tengo pocos conocimientos en vb, pero trato de aprender.
En esto estoy varado como encararlo.
Les cuento, tengo una base para cobrar en un pequño club las cuotas societarias, el problema que tengo es que debo cargar a mano cada registro de la cuota a cada jugador.
Necesito generar un registro por cada registro de la tabla jugador en la tabla cuota por cada mes.
Tengo las siguientes tablas:
T_juga TIPO DE DATOS
    Jug_Id (Clav Princip) (NÚMERO)
    Jug_Apelly Nomb (TEXTO)
    Jug_Dni (NÚMERO)
    Jug_categ (NÚMERO)
T_cuota TIPO DE DATOS
    Cuot_Id (Clav Princip) (NÚMERO)
    Cuot_Id_Juga            (NÚMERO)
    Cuot_ano (NÚMERO)
    Cuot_mes (TEXTO)
    Cuot_categ (NÚMERO)
Cuota_import (NÚMERO)
T_config TIPO DE DATOS valores
    Config_categ (NÚMERO) 1 2 3
    Config_valor            (NÚMERO)            $100    $50    $25
Estamos en el mes de junio.
Al cargar el formulario inicio deberá comprobar si cada registro de la tabla
T_juga tiene el registro en la T_cuota
[Cuot_Id]     [Cuot_mes]      [Cuot_ano]     [Cuota_categ]     [Cuota_import]
Ejemplo: 80 junio 2022 1 100
La idea es que al abrir el formulario principal busque el id del jugador y compare el mes y el año actual con la t_cuota si no esta que me genere un nuevo registro con el id del jugador + mes actual + año actual + la categ del jugador + importe.
Espero que se entienda lo que necesito y que me haya explicado bien.

2 respuestas

Respuesta
1

Tengo las siguientes tablas

La tabla anterior se llena al abrir el formulario siguiente

Si aceptamos se procesan las cuotas mediante una función. (Se puede dejar como procedimiento en el formulario)

CÓDIGO DEL EVENTO AL ABRIR DEL FORMULARIO

Private Sub Form_Open(Cancel As Integer)
 On Error GoTo hay_error
  Dim rs As Recordset
  Dim intCuotas As Integer
  If MsgBox("¿Liquida las cuotas del año " & Year(Date) & " y el mes de " & Format(Date, "mmmm") & " ?", vbQuestion + vbYesNo + vbDefaultButton2, "Liquida cuota") = vbNo Then
     Exit Sub
  Else
   Set rs = CurrentDb.OpenRecordset("T_juga", dbOpenTable)
   Do Until rs.EOF
     Call actualiza_cuotas(rs!Jug_id, Date)
     intCuotas = intCuotas + 1
     rs.MoveNext
   Loop
    rs.Close
    Set rs = Nothing
    Me.Requery
    MsgBox "Se procesaron " & intCuotas & " jugadores", vbInformation, "Cuotas mes"
  End If
hay_error_exit:
  Exit Sub
hay_error:
     MsgBox "Ocurrió el error " & Err.Number & " " & Err.Description, vbCritical, "Error.."
     Resume hay_error_exit
End Sub

CÓDIGO DE LA FUNCIÓN actualiza_cuotas()

Public Function actualiza_cuotas(mjugador As Long, mfecha As Date)
  Dim mmes As String
  Dim strMes As String
  Dim busca_cuota As Byte
  Dim intJugCateg As Byte
  Dim dbCuota As Double
  Dim strSQL As String
  mmes = Format(mfecha, "mmmm")
  busca_cuota = DCount("*", "T_cuota", "Cuot_Id_Juga=" & mjugador)
  If busca_cuota = 0 Then ' no está la cuota del año y mes del jugador
    intJugCateg = DLookup("Jug_Categ", "T_juga", "Jug_id=" & mjugador)
    dbCuota = DLookup("Config_valor", "T_config", "Config_categ=" & intJugCateg)
    'Adiciono el registro en la tabla T_cuota
    strSQL = "INSERT INTO T_cuota(Cuot_Id_Juga,Cuot_ano,Cuot_mes,Cuot_categ,Cuota_import) VALUES(" & vbCrLf
    strSQL = strSQL & mjugador & "," & Year(mfecha) & "," & "'" & mmes & "'" & "," & intJugCateg & "," & dbCuota & ")"
    CurrentDb.Execute strSQL
  End If
End Function

Esto es una idea de como actualizar las cuotas, claro que depende como lo haga, en el ejemplo asumo que se recorre la tabla de todos los  jugadores, pero ya usted puede fijar por uno solo, igualmente, asumo la fecha del sistema.

Trate de adaptar la idea a sus necesidades. Si quiere el ejemplo lo puede solicitar a [email protected] favor en el asunto anotar la consulta.

Respuesta
1

El método mas sencillo es reutilizar la propia tabla T_cuota.

Consulta >>> nueva >>> seleccionar la tabla T_cuota

>>> Se utilizan todos los campos excepto Cuot_ID (es la clave principal y se crea solo)

>>> Se desmarcan Cuot_ano y Cuot_mes (solo se necesitan para aplicar el filtro).

Condición para Cuot_ano >>> Year (Date()) ' el año actual

Condición para Cuot_mes >>>> Format(Date();"mmm") ' el mes actual

Se cambia a consulta de inserción (anexar) se le indica que la tabla destino es T_Cuota
En la línea 'anexar a:' se borra el dato debajo de Cuot_ano y Cuot_Mes

Se crean dos campos nuevos con estos textos:

Cuot_ano: Year(Date()) - (Mes(Date())=1)  'para el cambio automático de año

Cuot_mes: Format(DateAdd("m";1;Date()),"mmm") 'calcula el mes siguiente

Y en el desplegable 'anexar a:', se selecciona el adecuado (Cuot_ano / Cuot_Mes)

La SQL de la consulta quedara así (se puede copiar y pegar en una nueva consulta):

.................................................
INSERT INTO T_Cuota ( Cuot_Id_Juga, Cuot_categ, Cuota_Import, Cuot_ano, Cuot_mes )
SELECT T_Cuota.Cuot_Id_Juga, T_Cuota.Cuot_categ, T_Cuota.Cuota_Import, Year(Date())+Abs(Month(Date())=1) AS Cuot_ano, Format(DateAdd("m",1,Date()),"mmm") AS Cuot_mes
FROM T_Cuota
WHERE (((T_Cuota.Cuot_mes)=Format(Date(),"mmm")) AND ((T_Cuota.Cuot_ano)=Year(Date())));
--------------------------------------

Para evitar que se repita para el mismo ID la cuota del mes y año se tendrá que crear un índice que solo permita para cada uno de los jugadores un solo mes y año

El índice se creara con los campos Cuot_Id_Juga  +   Cuot_ano  +   Cuot_mes

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas