Guardar datos de un Formulario según el año seleccionado

Como puedo hacer para que los registro que cargué en un formulario se guarden en las Tablas según el año, Por ej.: yo cargo todos los datos en distintos campos independiente de un Formulario y cuando voy a guardar quiero que me pregunte el año (para que así se guarde según el año en la Tabla_2020 o Tabla_2021 o Tabla_2022).

2 Respuestas

Respuesta
1

No puede insertar datos sin validar que exista la tabla, en caso que no exista se debe permitir crearla, la respuesta que le dan "da respuesta" a su pregunta esta lejos de seguir los lineamientos de programación. A pesar que ha valorado la respuesta he preparado este ejemplo:

- Valida que exista la tabla

- Permite crear la tabla para el año (si no existe)

- Valida la integridad de los datos.

- Utiliza un formulario para recoger el año a registrar

- Con base en 2 funciones y 2 procedimientos realiza el trabajo.

Hago clic en el botón Guardar y se abre el formulario para seleccionar el año.

Al hacer cli en Aceptar se pregunta si está de acuerdo con el año

Si hace clic en Si, nos informa sobre la creación satisfactoria.

Observe que se ha creado la tabla para Tabla_2022 (con base en el diseño de la tabla Tabla_2020)

CÓDIGO DEL BOTÓN GUARDAR DEL FORMULARIO frmDatos

Private Sub Comando6_Click()
 If IsNull(Me.ctlnota) Or IsNull(Me.cboServicio) Or IsNull(Me.ctl_identificador) Then
    MsgBox "Verifique que no falten datos", vbInformation, "Cuidado.."
    Exit Sub
 End If
  DoCmd.OpenForm "frmPeriodo"
End Sub

CÓDIGO DEL BOTÓN ACEPTAR DEL FORMULARIO frmPeriodo

Private Sub btnInsertar_Click()
 If IsNull(Me.cboPeriodo) Then
   MsgBox "Seleccione un año de la lista", vbInformation, "Cuidado..."
   Me.cboPeriodo.SetFocus
   Exit Sub
 End If
 If MsgBox("¿Está seguro que registra la información del año " & Me.cboPeriodo & "?", vbQuestion + vbYesNo + vbDefaultButton2, "Grabando..") = vbYes Then
   crear_tabla (Me.cboPeriodo)
   CurrentDb.Execute "INSERT INTO " & strTabla & "(nota,servicios,identificador) VALUES ('" & Forms!frmDatos!ctlnota & "'," & _
   Forms!frmDatos!cboServicio & "," & Forms!frmDatos!ctl_identificador & ")"
   DoCmd.Close acForm, Me.Name
   MsgBox "Registro adicionado OK", vbInformation, "Le informo"
 End If
End Sub

CÓDIGO DEL BOTÓN CANCELAR DEL FORMULARIO frmPeriodo

Private Sub btnCancelar_Click()
  DoCmd.Close acForm, Me.Name
End Sub

CÓDIGO DEL MODULO VBA

Option Compare Database
Option Explicit
Public strTabla As String
Public Function crear_tabla(periodo As Integer)
'Asume que existe ya una tabla base para copiarla,
 'en caso contrario se debe cambiar la función para
 'crear la tabla mediante SQL.
  strTabla = "Tabla_" & periodo
  If existe_tabla(strTabla) = False Then
   DoCmd.CopyObject "", strTabla, acTable, "Tabla_2020"
   CurrentDb.Execute "DELETE * FROM " & strTabla
   'reinicio autonumerico
   DoCmd.RunSQL "ALTER TABLE " & strTabla & " ALTER COLUMN id COUNTER(1,1);"
  End If
End Function
Public Function existe_tabla(miTabla As String) As Boolean
Dim db  As Database
Dim tbl As TableDef
Dim existe As Boolean
Set db = CurrentDb
For Each tbl In db.TableDefs
 If tbl.Name = miTabla Then
  existe = True
  Exit For
 End If
Next
If existe = True Then
  existe_tabla = True
Else
existe_tabla = False
End If
Set db = Nothing
End Function

Una recomendación no utilice input() para tomar información es un mal habito de programación.

