Access - Pregunta a Jefferson

   
Vista:

Pregunta a Jefferson

Publicado por AndresRos (6 intervenciones) el 15/11/2011 19:47:09
Hola amigo, te cuento que aprendo Access desde este foro. Ví dos artículos en los que participaste: Primero: http://www.lawebdelprogramador.com/foros/Access/1296245-Error_en_la_funcion_DLookup.html
Yo me hice mi propia base de datos con sus tablas y los campos tal cual decía este artículo y todo funcionó de maravillas. Luego trate de hacer que el campo utilizado como código en vez de ser tipo texto sea Autonumerico y ahí empezaron los problemas. Como decía que el problema era por los tipos es ahí dónde leo tu segundo Artículo: http://www.lawebdelprogramador.com/foros/Access/1296104-Abrir_Formulario_desde_otro_en_vista_Hoja_de_Datos.html.
Logré que el formulario se abriera pero la sorpresa que me llevo es que se habre en modo agregar datos. No con el registro seleccionado en el form principal. Te muestro mi código:

Private Sub txtcodCliente_Click()
Dim vPeli As Integer
vPeli = Nz(Me.txtCodCliente.Value, "")
'Esto es por si el control no tuviera valor
If vPeli = Null Then Exit Sub
'Abrimos el formulario FrmPeliculas, filtrado y a punto para su edición
DoCmd.OpenForm "frmModCli", , , "'[txtCodCli]'= '" & vPeli & "'", acFormEdit
End Sub

Fíjate que lo que hice distinto fueron dos cosas, primero declarar la variable como Integer en vez de Variant ya que mi campo es Númerico. Luego poner entre '' mi campo [txtCodCli], por ser número. Si no pongo este último entre ' ', al hacer click y ejecutar el código me sale una ventanita soliciando que ingrese el valor de txtCodCli.
Bueno espero haberme explicado. Creo que no me expliqué muy bien. Yo aprendo access realizando los problemas y soluciones que van saliendo en el foro, y este se me complicó un poquito. Gracias!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Neckkito

Pregunta a Jefferson

Publicado por Neckkito (1104 intervenciones) el 15/11/2011 20:15:02
Hola!

Supongo que Jefferson no se ofenderá si respondo yo, ya que el código que estás utilizando lo puse para ayudar a Ángel.

Te pongo mis comentarios sobre el mismo código
...
Private Sub txtcodCliente_Click() -> Si utilizas este tipo de nomenclatura, y dando por supuesto que el valor que te recoge este campo es un entero, deberías adecuar el nombre del campo con su tipo. Así como está proporciona una información confusa si lees el código rápido por encima, porque esperas encontrarte un String y no un Integer. No tiene mayor importancia, pero lo ideal hubiera sido llamarlo intcodCliente (por ejemplo, si es un booleano el prefijo suele ser bln, si es una fecha suele ser dtm, si es un Long suele ser lng, etc.)
Dim vPeli As Integer -> vPeli es una variable que queda muy "fea" para tu caso, porque no proporciona ninguna información "intuitiva". Podrías utilizar un nombre de variable con algo más de sentido. Por ejemplo vCli
vPeli = Nz(Me.txtCodCliente.Value, "") -> La función NZ te devuelve el valor que le indiques si en el campo no hay ningún dato; es decir, es Null. En este caso te devuelve una cadena de texto vacía (las dos comillas del final). Si estás trabajando con números sería mejor que te devolviera un valor numérico. Yo usualmente suelo utilizar el cero.
'Esto es por si el control no tuviera valor
If vPeli = Null Then Exit Sub -> Esta expresión infringe dos normas: la sintáctica y la de declaración de variables. Para indicar si un valor es nulo la expresión debería ser If isnull(vPeli) then... Por otra parte, si permites que vPeli coja el valor Null ya no la puedes declarar como integer, sino que deberías declararla como Variant. Al asignar el valor de vPeli a través de la función NZ te evitas precisamente que pueda coger el valor null (porque si es Null el valor del campo txtcodCliente vPeli cogería el valor cero).
'Abrimos el formulario FrmPeliculas, filtrado y a punto para su edición
DoCmd.OpenForm "frmModCli", , , "'[txtCodCli]'= '" & vPeli & "'", acFormEdit -> El filtro que se está aplicando aquí es para cadenas de texto (porque va entre comillas simples), pero no es válido para números. Para valores numéricos el filtro es, digamos, "directo"
End Sub
...
En definitiva, tu código podría quedar de la siguiente manera:
...
Private Sub txtcodCliente_Click() 'Con la salvedad del tipo de dato que ya te he comentado
Dim vCli As Integer
vCli = Nz(Me.txtCodCliente.Value, 0)
'Esto es por si el control no tuviera valor
If vCli= 0 Then Exit Sub
'Abrimos el formulario frmModCli, filtrado y a punto para su edición
DoCmd.OpenForm "frmModCli", , , "[txtCodCli]=" & vCli, acFormEdit
End Sub
...
A ver si así te funciona bien. Para lo que necesites, ya sabes ;

Un saludo,
Neckkito (http://neckkito.eu5.org)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pregunta a Jefferson

Publicado por Jefferson (381 intervenciones) el 15/11/2011 21:46:31
Hola Andres Ros

Saludos Neckkito, claro que no me molestaria, no hay porque..... de hecho mire tu pagina y es muy buena http://neckkito.eu5.org Te felicito y exitos....

Andres: el codigo que te ha pasado el amigo Neckkito es justo lo que necesitas, ahora bien, yo que tu no declararia la variable como Integer pues esta solo procesa 2 bytes de datos
quiere decir que si deseas filtrar un numero como 35254 va a producir un Desbordamiento, lo recomendable es usa la variable Long que esta si acepta 4 bytes de datos mas de 2 mil millones de numeros


Saludos y suerte
Desde Venezuela
Jefferson
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pregunta a Jefferson

Publicado por AndresRos (6 intervenciones) el 15/11/2011 21:52:19
Bueno, veo que juntos son una de las grandes ayudas de este foro. Gracias Neckkito y Jefferson. Ahora voy a probar lo que me explican. He aprendido mucho de ustedes por este foro y también por todo que tiene Neckkito en su página. Siempre fui un anónimo aprendís pero este vez no daba con la solución. Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pregunta a Jefferson

Publicado por AndresRos (6 intervenciones) el 15/11/2011 22:58:03
Hola Neckkito, te cuento que he probado tu código y al hacer doble click para abrir el formulario frmModCli se habre una ventanita dónde me solicita que ingrese el valor de txtCodCli. Traté de abrir el form con una macro pero dice lo mismo..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Neckkito

Pregunta a Jefferson

Publicado por Neckkito (1104 intervenciones) el 16/11/2011 07:56:19
Hola!

Probablemente el problema tenga que ver con los nombres de tus campos. Prueba una cosa:

- Por parte del subformulario (donde haces click), edítalo en modo diseño y selecciona el campo que tiene el evento. Te vas a propiedades -> Pestaña Otras -> Nombre, y comprueba si el nombre que te aparece ahí es txtCodCliente. Si no lo es le escribes este nombre.

- Por parte del formulario (por el tema del filtro): edítalo en modo diseño y compruebas si el campo que te recoge el código cliente se llama txtCodCli (propiedades -> Pestaña Otras -> Nombre). Si no lo es lo cambias

La otra opción es que cojas los nombres de estos dos elementos que tienes y los cambies en el código.

¡Suerte!

Neckkito (http://neckkito.eu5.org)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Neckkito

Pregunta a Jefferson

Publicado por Neckkito (1104 intervenciones) el 16/11/2011 07:48:21
Hola, Jefferson:

Aunque parezca un poco estereotipado de verdad que te agradezco muchísimo tu comentario y tus felicitaciones.

Sinceramente, muchas gracias

Para lo que necesites ya sabes... ¡y espero poderte pedir ayuda si yo la necesito!

Un gran saludo

Neckkito (http://neckkito.eu5.org)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pregunta a Jefferson

Publicado por AndresRos (6 intervenciones) el 16/11/2011 15:14:22
Hola, bueno al final he podido abrir mi subform. Les cuento a ver si me pueden dar la explicación teórica del por qué funcionó. No tenía problema en los nombres de mis controles. Mi cuadro de texto en la propiedad nombre es txtCodCli, su origen del control es CodCliente. Este último es el que utilicé y funcionó, así:
Private Sub intCodCliente_Click()
Dim vCli As Integer
vCli = Nz(Me.intCodCliente.Value, 0)
'Esto es por si el control no tuviera valor
If vCli = 0 Then Exit Sub
'Abrimos el formulario frmModCli, filtrado y a punto para su edición
DoCmd.OpenForm "frmModCli", , , "[codCliente]=" & vCli, acFormEdit
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Neckkito

Pregunta a Jefferson

Publicado por Neckkito (1104 intervenciones) el 16/11/2011 17:48:50
Hola, Andrés:

Lo que comentas no tiene mucho sentido para mí. Vamos a ver...
Cuando insertas un cuadro de texto te aparecen automáticamente dos controles: la etiqueta del campo y el propio campo. En este caso la etiqueta a nosotros no nos sirve para nada. Hay que centrarse en el campo.
Cuando tu escribes vCli = Nz(Me.intCodCliente.Value, 0), lo que estás diciendo es:
En el formulario en el que estoy (ME), del campo intCodCliente, cógeme su valor. Y ese intCodCliente es el valor que en ese campo (no etiqueta) aparece en la pestaña Otras->Nombre.
Y lo mismo puede decirse del campo [codCliente] de frmModCli. El nombre del campo (no de la etiqueta) será el que te aparece en la misma pestaña, en la misma propiedad "Nombre".

Si echas un vistazo a lo que te he comentado en tu BD lo verás... a los campos, no a sus etiquetas.

Un saludo,


Neckkito (http://neckkito.eu5.org)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar