** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Nuevo Registro en formulario continuo
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Nuevo Registro en formulario continuo

 Responder Responder
Autor
Mensaje
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 437
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Antonalo Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Nuevo Registro en formulario continuo
    Enviado: 19/Diciembre/2019 a las 16:02
Necesito que al crear un nuevo registro en un formulario de registros continuos aparezcan todos los registros que la ventana (control de formulario)  pueda contener, y el último, el nuevo.

Normalmente, si hay más registros que la capacidad de la ventana, aparece solo el nuevo.  Una de las cosas que he intentado en una ventana en la que caben 7 registros:

DoCmd.GoToRecord , , acNewRec
For i = 1 To 6
DoCmd.GoToRecord , , acPrevious
Next i
DoCmd.GoToRecord , , acNewRec

Pero esto es una chapuza porque repito una orden y porque si el número de registros del formulario es inferior a 6, no puede retroceder 6 veces y da error. Habria que contar el número de registros, la cosa se complica y creo que tiene que haber algo más sencillo, que no tenga que decirle el número de registros que puede contener la ventana.
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 5420
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita mounir Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 19/Diciembre/2019 a las 16:26
Hola!
Lo mas fácil y práctico es ir al ultimo registro ahi te muestra el ultimo y el nuevo:

DoCmd.GoToRecord , , acLast
Un Saludo.
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 5420
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita mounir Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 19/Diciembre/2019 a las 16:46
Hola!


Tienes este ejemplo de diseño de formularios continuos muy interesantes:

http://www.filebig.net/files/3qvQE4fAjA
Un Saludo.
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 437
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Antonalo Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 19/Diciembre/2019 a las 17:47
Hola Mounir, el problema es que si voy al último, los registrosn se desplazan hacia arriba y solo me muestra dos, el último y el nuevo. Lo que me vendría bien es que se muestren tantos registros como de la capacidad de la ventana y al final el nuevo

En el ejemplo que me has mandado, el formulario SF_BooksSub, funciona como a mi me gustaría que funcionara el mío pero los eventos que tiene asignados no parece que se ejecuten cuando le doy a nuevo registro, total que no entiendo. ¿Será tal vez una propiedad del formulario?
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 5420
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita mounir Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 19/Diciembre/2019 a las 19:36
Hola!
Para solucionar este problema utiliza este código:


With Me.Recordset   'usa recordset 
        .MoveLast       'pasar al último registro, se muestra en la parte superior de la lista
        .Move -6       'subir 6 que te caben en la pantalla, muestra más registros, la última fila baja
        .MoveLast    'Vuelve al último de nuevo
    End With


Respecto al ejemplo pues en el formulario padre "F_BooksMain_CF" ahí donde tienes el código que maneja el "BooksSub_CF"
Un Saludo.
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 5420
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita mounir Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 19/Diciembre/2019 a las 19:48
Hola!

Tambien funciona así:-

DoCmd.GoToRecord , , acGoTo, Form.Recordset.RecordCount - 6
DoCmd.GoToRecord , , acLast
Un Saludo.
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 12324
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 19/Diciembre/2019 a las 22:05
Yo acabo de probar:

DoCmd.GotoRecord ,, acLast

Y se ha posicionado en el último registro mostrándome todos los anteriores (caben 58 registros y la tabla tiene 112)

No se si tiene importancia pero el subformulario es en vista Hoja de datos.

Un saludo

Xavi, un minyó de Terrassa

Mi web
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 437
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Antonalo Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 20/Diciembre/2019 a las 17:08
Hola Xavi, es un subformulario y he creado un botón en el formulario principal para comprobar lo que tu dices, en el propio subformulario no puedo poner ningún botón porque en la vista hoja de  datos no se ve.

el codigo que he puesto es simple:

Private Sub Comando106_Click()
DoCmd.GoToControl "SUBEVOLUCIONCRHOME"
DoCmd.GoToRecord , , acLast
End Sub

Y en vista hoja de datos va al ultimo, y el ultimo está al final de la ventana, pero en vista de formularios continuos solo se ven dos, el ultimo y el nuevo. Cosas de access.

