Imprimir página | Cerrar ventana

Valor numérico predeterminado

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=86742
Fecha de impresión: 27/Marzo/2026 a las 04:08


Tema: Valor numérico predeterminado
Publicado por: Antonalo
Asunto: Valor numérico predeterminado
Fecha de publicación: 24/Julio/2023 a las 11:53
Tengo una base para controlar todas las canciones que tengo en mis cds etc...

tengo una tabla, Albumes con campos IdAlbum, Album....

y otra tabla Grabaciones:Orden, IdTema, IdAlbum, IdInterprete....

Tengo un formulario principal basado en la tabla albumes
y un formulario secundario basado en Grabaciones y esté enlazado al principal mediante IdAlbum=IdAlbum

Lo que quiero:

Que en el subformulario Grabaciones, el campo orden tenga el valor predeterminado de Nº de registros +1 (para ese idalbum).

Lo he intentado en el panel de propiedades del campo(valor predeterminado) pero no lo sé hacer.

Y mediante VBA:

Private Sub Orden_DblClick(Cancel As Integer)

   If Me.NewRecord Then

     Me.Orden = DMax("Orden", "Grabaciones", "IdAlbum =" & Me.Parent.IdAlbum) + 1

    End If
   
End Sub

Y así me funciona, pero en un primer código, intenté:
 en vez de Me.Parent.IdAlbum, puse me.IdAlbum

y no funcionaba porque al ser un nuevo registro, IdAlbum o es nulo y en el origen de registros está Grabaciones*, pero no hay ningún control que se llame IdAlbum, no lo necesito porque el campo con el enlace ya se rellena él solo.

El caso es que lo actual funciona porque existe el formulario padre pero ¿y si no existiera?

El evento lo he probado con el doble clic pero mi idea seria ponerlo al activar, O en propiedades, sin VBA










Respuestas:
Publicado por: Mihura
Fecha de publicación: 25/Julio/2023 a las 10:14
Puedes controlar si está cargado 'el principal' con el nombre del formulario activo:

Screen.ActiveForm.Name


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Kublai
Fecha de publicación: 25/Julio/2023 a las 10:16
Muchas gracias. Solucionado. Por favor, se puede cerrar el hilo



Publicado por: Mihura
Fecha de publicación: 25/Julio/2023 a las 10:28
Kublai,

¿tú eres Antonalo?


-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Kublai
Fecha de publicación: 25/Julio/2023 a las 10:30
No.
Me llamo Juan


Publicado por: Kublai
Fecha de publicación: 25/Julio/2023 a las 10:32
Perdón, me he metido sin querer en el hilo de otro. Lo siento mucho!!!


Publicado por: Antonalo
Fecha de publicación: 25/Julio/2023 a las 10:43
Hola Mihura. Ese no es el problema, el formulario principal está cargado porque estoy delante de él, metiendo datos en el subformulario Grabaciones.

Creo que me he dado cuenta de mi error. En un nuevo registro de un subformulario, no puede existir el valor del  campo común hasta que no se introduce algún dato, y es entonces cuando el campo del subformulario toma el valor de form. principal. Y por tanto:

Me.Orden = DMax("Orden", "Grabaciones", "IdAlbum =" & Me.IdAlbum) + 1 
no puede funcionar, no existe Me.IdAlbum, pero sí  Me.Parent.IdAlbum

Lo que voy a hacer es que este código se ejecute después de actualizar el siguiente cuadro de texto, por ejemplo el tema, (el título de la canción) y ya le ponga el orden, claro que tendré que ir introduciendo las canciones en su orden dentro del CD.

No obstante, me queda la duda de si no habría alguna fórmula para introducir dentro del panel de propiedades del cuadro de texto "Orden" en la pestaña Datos , en el apartado "valor predeterminado", y no recurrir a VBA.

¿Sería esto posible?
muchas gracias Mihura








Publicado por: Mihura
Fecha de publicación: 25/Julio/2023 a las 10:58
¿ has probado en el evento justo antes de guardar si ya hay valores 'reales' ?



-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Antonalo
Fecha de publicación: 25/Julio/2023 a las 11:44
Si hubiera valores reales en un nuevo registro, no sería un nuevo registro, digo yo.
La cuestión es que yo le estaba pidiendo a un nuevo registro de un subformulario, antes de introducir nada, que introduzca el valor del campo común, y , según he comprobado, el campo común del subformulario solo toma el valor del formulario principal después de introducir algún dato en el nuevo registro del subformulario. Es decir, que estaba pidiendo algo imposible, preguntando un valor que todavía no existe. 

Así que ahora lo que hago es introducir en primer lugar el título de la canción y después de actualizar:

Private Sub IdTema_AfterUpdate()
    If Me.NewRecord Then    
       Me.Orden = DMax("Orden", "Grabaciones", "IdAlbum =" & Me.IdAlbum) + 1
    End If
End Sub

y aquí no necesito Me.Parent.IdAlbum, porque después de actualizar, ya existe IdAbum


Ahora me surge la duda de si no habría alguna manera de extender este código a cualquier campo del nuevo registro, es decir, que tanto si meto primero el título, como el interprete o los demás campos, el campo Orden se rellene solo?  ¿Quizás en los eventos afterInsert, o BeforeInsert?

Lo que más me gustaría sería, como antes he comentado, en las propiedades del cuadro de texto, en valor predeterminado




Publicado por: Mihura
Fecha de publicación: 25/Julio/2023 a las 11:48
Créate una función y asígnala a los campos que quieras (podría ser en después de cambiar).

-------------
Jesús Mansilla Castells.
Saludos desde Móstoles.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Antonalo
Fecha de publicación: 25/Julio/2023 a las 12:14
He puesto este código, es más corto que hacer una función y asignarla a todos los controles:

Private Sub Form_AfterInsert()
  Me.Orden = DMax("Orden", "Grabaciones", "IdAlbum =" & Me.IdAlbum) + 1  
End Sub

Esto funciona sea cual sea el campo por donde empiece, y me puedo olvidar de poner el numerito en Orden.


Muchas gracias Mihura,. podéis cerrar el hilo




Imprimir página | Cerrar ventana