Aunque tiene código o "Enciclopedia Británica" como dicen otros, pero es la forma de manejar la información. Si quiere el ejemplo lo puede solicitar a [email protected] favor en el asunto anotar la consulta.

Muchas Gracias Eduardo, muy buen aporte, también me sirvió mucho 

Hola, una consulta más, siguiendo con el ejemplo anterior, como hago para que el año que puse para crear la Tabla, se me guarde también en un campo "Año" junto con los otros datos (Nota, Servicios, Identficador) en la la tabla según el año indicado

Debe agregar a la tabla modelo el campo año (prefiero periodo para no utilizar caracteres que causan problema al exportar datos).

Supongamos que a la tabla Tabla_2020 se toma como modelo le adicionamos el campo periodo, tipo entero. En este caso el código del evento Aceptar quedaría:

Private Sub btnInsertar_Click()
 If IsNull(Me.cboPeriodo) Then
   MsgBox "Seleccione un año de la lista", vbInformation, "Cuidado..."
   Me.cboPeriodo.SetFocus
   Exit Sub
 End If
 If MsgBox("¿Está seguro que registra la información del año " & Me.cboPeriodo & "?", vbQuestion + vbYesNo + vbDefaultButton2, "Grabando..") = vbYes Then
   crear_tabla (Me.cboPeriodo)
   CurrentDb.Execute "INSERT INTO " & strTabla & "(nota,servicios,identificador,periodo) VALUES ('" & Forms!frmDatos!ctlnota & "'," & _
   Forms!frmDatos!cboServicio & "," & Forms!frmDatos!ctl_identificador & "," & Me.cboPeriodo & ")"
   DoCmd.Close acForm, Me.Name
   MsgBox "Registro adicionado OK", vbInformation, "Le informo"
 End If
End Sub

Observe como he adicionado el campo periodo en inserto el contenido del cuadro combinado donde se selecciona el año.

Respuesta
1

Convendría ver una imagen del formulario, ya que se puede hacer de muchas formas. Por ejemplo, si tengo el formulario con unos cuadros de texto

Cuando pulso el botón

Escribo el año y cuando pulso Aceptar

En este caso en particular, ya que como te decía habría que ver el formulario, el código del evento Al hacer clic del botón es

Private Sub Comando54_Click()
DoCmd.SetWarnings False
Dim t As String
t = "Tabla" & "" & InputBox("Escriba el año donde lo quiera guardar", "Muy amable, gracias")
DoCmd. RunSQL "insert into " & t & "(cliente, nombrecontacto, pais)values(cliente, contacto, nacion)"
End Sub

Hola, en este formulario tengo campos independientes (cuadro de texto) donde cargo "Nota" (texto), "Servicios" (numérico) y un "Identificador" (numérico), cuando le doy un click en "Guardar", ahí quiero que me pregunte el año para guardar en la tabla que según corresponda (Tabla_2020 o Tabla_2021 o Tabla_2022), o sea, yo cargo Nota, Servicios e Identificador y quiero guardar en el año 2022 o sea en la Tabla_2022; y después cargo otra Nota, Servicios e Identificador pero quiero guardar en el año 2020 o sea en la Tabla_2020. En definitiva, cuando vaya a Guardar los datos que cargué, quiero poner el año y que se direccione o se guarde en la Tabla que corresponda

Pues es precisamente lo que te decía.

Suponiendo que los controles se llaman como aparece en las etiquetas, Nota, Servicios e Identificador, en el evento Al hacer clic del botón puedes poner lo que te decía antes

Private Sub Comando54_Click()
DoCmd.SetWarnings False
Dim t As String
t = "Tabla" & "" & InputBox("Escriba el año donde lo quiera guardar", "Muy amable, gracias")
DoCmd. RunSQL "insert into " & t & "(campoA, campoB, campoC)values(nota, Servicios, Identificador)"
End Sub

Los campos de destino y origen no tienen porque llamarse igual( por eso le he puesto CampoA,...), pero sí ser de datos coherentes, es decir que si el CampoA de la Tabla2020 es texto, Nota tiene que ser texto, si es numérico, ambos deben ser numéricos, etc.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas