[vfp] Me sale Error 110

281 views
Skip to first unread message

Rita Cecila Restrepo De La Hoz

unread,
Feb 9, 2012, 11:14:15 PM2/9/12
to Comunidad de Visual Foxpro en Español
Hola chicos ya mis aplicaciones guardan, pero ahora que quise retirar me sale este mensaje

"Debe abrir el archivo en modo exclusivo"

Cuando llega al PACK ya que quiero que borre físicamente el registro de la tabla.
Estuve mirando y tengo el SET EXCLUSIVE ON, ademas sale un mensaje donde me pregunta que si desea sobrescribir el archivo de indice...
Que hago para que me borre físicamente y ademas no me salga el mensaje incomodo.

Parte del código

*** PROCEDIMIENTO - CLICK - OBJETO - BOTON 06 - ELIMINAR
PROCEDURE image14.Click
USE c:\deata\data2\sdeata_05.dbf
INDEX ON s511000 TO c:\deata\data2\sdeata_05
SEEK _CODIGO
DELETE 
PACK
REINDEX
CLOSE ALL
DO limpia_text0501
DO limpia_contenido
DO mensaje_050101
ENDPROC

Jorge Javier Gutierrez

unread,
Feb 9, 2012, 11:37:25 PM2/9/12
to publice...@googlegroups.com
Hola, no se en que parte tendrás el SET EXCLUSIVE ON,
pero te comento como hago yo en mis aplicaciones en el caso
de trabajar con tablas con acceso exclusivo:

1 - Formulario con Sesión provada de datos:
DataSession = 2

2 - En el evento load del formulario:
set safety off
set talk off
set exclusive OFF
(entre otras)

3 - abrir una tabla en forma exclusiva:
use miTabla exclusive
delete
pack
use in miTabla


Si miTabla la utilizo varias veces, entonces la abro sólo una vez en el load del formulario


Saludos

TheNewInquirer

unread,
Feb 10, 2012, 1:04:34 AM2/10/12
to Comunidad de Visual Foxpro en Español
Hola Rita,

Preguntas y Respuestas:

1. "Debe abrir el archivo en modo exclusivo"
Respuesta: el mensaje sale porque el comando PACK requiera que abra la
tabla en modo exclusivo.
Solución:

SET EXCLUSIVE OFF (Se usa toda la vida para trabajar en red y poder
abrir
las tablas por varios usuarios simultaneamente).

USE Mitabla EXCLUSIVE
Go NumerodeRegistroaborrar
Delete
Pack
SET EXCLUSIVE OFF


2. Cuando llega al PACK ya que quiero que borre físicamente el
registro de la tabla.
Solución: En la practica No se usa PACK nunca, solo cuando se hace
labor de mantenimiento de la base de datos.

Para esto, el administrador del sistema debe pedir a todo el mundo que
salgan del sistema en todas las terminales, para correr los REINDEX y
los PACK para borrar datos basura.

En la vida real solo se "marca para borrado" usando el comando DELETE.
También se suele usar SET DELETE ON para que no se vean los registros
marcados para borrado.

En resumen: es muy mala practica "borrar" información.

3. Estuve mirando y tengo el SET EXCLUSIVE ON

Se usa al reves. Ponemos el SET EXCLUSIVE OFF en cada evento LOAD de
los forms y/o en el MAIN.PRG del sistema.

Cuando queremos abrir en modo exclusivo, será temporal. y luego
volvemos a poner SET EXCLUSIVE OFF.

4. Ademas sale un mensaje donde me pregunta que si desea sobrescribir
el archivo de indice..

Se suele usar SET SAFETY OFF en los Loads o en el MAIN.PRG para que no
aparezcan mensajes de confirmación.

5. Que hago para que me borre físicamente y ademas no me salga el
mensaje incomodo.?
No borres fisicamente con PACK.

Solo ve al registro a borrar y marcalo con DELETE.

Para los mensajes: SET SAFETY OFF.

NOTA.- Me dice walter que se puede hacer un ZAP a cursores porque
estos se crean en la memoria del equipo a nivel local y si se borran
no afectarían a los demas usuarios.

Te ayudará mucho leer estos enlaces acerca de los cursores y los
grids:

https://groups.google.com/group/publicesvfoxpro/browse_thread/thread/8b0b7c6ed54ddaeb/111c495ea6575fc1?hl=es&lnk=gst&q=grids#111c495ea6575fc1


Correcciones al CODIGO:


> *** PROCEDIMIENTO - CLICK - OBJETO - BOTON 06 - ELIMINAR
> PROCEDURE image14.Click


USE c:\deata\data2\sdeata_05.dbf ===> Esto casi no se usa.

En lugar usamos:

SET DEFAULT TO "UNIDAD:\RUTA" En los main.prg del sistema o en
los load de los forms.

Para subcarpetas de organizacion dentro de la ruta principal usamos:
SET PATH (Busca la sintaxis conveniente para ti en la ayuda de Fox).

Luego ya no pones rutas cada vez. Solo haces esto en los load de los
forms:

CLOSE DATABASES
SET EXCLUSIVE OFF

SELE 3 (Seleccionas el area de trabajo)
USE Mitabla

SELE 5
USE Otratabla

SELE nArea
USE nTabla

...


INDEX ON s511000 TO c:\deata\data2\sdeata_05

SEEK _CODIGO
> DELETE
> PACK
> REINDEX
> CLOSE ALL
> DO limpia_text0501
> DO limpia_contenido
> DO mensaje_050101
> ENDPROC


Este sería un tipico codigo de arranque y cierre de forms:

Evento Init (Para declarar variables)
PUBLIC A
PUBLIC B
SET DATE ITALIAN

Evento Load (Para carga de tablas)
CLOSE DATABASES (Cerramos cualquier tabla que pudiera estar abierta)

SET SAFETY OFF
SET EXCLUSIVE ON (Solo temporalmente para crear los indices)

USE MitablaUno
INDEX ON ALLTRIM(NOMBRE)+DTOS(FECHA) TAG NOMBRE

(Para indexar por el campo nombre y luego por fecha con NOMBRE como
etiqueta principal del indice CDX.

USE (Sin parametros, Para cerrar la tabla despues de crear el indice)

SET EXCLUSIVE OFF
SELE 15
USE MitablaUno
SET ORDER TO NOMBRE
(Ordena el archivo de índice por el campo nombre).

En los eventos Unload, escribimos:
CLOSEDATABASES
CLOSE ALL

En los botones de comandos Salir usamos:
Thisform.Release()


Espero te sirva..

Walter R. Ojeda Valiente

unread,
Feb 10, 2012, 1:44:51 AM2/10/12
to publice...@googlegroups.com
Algunos comentarios:

1. Si abres tu tabla con USE MiTabla EXCLUSIVE no importa como esté configurado SET EXCLUSIVE

2. El PACK y el REINDEX requieren acceso exclusivo a la tabla y además pueden tardar bastante tiempo, por eso es conveniente realizarlos fuera de las horas normales de trabajo, para no estar pidiéndole a todo el mundo que salga del sistema.

3. Si trabajas en red, entonces lo conveniente es que tengas el SET EXCLUSIVE OFF al inicio de tu aplicación y también en todos los formularios que se abren con 2. Private Data Session (sesión privada de datos) aunque en este último caso lo normal es que la clase madre lo tenga contenido en su evento LOAD() o que llame a una rutina de inicialización.

4. Los cursores son locales a cada computadora, lo que les hagas a ellos no lo sabrán en las demás computadoras

5. El SELECT 3, SELECT 5, etc. no es conveniente usarlos ya que podrías "meter la pata" y creer que el área está disponible cuando en realidad ya hay una tabla abierta allí. Es mucho mejor escribir:
        SELECT 0 (que se ubica en la siguiente área disponible)
        USE MiTabla
        o alternativamente:
        USE MiTabla IN 0

6. Las variables PUBLIC es fuertemente recomendado jamás utilizarlas. Es muchísimo mejor asignarle una nueva propiedad al objeto _Screen y usar esa propiedad

7. Escribir CLOSE DATABASES en los eventos UNLOAD() no siempre es conveniente, ya que eso cerrará todas las tablas y no siempre eso es lo deseable.

8. Al escribir ThisForm.Release() se libera el formulario de la memoria y eso puede ser lo conveniente en muchos casos, pero a veces necesitas que permanezca en la memoria para continuar teniendo acceso a sus propiedades y métodos y en ese caso lo correcto es escribir ThisForm.Hide().

Saludos.

Walter.



> Date: Thu, 9 Feb 2012 22:04:34 -0800
> Subject: [vfp] Re: Me sale Error 110
> From: thenewin...@gmail.com
> To: publice...@googlegroups.com

Rudolf Johann Heiner

unread,
Feb 10, 2012, 3:52:24 AM2/10/12
to publice...@googlegroups.com
saludos y bendiciones Rita,
tu programa debe quedar asi:
 
PROCEDURE image14.Click
 
    Set Exclusive On
 
    USE c:\deata\data2\sdeata_05.dbf
    INDEX ON s511000 TO c:\deata\data2\sdeata_05
 
    SEEK _CODIGO
    DELETE
    PACK
    REINDEX
 
    CLOSE ALL
 
    Set Exclusive Off
 
    DO limpia_text0501
    DO limpia_contenido
    DO mensaje_050101
   
ENDPROC
 
o otra opcion es:
 
PROCEDURE image14.Click
 
    USE c:\deata\data2\sdeata_05.dbf Exclusive
    INDEX ON s511000 TO c:\deata\data2\sdeata_05
   
    SEEK _CODIGO
    DELETE
    PACK
    REINDEX
 
    CLOSE ALL
 
    DO limpia_text0501
    DO limpia_contenido
    DO mensaje_050101
ENDPROC
 
si tienes problemas no dudes en consultar,
saludos,
rudolf heiner.
 
 
 

Rudolf Johann Heiner

unread,
Feb 10, 2012, 4:07:04 AM2/10/12
to publice...@googlegroups.com
saludos y bendiciones Rita,
tu programa debe quedar asi:
 
PROCEDURE image14.Click
 
    Set Exclusive On
 
    USE c:\deata\data2\sdeata_05.dbf
    INDEX ON s511000 TO c:\deata\data2\sdeata_05
 
    SEEK _CODIGO
    DELETE
    PACK
    DELETE TAG ALL
    REINDEX
 
    CLOSE ALL
 
    Set Exclusive Off
 
    DO limpia_text0501
    DO limpia_contenido
    DO mensaje_050101
   
ENDPROC
 
o otra opcion es:
 
PROCEDURE image14.Click
 
    USE c:\deata\data2\sdeata_05.dbf Exclusive
    INDEX ON s511000 TO c:\deata\data2\sdeata_05
   
    SEEK _CODIGO
    DELETE
    PACK
    DELETE TAG ALL

Rudolf Johann Heiner

unread,
Feb 10, 2012, 4:10:58 AM2/10/12
to publice...@googlegroups.com
saludos y bendiciones Rita,
tu programa debe quedar asi:
 
PROCEDURE image14.Click
*----------------------------------------
 
    Set Exclusive On
 
    USE c:\deata\data2\sdeata_05.dbf
    INDEX ON s511000 TO c:\deata\data2\sdeata_05
 
    SEEK _CODIGO
    DELETE
    PACK
    DELETE TAG ALL
    REINDEX
 
    CLOSE ALL
   
    Set Exclusive Off
   
    DO limpia_text0501
    DO limpia_contenido
    DO mensaje_050101
 
ENDPROC
o otra opcion es:
 
PROCEDURE image14.Click
*----------------------------------------
 
    USE c:\deata\data2\sdeata_05.dbf Exclusive
    INDEX ON s511000 TO c:\deata\data2\sdeata_05
 
    SEEK _CODIGO
    DELETE
    PACK
    DELETE TAG ALL
    REINDEX
 
    CLOSE ALL
 
    DO limpia_text0501
    DO limpia_contenido
    DO mensaje_050101
 
ENDPROC
 

Marcelo Barberis

unread,
Feb 10, 2012, 4:22:09 AM2/10/12
to publice...@googlegroups.com
Bueno aportando en este hilo sobre este tema, yo inclui algo asi, me he creado un prg que realiza esta tarea, primero cierro todas las tablas con CLOSE ALL, despues procedo a abrir cada tabla y uso pack para cada tabla y reordeno todo nuevamente y despues de eso le aplico una rutina para realizar copias de respaldos.

Tambien puedes utilizar compactar base de datos si deseas.
Marcelo
Bolivia

2012/2/10 Rudolf Johann Heiner <rudolf...@hotmail.com>

Irlandes 1960

unread,
Feb 10, 2012, 6:00:08 AM2/10/12
to publice...@googlegroups.com
Disiento. Desde mi punto de vista No es buena política borrar información. Nunca. 
Deberías apuntar a campos lógicos o de fecha que indiquen que ese registro ya no está activo, e indexar la tabla con ese campo.
Cuando pones la tabla en el entorno de datos, lo haces con la clausula de filtro EMPTY(BAJA)  o como se llame el campo.
Pero fijate hasta que punto esas bajas no siempre son tales, que tengo consultas en las cuales hay doble filtro de selección, con un combo con los registros activos, y otro con los dados de baja. Y las consultas de los padrones mas complejos habilitan a incluir también los casos dados de baja. Y varios etc más.
No deberías permitir nunca que la información desaparezca. Imaginate un requerimiento judicial, y que te objeten el resultado por que en tu sistema la información puede ser borrada.
El delete y pack solo quedan para casos en que realmente haya que depurar información espurea generada por error del sistema, en manos del desarrollador y nunca del usuario final.

Walter R. Ojeda Valiente

unread,
Feb 10, 2012, 9:50:31 AM2/10/12
to publice...@googlegroups.com
Después de hacer un PACK no es necesario realizar un REINDEX ya que el PACK lo realiza por sí mismo.

Saludos.

Walter.




Date: Fri, 10 Feb 2012 10:22:09 +0100
Subject: Re: [vfp] Me sale Error 110
From: alexm...@gmail.com
To: publice...@googlegroups.com

Walter R. Ojeda Valiente

unread,
Feb 10, 2012, 10:05:56 AM2/10/12
to publice...@googlegroups.com
Totalmente de acuerdo contigo.

Siempre es mejor tener de más que de menos. Los datos obsoletos se quedan marcados como obsoletos y ya está.

Particularmente, yo no les permito a los usuarios comunes borrar datos, esa es una tarea que le compete exclusivamente al Supervisor. Y cuando borra algo quedan registrados la fecha, la hora, la computadora y su nombre debidamente encriptados.

Idem para las actualizaciones, las cuales se realizan como un borrado lógico más una inserción correctamente identificada como "Modificación" de datos anteriores, no como inserción de datos nuevos.

La gran ventaja de este modo de proceder es que si alguna vez se necesita retrotraer la Base de Datos a una fecha anterior siempre podrá hacerse.  ¿Quiéres ver como estaba exactamente la Base de Datos el 12 de Enero de 2012 a las 17:00:00? En unos segundos la ves. ¿Al 15 de Diciembre de 2011 a las 16:30:00? En unos segundos la estarás viendo. Y así con cualquier otra fecha y hora que se te ocurra.

Saludos.

Walter.



Date: Fri, 10 Feb 2012 08:00:08 -0300

Subject: Re: [vfp] Me sale Error 110

TheNewInquirer

unread,
Feb 10, 2012, 10:10:11 AM2/10/12
to Comunidad de Visual Foxpro en Español
Walter,

En el punto 6, comentas lo siguiente:

6. Las variables PUBLIC es fuertemente recomendado jamás utilizarlas.
Es muchísimo mejor asignarle una nueva propiedad al objeto _Screen y
usar esa propiedad.

¿Por qué no es recomendable usar variables Publicas?...

¿Que propiedad x ejemplo?...

Ilústranos... jeje

Saludos!

Walter R. Ojeda Valiente

unread,
Feb 10, 2012, 10:48:01 AM2/10/12
to publice...@googlegroups.com
El gran problema con las variables públicas es que están disponibles en todas partes dentro de tu aplicación: cada procedimiento, función o método tiene acceso a ellas y cuando llegas a cualquier punto el valor que tienen puede ser distinto al que esperabas. Y eso podría llegar a causar un desastre mayúsculo. El único caso en que podrían usarse es cuando al inicio de la aplicación se les asigna un valor y luego ese valor es usado pero nunca jamás cambiado.

Sin embargo, continúa siendo una mala práctica heredada de la época del dBase, FoxBase y compañía.

En un entorno de programación orientada a los objetos, como muy bien podemos tener con VFP, lo mejor es escribir algo como:

_Screen.AddProperty("cNombreAplicacion", "MI GRAN APLICACIÓN")

donde agregas una propiedad al objeto _Screen y también ya le asignas un valor, o:

_Screen.AddProperty("nCantidadLineasFactura")

donde solamente agregas la propiedad sin asignarle un valor. Cuando necesitas asignarlo escribes:

_Screen.nCantidadLineasFactura = 12

¿Por qué usar el objeto _Screen?

Porque lo tienes siempre disponible en todas las aplicaciones hechas en VFP, no necesitas crear un objeto exclusivamente para guardar tus propiedades (aunque podrías hacer eso, si lo deseas).

Saludos.

Walter.



> Date: Fri, 10 Feb 2012 07:10:11 -0800
> Subject: [vfp] Re: Me sale Error 110
> From: thenewin...@gmail.com
> To: publice...@googlegroups.com

Rita Cecila Restrepo De La Hoz

unread,
Feb 10, 2012, 10:55:32 AM2/10/12
to publice...@googlegroups.com
Hola chicos, les agradezco de corazón su apoyo con sus consejos, son diferentes, pero muy apreciados todos, aunque ustedes no lo crean para mi profesión cualquier pista por muy pequeña o insignificante es valiosa, tome en cuenta TODOS los consejos y considero que unos tienen razón que no en todos apartes del programa debe estar la función de borrado, creo que debo organizar un poco mejor el sistema de mantenimiento de la aplicación, desde donde yo pueda hacer mantenimiento a las bases de datos, por ahora seguiré sin el PACK pero desactivando el registro en si.

Esta semana vamos para los ángeles california, por ende dejare de molestarlos, vamos por que en esa ciudad se esta llevando un programa experimental de investigación criminal, les cuento que lo que aparece en CSI o BONES, no es tan cierto, aunque existen sistemas impresionantes, esa tecnología esta mas en manos de los agencias de seguridad, pantallas virtuales de imágenes tridimensionales y muchos programas que aparecen en esas series, pero la mayoría de las imágenes son montajes cinematográficos.

Nuevamente mil y mil gracias, aunque llevo ya casi 15 aplicaciones pequeñas independientes, ya llego la hora de hacer los menús, deseo confirmarle a miguel angel que ya recibimos los iconos como lo solicitamos, necesito tambien el logo institucional del ponal en vector.


Abrazos 

Rita.

TheNewInquirer

unread,
Feb 10, 2012, 11:22:23 AM2/10/12
to Comunidad de Visual Foxpro en Español
Pues la de "Duro de Matar 4" con Bruce Willis, me asombro... jeje

Sobre todo la parte donde sale "El hechicero", un hacker experto que
esta recostado en un centro de comando y que dice tener "el seguro
para el fin del mundo" ya que usa un generador para que nunca "se
desconecte" o deje de estar en linea jajaja!

O la del "El hombre bicentenario" con Robin Williams, sobre Robotica.
Muy sentimental..

O la de "Enemigo Público" con Will Smith, sobre espionaje y
satélites...

Solo hay que entender que el propósito es quitarnos el stress, aunque
algunas cosas pueden ser ciertas..

farh

unread,
Feb 10, 2012, 3:34:59 PM2/10/12
to publice...@googlegroups.com
Me llegan las series de CSI, Criminal Minds, NCIS, etc.............

saludos
 



Sera un gusto poder servirle.
(502) 59378115  (502) 52139269

 

¡¡¡ Fui bendecido, Soy Chapin !!!
       ¡ Stay in the light !
              ¿Ya naciste de nuevo?
                     ¡ Depende de vos........!
                            Knocking on heaven's door.......
                                   .......rompe cadenas
                                        El que piense estar firme, mire que no caiga.  
                                             No tengo plata ni oro, pero lo que tengo te doy.......
                                                  Si no has aprendido a vivir, es tiempo de consultar el manual del fabricante.......

ADVERTENCIA:  El contenido de este mensaje puede salvarte...  


De: Rita Cecila Restrepo De La Hoz <ritacecil...@gmail.com>
Para: publice...@googlegroups.com
Enviado: viernes, 10 de febrero de 2012 9:55
Asunto: Re: [vfp] Me sale Error 110
Reply all
Reply to author
Forward
0 new messages