Necesito usar tablas compartidas, en red!!

4,661 views
Skip to first unread message

alfamaca

unread,
May 19, 2011, 10:51:16 PM5/19/11
to Comunidad de Visual Foxpro en Español
Hola a todos! Tengo que entregar un sistema que funcione en red para 8
personas, todos pueden acceder a la informaciòn de las tabla a la vez!
"Como hago para usar tablas compartidas en vfp 9.0 con el s.o windows
7??" yo uso lo siguiente: if not used("tabla.dbf")
use tabla shared
else
select tabla
endif
Pero me dijeron que esto no sirve en el vfp 9.0, por favor, esto me
tiene desesperado! necesito su ayuda!

Walter R. Ojeda Valiente

unread,
May 19, 2011, 11:32:44 PM5/19/11
to publice...@googlegroups.com
Para trabajar en red TODAS tus tablas tienen que estar compartidas. La única excepción es cuando tienes tablas locales en cada computadora, esas sí pueden tener acceso exclusivo, pero las tablas a las cuales accederán varios usuarios deben estar compartidas. Para compartirlas puedes hacer de dos formas:

1. Escribir SET EXCLUSIVE OFF antes de abrir tus tablas, o
2. Cada vez que abres una tabla le pones USE MiTabla SHARED

La opción 1. es la recomendable.

Saludos.

Walter.



> Date: Thu, 19 May 2011 19:51:16 -0700
> Subject: [vfp] Necesito usar tablas compartidas, en red!!
> From: alfam...@yahoo.com
> To: publice...@googlegroups.com

HernanCano

unread,
May 20, 2011, 1:52:17 AM5/20/11
to Comunidad de Visual Foxpro en Español

Tu sistema funcionará en red para 8 personas o para cualquier
cantidad; todos podrán acceder a la información de las tabla a la vez
si así lo necesitas con las instrucciones que nos das.
Las instrucciones que nos muestras permiten abrir los archivos de
datos de modo compartido en vfp 9.0 o cualquier otra versión de FoxPro
(que admita la cláusula SHARED) con el s.o Windows o con cualquier
sistema operativo sobre el que funcione VFP (o la versión de FoxPro
que uses).
Si usas lo siguiente, estás bien encaminado:
if not used("DATOS.dbf")
use DATOS shared
else
select DATOS
endif

>>>> Pero me dijeron que ésto no sirve en el vfp 9.0, por favor, ésto me
>>>> tiene desesperado! Necesito su ayuda!

Cuando lo has ejecutado ¿qué mensaje de error te aparece?
Por lo que sabemos, funciona sin inconvenientes. Dínos el mensaje de
error y te diremos qué pasa.
..
..
..

Irlandes 1960

unread,
May 20, 2011, 8:31:12 AM5/20/11
to publice...@googlegroups.com
Hola, fijate que el problema que puedes tener esta en el set exclusive off (ademas asume ON)
Si las tablas (dbf) estan armadas en un contenedor (dbc) este se abre al abrir la tabla, y que este compartido o no depende del set exclusive off, o de que lo hayas abierto previamente con un open database xxxxxx shared
Por otro lado todo esto no depende de la version de sist.operativo que tengas.
Si tomado todo esto en cuenta el problema persiste, puede haber algun tema en los permisos de acceso a la carpeta a nivel de la red.
Cuando hayas logrado la apertura simultanea de las tablas, vas a tener que encarar como armar las grabaciones para preveer colisiones.
Suerte

Jairo Miranda

unread,
May 20, 2011, 9:53:41 AM5/20/11
to publice...@googlegroups.com
Nota: mi Visual FoxPro es POO , así que siempre es mejor utilizar la
directrices del mismo y dejar de programar a la usanza vieja..

Otra forma

Si colocas en tus formularios las tablas en el entorno de datos ,todas se
manejan en modo exclusivo en .f. solo debes colocar en cada objeto tabla en
la propiedad bufferModeOverride en 5. Y cuando vayas a grabar :

SELECT Detalle
SET MULTILOCKS ON && Must be on for table buffering
= CURSORSETPROP('Buffering', 5, 'Detalle' ) && Enable table
buffering
= TABLEUPDATE(.T.) && Commits changes


-----Mensaje original-----
De: publice...@googlegroups.com
[mailto:publice...@googlegroups.com] En nombre de alfamaca
Enviado el: Jueves, 19 de Mayo de 2011 21:51
Para: Comunidad de Visual Foxpro en Español
Asunto: [vfp] Necesito usar tablas compartidas, en red!!

Adolfo Leon Quintero Hoyos

unread,
May 20, 2011, 10:26:53 AM5/20/11
to publice...@googlegroups.com
Lee con mucho cuidado y listo tu problrma


Tableupdate

(1362 palabras totales en este texto)
(8115 lecturas)  Versión imprimible

TableUpdate() en Visual FoxPro

por Jim Booth (Publicado originalmente en FoxTALK Mayo 1998)

Traducido por Roberto Alfredo Moré para PortalFox (http://www.portalfox.com)

 

TableUpdate() es una de las funciones usadas muy frecuentemente cuando se utiliza buffering en Visual FoxPro.  La versión 5.0 de Visual FoxPro ha mejorado la funcionalidad de esta función. Este mes, examinaremos las mejoras a la función TableUpdate().

La sintaxis.

En Visual FoxPro versión 5 se ha mejorado la función TableUpdate().  Hay nuevas opciones que pueden usarse para hacer que esta función sea más útil a nosotros como desarrolladores. TableUpdate() tiene cuatro argumentos que controlan sus acciones. La siguiente es la sintaxis para la función TableUpdate.

TableUpdate( <nFilas>, <lForzar>, <cAliasTabla or nÁreaTrabajo>, <cMatrizErrores> )

nFilas.

Miremos cada uno de los argumentos de esta función. El primer argumento controla como la función trabajará con múltiples registros en el buffer.  Este es probablemente el argumento más confuso de la función.

nFilas aceptará uno de los tres valores 0, 1, o 2.  Un valor de 0 sólo actualizará el registro actual independientemente si el buffering es tabla o fila. Este argumento puede ser usado para controlar la edición de un único registro cuando se usa buffering de tabla o para procesar cada registro en el buffer separadamente.

Un valor de 1 actualizará todos los registros en el buffer en una llamada a TableUpdate.  Si TableUpdate encuentra un registro que no puede ser actualizado, fallará en ese punto y retornará un valor de .F., indicando que ha fallado. Ningún registro más allá del que tiene el problema será procesado.

Usando 2 como valor de nFilas también actualiza todos los registros en una llamada a la función, pero reacciona diferentemente si falla en un registro. Si un registro no puede ser actualizado, continuará con el resto de los registros y actualizará todos los que pueda.  TableUpdate retornará un valor .F. indicando que hubo un problema y llenará la matriz referenciada en el cuarto argumento con los registros que no pudo actualizar.

Si no se define un valor para nFilas se usa el valor 0.

lForzar.

El segundo argumento es un valor lógico .T. o .F. y controla como TableUpdate tratará los conflictos cuando otro usuario haya cambiado el registro mientras estábamos trabajando sobre él. Un valor de .T. forzará nuestra actualización y sobrescribirá los cambios realizados por el otro usuario, mientras que un valor de .F. no realizará la actualización si otro usuario ha hecho modificaciones al mismo registro.

Es una buena idea usar .F. para este argumento, ya que el sobrescribir los cambios de otros usuarios puede producir resultados no deseados en la tabla. Siempre podemos escribir código de recuperación para un TableUpdate fallido que pueda rectificar las diferencias y luego forzar una actualización (discutiremos este tipo de código el próximo mes).

cAliasTabla/nÁreaTrabajo

Este argumento es usado para determinar qué área de trabajo o alias será afectado por el llamado a la función TableUpdate.  Si se omite este argumento, se afecta el área de trabajo actualmente seleccionada. Se recomienda que siempre se indique el nombre de alias a la función TableUpdate() para prevenir resultados inesperados. En Visual FoxPro es muy fácil encontrarse con un área de trabajo cambiada y mediante el uso de este argumento no quedará ninguna duda sobre que área de trabajo debe ser actualizada.

cMatrizErrores

Este argumento es el nombre de una matriz unidimensional que contendrá los números de registro de aquellos registros que no hayan podido actualizarse cuando se usa como valor del primer argumento 2. Este argumento debería indicarse siempre cuando se usa un valor de 2 para el primer argumento, ya que no hay otra manera de averiguar cuáles son los registros no actualizados.

Cuando el primer argumento es 0 o 1 el puntero de registro en el alias que está siendo actualizado permanece en el registro que no pudo actualizarse. f

Muéstranos algo de código.

Con todas estas opciones en la función, habría varias maneras de utilizarla en nuestro código. Examinemos algunos escenarios.

 Escenario 1 – Actualización de un registro único.

Tenemos un formulario que permite la edición de sólo un registro de cliente y está usando solamente la tabla de clientes (Customer). El código que podríamos tener en el método de grabado de este formulario se muestra en el Listado 2.

LOCAL lcFldState

lcFldState = GetFldState( -1,”Customer”)

IF “2” $ lcFldState OR “4” $ lcFldState

   * Se ha editado un registro existente o bien uno nuevo.

   IF NOT TableUpdate( 0, .F., “Customer” )

      * The update failed

      TableRevert(.F., “Customer”)

   ENDIF

ENDIF

 Listado 2 – Un ejemplo de actualización de un registro único.

 Escenario 2 – Múltiples registros, todos o ninguno.

En esta situación tenemos un formulario para editar clientes que permite al usuario editar varios registros de clientes antes de guardar el trabajo. Deseamos guardar todas las ediciones o no guardar ninguna.

* Se ha editado un registro existente o bien uno nuevo.

BEGIN TRANSACTION

IF NOT TableUpdate( 1, .F., “Customer” )

   * The update failed

   ROLLBACK

   TableRevert(.T., “Customer”)

ELSE

   END TRANSACTION

ENDIF

Listado 3 – Actualizando múltiples registros usando 1 como primer argumento de TableUpdate()

 Escenario 3 – Múltiples registros, haga lo que pueda.

En este ejemplo tenemos la misma situación de edición que en el Escenario 2, pero deseamos guardar todo lo que podamos y revertir únicamente los registros que no puedan ser guardados.

*  Se ha editado un registro existente o bien uno nuevo.

DIMENSION laBadRecs(1)

IF NOT TableUpdate( 2, .F., “Customer”, laBadRecs )

   * The update failed

   FOR EACH nRecord IN laBadRecs

      GOTO nRecord

      TableRevert(.F., “Customer”)

   ENDFOR

ENDIF

Listado 4 – Actualizando múltiples registros usando 2 como el primer argumento de TableUpdate()

En resumen.

La función TableRevert() fue usada en cada uno de los ejemplos. Esta función toma dos argumentos. El primero es  .T. para revertir todos los registros y .F. para revertir sólo el registro actual. El segundo argumento es el alias a ser revertido.

En el segundo escenario, se usó una transacción para englobar toda la actualización en una operación de o todo o nada. Las transacciones serán el tema de otra publicación.

Las mejoras a la función TableUpdate nos dan un control muy fino sobre la forma de trabajar de la operación de actualización. Como usted puede ver en los ejemplos, podemos controlar la actualización de nuestras tablas de forma de lograr el comportamiento exacto que deseamos para cada uno de los formularios que construyamos.

  


 

Transacciones

(1543 palabras totales en este texto)
(7635 lecturas)  Versión imprimible

Publicado originalmente en FoxTALK en Junio de 1998


Usando Transacciones

Jim Booth

Traducido por Pablo Roc Serrano para PortalFox (http://www.portalfox.com)

Previamente habíamos hablado sobre TableUpdate y TableRevert() y hemos visto como nos permiten controlar actualizaciones mientras usamos "buffering" en tablas y cursores. Estas dos opciones son muy buenas para manejar la actualización o la reversión de una sóla tabla o cursor, pero cómo coordinamos las actualizaciones o cancelaciones de varias tablas relacionadas. Aquí entran las Transacciones.

Pero, ¿qué es una transacción?

Hay situaciones en las que necesitamos actualizar más de una tabla o cursor y la combinación de actualizaciones representa una de las acciones en la Base de Datos. Esta acción debería ser una operación "todo o nada", es decir, Todo si todo va bien o Nada si algo falla. Por ejemplo, cuando escribimos código para guardar una nueva factura tenemos que añadir un registro en la tabla de cabecera de facturas, añadir un grupo de registros en la tabla de líneas de factura, modificar el saldo en el registro del cliente ya añadir un registro en la tabla de recibos. Si alguna de estas operaciones falla necesitamos deshacer todas las operaciones anteriores que sí han funcionado y asegurarnos que no se han realizado cambios en los datos. Las transacciones se han diseñado para este propósito.

Utilizaremos la instrucción BEGIN TRANSACTION para comenzar el seguimiento de la transacción en Visual FoxPro y la instrucción ENDTRANSACTION para terminar correctamente la transacción o la intrucción ROLLBACK para deshacer la transacción.

¿Cómo funcionan las transacciones?

Cuando VFP encuentra un BEGIN TRANSACTION comienza a hacer un seguimiento de las operaciones de actualización de fichero que se realizan. Para cada modificación VFP obtiene los bloquedos adecuados pero no realiza la actualización todavía. Cuando encuentra un ENDTRANSACTION Visual FoxPro realiza todas las escrituras de fichero involucradas en la transacción y libera los bloqueos que se había procurado con anterioridad. Si encuenta un ROLLBACK, Visual FoxPro abandona los bloqueos sin realizar ninguna operación de escritura.

Gracias a este proceso, Visual FoxPro es capaz de asegurar que todos los cambios se realizarán o no se realizará ninguno. Como podemos apreciar examinando este proceso es una muy buena idea poner las instrucciones BEGIN TRANSACTION y ENDTRANSACTION/ROLLBACK lo más cerca posible una de otra en el código como sea posible. Haciendo esto reduciremos el tiempo en el que los recursos están bloqueados.

¿Qué tablas y cursores pueden participar en una transacción?

En Visual FoxPro las transacciones sólo están disponibles para tablas que están en Bases de Datos (DBC). Las tablas libres no pueden participar en una transacción, y un rollback (roll back es literalmente "enrollar") u otro final anormal de una transacción no afecta a las modificaciones realizadas sobre tablas libres durante una transacción.

Esto puede causar efectos sorprendentes si una tabla libre es la fuente de datos de una tabla local que es gestionada por una transacción. Vamos a examinar los pasos del proceso con una transacción ficticia. En esta transacción hay una tabla perteneciente a una Base de Datos que se llama Tabla1 y una vista llamada Vista1 que consigue los datos de una tabla libre que se llama (originalidad sin fronteras) Tabla2. El código para la transacción es el que sigue:

BEGIN TRANSACTION
IF TableUpdate( 1, .F., "Vista1")

IF TableUpdate ( 1, .F., "Tabla1")

END TRANSACTION

ELSE

ROLLBACK

ENDIF
ELSE

ROLLBACK

ENDIF

Ahora las preguntas, si el TableUpdata de Tabla1 falla, ¿puede el ROLLBACK deshacer los cambios de Vista1 y dejarla en el estado anterior a la transacción? La respuesta es sí, puede deshacer los cambios en Vista1. ¿Pueden los cambios hechos en Table2 como resultado de la actualización de Vista1 ser deshechos por el ROLLBACK? No, porque Tabla2 es una tabla libre y, como tal, no participa en la transacción. Esto puede dejar tus datos en un estado inconsistente, deberías manejar la tabla libre por ti mismo. Lo mejor en no depender de transacciones cuando estén relacionadas tablas libres.

¡Enséñanos el código!

¿Cómo integraremos transacciones en nuestros formularios? Se puede hacer en un formulario directamente o genéricamente en una clase de formularios. Debajo hay un pseudocódigo que nos dará una idea de cómo es la estructura para incorporar transacciones en nuestras actualizaciones.

* Establecer una variable para el seguimiento de fallos
LOCAL llRollBack
llRollBack = .F.
* Esperar hasta que todo el proceso de datos está completo antes de comenzar la transacción
BEGIN TRANSACTION
* Realizar cada actualización comprobando el resultado
IF NOT TableUpdate( ... )

llRollBack = .T.

ELSE

IF NOT TableUpdate( ... )

llRollBack = .T.

ELSE

IF NOT TableUpdate( ... )

llRollBack = .T.

ENDIF

ENDIF

ENDIF
IF llRollBack

ROLLBACK

ELSE

ENDTRANSACTION

ENDIF

Este código de arriba es pseudocódigo, no lo tomes al pie de la letra. Hemos usado una serie de instrucciones IF anidadas para controlar las acciones. Podríamos haber puesto todos los alias en una matriz y utilizar un bulce FOR/ENDFOR para procesarlos, terminando el bucle cuando hubiera un error o termináramos con todos.

¿Qué puede ir mal?

En el pseudocódigo de arriba asumimos que la transacción falla y que se se ha realizado el ROLLBACK. ¿Qué, exactamente, ha hecho el ROLLBACK? ¿Los "buffers" se han dejado en su estado pre-edición o todavía tienen basura de la edición del usuario?

La respuesta es que los "buffers" se restauran al estado en el que estaban antes del BEGIN TRANSACTION. Esto quiere decir que todavía tenemos que ocuparnos de la edición del usuario. Aquí nosotros decidimos, podemos poner lo editado por el usuario de nuevo en el formulario y dejarle decidir a él, o podemos realizar un TableRevert con todos los alias y descartar lo que ha escrito el usuario. El límite lo ponemos nosotros.

¿Qué ocurre si el ordenador se apaga (o cuelga) durante la transacción? Obviamente VFP no tiene registro de la transacción cuando el sistema es reiniciado. Entonces ¿las tablas se han actualizado o no? Ninguna tabla se modificó y el resultado es como se hubiera ejecutado un ROLLBACK.

Otra situación que puede ocurrir y causar muchos problemas es esta, un desarrollador escribe un formulario y pone un BEGIN TRANSACTION en el evento Init y pone un ENDTRANSACTION o un ROLLBACK en el evento destroy, dependiendo del botón que pulse el usuario para salir del formulario. ¿Qué problema puede causar esto? En primer lugar ningún otro usuario puede hacer nada con las tablas implicadas en la transacción mientras tanto, hasta que el usuario sale del formulario y se eliminan los bloqueos. He visto esta situación usada como argumento contra las transacciones. Bueno, vamos allá, cualquier cosa que se utiliza incorrectamente puede causar problemas. Cuando se usan transacciones correctamente se limitará el tiempo entre el comienzo y el final al mínimo imprescindible. Los eventos Init y Destroy de un formulario NO son el menor periodo de tiempo posible. Este periodo de tiempo no está nunca bajo el control del programador.

He visto escrito que las transacciones de Visual FoxPro no son tan "robustas" como las transacciones que utilizan los servidores de bases de datos cliente/servidor. ¿Y qué?. De hecho, los frenos de un tractor son más "robustos" que los frenos de mi coche, ¿ es eso una razón para NO usar los frenos de mi coche? NO. Las transacciones de Visual FoxPro son útiles y sirven para su propósito. Se deben utilizar, incluso cuando los datos están almacenados en un Base de Datos cliente/servidor.

Resumen

Las transacciones de Visual FoxPro son una utilidad muy valiosa del producto. Nos permiten agrupar varias operaciones de actualización en una operación "todo o nada". Hoy por hoy raramente creamos formularios que sólo gestionan una tabla, el formulario con múltiples tabla se ha convertido en una norma. Gestionar estas actualizaciones de varias tablas se ha convertido en un aspecto muy importante de nuestro trabajo y las transacciones tienen un valor inestimable para hacerlo. 


SALUDOS

ADOLFO

Carlos Miguel FARIAS

unread,
May 20, 2011, 4:03:27 PM5/20/11
to publice...@googlegroups.com
Adolfo: Muy loable de tu parte en copiar toda la ayuda, pero mejor hubiese sido poner la referencia a la fuente y no toda la fuente.
Porque si alguno pregunta como programo en VFP ( le pegas todo FoxTALK).
Ah, y es información para vfp 5, me parece que muy vieja.
Gracias igual.

Cristopher Antonio A.G

unread,
Jun 13, 2015, 5:18:47 PM6/13/15
to publice...@googlegroups.com, jherna...@gmail.com
hola, yo use un pc para tener ahí mis tablas libres (no use base de datos , solo tablas libres), y desde otros ordenadores acceso a esas tablas, pero solo me abre bien en una computadora, ya que cuando acceso a la tabla en una segunda PC me marca el siguiente error "denegado ruta tabla.dbf al acceso al archivo". por favor ayuda, necesito abrir mi tabla en varios ordenadores ala vez 

Carlos Alfaro

unread,
Jun 13, 2015, 5:56:18 PM6/13/15
to publice...@googlegroups.com

Amigo Cristopher:

 

Estas usando el SET EXCLUSIVE en estado OFF?

 

Buen día.

 

Carlos Alfaro

Fernando D. Bozzo

unread,
Jun 13, 2015, 5:59:37 PM6/13/15
to publice...@googlegroups.com, arias_g...@hotmail.com, jherna...@gmail.com
Hola Cristohper:

¿Algún motivo para responder a algo de 2011?

Cristopher Antonio Arias Garay

unread,
Jun 13, 2015, 11:50:06 PM6/13/15
to publice...@googlegroups.com

Hola, si lo eh intentado usar, pero con él o sin él, no me permite abrir las tablas en más de un equipo. No sé cómo deba de hacerlo, mira. yo tengo 3 pc, en una puse las tablas libres que ocupo ( si es necesario lo hago con base de datos si me lo recomiendan) la carpeta dónde están esas tablas la comparto , y en los otros dos equipos les conecto una unidad de red con ubicación de esa carpeta de la pc donde están las tablas, y en las otras dos pc creo un programa en el cual a la hora de llamar a la tabla, le doy la ubicación de la unidad de red, y si acceden a la tabla, pero solo puedo tener acceso un ordenador a la vez. No sé si me explique bien, espero me puedan ayudar con mi problemática.



From: publice...@googlegroups.com
To: publice...@googlegroups.com
Subject: RE: [vfp] Re: Necesito usar tablas compartidas, en red!!
Date: Sat, 13 Jun 2015 15:56:12 -0600

Cristopher Antonio Arias Garay

unread,
Jun 13, 2015, 11:52:07 PM6/13/15
to publice...@googlegroups.com
puede ser del 2011 , pero mi problemática se me presenta actualmente en este año en curso 2015. 


Subject: [vfp] Re: Necesito usar tablas compartidas, en red!!

integral

unread,
Jun 14, 2015, 12:35:24 AM6/14/15
to publice...@googlegroups.com, alfam...@yahoo.com

Amigo Cristopher :

Recién acabo de ver tu consulta...

Te prometo mañana darte unos consejos sobre el tema...

En estos momentos ya es casi medianoche.

Saludos,

INTEGRAL

Cristopher Antonio Arias Garay

unread,
Jun 14, 2015, 12:36:57 AM6/14/15
to publice...@googlegroups.com
Ok muchas gracias. esperare tus consejos. por lo pronto buenas noches 


Date: Sat, 13 Jun 2015 21:35:24 -0700
From: gabriel_...@hotmail.com
To: publice...@googlegroups.com; alfam...@yahoo.com

Subject: [vfp] Re: Necesito usar tablas compartidas, en red!!

HernanCano

unread,
Jun 14, 2015, 3:54:56 AM6/14/15
to publice...@googlegroups.com, arias_g...@hotmail.com
Cristopher:

Lo más recomendable es que uses SET EXCLUSIVE OFF.

Pero "no es lo único".

Si deseas mejores resultados, no uses SET EXCLUSIVE ON.

Habiendo aclarado éso, entonces..................


Si en tus pruebas has usado SET EXCLUSIVE OFF y de todas formas te está apareciendo el mensaje "denegado ruta tabla.dbf al acceso al archivo", entonces las DBFs que estás abriendo, las estás abriendo así: USE Archivo EXCLUSIVE, y entonces el usar la cláusula EXCLUSIVE en USE, te anula el efecto que se pretende con SET EXCLUSIVE OFF.

Insisto:
Si has usado SET EXCLUSIVE OFF y estuvieras abriendo las DBFs con USE ARCHIVO, o con USE ARCHIVO SHARED, no se te presentaría el mensaje.

Si tu escenario no tiene las características que estoy mencionando (si consideras que estoy errado), entonces danos más info de tu escenario para ayudarte mejor.

Me interesa que integral te dé sus consejos. Voy con algunnos:

- Usa SET EXCLUSIVE OFF (Crear un proyecto FoxPro ¿por dónde comenzar?  http://fdbozzo.blogspot.com.es/2014/01/crear-un-proyecto-foxpro-por-donde.html )
Tanto en tu PRG de inicio como en el LOAD o en el INIT los formularios que usen sesión privada de datos (.DataSession=2) (si usas una clase base para formularios, entonces es suficiente con que lo hagas en el form base). Si en tus formularios no usas sesión privada de datos (o sea que se usa la 'sesión por defecto' .DataSession=1, que es la opción por default), entonces con el SET EXCLUSIVE OFF del prg de inicio tienes cubierto el panorama.

- Cuando abras tus DBFs, no lo hagas USE ARCHIVO EXCLUSIVE (a menos que tengas que crear índices, etc, lo cual debe hacerse en un momento en que nadie esté usando la app, y evidentemente en una opción del menú específica para ello).

- Cuando abras tus DBFs, házlo con USE ARCHIVO SHARED de manera que siempre le ayudes a tu consciencia a que se dé cuenta en qué ambiente está.

- Espero te quede claro que no necesitas USE ARCHIVO EXCLUSIVE para (1)agregar registros (con APPEND o con INSERT), ni para (2)corregir/modificar datos (con REPLACE o con UPDATE), ni para las (3)consultas (con SELECT SQL), ni para (4)retirar registros (con DELETE) (para lo cual también debes tener SET DELETED ON para que los registros deleted/borrados/eliminados no aparezcan en los reportes ni en los browse ni en los skip, ni en los SELECT SQL, etc)

- El USE ARCHIVO EXCLUSIVE sólo es necesario para los PACK, REINDEX (prefiero (re)crear los indexados con INDEX ON), pero recuerda que el PACK no es necesario hacerlo seguido, de hecho no es necesario mientras uses SET DELETED ON.

>>> ... (si es necesario lo hago con base de datos si me lo recomiendan) ...

Con bases de datos DBC de VFP se debe hacer exactamente lo mismo: tu escenario "no cambia" (en lo que a uso compartido se refiere --los comandos mencionados aquí--, y en gral la necesidad) por sólo usar DBCs. Si implementas DBCs, debes hacer exactamente lo mismo.

Observación:
Se considera (se entiende) en tu escenario que los usuarios tienen derechos de acceso adecuados por sistema operativo al directorio (carpeta) donde están los datos (los DBF).


El sábado, 13 de junio de 2015, 22:50:06 (UTC-5), Cristopher Antonio A.G escribió:

Hola, si lo eh intentado usar, pero con él o sin él, no me permite abrir las tablas en más de un equipo. No sé cómo deba de hacerlo, mira. yo tengo 3 pc, en una puse las tablas libres que ocupo ( si es necesario lo hago con base de datos si me lo recomiendan) la carpeta dónde están esas tablas la comparto , y en los otros dos equipos les conecto una unidad de red con ubicación de esa carpeta de la pc donde están las tablas, y en las otras dos pc creo un programa en el cual a la hora de llamar a la tabla, le doy la ubicación de la unidad de red, y si acceden a la tabla, pero solo puedo tener acceso un ordenador a la vez. No sé si me explique bien, espero me puedan ayudar con mi problemática.



Amigo Cristopher:

HernanCano

unread,
Jun 14, 2015, 3:58:34 AM6/14/15
to publice...@googlegroups.com, arias_g...@hotmail.com
Sí, Cristopher.
Lo que pasa es que debiste crear un tema nuevo.

Si ves que el "original" es tan antiguo, no lo "respondas", no lo "comentes": abre uno nuevo que quedará con tu nombre.

Aún te llegarán unas dos o tres respuestas más por éste... así que si aún te quedan dudas, abre otro luego de esas dos o tres que te llagarán.

integral

unread,
Jun 14, 2015, 8:38:25 PM6/14/15
to publice...@googlegroups.com, alfam...@yahoo.com

Estimado Amigo CHRISTOPHER :

Antes que nada es importante crear un programa principal de inicio donde establezcas los set principales 

SET TALK OFF
SET DELETED ON
SET EXCLUSIVE OFF   && En ambiente multiusuario
SET CENTURY ON
SET DATE TO DMY
SET SAFETY OFF
SET ESCAPE OFF
SET ENGINEBEHAVIOR 70
SET PATH TO \bitmaps, \tablas, \forms, \clases, \prgs, \reportes
SET CLASSLIB TO misclases
SET PROCEDURE TO funciones

Al momento de abrir una pantalla para ingresar datos que es mas recomendable?

A) abrir las tablas de este modo:

En el Init o load del form:

use tabla1 in 0 shared 
use tabla2 in 0 shared

ó

SELECT 0
USE obs
SELECT 0
USE excepcion
SELECT 0
USE adjuntos
SELECT 0
USE estado
SELECT 0
USE facturacion

=CURSORSETPROP("buffering",5,"obs")
=CURSORSETPROP("buffering",5,"excepcion")
=CURSORSETPROP("buffering",5,"adjuntos")
=CURSORSETPROP("buffering",5,"estado")
=CURSORSETPROP("buffering",5,"facturacion")

Evento UNLOAD .

IF USED("obs")
USE IN obs
ENDIF

Y asi sucesivamente...

Claro esta si vas a utilizar la tecnica del Buffering.

B) Abrir las tablas desde el Data Environment ( Ver Imagen Adjunta)

Las dos formas son validas, depende el estilo que desees implementar...

Ahora bien todo ello resulta importante así como también conocer la infraestructura de la que se compondrá nuestra RED instalada..
Para ello debemos conocer .

1) El tipo y capacidad del Servidor dedicado 
2) La version y tipo del sistema del Windows Server
3) es preferible que sea una red con cableado

Bueno tambien se presentara en ciertas ocasiones que tengas que abrir una tabla de manera concurrente, en esos casos tendras hacerl ode la siguiente
forma .

SELECT 0 
USE parciales Again 
GO TOP

Bueno amigo espero hasta aqui haber contribuido en algo la solucion a tu problema.
Saludos,

INTEGRAL
Tablas_en_Red.jpg

Carlos Miguel FARIAS

unread,
Jun 15, 2015, 6:56:44 AM6/15/15
to Grupo Fox
Hay algunas omisiones en las indicaciones de Integral.
Varios de los sets que fija en el programa principal, que no está mal indicarlos, deben ser indicados en el load de cada formulario, porque si trabaja con sesión exclusiva de datos, estos valores son privativos de cada sesión y no se "heredan" del programa principal.
Hay mucha diferencia de abrir las tablas en el load o en el init.
Si hay controles que están asociados a las tablas, abrirlas en el init hara que haya problemas, porque los controles intentarán asociarse con sus respectivas tablas al momento del init de cada uno de elllos que se dispararán antes que el init del formulario.
Lo más simple es usando dbfs es agregar las tablas al entorno de datos, entonces, se abren sin necesidad de poner código y al cerrar el formulario, se cierran solas.
Si usas la clausula again, deberías además indicar una clausula alias, porque si no puedes estar cerrando accidentalmente la otra tabla abierta y NUNCA NUNCA, seleccionar tablas por su número de ALIAS (eso quedo del dbase II que solo podía tener dos tablas abiertas y del dbase III que solo manejaba 10 tablas abiertas simultáneas).
Hay otras cosas que se pueden hacer, que hacen la cosa más simple.
Saludos: Miguel, La Pampa (RA)

Cristopher Antonio A.G

unread,
Jun 15, 2015, 10:07:43 AM6/15/15
to publice...@googlegroups.com, wr...@hotmail.com, wr...@hotmail.com
hola, y como puedo aplicarle un zap o algo similar, a una tabla compartida ?


El jueves, 19 de mayo de 2011, 21:32:44 (UTC-6), Walter R. Ojeda Valiente escribió:
Para trabajar en red TODAS tus tablas tienen que estar compartidas. La única excepción es cuando tienes tablas locales en cada computadora, esas sí pueden tener acceso exclusivo, pero las tablas a las cuales accederán varios usuarios deben estar compartidas. Para compartirlas puedes hacer de dos formas:

1. Escribir SET EXCLUSIVE OFF antes de abrir tus tablas, o
2. Cada vez que abres una tabla le pones USE MiTabla SHARED

La opción 1. es la recomendable.

Saludos.

Walter.



> Date: Thu, 19 May 2011 19:51:16 -0700
> Subject: [vfp] Necesito usar tablas compartidas, en red!!
> From: alfam...@yahoo.com

Arnaldo Toledano

unread,
Jun 15, 2015, 10:44:55 AM6/15/15
to publice...@googlegroups.com, arnaldo....@gmail.com
Tenes que abrirla en modo EXCLUSIVO
Por ende tenes que preguntar primero si la tabla esta en uso
Si no lo esta
    Set Excl On
    Abris la tabla
    ZAP
   Cerras la tabla
    Set excl OFF

Listo


Arnaldo Toledano

El 15/06/2015 a las 11:07 a.m., Cristopher Antonio A.G escibió:
--
Arnaldo Toledano Tesys Informática Córdoba Argentina

Carlos Miguel FARIAS

unread,
Jun 15, 2015, 11:10:02 AM6/15/15
to Grupo Fox
TRY
   USE tuTabla_aZapear EXCLUSIVE
   ZAP && o PACK, o INDEX o REINDEX
CATCH TO eXepcion
   * aca indicas que hubo un error, los datos del error los obtienes de eXepcion.
   * Si estas en este bloque, o no pudiste abrir la tabla en exclusiva, o hubo otro problema
   * En la variable tenes los códigos para que el operador sepa que no puede y porque el zapeo.
ENDTRY

Saludos: Miguel, La Pampa (RA)
El 15 de junio de 2015, 11:44, Arnaldo Toledano <arnaldo....@gmail.com> escribió:
Tenes que abrirla en modo EXCLUSIVO
Por ende tenes que preguntar primero si la tabla esta en uso
Si no lo esta
    Set Excl On
    Abris la tabla
    ZAP
   Cerras la tabla
    Set excl OFF

Listo


Arnaldo Toledano

El 15/06/2015 a las 11:07 a.m., Cristopher Antonio A.G escibió:
hola, y como puedo aplicarle un zap o algo similar, a una tabla compartida ?

El jueves, 19 de mayo de 2011, 21:32:44 (UTC-6), Walter R. Ojeda Valiente escribió:
Para trabajar en red TODAS tus tablas tienen que estar compartidas. La única excepción es cuando tienes tablas locales en cada computadora, esas sí pueden tener acceso exclusivo, pero las tablas a las cuales accederán varios usuarios deben estar compartidas. Para compartirlas puedes hacer de dos formas:

1. Escribir SET EXCLUSIVE OFF antes de abrir tus tablas, o
2. Cada vez que abres una tabla le pones USE MiTabla SHARED

La opción 1. es la recomendable.

Saludos.

Walter.



> Date: Thu, 19 May 2011 19:51:16 -0700
> Subject: [vfp] Necesito usar tablas compartidas, en red!!
> From: alfam...@yahoo.com

>
> Hola a todos! Tengo que entregar un sistema que funcione en red para 8
> personas, todos pueden acceder a la informaciòn de las tabla a la vez!
> "Como hago para usar tablas compartidas en vfp 9.0 con el s.o windows
> 7??" yo uso lo siguiente: if not used("tabla.dbf")
> use tabla shared
> else
> select tabla
> endif
> Pero me dijeron que esto no sirve en el vfp 9.0, por favor, esto me
> tiene desesperado! necesito su ayuda!

Cristopher Antonio Arias Garay

unread,
Jun 15, 2015, 11:38:44 AM6/15/15
to publice...@googlegroups.com
HOLA, mira use lo que me dijiste y me quedo en el bloque del( CATCH TO eXepcion) , sigo sin poder aplicar un zap ala tabla


Date: Mon, 15 Jun 2015 12:09:57 -0300
Subject: Re: [vfp] Necesito usar tablas compartidas, en red!!
From: carlosmig...@gmail.com
To: publice...@googlegroups.com

Carlos Alfaro

unread,
Jun 15, 2015, 12:00:00 PM6/15/15
to publice...@googlegroups.com

Mi comentario no es para resolver tu problema.

 

Me llama la atención que estuviste preguntando, cómo hacer para una tabla pudiera ser accesible por más de una computadora y ahora necesitas aplicar zap a una tabla.

 

Podrás aplicar zap a esa tabla, abriéndola con el comando exclusive, por ejemplo:

 

Use mitabla exclusive

 

Pero toma en cuenta que no podrá ser accedida por más de una computadora.

 

Buen dia.

 

Carlos Alfaro

Cristopher Antonio Arias Garay

unread,
Jun 15, 2015, 12:40:01 PM6/15/15
to publice...@googlegroups.com
Si mira, lo que sucede es que mi sistema debe estar en red de dos maquinas, y en una de ellas se hacen registros en una tabla y eso me funciona todo bien, pero en la otra maquina, se hace una consulta de la tabla1, y esa consulta la paso a una tabla2 para despues exportar esta tabla2 a excel y al final debo limpiar la tabla2. por eso requiero aplicar un zap, pero no me funciona el (use mi tabla exclusive) me sigue marcando que debo abrirla en modo exclusivo. gracias por tu ayuda


To: publice...@googlegroups.com
Subject: RE: [vfp] Necesito usar tablas compartidas, en red!!
Date: Mon, 15 Jun 2015 09:59:51 -0600

Carlos Alfaro

unread,
Jun 15, 2015, 12:50:43 PM6/15/15
to publice...@googlegroups.com

Revisa bien, porque toda tabla abierta en modo exclusive se puede aplicar zap.

Cristopher Antonio Arias Garay

unread,
Jun 15, 2015, 12:55:39 PM6/15/15
to publice...@googlegroups.com
mira yo tengo un prg en que establesco el set excluvise OFF y todo bien, puedo abrir mis tablas en los dos equipos, pero cuando aplico el zap, antes del zap le indico un use mitabla exclusive y despues el zap, y esto no me esta funcionando.


From: publice...@googlegroups.com
To: publice...@googlegroups.com
Subject: RE: [vfp] Necesito usar tablas compartidas, en red!!
Date: Mon, 15 Jun 2015 10:50:37 -0600

Carlos Alfaro

unread,
Jun 15, 2015, 1:49:57 PM6/15/15
to publice...@googlegroups.com

Debo suponer que en use mitabla exclusive, sustituis mitabla por el nombre de la tabla que necesitas aplicar zap.

Cristopher Antonio Arias Garay

unread,
Jun 15, 2015, 3:02:58 PM6/15/15
to publice...@googlegroups.com
claro que si sustituyo el nombre y le ante pongo su ubicación 


From: publice...@googlegroups.com
To: publice...@googlegroups.com
Subject: RE: [vfp] Necesito usar tablas compartidas, en red!!
Date: Mon, 15 Jun 2015 11:49:51 -0600

Saul Piña Hernandez

unread,
Jun 15, 2015, 3:06:11 PM6/15/15
to publice...@googlegroups.com, arias_g...@hotmail.com
Saludos, en mi caso cuando quiero utilizar zap, un buen amigo me recomendó usar cursores temporales, agregar datos en el cursor, hacer procesos y al final cuando ya tienes todo listo para guardar, enviar a tu tabla compartida.

ya con esto, es posible usar zap cuando trabajas en red.


Hernan Cano

unread,
Jun 16, 2015, 1:54:06 AM6/16/15
to publice...@googlegroups.com
Cristopher:
En mi comentarfio ya había respondido a lo que mencionas (todos te han dado respuesta a lo que pides). En este mensaje te voy a condensar las repuestas a varios interrogantes. Desde el principio debiste iundicar que ésto es lo que te sucedía.

---Cristopher preguntó:---
>>> hola, y como puedo aplicarle un zap o algo similar, a una tabla compartida?

---Hernán Cano respondió:---
- Cuando abras tus DBFs, no lo hagas USE ARCHIVO EXCLUSIVE (a menos que tengas que crear índices, etc, lo cual debe hacerse en un momento en que nadie esté usando la app, y evidentemente en una opción del menú específica para ello).

---Cristopher dijo:---
>>> Mira: yo tengo un prg en que establezco el SET EXCLUSIVE OFF y todo bien, puedo abrir mis tablas en los dos equipos,...

---Hernán Cano dice:---
CORRECTO!!! APLICASTE NUESTRA RECOMENDACION Y SOLUCIONASTE TU INCONVENIENTE INICIAL!!!!!!!!!!!!1

---Cristopher dice:---
>>> ... pero cuando aplico el ZAP, antes del zap le indico un USE MITABLA EXCLUSIVE y despues el ZAP, y ésto no me está funcionando.

SI ANTES DEL ZAP TIENES "USE MITABLA EXCLUSIVE", estás haciendo las cosas como es: así es lo correcto....

---Cristopher dice:---
>>>... me sigue marcando que debo abrirla en modo exclusivo... 

Este último mensaje aparece cuando se ejecuta por ejm ZAP y la DBF no está abierta en exclusiva.................................... ..................................................................  ...........................................

SUPONGO Tuescenario debe ser el sgte:

Hernan Cano

unread,
Jun 16, 2015, 2:16:54 AM6/16/15
to publice...@googlegroups.com
Saúl:

Hablas sobre "...cursores temporales" y mencionas que "ya con ésto, es posible usar ZAP cuando trabajas en red."

Entiendo a qué te refieres y lo uso a veces, pero que un aprendiz como tú lo expresas, es mal expresado y pido descartar tu explicación por confusa e incompleta.
No debemos intervenir más con respecto a ésta tu apreciación, Saúl, para no enturbiar el hilo.

Hernan Cano

unread,
Jun 16, 2015, 2:18:13 AM6/16/15
to publice...@googlegroups.com
SUPONGO que tu escenario debe ser el sgte:

- Haces SET EXCLUSIVE OFF, abres tus tablas así: USE ARCHIVO, o quizá con USE ARCHIVO SHARED y la app te trabaja bien. Ok!!

- En algún momento (que fuera bueno saber cuándo es) quieres hacer un ZAP. Como te estamos diciendo qué se hace para abrirlas COMPARTIDAS, entonces tú ---para hacer el ZAP--- haces:

USE ARCHIVO SHARED
ZAP

Pero el ZAP requiere que se abra en exclusiva y te aparece otro de los errores que dices (me sigue marcando que debo abrirla en modo exclusivo). Sólo toma en cuenta que te hablamos de "compartidas" (set exclusive off" y "shared") porque tu mensaje se titula "Necesito usar tablas compartidas, en red!!"

Entonces conmo te decimos que para ZAP necesitas abrirla en exclusiova, entonces estás haciendo:

USE ARCHIVO EXCLUSIVE 
ZAP

Lo cual es válido desde el punto de vista del lenguaje de programación. En donde estás fallando es en que lo estás haciendo mientras la app está en uso y --mejor-- la DBF está en uso.

Cuando dije...:

- Cuando abras tus DBFs, no lo hagas USE ARCHIVO EXCLUSIVE (a menos que tengas que crear índices, etc, lo cual debe hacerse en un momento en que nadie esté usando la app, y evidentemente en una opción del menú específica para ello).

Nota que la clave de mi respuesta está en "lo cual debe hacerse en un momento en que nadie esté usando la....DBF".

Mi recomendación final a tu inquietud es: debes implementar una opción en el menú específica para hacer ZAP y/o reindexar. Y ejecutarla en un momento en que nadie esté usando la app.

Por favor nota que también mencioné: pero recuerda que el PACK (y el ZAP) no es necesario hacerlo seguido, de hecho ni siquiera es necesario, porque estás usando SET DELETED ON, ¿cierto?.

Tu dificultad actual es que estás ejecutando USE ARCHIVO EXCLUSIVE mientras la DBF está en uso por otro usuario de la red.

Saul Piña Hernandez

unread,
Jun 16, 2015, 2:58:31 PM6/16/15
to publice...@googlegroups.com, jherna...@gmail.com
Ejemplo ZAP en cursor.

En el Load del Form:

CREATE CURSOR cur_dat (ncompleto c(60), ife c(25), id n(9))   <--- crear un cursor
SELECT * FROM cur_dat  INTO CURSOR cur_dat READWRITE   <-----  El mismo cursor esté listo para recibir datos
SELECT cur_dat


En un evento clic, valid o lostfocus:

this.BackColor=RGB(255,255,255)

IF EMPTY(this.Value)
ELSE
SELECT cur_dat
ZAP   

thisform.procesar
ENDIF


Agregando datos en el cursor:

cBusca=UPPER(ALLTRIM(thisform.txt_bName.Value))
    cBusca1=cBusca+'%'
*!*        SQLEXEC(lhandle, "SELECT ncompleto, ife, id from P13C WHERE ncompleto like ?cBusca1 ORDER BY ncompleto","cConsulta1")
SELECT ncompleto, ife, id from p13Co WHERE ncompleto like cBusca1+"%" ORDER BY ncompleto INTO CURSOR cConsulta1 NOFILTER
    IF RECCOUNT()>0
    SELECT cur_dat
    APPEND FROM DBF ('cConsulta1')
        thisform.c_pd13.list1.refresh()

        thisform.c_pd13.list1.Enabled=.t.
etc..


Trabajando en todo momento en RED


Hernan Cano

unread,
Jun 16, 2015, 11:47:53 PM6/16/15
to publice...@googlegroups.com
((con permiso, chicos... pero Saúl escribió aquí...)
Saúl:
¿Seguro que después de 

>>> CREATE CURSOR cur_dat (ncompleto c(60), ife c(25), id n(9))   <--- crear un cursor

necesitas 

>>> SELECT * FROM cur_dat  INTO CURSOR cur_dat READWRITE   <-----  El mismo cursor esté listo para recibir datos

??

Saúl Piña

unread,
Jun 17, 2015, 10:16:05 AM6/17/15
to publice...@googlegroups.com, jherna...@gmail.com
Saludos Hernan, si asi es, o como debería de ser?


Hernan Cano

unread,
Jun 18, 2015, 1:34:14 AM6/18/15
to publice...@googlegroups.com
Veamos, Saúl. Lo diré como si ya lo supieras.

Después de CREATE CURSOR no se necesita SELECT...READWRITE pues con CREATE CURSOR se crea un cursor que ya es escribible.

Saul Piña Hernandez

unread,
Jun 18, 2015, 9:31:26 AM6/18/15
to publice...@googlegroups.com, jherna...@gmail.com
Ups, bueno. me voy con la cabeza hagachada y avergonzado...je,je,je

Saludos!!!

Irwin Rodriguez

unread,
Jun 18, 2015, 9:33:47 AM6/18/15
to publice...@googlegroups.com
Saúl, te vas doblemente avergonzado por que agachado es sin "H" :-)

Feliz Pre-Viernes! :-P

El 18 de junio de 2015, 9:31, Saul Piña Hernandez <vfxpro...@gmail.com> escribió:
Ups, bueno. me voy con la cabeza hagachada y avergonzado...je,je,je

Saludos!!!




--
DISTRIBUIDORA IRSESU, C.A
J-29947174-7
Irwin Rodríguez
- Director
Analista Programador - Freelance
+584125210679

Barquisimeto - Venezuela
Desarrollos online dentro y fuera del país

Saul Piña Hernandez

unread,
Jun 18, 2015, 11:18:31 AM6/18/15
to publice...@googlegroups.com, rodrigu...@gmail.com
Es un pre-viernes...ja,ja,ja 


Antonio Meza

unread,
Jun 18, 2015, 12:12:38 PM6/18/15
to publice...@googlegroups.com, vfxpro...@gmail.com, rodrigu...@gmail.com
Hola Saul !!

Andando un poco de chismoso y revisando tu ejemplo, veo que estas haciendo 4 pasos cuando solo necesitas uno

1.- Creas un cursor llamado cur_dat   (ya es de escritura )
     CREATE CURSOR cur_dat (ncompleto c(60), ife c(25), id n(9))   <--- crear un cursor
2.-  Haces un select * para obtener el mismo cursor que ya es de escritura
     SELECT * FROM cur_dat  INTO CURSOR cur_dat READWRITE
3.- Luego creas otro cursor llamado cConsulta1 que obtienes de p13Co
     SELECT ncompleto, ife, id from p13Co WHERE ncompleto like cBusca1+"%" ORDER BY ncompleto INTO CURSOR cConsulta1 NOFILTER 
4.- Luego si obtienes registros los agregas al cursor cur_dat
     select cur_dat
     APPEND FROM DBF ('cConsulta1')

Todo eso lo resuelves simplemente haciendo el select del 3 paso y poniendo el nombre del cursor Cur_Dat en vez de ccConsulta1, ejemplo:

     SELECT ncompleto, ife, id from p13Co WHERE ncompleto like cBusca1+"%" ORDER BY ncompleto INTO CURSOR cur_dat READWRITE 

Y ya tienes un cursor de escritura llamado cur_dat con los campos y registros, por lo que evitas hacer tanto pasos para obtener el mismo resultado, ahora bien si necesitas tener el cursor vació simplemente la misma consulta que te puse la llamas filtrando para que te regrese el cursor sin registros, y luego en vez de usar Append vuelves a llamar el Select con la condición.

saludos
Antonio Meza


El jueves, 18 de junio de 2015, 10:18:31 (UTC-5), Saul Piña Hernandez escribió:
Es un pre-viernes...ja,ja,ja 


Saul Piña Hernandez

unread,
Jun 18, 2015, 12:37:08 PM6/18/15
to publice...@googlegroups.com, solv...@gmail.com, vfxpro...@gmail.com, rodrigu...@gmail.com
Excelente, entonces valió la pena mis multiples errores y exposicion de los mismos. Gracias

Fernando D. Bozzo

unread,
Jun 18, 2015, 1:32:45 PM6/18/15
to publice...@googlegroups.com, gabriel_...@hotmail.com, alfam...@yahoo.com
Perdonen chicos, pero..... ¿nadie se dio cuenta de que esta consulta fue en 2011 (4 años ya)?

Con lo cual, la urgencia que había, ya fue.

....en serio, algo raro está pasando a la gente del foro que contesta mensajes caducados, y sigo sin entender cómo encuentran estos mensajes.

¿Alguien lo sabe?

Lo que sí, la respuesta me gustaría esta semana y no dentro de 4 años xD


Marty McFly.-

Carlos Alfaro

unread,
Jun 18, 2015, 1:54:51 PM6/18/15
to publice...@googlegroups.com

Lo que pasa amigo Fernando, es que el amigo Cristopher, tomo este hilo y expuso su consulta el 15 del presente mes.

 

Buen dia.

 

 

Carlos Alfaro

Fernando D. Bozzo

unread,
Jun 18, 2015, 2:09:00 PM6/18/15
to publice...@googlegroups.com, calf...@yahoo.com.ar, calf...@yahoo.com.ar
Sí Carlos, ya veo que se han conjugado una sumatoria de malas prácticas, incluyendo el famoso "cierre" del hilo que fué finalizado por quien no lo comenzó ni lo reabrió :D
Reply all
Reply to author
Forward
0 new messages