Con respecto a lo que me dice Mounir, tengo aún que probar el código, lo de Move -6 me parece que está mucho mejor que mi bucle.

Sin embargo, la base de datos que me ha pasado en el enlace me parece mucho mejor, no tengo que decirle al codigo los registros que caben en el formulario. Esa base es un poco difícil para mi, me está llevando tiempo descubrir como  funciona


Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 437
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Antonalo Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 20/Diciembre/2019 a las 23:16
El primer problema que tengo que abordar es el matemático:
Sea R el número de registros del formulario, y por Mounir se que:

R = Form.Recordset.RecordCount
Sea V el número de registros que caben en la ventana del formulario, ese número se lo digo yo.

Está claro que si metemos tantos registros como podamos en la ventana, empezando por el último,
Se quedarán fuera R-V registros, y el primero que se visualizará será el R-V+1

Si añadimos un nuevo registro a la ventana, ahora el primero sera R-V+2

Tenemos que tener en cuenta que R-V+2 no puede ser menor que 1, ya que no existe el registro 0 ni registros negativos. Por tanto, tenemos que decirle al código que tome como primer registro de la ventana el registro resultado de esta fórmula condicional al que llamaremos P

P = IIf(R-V+2<1,1,R-V+2)

Ahora tenemos que tener en cuenta el comportamiento de access cuando le mandamos ir a un registro:

Después de muchas pruebas, llego a la conclusión de que el modo seguro es:

Ir al primero, al nuevo, a P y otra vez al nuevo

Private Sub CmdNuevoReg_Click()

Dim R As Integer, V As Integer, P As Integer

R = Me.Recordset.RecordCount
V = 7
P = IIf(R - V + 2 < 1, 1, R - V + 2)

DoCmd.GoToRecord , , acFirst
DoCmd.GoToRecord , , acNewRec
DoCmd.GoToRecord , , acGoTo, P
DoCmd.GoToRecord , , acNewRec
End Sub


Me funciona, no es lo que buscaba porque no quería tener que decirle a access que V = 7 
Pero el código no es demasiado largo. 

Muchísimas gracias Xavi y Mounir.



Arriba
raipon Ver desplegable
Moderador
Moderador


Unido: 10/Diciembre/2004
Localización: Desconocida
Estado: Sin conexión
Puntos: 4023
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita raipon Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 21/Diciembre/2019 a las 09:38
Hola,

para saber a priori el número de registros que puede mostrarte el subformulario, puedes hacer un cálculo parecido a este:

Altura control subformulario - Altura encabezado (del formulario anidado como subformulario) - Altura pie (del formulario anidado como subformulario) 

y el resultado de la resta anterior lo divides por la altura de la sección detalle.

Saludos.


Editado por raipon - 21/Diciembre/2019 a las 09:39
Ramon desde Terrassa.

Mi blog
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 437
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Antonalo Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 21/Diciembre/2019 a las 11:32
Si, raipon, no creas que no lo había pensado. Es lo que tendré que hacer si quiero que esto se ejecute para cualquier formulario que me interese sin tener que decirle cuantos registros caben. Mientras estudio la base que me pasó mounir, esto me puede servir. 

Podéis cerrar
Arriba
mounir Ver desplegable
Colaborador
Colaborador


Unido: 09/Febrero/2009
Localización: Asturias-España
Estado: Sin conexión
Puntos: 5420
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita mounir Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 21/Diciembre/2019 a las 11:34
Hola!

Te explico como funciona el ejemplo "Method - A (Continuous Form Mode - Via Command Button)" de la Base de Datos que te propuse:-

Formulario Principal:-

1- Es independiente sin origen de registro y solo tiene un Boton para guardar el registro del subformulario.

