Anda di halaman 1dari 12

Buenas tardes,

Trabajo actualmente de esta forma:


se le 1
use maestro
se le 2
Use detalle
Es as como abro mis tabla (tablas libres), y luego en las diferentes rutinas solo
invoco se le 1 o sele2 o el se le que necesito.
Me aconsejan que trabaje con buffer, pregunto :
El trabajar con buffer me aligera el proceso, teniendo en cuenta que cada tabla
tiene considerable cantidad de registros.?
El buffer es un cursor temporal , que se aloja en c:\temp (segun config.fpw lo t
engo asi tmpfiles=c:\temp) ?
Tengo que cambiar a buffer optimista/pesimista y lo se le 1 por se le maestro, s
e le 2 por se le detalle y as sucesivamente. Habra algn otro cambio?
Tengo 3 formularios ( del tipo abuelo, padre, hijo), es decir un formulario con
un grid con documento 1, este grid llama a otro formulario que tiene un grid por
cada registro de documento 1, y este ultimo grid llama a otro formulario con un
grid con los items de cada registro del grid 2 (formulario 2)., si defino datas
sesion en 2 en formulario 1 cual es el comportamiento de los grid en los otros 2
formularios reconocer los select, se cruzaran cuando otros usuarios entren a est
a opcin, se respeta el datassesion=2 del primer formulario en los otros 2 formula
rios.?
Ah me olvidaba, la informacin actualmente se graba directo en cada tabla de cada
grid en los tres formularios, como aplicara el tableupdate en este caso, o es que
movimiendo el cursor del teclado en cada columna o file del grid estos se actual
izan automticamente o en cada columna tendra que hacer tableupdate() para que se g
rabe la informacin en la tabla?
***************************************************************************
1.. Trabajar con buffer por supuesto que aligera el proceso porque dejas los dat
os en memoria y los jalas solo cuando los necesites.. por otro lado yo uso curso
res que trabjan en una forma impresionante y que no estas usando la tabla de est
a manera evitas saturar la base de datos...
2. A si es en realidad es un cursor actualizable basado en la tabla original. To
dos los cambios se han hecho sobre este cursor y slo se escriben en la tabla cuan
do se utiliza el comando "update" adecuado.
3.
Estrategias de buffer
La estrategia de buffer determina cundo y cmo se almacenan en la tabla los cambios
que se encuentran en el buffer. Existen tres opciones:
* No se emplea buffer: Esta va es solamente una opcin para las versiones anteriore
s a Visual Foxpro versin 3.0 y es adems, el comportamiento predeterminado actualme
nte para las tablas de Visual FoxPro. Cualquier cambio hecho en una tabla va dir
ectamente e inmediatamente a la tabla original. No hay posibilidad de "deshacer"
sin que se haya programado explcitamente - utilizando Scatter y Gather, por ejem
plo. Se establece al asignar "1" como parmetro a CursorSetProp()
* Buffer de filas: Los cambios no se han enviado a la tabla original a menos que
ocurran una de estas dos cosas. O hay una llamada explcita a la funcin TableUpdat
e(), o el puntero del registro se mueve dentro de la tabla original. Vea que CUA
LQUIER movimiento del puntero del registro, aunque sea iniciado por una tabla qu
e est en buffer de filas, siempre causa un TableUpdate() "implcito". Establezca 2
3 como parmetro para CursorSetProp().
* Buffer de tabla: Los cambios nunca se envan automticamente a la tabla original,
a menos que exista una llamada a un comando TableUpdate() o TableRevert() siempr
e debe afectar los cambios que estn guardados en el buffer. Intentar cerrar una t
abla con buffer mientras tiene cambios no cometidos provoca que Visual FoxPro ge
nere un error en la versin 3.0; pero este comportamiento cambi en versiones anteri
ores por tanto, los cambios pendientes simplemente se pierden. (No hay error; ni
advertencia de que los cambios se van a perder). Se establece asignando 4 5 com
o parmetro para CursorSetProp().
Hasta este punto se est preguntando, por qu hay DOS parmetros posibles para cada un
a de las estrategias que implementan buffer. La respuesta es, como se indica en
la introduccin, debido a que hay dos estrategias de bloqueo.
Estrategias de bloqueo
Visual FoxPro necesita bloquear el registro fsico en la tabla mientras se realiza
n los cambios en su contenido y existen dos vas con las que se puede establecer e
l bloqueo automtico (opuesto al uso explcito de las funciones RLock()/FLock())
* Bloqueo pesimista: El registro se bloquea en cuanto un usuario comienza a hace
r cambios (El bloqueo en realidad ocurre en cuanto se oprime cualquier tecla vlid
a). Esto evita que cualquier otro usuario pueda hacer o guardar cambios sobre es
te registro hasta tanto el usuario actual haya completado sus cambios y liberado
el registro tanto guardando o revirtiendo los cambios.
* Bloqueo optimista: Un intento de bloqueo del registro se hace solamente cuando
los cambios se comienzan a enviar a la tabla. Esto significa que incluso mientr
as un usuario hace cambios en el dato, el registro permanece disponible a otros
usuarios, los que tambin podran, y posiblemente guardarn, cambios en el mismo regis
tro mientras el primer usuario estn aun trabajando en el.
Modos de buffer
El modo de buffer para una tabla es, por tanto, la combinacin especfica de las est
rategias de Buffer y Bloqueo que se aplican. Existe un total de 5 modos de buffe
r para una tabla como se ilustra en la Tabla 1.
Tabla 1. Modos de Buffer en Visual FoxPro
Modo Bloqueo Buffer Comentarios
1 Pesimista Ninguno nica opcin para FP2. Por, predeterminado para tablas VFP
2 Pesimista Fila El bloqueo se establece por el evento KeyPress. El movimiento d
el puntero de registro obliga a Guardar
3 Optimista Fila El bloqueo se establece por TableUpdate(). El movimiento del pu
ntero de registro obliga a Guardar
4 Pesimista Tabla El bloqueo se establece por el evento KeyPress. Guardar se deb
e iniciar explcitamente
5 Optimista Tabla El bloqueo se establece por el evento TableUpdate(). Guardar s
e debe iniciar explcitamente
Al trabajar con Visual FoxPro, debemos ser cuidadosos al distinguir entre estrat
egias individuales, que se especifican directamente para Buffer y Bloqueo, y el
modo buffer que resulta de la combinacin de ellos. Desafortunadamente, como hemos
visto, Visual FoxPro es de por s, menos cuidadoso con esta distincin.
Qu significa todo esto cuando creamos formularios enlazados a datos?
He aqu donde las cosas comienzan a ponerse un poco ms complejas (y no es solamente
por la nomenclatura). Consideremos una situacin normal donde las tablas se agreg
an al formulario por el entorno de datos nativo. El formulario tiene una propied
ad llamada "Buffermode" que tiene tres valores posibles:
* 0 Ninguno (predeterminado)
* 1 Pesimista
* 2 Optimista
Vea que esto se refiere en realidad a las opciones para la estrategia de bloqueo
y no tiene nada que ver con el buffer Para nada ! El hecho por el cual el formu
lario determina la estrategia buffer es por sus tablas todas por si mismo, basad
as en su utilizacin. Si un formulario utiliza dos tablas que tienen una relacin de
uno a muchos, muestran el lado "muchos" de la relacin de diferentes formas.
Si la tabla "muchos" se utiliza como origen de datos para el control grid, para
el formulario, se abre con buffer de tabla. Sin embargo, si la tabla "muchos" se
emplea para enlazar con controles que solamente muestran una fila de la tabla c
ada vez entonces, el buffer para la tabla va a ser lo mismo que para "una" tabla
para toda de configuracin de la propiedad Buffermode del formulario.
Si crea un pequeo formulario de prueba y ejecuta todas sus opciones para la propi
edad Buffermode de un formulario, puede ver que incluso con la propiedad BufferM
ode establecida en 0-(Ninguna) el cursor creado por Visual FoxPro est aun abierto
en modo buffer de fila cuando las tablas se abren desde el entorno de datos del
formulario. Es como si para el formulario "No buffer" y "Buffer de filas" fuera
lo mismo.
Sin embargo, este NO es el caso si las tablas se abren directamente con el coman
do USE. Si las tablas se abren explcitamente en el mtodo Load(), entonces la propi
edad Buffermode no tiene impacto en lo absoluto, y las tablas se abren en depend
encia de los parmetros apropiados en la Sesin de datos. Para formularios que corre
n en la sesin predeterminada de datos (DataSession = 1) se utilizan los parmetros
especificados en la ventana Opciones. Vea que en la ventana Opciones, las opcion
es, en realidad establecen la configuracin del modo de buffer. Tiene las 5 opcion
es que se corresponden con lo 5 modos definidos antes, en la Tabla 1, y los que
utilizan los mismos identificadores que la funcin CursorSetProp(). Si el formular
io se ejecuta en sesin privada de datos, entonces, las tablas abiertas con el com
ando USE se configuran en dependencia de la configuracin establecida para esa ses
in de datos y, de forma predeterminada, no sern alojadas en buffer.
Aun confundido?
Lo ms que puedo decir es que la situacin es realmente como sigue:
* Para las tablas abiertas por el entorno de datos del formulario, no importa si
el formulario tiene Datassesion con valor Default o Private. Las tablas siempre
tienen almacenamiento en buffer, al menos en modo Optimista de filas.
* La propiedad BufferMode del formulario en realidad determina la estrategia de
bloqueo, no el modo de buffer; pero solo para tablas que han sido abiertas en el
entorno de datos del formulario.
* En la sesin de datos actual, las tablas que han sido abiertas explcitamente tien
en ambas estrategias: buffer y bloqueo establecidas en dependencia de la ventana
Opciones.
* En la sesin Privada de datos, las tablas que han sido abiertas explcitamente tie
nen sus estrategias de buffer y bloqueo establecidas de acuerdo a los parmetros q
ue se han aplicado para esta sesin (Predeterminado = "No Buffering")
* Estos resultados se pueden verificar estableciendo varias opciones en un formu
lario sencillo y mostrando el resultado que se obtiene por CURSORGETPROP("BUFFER
ING")
Entonces, cmo debemos establecer el buffer para un formulario?
La respuesta corta, como siempre, es "depende". Si utiliza el entorno de datos d
el formulario para abrir las tablas entonces, puede normalmente dejar la opcin al
Visual FoxPro. En caso contrario puede simplemente emplear la funcin CursorSetPr
op() en su cdigo para configurar cada tabla como sea necesario. De cualquier mane
ra necesita ser consciente de las consecuencias para que pueda programar sus act
ualizaciones rpidamente.
Utilizar BufferModeOverride
La clase dataenvironment posee una propiedad para cada tabla (o, mejor dicho, "c
ursor") llamado "BufferModeOverride". Esta propiedad va a fijar el modo del buff
er para esa tabla (y slo esa tabla) a una de las estas seis opciones - si, es cor
recto, SEIS opciones, no cinco - veamos:
* 0 Ninguno
* 1 (Predeterminado) Utilizar la configuracin del formulario.
* 2 Bffer pesimista de fila
* 3 Buffer optimista de fila
* 4 Buffer pesimista de tabla
* 5 Buffer optimista de tabla
Existen dos puntos sobre los que hay que prestar atencin. Primero, Vea que mientr
as los nmeros del 2 al 5 se corresponden con los parmetros de CursorSetProp() y so
n aquellos mismos que estn disponibles desde el dilogo Opciones, el valor requerid
o para la configuracin "ninguno" ahora es 0 en lugar de 1. He aqu otra inconsisten
cia en la configuracin del buffer. Segundo, vea que el valor predeterminado para
esta propiedad es "1 - Utiliza la configuracin de formularios". Cuando se refiere
a configuracin de formularios, se refiere, por supuesto a la propiedad "BufferMo
de", la que como ya hemos visto en realidad se encarga de definir la estrategia
de bloqueo a aplicar. No existe configuracin del formulario para controlar buffer
!.
Habiendo dicho esto, la configuracin de la propiedad BufferModeOverride va a aseg
urar que la tabla se abre utilizando el modo buffer que usted ha especificado. A
l menos esta propiedad ha sido nombrada correctamente, sobreescribe todo lo dems
y fuerza la tabla a un modo especial de buffer en todas las situaciones.
Utilizar CursorSetProp()
Independientemente de cmo fue abierta la tabla, siempre puede utilizar la funcin C
ursorSetProp() para cambiar el modo buffer de una tabla. Sin embargo, si est util
izando el entorno de datos del formulario para abrir sus tablas, entonces, tiene
dos opciones en dependencia de si su formulario utiliza sesin privada de datos o
sesin actual de datos. En el primer caso, puede establecer simplemente el modo r
equerido en la ventana Opciones y olvidarse de ello. Todas las tablas se van a a
brir siempre con esa configuracin y siempre sabr en qu estado se encuentra. Si util
iza una sesin privada de datos entonces, necesita hacer dos cosas. Primero, neces
ita asegurarse de que el entorno de datos est configurado para soportar buffer. A
lgunos parmetros de entorno se limitan a la sesin de datos actual y puede que nece
site cambiar el comportamiento predeterminado o alguno, o todos los siguientes (
vea el tema SET DATASESSION en el archivo ayuda para una lista completa de parmet
ros afectados):
* SET MULTILOCKS - Debe ser ON para permitir buffer, predeterminado OFF
* SET DELETED - Predeterminado OFF
* SET DATABASE - "No database" es el predeterminado en una sesin Privada
* SET EXCLUSIVE - El predeterminado es OFF para una sesin Privada
* SET LOCK - Predeterminado OFF
* SET COLLATE - Predeterminado es "MACHINE"
* SET EXACT - Predeterminado es OFF
Lo segundo que necesita es especificar explcitamente el modo buffer de cada tabla
utilizada en la funcin CursorSetProp() con el parmetro apropiado porque la config
uracin en la ventana Opciones no se puede aplicar a la sesin privada de datos.
Entonces, qu modo de buffer debo utilizar en mis formulario?
Para nosotros la respuesta es sencilla. Siempre debe utilizar estrategia de buff
er de tabla con bloqueo optimista (es decir modo de buffer 5). La razn es simplem
ente que, con la excepcin de creacin de un ndice, no hay nada que pueda hacer en ot
ro modo que no pueda hacer en este modo. Mientras el buffer de filas puede ser u
tilizado en desarrollo, no creemos que tienen cabida en una aplicacin en funciona
miento. La razn es simplemente que existe muchas formas en las que puede ser dese
ncadenada la funcin TableUpdate() implcito (causado por el movimiento del puntero
de registro) y no todos los que estn por debajo de nuestro control directo. Por e
jemplo, la funcin KeyMatch() est definida en el archivo Ayuda, como;
Busca una clave de ndice en una etiqueta o un archivo de ndice.
Parece suficientemente inofensivo - seguramente buscar un archivo ndice no puede
causar problemas. Pero una nota (en la seccin Observaciones justo al final del te
ma) indica que:
KEYMATCH( ) devuelve el puntero de registro al registro donde estaba originalmen
te antes de ejecutar KEYMATCH( ).
Aqu se bloquea! Seguramente "devuelve el puntero de registro" implica que mueve e
l puntero del cursor - lo que en efecto - hace. La consecuencia es que si est uti
lizando el buffer de filas y quiere verificar por clave duplicados utilizando ke
ymatch(), puede realizar inmediatamente cualquier cambio pendiente. (Por supuest
o, en la versin 6 o despus pueden siempre utilizar en su lugar IndexSeek(). Sin em
bargo, el mismo problema surge cuando muchos de los comandos y funciones que ope
ran sobre una tabla - especialmente el ms viejo introducido en FoxPro antes los da
s de buffer (e.g. CALCULATE, SUM y AVERAGE).
Aun ms importante, el hecho de que configure una tabla para buffer de tabla no lo
previene de que la tabla como si en realidad hubiera buffer de filas. Ambas fun
ciones TableUpdate() y TableRevert(). Esto puede significar que tiene que escrib
ir un poco ms de cdigo; pero puede evitar muchos problemas.
Cambiar el modo de buffer de la tabla
Hemos dicho, al inicio de la ltima sesin, que puede utilizar siempre CursorSetProp
() para establecer o cambiar el modo de buffer de una tabla. Esto es cierto; per
o si la tabla ya ha tenido asignado un modo buffer, puede no ser tan sencillo po
rque al cambiar el estado de buffer forzara a Visual FoxPro a verificar el estado
de cualquier buffer existente.
Si la tabla tiene buffer de filas, y tiene cambios no confirmados, Visual FoxPro
los enva y permite cambiar el modo. Si el destino tiene buffer de tablas, y trat
a de cambiar su modo de buffer mientras existen cambios no confirmados, Visual F
oxPro se queja y manda el error 1545 ("El bfer de tablas para el alias "nombre" c
ontiene cambios no confirmados"). Esto es un problema porque no puede indexar un
a tabla, o hacerla libre una tabla o cursor transactable, los que mientras la ta
bla tiene buffer, por tanto es la nica va de hacer estas cosas, temporalmente, a b
uffer de filas. Por supuesto, la solucin es siempre suficiente - asegrese slo de qu
e no hay cambios pendientes antes de que intente cambiar el modo de buffer.
4.. 00
Para asegurarse de que todos los usuarios de un entorno compartido disponen de u
n duplicado exacto y seguro del entorno, y que mltiples instancias de un formular
io pueden funcionar independientemente, Visual FoxPro proporciona sesiones de da
tos.
Una sesin de datos es una representacin del entorno de trabajo dinmico actual. Podra
considerar la sesin de datos como un entorno de datos en miniatura dentro de una
sesin de Visual FoxPro abierta en un equipo. Cada sesin de datos contiene:
Una copia de los elementos en el entorno de datos del formulario
Cursores que representan las tablas abiertas, sus ndices y relaciones.
El concepto de una sesin de datos se entiende fcilmente cuando se considera lo que
ocurre al abrir el mismo formulario simultneamente en dos estaciones de trabajo
diferentes en una aplicacin multiusuario. En este caso, cada estacin de trabajo ej
ecuta una sesin de Visual FoxPro diferente y, por tanto, tiene su propio conjunto
de reas de trabajo: cursores que representan las tablas base abiertas, los ndices
y las relaciones.
Sin embargo, si abre en un solo equipo mltiples instancias del mismo formulario e
n un solo proyecto, dentro de la misma sesin de Visual FoxPro, los formularios co
mparten la sesin de datos predeterminada, lo que representa un nico entorno de tra
bajo dinmico. Cada instancia del formulario abierto en la misma sesin de Visual Fo
xPro usa el mismo conjunto de reas de trabajo y las acciones en una nica instancia
de un formulario que mueven el puntero de registro en un rea de trabajo afectan
automticamente a otras instancias del mismo formulario.
Usar sesiones privadas de datos
Si desea tener ms control sobre mltiples instancias de un formulario, puede implem
entar sesiones privadas de datos. Cuando el formulario utiliza sesiones privadas
de datos, Visual FoxPro crea una nueva sesin de datos para cada instancia del co
ntrol Form, FormSet o Toolbar que crea la aplicacin. Cada sesin privada de datos c
ontiene:
Una copia diferente de cada tabla, ndice y relacin del entorno de datos del formul
ario.
Un nmero ilimitado de reas de trabajo.
Punteros de registro para la copia de cada tabla, independientes de las tablas b
ase del formulario.
El nmero de sesiones de datos disponibles est limitado slo por la memoria y el espa
cio en disco disponible en el sistema.
Las sesiones privadas de datos se implementan al establecer la propiedad DataSes
sion para el formulario. La propiedad DataSession tiene dos configuraciones:
1? Sesin predeterminada de datos (la configuracin predeterminada).
2? Sesin privada de datos.
El valor predeterminado de la propiedad DataSession es 1.
Para activar las sesiones privadas de datos
Elija una de las opciones siguientes:
En el Diseador de formularios, establezca la propiedad DataSession del formulario
como 2? Sesin privada de datos.
? O bien?
En el cdigo, establezca la propiedad DataSession a 2.
Por ejemplo, escriba:
frmFormName.DataSession = 2
Nota Slo puede establecer la propiedad DataSession durante el diseo y, en tiempo d
e ejecucin, esta propiedad es de slo lectura.
Cuando un formulario utiliza sesiones privadas de datos, cada instancia de un fo
rmulario abierta en un solo equipo en una nica sesin de Visual FoxPro usa su propi
o entorno de datos. El uso de sesiones privadas de datos es similar a la ejecucin
simultnea del mismo formulario desde diferentes estaciones de trabajo.
Mltiples sesiones de datos equivalentes
Identificar sesiones de datos
Cada sesin privada de datos se identifica por separado. Puede ver el contenido de
cada sesin de datos en la ventana Sesin de datos. Tambin puede cambiar la descripc
in de la sesin de datos mediante comandos en el cdigo del evento Load.
Puede ver el nmero de identificacin de cada sesin de datos mediante la propiedad de
tiempo de ejecucin DataSessionID. El ejemplo siguiente muestra la propiedad Data
SessionID de un formulario denominado frmMiFormulario:
DO FORM frmMiFormulario
? frmMiFormulario.DataSessionID
Si activa el formulario mediante la clusula NAME, puede usar el nombre del formul
ario para tener acceso a la propiedad DataSessionID, como en el cdigo siguiente:
DO FORM MiFormulario NAME one
? one.DataSessionID
La propiedad DataSessionID sirve para identificar una sesin de datos determinada.
Evite cambiar la propiedad DataSessionID de una instancia de un formulario porq
ue los controles dependientes de datos pierden sus orgenes de datos cuando se mod
ifica esta propiedad.
Actualizar datos con mltiples instancias de un formulario
Mientras que las sesiones privadas de datos generan reas de trabajo diferentes qu
e contienen copias independientes de las tablas abiertas, ndices y relaciones de
un formulario, cada copia del formulario hace referencia a los mismos archivos d
e tablas base y de ndices base subyacentes. Cuando un usuario actualiza un regist
ro en una instancia de un formulario, se actualiza la tabla base a la que hace r
eferencia el formulario. Los cambios realizados en otra instancia del formulario
pueden verse al desplazarse por el registro modificado.
Los bloqueos realizados en registros o tablas en una sesin privada de datos son r
espetados por otras sesiones privadas de datos. Por ejemplo, si el usuario de la
sesin de datos 1 pone un bloqueo en un registro, el usuario de la sesin de datos
2 no puede bloquear el registro. Si el usuario de la sesin 1 abre una tabla de fo
rma exclusiva, el usuario de la sesin de datos 2 no puede abrir la tabla. Respeta
ndo los bloqueos realizados por otras sesiones de datos, Visual FoxPro protege l
a integridad de las actualizaciones en las tablas base subyacentes.
Personalizar el entorno de una sesin de datos
Debido a que las sesiones de datos controlan el alcance de determinados comandos
SET, puede usar sesiones privadas de datos para establecer configuraciones pers
onalizadas de comandos SET dentro de una sola sesin de Visual FoxPro.
Por ejemplo, el comando SET EXACT, que controla las reglas utilizadas al compara
r cadenas de caracteres de diferentes longitudes, pertenece al mbito de la sesin d
e datos actual. La configuracin predeterminada de SET EXACT es Off, lo que especi
fica que, para ser equivalentes, las expresiones deben coincidir, carcter a carcte
r, hasta que se llega al final de las expresiones en el lado derecho. Tal vez de
see activar bsquedas "borrosas" o equivalentes; para ello, establezca SET EXACT c
omo OFF para la sesin de datos actual. Sin embargo, la aplicacin podra contener un
formulario determinado que requiriera coincidencias exactas. Podra establecer la
propiedad DataSession como 2 para el formulario que requiere coincidencias exact
as, para activar las sesiones privadas de datos y despus establecer SET EXACT a O
N para ese formulario. Si ejecuta un comando SET slo para el formulario que utili
za sesiones privadas de datos, se mantiene intacta la configuracin global de la s
esin de Visual FoxPro a la vez que permite la configuracin personalizada para un f
ormulario determinado.
Ignorar la asignacin automtica de sesin de datos
Cuando las sesiones privadas de datos para un formulario estn en uso, los cambios
realizados en los datos de un formulario no se representan automticamente en otr
as instancias del mismo formulario. Si desea que todas las instancias de un form
ulario tengan acceso a los mismos datos y reflejen automticamente los cambios rea
lizados en datos comunes, puede ignorar la asignacin automtica de sesin de datos.
Para ignorar la asignacin automtica de sesin de datos
Utilice uno de estos comandos:
SET DATASESSION TO 1
?O bien?
SET DATASESSION TO
Ambos comandos permiten controlar la sesin de datos predeterminada mediante la ve
ntana Comandos y el Administrador de proyectos.
5.. esto es segn si estas trabajando con buffer=5.. tendrs que poner
se le tabla
=tableupdate(.t.)
para guardar los cambio
'o
sele tabla
=tablerevert(.t.)
Para quitar los cambios..
Amigo espero no haberte saturado de informacin, puedes leer la mitad probar y des
pus la otra mitad, y espero haberte ayudado... cualquier duda
appletonstate@hotmail.com--- emmanuel carrillo ponce
********************************************************************************
**********************************
1. Establece las propiedades Buffermode y Datassession del formulario a 2 y lueg
o en el evento init del formulario escribe las siguientes comando:
Set Multilocks ON
=CursorSetProp("Buffering", 5, "Ubic")
2. Por ltimo escribe reeamplaza el cdigo enviado por lo siguiente:
Local lcError
IF THISFORM.NUEVO
nAnswer = MESSAGEBOX(cMessageText, nDialogType, cMessageTitle)
IF nAnswer=6
WAIT WINDOW 'GRABANDO...' NOWAIT
INSERT INTO ubic VALUE( THISFORM.G_COD.VALUE,;
THISFORM.G_NOM.VALUE,THISFORM.CMBAREA.VALUE)
lcError = TableUpdate(.T.)
If lcError
messgebox("Se han guardado los cambios...")
Else
messgebox("Ha ocurrido un error al actualizar los datos...")
Endif
ELSE
messgebox("Grabacin cancelada...")
ENDIF
ELSE
SELECT ubic
REPLACE NOMBRE WITH THISFORM.G_NOM.VALUE
lcError = TableUpdate(.T.)
If lcError
MESSAGEBOX("Los datos se han actualizados")
Else
messgebox("Ha ocurrido un error al actualizar los datos...")
Endif
ENDIF
If lcError
thisform.NUEVO=.F.
thisform.boton_nuevo.SETFOCUS
Endif
**************************************************************
Geraldo, creo no lograste entender del todo la idea. Te lo cuento con otras pala
bras:
Caso 1: Modificar registro
El usuario est navegando por los datos con un grid (esto es una suposicin, ya que
no comentaste nada), entonces se detiene sobre un registro que quiere modificar
y pulsa "Modificar". Acto seguido se copia el registro a un objeto (ej: SCATTER
MEMO NAME loReg) --acceso a datos 1-- y se muestran los campos en la misma panta
lla bajo el grid (lo tpico) o en otra nueva, donde los ControlSource de los contr
oles apuntan a ese objeto de datos loReg, y toma una decisin con dos botones:
a) Grabar: Se vuelca el contenido del objeto modificado a la tabla (GATHER MEMO
NAME loReg) --acceso a datos 2--
b) Cancelar: Simplemente se libera el objeto o se limpia para que los campos de
edicin queden en blanco o se oculten
Finalmente de vuelven a mostrar los botones "Nuevo, Modificar y Eliminar"
Caso 2: Nuevo registro
El usuario pulsa el botn "Agregar" o "Nuevo" y se le presenta una pantalla de edi
cin bajo el grid o en un nuevo form (los mismos controles de edicin de antes y con
el mismo ControlSourse), y al finalizar toma una decisin con dos botones:
a) Grabar: Se vuelca el contenido del objeto modificado a la tabla (INSERT FROM
NAME loReg) --acceso a datos 1--
b) Cancelar: Simplemente se libera el objeto o se limpia para que los campos de
edicin queden en blanco o se oculten
Finalmente de vuelven a mostrar los botones "Nuevo, Modificar y Eliminar"
Caso 3: Eliminar registro
El usuario, estando con un registro seleccionado, pulsa "Eliminar" y toma una de
cisin con dos botones
a) Eliminar: Se elimina el registro de la tabla (DELETE FROM LaTabla WHERE <cond
icin-para-ubicar-el-registro> ) --acceso a datos 1--
b) Cancelar: No hace nada
Finalmente de vuelven a mostrar los botones "Nuevo, Modificar y Eliminar"
Como ves, los accesos a datos son los mnimos, y esto es inevitable, tanto de esta
forma como de la otra que sugers, pero con la diferencia que esta forma es mucho
ms sencilla de implementar y no hay que andar creando propiedades propiedades do
bles para valor actual/valor anterior.
******************************************************************************
Scatter Memvar funciona a nivel local y no pblico, trata con lo siguiente:
En el evento Init del formulario escribe lo siguiente:
SELECT alumnos
SCATTER NAME oTest BLANK
Text1:InteractiveChange
oTest.codigo = thisform.text1.Value
Text2:InteractiveChange
oTest.nombre = thisform.text2.Value
Text3:InteractiveChange
oTest.direccion = thisform.text3.Value
Text4:InteractiveChange
oTest.cpostal = VAL(thisform.text4.Value)
Luego en el boton de Guardar escribe el siguiente cdigo en el evento click
SELECT alumnos
APPEND BLANK
GATHER oTest
RELEASE oTest
Thisform.Release
Me comentas si te funcion.
Gracias.
*******************************************************************************
Espero que ahorDebes decidir simplemente si el SCATTER va dirigido a una matriz
a MEMVAR
Si es a un Array, entonces: SCATTER to gaArrayNombre y GATHER FROM ARRAY gaArray
Nombre
Si es a MEMVAR, entonces: SCATTER MEMVAR y GATHER MEMVAR
Las dos juntas no funcionan. Pero tampoco tiene sentido usarlas.
De paso te comento que las ms de las veces, SCATTER MEMVAR funciona ms rpido que SC
ATTER TO gaArrayName. ( no la gran diferencia, claro).
Si tens campos memos, tens que agregar la clusula MEMO.
SCATTER MEMO MEMVAR GATHER MEMVAR MEMO
SCATTER MEMO to gaArrayName GATHER FROM gaArrayName MEMOa quede ms ilustrado.
********************************************************************************
*************************

Sustituye los datos del registro actual de la tabla seleccionada actualmente por
datos de una matriz, un conjunto de variables o un objeto.
GATHER FROM ArrayName | MEMVAR | NAME ObjectName
[FIELDS FieldList | FIELDS LIKE Skeleton | FIELDS EXCEPT Skeleton]
[MEMO]
Parmetros
FROM ArrayName
Especifica la matriz cuyos datos reemplazan los datos del registro actual. El co
ntenido de los elementos de la matriz, comenzando con el primer elemento, reempl
aza el contenido de los campos correspondientes del registro. El contenido del p
rimer elemento de la matriz reemplaza al primer campo del registro; el contenido
del segundo elemento de la matriz reemplaza al segundo campo y as sucesivamente.
Si la matriz tiene menos elementos que el nmero de campos de la tabla, se pasan p
or alto los campos adicionales. Si la matriz tiene ms elementos que el nmero de ca
mpos de la tabla, se pasar por alto el resto de elementos de la matriz.
MEMVAR
Especifica las variables o la matriz desde las que se copian datos al registro a
ctual. Los datos se transfieren desde la variable hasta el campo que tenga el mi
smo nombre que dicha variable. El contenido de un campo no se sustituye en caso
de que no exista ninguna variable con el mismo nombre que el campo.
Mostrar historial de mensajes
Ejemplo
En este ejemplo se utiliza GATHER para copiar datos a un nuevo registro de una t
abla. Una vez creada la tabla Test, se utiliza SCATTER para crear un conjunto de
variables basado en los campos de la tabla. Despus se asigna un valor a cada cam
po y se agrega un nuevo registro en blanco a la tabla.
CREATE TABLE Test FREE ;
(Object C(10), Color C(16), SqFt n(6,2))
SCATTER MEMVAR BLANK
m.Object="Box"
m.Color="Red"
m.SqFt=12.5
APPEND BLANK
GATHER MEMVAR
BROWSE
En el ejemplo siguiente se utiliza GATHER con la clusula NAME para copiar datos a
un registro nuevo de la tabla. Una vez creada la tabla Test, se utiliza SCATTER
para crear un objeto con propiedades basadas en los campos de la tabla. Despus s
e asignan valores a las propiedades del objeto y se agrega un nuevo registro en
blanco a la tabla.
CREATE TABLE Test FREE ;
(Object C(10), Color C(16), SqFt n(6,2))
SCATTER NAME oTest BLANK
oTest.Object="Box"
oTest.Color="Red"
oTest.SqFt=12.5
APPEND BLANK
GATHER NAME oTest
RELEASE oTest
BROWSE
****************************************************************************
la instruccion scatter memvar crea variables en la memoria con el mismo nombre q
ue tienen los campos en la tabla agregandole m., es decir si en la tabla tienes
un campo que se llama codigo, entonces la instruccion te crea una variable m.cod
igo. si le colocas blank los contenidos de estas variables estan en blanco y si
no lo colocas te coloca el contenido del registro en la tabla. la orden memo cre
a variables para los campos memo.
La orden gather reemplaza los campos la tabla con los contenidos de las variable
s que estn en memoria.
El chr(13) es el retorno de carro, es para escribir en la siguiente linea. El 0+
64 indica los estilos re los botones e iconos del messagebox. Busca la ayuda del
messagebox para que veas todas las alternativas.
****************************************************************************
Ejemplo 1
El ejemplo siguiente utiliza SCATTER para crear un conjunto de variables a parti
r de los campos de la tabla de comprobacin. Despus se asigna un valor a cada campo
y se agrega un nuevo registro en blanco a la tabla. Los datos se copian a la ta
bla con el comando GATHER.
CREATE TABLE Test FREE ;
(Object C(10), Color C(16), SqFt n(6,2))
SCATTER MEMVAR BLANK
m.Object="Box"
m.Color="Red"
m.SqFt=12.5
APPEND BLANK
GATHER MEMVAR
BROWSE
Ejemplo 2
En este ejemplo se utiliza SCATTER junto con la clusula NAME para crear un objeto
con propiedades basadas en los campos de la tabla. Despus se asignan valores a l
as propiedades del objeto y se agrega un nuevo registro en blanco a la tabla. Lo
s datos se copian al nuevo registro con GATHER y la clusula NAME.
CREATE TABLE Test FREE ;
(Object C(10), Color C(16), SqFt n(6,2))
SCATTER NAME oTest BLANK
oTest.Object="Box"
oTest.Color="Red"
oTest.SqFt=12.5
APPEND BLANK
GATHER NAME oTest
RELEASE oTest
BROWSE
*****************************************************************************
Migaldra, en la ayuda de VFP se explican todos los parmetros, sin embargo te doy
unos cuentos para que los chequees:
messagebox("Este ser el mensaje principal",32+4+256,"Esto es lo que va en el titu
lo de la ventana")
los nmeros cambian segun lo que quieres establecer en el mensaje, ejm. 32 = ?
48 = ! 64 = I (Signo de informacin)
El 4 ser los botones a presentar, en este caso: S - No.
El 256 indica que por default quedar el focus en el botn de No (por lo menos en es
te ejemplo).
Algunos programadores utilizan la suma para estas representaciones, es cuestin de
gusto, en este caso, sera sustituir 32+4+256 por 292.
Cmo, te dijimos en la ayuda estn todos los valores, incluso el como conocer cual e
s el valor que devuelve segn el botn que se haya elegido
Return value Button
1 OK
2 Cancel
3 Abort
4 Retry
5 Ignore
6 Yes
7 No
Value Icon
16
Stop sign
32
Question mark
48
Exclamation point
64
Information (i) icon
Value
Default button
0 First button
256 Second button
512 Third button

Anda mungkin juga menyukai