Como Guardar varias filas con un solo Click?

Tengo una tabla de Citas con los campos Fecha_Cita, Hora_Inicio, Hora_Final y Cliente.

Entonces quiero crear un formulario en el que se deba ingresar solo una vez la Fecha Cita, Cliente, Hora Inicio y Hora Final y se guarden "n" cantidad de filas dependiendo del rango de las horas.

Los campos Hora Inicio y Hora Final tienen un cuadro combinado para cada uno de ellos en donde el tipo de origen de la fila es una lista de valores a cada 15 minutos (06:00;06:15;06:30;06:45)

En el formulario registro lo siguiente:

Fecha Cita Hora Inicio Hora Final Cliente

01/01/2014       06:00              06:45            A1

En la tabla debería quedar algo así con un solo Click en el botón guardar:

Fecha_Cita    Hora_Inicio   Hora_Final   Cliente

01/01/2014       06:00              06:45            A1

01/01/2014       06:15              06:45            A1

01/01/2014       06:30              06:45            A1

01/01/2014       06:45              06:45            A1

2 respuestas

Respuesta
1

Has una consulta de anexar o actualizar y agregas un botón que ejecute la consulta

Gracias!  Mira no me queda muy clara tu idea, si me puedes enviar un ejemplo te lo agradecería mucho.

Saludos

Tu idea es crear una tabla donde vengan las citas de cada 15 min, ¿dependiendo el rango de la fecha de inicio y fecha final?

correcto

No quiero  tener que dar las citas una a una sino con un solo click se registren dependiendo del rango de horas.

Pásame las tablas que tienes para ver como lo tienes y pasarte un ejemplo [email protected]

Respuesta
1

Desconozco tu nivel con VBA por lo que te comento de un modo conceptual como puedes hacerlo. Si requieres más ayuda indícalo.

  • Crea un formulario para insertar los cuatro valores. Este formulario debe de ser independiente, es decir, sin tener como origen de datos a la tabla CITAS ni una consulta ...
  • Añade los cuatro campos para añadir los valores (cuadros de texto o combinados)
  • Añade un botón para añadir los registros.
  • Añade código al eveto 'Al hacer clic' de ese botón.

El código debe de hacer lo siguiente:

  • Comprobar que hay algún valor en los cuatro campos (en caso contrario parar la ejecución avisando al usuario con un cuadro de mensaje...). Puedes usar la función IsNull con los valores de los campos y si es True avisar...
  • Comprobar que hora fin es mayor o igual a hora inicio (en caso contrario...)
  • Cargar los valores introducidos en cuatro variables.
  • Escribir un bucle DO UNTIL mivariablehorainicio = mivariablehorafin   .... LOOP

En el bucle se deben de realizar las siguientes acciones:

Una manera sencilla de insertar un registro es usar el método DoDmc. RunSQL para ejecutar una consulta de inserción de datos. La consulta sería algo así como lo siguiente:

    "INSERT INTO CITAS (Fecha_Cita, Hora_Inicio, Hora_Final, Cliente) SELECT (mivariablefecha, mivariablehorainicio, mivariablehorafin, mivariablecliente)"
    Tras la ejecución e inserción del registro debes de usar la función DateAdd para aumentar la mivariablehorainicio en 15 minutos. Algo así como mivariablehorainicio=DateAdd ("n",15,mivariablehorainicio).
      Este bucle insertará registros hasta que mivariablehorainicio sea igual a mivariablehorafin. Los registros tendrán todos la misma fecha, hora fin y cliente, y en el campo hora inicio los valores que correspondan (el inicial el primer registro, el inicial + 15 minutos el segundo, +30...).
      Tras las inserciones el código continuará en la linea siguiente a LOOP en las que puedes usar un cuadro de mensaje para avisar al usuario de que la creación ha sido correcta, de cuantos registros se han insertado...
        Espero te sirva. Cordiales saludos.

        Buenos Días

        LasChanas

        Mi nivel de VBA aun es básico, por lo que hasta el momento siguiendo tus instrucciones logre solamente la validación de campos, lo del bucle no lo había escuchado por lo cual si me ayudas mas en esta parte te lo agradecería.

        Hasta el momento el botón tiene este código:

        If IsNull(txtFecha) Then
            MsgBox "Debe de indicar la Fecha Cita", vbCritical, "Campo Obligatorio"
            txtFecha.SetFocus
            Else
            If IsNull(txtHora_Inicio) Then
            MsgBox "Debe de indicar la hora Inicio", vbCritical, "Campo Obligatorio"
            txtHora_Inicio.SetFocus
            Else
            If IsNull(txtHora_Fin) Then
            MsgBox "Debe de indicar la hora Final", vbCritical, "Campo Obligatorio"
            Else
            If txtHora_Inicio > txtHora_Fin Then
            MsgBox "La Hora Inicial no puede ser mayor a la Hora Final", vbExclamation, "Dato Erróneo"
            Else
            If IsNull(txtCliente) Then
            MsgBox "Debe de indicar el Nombre del Cliente", vbCritical, "Campo Obligatorio"
            ''''''''''''''''''''''''''''BUCLE??????????'''''''''''''''''''''''''''''''''''''''''''''
            ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            DoDmc.RunSQL
        End If
        End If
        End If
        End If
        End If

        Una consideración sobre lo que has escrito. Queda más legible el código si haces las comprobaciones individualmente y añades la salida del código si se cumple alguna.

        If IsNull(mivariablefecha) then

        msgbox(...)

        txtFecha.setfocus

        exit sub

        end if

        Te pongo un ejemplo de bucle. Vendría a continuación de todas las condicionas previas que has validado. Usa el método RunSQL. Yo prefiero los recorsets en código para hacer las inserciones, ya que dan mayor versatilidad, pero este enfoque es más sencillo y para lo que lo necesitas supongo que suficiente.

        Dim miVariableFecha as date, miVariableHoraInicio as date, miVariableHoraFin as date, miVariableCliente as string

        ‘NOTA: debes de definir el tipo de datos adecuado en cada caso (date o string o lo que sea)

        Dim miSQL as string

        miVariableFecha=Me.txtFecha

        miVariableHoraInicio=Me.txtHora_Inicio

        miVariableHoraFin=Me.txtHora_Fin

        miVariableCliente=Me.txtCliente

        DoCmd.SetWarnings False      ‘Con esto evitamos los mensajes de inserción…

        DO UNTIL mivariablehorainicio = mivariablehorafin

        miSQL= "INSERT INTO CITAS (Fecha_Cita, Hora_Inicio , Hora_Final, Cliente) SELECT (miVariableFecha, miVariableHoraInicio, miVariableHoraFin, miVariableCliente)"

        DoCmd.RunSQL miSQL

        miVariableHoraInicio =DateAdd ("n",15, miVariableHoraInicio)

        Loop    

        DoCmd.SetWarnings True

        Ma da el siguiente error:

        Se ha producido el error 3075 en tiempo de ejecución
        Error de sintaxis (coma) en la expresión de consulta '(miVariableFecha, miVariableHoraInicio, miVariableHoraFin, miVariableCliente)'.

        Investigue un poco y parece ser que se le debe dar formato a la fecha pero aun no se resuelve el problema:

        Dim XFecha As Variant
        XFecha = (Format([Fecha_Cita], "dddddd"))

        Saludos

        Hazme el favor de indicarme el tipo de datos de la tabla CITAS para recrearla en un mdb vacío, y poder probar en código la inserción. Cuando me funcione te envío el código que genere.

        Cordiales saludos.

        Buenos Días

        Primero que nada muchas gracias por toda la ayuda que me has brindado.

        La tabla esta diseñada así:

        Nombre del Campo         Tipo de datos

        Fecha_Cita                         Fecha/Hora

        Hora_Inicio                         Fecha/Hora

        Hora_Final                          Fecha/Hora

        Cliente                                Texto

        Saludos

        Me ha creado una tabla con esos cuatro campos, un formulario con ellos y el botón de insertar registros. Te copio el código con el que me funciona correctamente.

        Cordiales saludos.

        Pd: El manejo de fechas y horas siempre exige algunas pruebas, y en cada caso es algo diferente dependiendo de como se definan los campos, las máscaras de entrada, formatos...

        Option Compare Database 
        Option Explicit 
        Private Sub Insertar_Click() 
        On Error GoTo Err_Insertar_Click 
            Dim msg As String, estilo, title As String 
            estilo = vbCritical + vbOKOnly 
            title = "Error en la inserción por falta de datos" 
            msg = "No se han podido crear los registros solicitados por no existir ninguna entrada en el campo " 
            If IsNull(Me.Fecha_Cita) Then 
                msg = msg & "Fecha_Cita." 
                MsgBox msg, estilo, title 
                Me.Fecha_Cita.SetFocus 
                Exit Sub 
            End If 
            If IsNull(Me.Hora_Inicio) Then 
                msg = msg & "Hora_Inicio." 
                MsgBox msg, estilo, title 
                Me.Hora_Inicio.SetFocus 
                Exit Sub 
            End If 
            If IsNull(Me.Hora_Final) Then 
                msg = msg & "Hora_Final." 
                MsgBox msg, estilo, title 
                Me.Hora_Final.SetFocus 
                Exit Sub 
            End If 
            If IsNull(Me.Cliente) Then 
                msg = msg & "Cliente." 
                MsgBox msg, estilo, title 
                Me.Cliente.SetFocus 
                Exit Sub 
            End If 
            If Me.Hora_Inicio > Me.Hora_Final Then 
                title = "Dato Erróneo" 
                msg = "No se han podido crear los registros solicitados al ser la Hora de inicio mayor que la Hra final." 
                MsgBox msg, estilo, title 
                Me.Hora_Inicio.SetFocus 
                Exit Sub 
            End If 
            Dim miVariableFecha As Date, miVariableHoraInicio As Date, miVariableHoraFin As Date, miVariableCliente As String 
            Dim miSQL As String, cuantosRegistros As Integer 
            miVariableFecha = Me.Fecha_Cita 
            miVariableHoraInicio = Me.Hora_Inicio 
            miVariableHoraFin = Me.Hora_Final 
            miVariableCliente = Me.Cliente 
            cuantosRegistros = 0 
            DoCmd.SetWarnings False 
            Do Until CDate(miVariableHoraInicio) > CDate(miVariableHoraFin) 
                miSQL = "INSERT INTO CITAS (Fecha_Cita, Hora_Inicio , Hora_Final, Cliente) SELECT #" 
                miSQL = miSQL & miVariableFecha 
                miSQL = miSQL & "#, #" 
                miSQL = miSQL & miVariableHoraInicio 
                miSQL = miSQL & "#, #" 
                miSQL = miSQL & miVariableHoraFin 
                miSQL = miSQL & "#, '" 
                miSQL = miSQL & miVariableCliente 
                miSQL = miSQL & "';" 
                DoCmd.RunSQL miSQL 
                miVariableHoraInicio = DateAdd("n", 15, miVariableHoraInicio) 
                cuantosRegistros = cuantosRegistros + 1 
            Loop 
            DoCmd.SetWarnings True 
            estilo = vbOKOnly + vbInformation 
            title = "Registros creados correctamente" 
            msg = "Se han creado correctamente " & cuantosRegistros & " registros en la tabla CITAS." 
            MsgBox msg, estilo, title 
        Exit_Insertar_Click: 
            Exit Sub 
        Err_Insertar_Click: 
            MsgBox Err.Description 
            Resume Exit_Insertar_Click 
        End Sub 
        

        ¡Gracias! 

        LasChanas  Demasiado agradecido, me gusta ir aprendiendo poco a poco de VBA y más con tu ayuda  ya aprendí algo nuevo.

        Saludos

        Añade tu respuesta

        Haz clic para o

        Más respuestas relacionadas