La semana pasada te hice una pregunta sobre un sistema en red y vos me dijiste que tengo problema de acceso concurrente y tienes razón. El problema surge que tengo tablas auxiliares en dentro de un formulario que las necesito y cuando pulso un determinado botón esas tablas se borran ya se con un zap o pack y para eso necesito que estén en modo exclisivo. Mi pregunta es la siguiente como soluciono el problema de eliminar esos registros de la tabla sin que se produzca el error"error al cargar el archivo. Numero de registro 5. Form1<o uno de sus miembros> cargando el formulario o el entorno de datos: denegado el acceso al archivo."
Otra cosita más senes algún sistema que me puedas pasar para ver tu forma de trabajar en red yo te lo agradecería. mail:[email protected]
1 Respuesta
Respuesta de davsoft
1
1
davsoft, Desarrollador con 10 años de experiencia en el area de Visual...
Tu problema tiene solución así como estas trabajando, pero luego en segunda instancia te daré la forma correcta. Bueno, para solucionar esto puedes abrir tablas algunos en forma exclusiva y otros no, si utilizas SET EXCLUSIVE OFF todo lo que abres sera compartido, pero luego te vas al entorno de datos y a la tabla que quieras en forma exclusiva le cambias el valor de la propiedad EXCLUSIVE = .F. o .T., esto también es lo equivalente a Use clientes shared O use clientes exclusive Si no usas entorno de datos, pues bien, ahora ya sabes abrir archivos en forma diferentes, pero mi pregunta es, ¿a qué te refieres con usar archivos temporales?, ¿Son tablas en las que pones informaciones que lo vacías cada vez que reinicia el programa?, bue o si esto es así la forma correcta de trabajar seria así: Tu creas archivos temporales, lo usas y lo vacías, recuerda que DELETE no borra los archivos físicamente, más bien los oculta, pero para esto SET DELETE ON debería así, pues así si marcas con DELETE un registro desaparcerá de la vista, para ello no necesitas PACK, pues pack hace un copiado del archivo omitiendo los marcados por delete, pero yo NO recomiendo este método que estas usando, pues las tablas temporales si están en directorio común para todos no servirá de nada, pues si entran dos personas al mismo tiempo aunque no tengas el mensaje de ACCESO DENEGADO igual tendrás problemas, ¿por qué?. Te doy un ejemplo, supongamos que en un form usas una tabla temporal que cada vez que abres la ventana se vacía para luego sea cargada nuevamente, pues que pasará si yo estoy cargando datos por ej de una factura de items, y cuando estoy en el item 49 alguien se le ocurre ingresar al mismo programa, y en el evento INIT vacía la tabla temporal y hace perder toda la información a los demás, es decir no puedes utilizar tablas temporales compartidos de esa forma, hay otras formas, por ejemplo en la misma tabla temporal diferencias los registros cargados por cada usuario entonces cada usuario solo borra los que son de el mismo, pero de ahí hay que controlar que una misma persona no abra dos sesiones y ahí es otra historia, no es muy eficiente cuando hay problemas de salida anormal del sistema y ya no sabemos si quien esta realmente on line u off line, bueno, la solución que yo te planteo es lo siguiente: Trabajas con CURSORES en vez de tablas temporales físicas, los cursores son tablas temporales de memoria que generalmente fox lo almacena físicamente en la carpeta TEMP del windows con el nombre por ej _016464.tmp estas tablas son creadas en las terminales y no es compartido con otros usuarios, la sintaxis de creación y utilización es lo mismo que con las tablas, soporta prácticamente todos los comandos, delete, index, skip etc. Bueno por ej. Create cursor temp(código N(10), cant(12,2), nombre c(30)) crea un cursor llamado temp que luego ya puedes utilizarlo básicamente como una tabla pero no tendrás problemas con nadie, bueno, espero que te haya ayudado en algo, pues no tengo ejemplos con DBF, si con cursores por que utilizo MYSQL en vez de tablas tipo dbf, pero el problema es sencillo no creas que necesites un ejemplo, pero por las dudas házmelo saber.
Las tablas temporales a las que me refiero reflejan grid dentro de formularios a los cuales les agrego datos y los elimino. Por ejemplo tengo un form donde hay un grid este grid refleja una tabla que se llama auxagenda que trae registros de otra que se llama agenda, entonces para no modificar directamente los datos de agenda e creado una tabla auxiliar que se llama auxagenda. Ahora e intentado crear cursores pero no puedo. Probé como me explicaste con el comando create cursor y me dice error de sintaxis. Ejemplo:Create cursor temp(código N(10), cant(12,2), nombre c(30))
Disculpa que me equivoque de sintaxis, la correcta es Create cursor temp (codigo N(10), cant N(12,2), nombre C(30)) Me olvide del N(12,2) en el campo cant, bueno, pero por lo que dices algo mas rapido seria un SQL, por ejemplo select * from agenda into cursor auxAgenda readwrite Con esto listo, tienes un cursor idéntico con los mismos datos en un cursor llamado auxAgenda y de lectura escritura, esta sintaxis de readwrite solo a partir de vfp7, así podrías solucionar el tema
Mira ahora aprendí a usar cursores pero no me deja eliminar registros. Sale un error que dice "la operación no es valida para el objeto o cursor " esto es cuando pongo pack No te molesto más pero muchas gracias por tu ayuda .Espero una ultima respuesta y luego la finalizo
No puedes hacer pack a un cursor por que simplemente no lo necesitas, si necesitas eso simplemente lo vuelves a crear y listo.