0 evaluări0% au considerat acest document util (0 voturi)
68 vizualizări12 pagini
1. Trabajar con buffer aligera el proceso al dejar los datos en memoria en lugar de acceder constantemente a la tabla, y usar cursores mejora el rendimiento evitando saturar la base de datos.
2. El buffer es un cursor temporal que almacena cambios de forma actualizable antes de escribirlos en la tabla original mediante un comando update.
3. Existen diferentes estrategias de buffer y bloqueo que determinan cuándo y cómo se almacenan cambios en el buffer y la tabla, afectando el comportamiento de los formularios enlazados a datos
1. Trabajar con buffer aligera el proceso al dejar los datos en memoria en lugar de acceder constantemente a la tabla, y usar cursores mejora el rendimiento evitando saturar la base de datos.
2. El buffer es un cursor temporal que almacena cambios de forma actualizable antes de escribirlos en la tabla original mediante un comando update.
3. Existen diferentes estrategias de buffer y bloqueo que determinan cuándo y cómo se almacenan cambios en el buffer y la tabla, afectando el comportamiento de los formularios enlazados a datos
1. Trabajar con buffer aligera el proceso al dejar los datos en memoria en lugar de acceder constantemente a la tabla, y usar cursores mejora el rendimiento evitando saturar la base de datos.
2. El buffer es un cursor temporal que almacena cambios de forma actualizable antes de escribirlos en la tabla original mediante un comando update.
3. Existen diferentes estrategias de buffer y bloqueo que determinan cuándo y cómo se almacenan cambios en el buffer y la tabla, afectando el comportamiento de los formularios enlazados a datos
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