2- En su evento al cargar:-

       DoCmd.SetWarnings False                'Desactivamos el aviso de ejecutar la consulta
        DoCmd.OpenQuery "Q_UpDt_Books_CFLoad" 'Marcar el campo (FCheck)
                                               'para todos los registros a "C" para formato condicional
                                               'para cambiar de color verde si es un registro actual o reciente, o
                                               'a color naranja si es el anterior al actual o reciente
        DoCmd.SetWarnings True                 'Activamos el aviso de ejecutar la consulta
        SF_BooksSub.Requery                    'Actualizamos el Subformulario
        SF_BooksSub.SetFocus                   'Enviamos el foco al subformulario y
        SF_BooksSub("TxtAuthor").SetFocus      'y le situamos en el campo TxtAuthor



Boton Comando:- ejeculta el siguiente código:-

     If SF_BooksSub("TxtNew") > 0 Then ' Comprueba si hay datos en espera de entrada
        SF_BooksSub.SetFocus
        SF_BooksSub.Form.P_NewRec    'Procedimiento público que tiene el Subformulario para insertar el contenido de los
                                    'cuadros de texto independientes en la tabla de datos.
     Else
        MsgBox "No Fresh Data"
     End If                     


SUBFORMULARIO BooksSub_CF:-

1- Su origen de registro es la consulta "Q_Books_CF" que viene ordenada de forma ascendente por el campo (FCheck)
y así nos ordena el subformulario por el registro reciente.
2- El campo (FCheck) se le asigna la letra (A) >>> Color Verde para los registros Recientes actulaes, Letra (B)
>>> Color Naranja regsitro anterior al actual o reciente y la letra (C) para los demas registros.
3. Mírate el formato condicional de todos los controles tanto independientes como los otros oara entender
el comprtamiento de los colores.
4- Las Consultas de insercion (Q_UpDt_Books_CFNew) y (Q_UpDt_Books_CFLoad) estan relacionadas con lo dicho en los puntos
2 y 3.
5- Procedimiento público que tiene el Subformulario para insertar el contenido de los cuadros de texto independientes
en la tabla de datos (T_Books_CF).
   
Public Sub P_NewRec()
    DoCmd.SetWarnings False
      DoCmd.OpenQuery "Q_UpDt_Books_CFNew"                            'Actualiza el valor existente de FCheck De "A" a "B"
    DoCmd.SetWarnings True
    
    DoCmd.GoToRecord , , acNewRec
                                                                      ''Mover datos de controles independientes a a la tabla
    Author = TxtAuthor
    Title = TxtTitle
    Stock = TxtStock
    FCheck = "A"                                                     ' Marcar (A) para registro recién añadido.
    
                                                                     'Borrarmos contenido de los controles independientes
    TxtAuthor = Null
    TxtTitle = Null
    TxtStock = Null
    
    Me.Requery                                                       'Trae el registro recién agregado arriba actualiazndo
                                                                     'el subformulario
    
   TxtAuthor.SetFocus                                               'Listo para la próxima entrada
                                                                    'Nota - Valor del campo FCheck (A - Nuevo récord, B - Registros                                                                     'recientes,
                                                                    'C - Registros antiguos)
                                                                    'La orden es según FCheck
End Sub


Espero que te sirva y te ayude a adaptarlo a tus necesidades
Un Saludo.
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 437
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Antonalo Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 21/Diciembre/2019 a las 17:30
Ya lo he estudiado, muchas gracias por las explicaciones, me han servido para entender.

No sabía que podía ser de SF_BooksSub("TxtNew") porque hasta ahora yo hacía
Me.SF_BooksSub.Form!TxtNew 

Ahora he aprendido a hacer referencia a un control de un subformulario, de otra manera.

Los colores que se van poniendo es una buena idea.

Creo que el resto de formularios con los otros dos métodos podré estudiarlos por mi cuenta. también son muy interesantes. 
La idea es que cuando se abre el formulario, el nuevo registro ya está creado y ordenado mediante un campo que pone el registro vacio (menos ese campo)  arriba del todo. El código se encarga de comprobar si algo se modifica en el nuevo registro para crear otros, para colorearlos etc.


Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 437
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Antonalo Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 11/Febrero/2020 a las 18:59
Podéis cerrar este hilo, siento haberlo dejado abierto
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable