In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Realizar mantenimiento dbf

Foro público de Xailer en español
Responder
fredy[1]
Mensajes: 218
Registrado: Mar Mar 08, 2005 2:03 am

Realizar mantenimiento dbf

Mensaje por fredy[1] »

Hola,
Estoy preparando un mantenimiento de una dbf a través de dataset y un dbnavigator y me estoy encontrando con algunos problemillas que os quiero comentar.
1.- El mantenimiento tiene una serie de DBCheckbox con atajos de teclado y me he fijado que aunque no esté en modo de edición, si pulso el atajo del teclado, el checkbox se marca y se desmarca. Esto no pasa si intento marcarlo con el ratón. De todas formas, si me muevo a otro registro y vuelvo al anterior, las marcas que he puesto con los atajos desaparecen. No es un problema muy grave, pero sí que puede resultar un tanto confuso.
2.- ¿Cuando estoy editando un campo, hay alguna manera de saber si es un registro nuevo o estoy modificando uno que ya existe?. En mi ejemplo, el campo NIF no se puede repetir y quiero que si estoy en edición lo salte. Para hacerlo he tenido que crear un DATA lInsertar que voy cambiando a mano, pero mejor si me lo dice Xailer.
3.- Para saltarme el campo NIf si estoy editando, el método OnCheckState me devuelve ::lInsertar. Así si estoy añadiendo puedo entrar y si estoy modificando no. Me he dado cuenta de que si lInsertar:= .f. y pulso sobre el campo Nif, el texto se pone en gris (desactivado). ¿Hay alguna forma de que el texto salga en negro? he probado con la propiedad nClrText pero no me hace caso.
4.- Para comprobar si el nif que me introducen ya existe, utilizo el evento OnExit, que por cierto, en la documentación pone que devuelve Nil y realmente devuelve .t. o .f. para indicarnos si pasamos al siguiente control o no.
5.- En el OnExit intento averiguar el valor que me han introducido en el DbEdit a través del método VarGet(), pero me da siempre una cadena vacía. oSender:FieldGet() tampoco me funciona.
6.- Al utilizar OnExit y estar en modo de visualización el programa se empeña en validar el OnExit cada vez que el DBEdit pierde el foco. ¿Hay alguna forma de saber si estoy visualizando o editando?. La idea es que si estoy visualizando, OnExit devuelva siempre .t. y si estoy modificando o añadiendo se procese.
7.- Tengo un DBListbox con una serie de valores cargados y cuando añado un nuevo registro, me mantiene el valor del registro que tenía seleccionado antes de insertar. ¿No se tendría que poner en blanco como el resto de los campos, o en todo caso, con el primer valor de la lista?
8.- Si cambio la propiedad lPushed de un botón desde el IDE, me hace caso, pero la visualiza siempre con el valor .f.
9.- La creación del formulario ha sido muy rápida, pero he notado que se pierde mucho tiempo en asignar a cada DBEdit el valor. Un pequeño cambio en el IDE que lo haría más cómodo es que el combobox de la propiedad oDataField del DBEdit se desplegara por completo porque tal y como está ahora sólo deja ver 8 ó 9 campos de la dbf y hay que estar bajando con la barra de scroll constantemente.
10.- Me he fijado que puedo cambiar la propiedad cVarName de tal manera que le puedo dar el mismo nombre a dos objetos distintos (un label y un edit) ¿No dará problemar esto?.
11.- Me parece que el evento OnChange del dataset se dispara por primera vez antes de estar construidos los DataControl asociados, por lo tanto si intento llamar a algún datacontrol dentro del OnChange me da un error al iniciar el programa.
12.- ¿Cómo se hacía para poder pasar de un campo a otro con Enter en lugar de con Tab?
Bueno, de momento nada más.
Un saludico,
Fredy
---
avast! Antivirus: Saliente mensaje limpio.
Base de datos de Virus (VPS): 0512-1, 25/03/2005
Comprobado en: 26/03/2005 3:26:14
avast! tiene los derechos reservados (c) 1988-2004 ALWIL Software.
http://www.avast.com

Attached files ejemplo.zip (5.1 KB)Â
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9442
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Realizar mantenimiento dbf

Mensaje por ignacio »

Fredy,
> 1.- El mantenimiento tiene una serie de DBCheckbox con atajos de teclado y
> me he fijado que aunque no esté en modo de edición, si pulso el atajo del
> teclado, el checkbox se marca y se desmarca. Esto no pasa si intento
> marcarlo con el ratón. De todas formas, si me muevo a otro registro y
> vuelvo al anterior, las marcas que he puesto con los atajos desaparecen.
> No es un problema muy grave, pero sí que puede resultar un tanto confuso.
>
Arreglado. Gracias
> 2.- ¿Cuando estoy editando un campo, hay alguna manera de saber si es un
> registro nuevo o estoy modificando uno que ya existe?. En mi ejemplo, el
> campo NIF no se puede repetir y quiero que si estoy en edición lo salte.
> Para hacerlo he tenido que crear un DATA lInsertar que voy cambiando a
> mano, pero mejor si me lo dice Xailer.
>
En el dataset tienes un método OnEdit() qu te indica si estas en edición o
no (Edición o alta), y también tienes un metodo OnAppend() que te indica si
estas en alta. OJO que estos dos metodos para no confundirlos con un evento
les hemos puesto una 'L' delante para la prerelease 3. Es decir, vann a ser:
LONEDIT, LONAPPEND
> 3.- Para saltarme el campo NIf si estoy editando, el método OnCheckState
> me devuelve ::lInsertar. Así si estoy añadiendo puedo entrar y si estoy
> modificando no. Me he dado cuenta de que si lInsertar:= .f. y pulso sobre
> el campo Nif, el texto se pone en gris (desactivado). ¿Hay alguna forma de
> que el texto salga en negro? he probado con la propiedad nClrText pero no
> me hace caso.
>
OnCheckState cambia el estado de habilitado a deshabilitado y viceversa y el
API (que no Xailer) cambia el color del control como comentas. Sino te gusta
diho color y que quede completamente deshabilitado puedes poner el campo NIF
de sólo escritura. Si es usando un DBEdit deberás utilizar la propiedad
lForcedReadOnly en vez de lReadOnly ya que lReadOnly se utiliza internamente
para bloquear y desbloquear el control para edición.
> 4.- Para comprobar si el nif que me introducen ya existe, utilizo el
> evento OnExit, que por cierto, en la documentación pone que devuelve Nil y
> realmente devuelve .t. o .f. para indicarnos si pasamos al siguiente
> control o no.
>
Efectivamente el comportamiento de dicho evento ha cambiado hace poco, y se
nos paso cambiarlo en la documentación aunque si está en LoNuevo.htm. Ahora
mismo lo actualizo. Gracias.
> 5.- En el OnExit intento averiguar el valor que me han introducido en el
> DbEdit a través del método VarGet(), pero me da siempre una cadena vacía.
> oSender:FieldGet() tampoco me funciona.
>
oSender apunta al control DBEdit y creo que no existe el método FieldGet()
en dicho control ¿?¿?¿?¿
¿Has probado con DbEdit:Value o oSender:Value?
> 6.- Al utilizar OnExit y estar en modo de visualización el programa se
> empeña en validar el OnExit cada vez que el DBEdit pierde el foco. ¿Hay
> alguna forma de saber si estoy visualizando o editando?. La idea es que si
> estoy visualizando, OnExit devuelva siempre .t. y si estoy modificando o
> añadiendo se procese.
>
Ya respondido.
> 7.- Tengo un DBListbox con una serie de valores cargados y cuando añado un
> nuevo registro, me mantiene el valor del registro que tenía seleccionado
> antes de insertar. ¿No se tendría que poner en blanco como el resto de los
> campos, o en todo caso, con el primer valor de la lista?
En blanco no me parece lógico, tendría más sentido que fuera el primero en
la lista y así lo tengo arreglado. Gracias
>
> 8.- Si cambio la propiedad lPushed de un botón desde el IDE, me hace caso,
> pero la visualiza siempre con el valor .f.
>
Ese problema ya está arreglado. Gracias
> 9.- La creación del formulario ha sido muy rápida, pero he notado que se
> pierde mucho tiempo en asignar a cada DBEdit el valor. Un pequeño cambio
> en el IDE que lo haría más cómodo es que el combobox de la propiedad
> oDataField del DBEdit se desplegara por completo porque tal y como está
> ahora sólo deja ver 8 ó 9 campos de la dbf y hay que estar bajando con la
> barra de scroll constantemente.
Puedes escribir también el nombre del campo directamente. Veremos lo que se
puede hacer en cualquier caso. A lo mejor haciendo doble-click podemos
desplagar un formulario con un listbox más grande.
>
> 10.- Me he fijado que puedo cambiar la propiedad cVarName de tal manera
> que le puedo dar el mismo nombre a dos objetos distintos (un label y un
> edit) ¿No dará problemar esto?.
>
Pues obviamente si. Como supondrás lo que va a ocurrir es que dicha variable
hará referencia al último componente creado, por lo tanto la referencia al
primer componente con dicho nombre la pierdes, o al menos, no está TAN
accesible.
>
> 11.- Me parece que el evento OnChange del dataset se dispara por primera
> vez antes de estar construidos los DataControl asociados, por lo tanto si
> intento llamar a algún datacontrol dentro del OnChange me da un error al
> iniciar el programa.
>
No existe tal evento en el DataSet. No existe ningún evento en el DataSet
que se active cuando se construyen sus datacontrols. En cualquier caso es
normal que existan eventos que se disparen antes de que se creen los
DataControls como por ejemplo OnCreate.
> 12.- ¿Cómo se hacía para poder pasar de un campo a otro con Enter en lugar
> de con Tab?
>
> Bueno, de momento nada más.
Application:lUseReturn := .t.
Saludos,
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Responder