He leído todos los mensajes en este hilo y ahora puedo darte mi opinión.
1. Basicamente tienes tres opciones:
a. Conectarte a la BD cuanto inicia tu aplicación, ejecutar todos los comandos requeridos, desconectarte al finalizar tu aplicación
b. Conectarte a la BD cuando ingresas a un formulario, ejecutar todos los comandos requeridos, desconectarte al salir del formulario
c. Conectarte a la BD cada vez que ejecutas un comando, desconectarte apenas se finaliza la ejecución de ese comando
En todos los casos, antes de ejecutar un comando deberías verificar que la conexión aún se encuentra activa. En el caso de una red LAN eso es lo normal. En el caso de una conexión por Internet no puedes confiar.
Entonces ¿cuál de las tres opciones anteriores es la mejor?
Depende del caso, si todas las computadoras están en una LAN, entonces la 1.a, sin dudas. Para las computadoras que no están allí (por ejemplo, la notebook del Gerente mientras está viajando en un vehículo) la más recomendable suele ser la 1.c aunque por supuesto depende de la estabilidad de la conexión con Internet. Si tiene una buena conexión entonces puedes usar la 1.a también en ese caso.
Tu aplicación debería permitirle al usuario elegir cual de esas tres formas de conexión prefiere (o establecerla tú mismo cuando le instalas tu aplicación)
2. Verificar que la conexión esté activa
Siempre, antes de ejecutar un comando debes verificar que la conexión con el Servidor esté activa, si no lo está entonces:
a. Intentas reconectarte durante "x" veces o durante "y" segundos
b. Si fue imposible reconectarte, entonces muestras un mensaje al usuario
3. Para conseguir lo anterior, en lugar de ejecutar la función SQLEXEC() es preferible que crees una función propia o una clase que se encargue de esa tarea. Por ejemplo, la función SQL_Ejecutar():
a. Verifica que la conexión está activa
b. Si no lo está, reintenta conectarse varias veces. Si no lo consigue, muestra un mensaje al usuario
c. Si la conexión está activa, entonces ejecuta la función SQLEXEC()
d. Devuelve el resultado de la ejecución del comando
4. La velocidad de ejecución también puede ser muy importante, sobre todo en los casos en que hay muchos usuarios concurrentes.
a. Conectarse a la BD al iniciar la aplicación y desconectarse al finalizar la aplicación es lo más rápido
b. Conectarse y desconectarse a cada rato consume tiempo y es más lento, aunque no será notorio si el usuario ejecuta pocos comandos
5. El tráfico por la red (o sea, la comunicación entre el Cliente y el Servidor) debe ser el mínimo de todos los mínimos posibles ya que de esa manera garantizarás una acceso muy veloz a los datos. Eso implica:
a. Que todas tus tablas estén normalizadas
b. Que nunca consultes más filas de las estrictamente necesarias (cargar un cursor con 100.000 filas para mostrarlas en una grilla es una locura y una ineptitud total porque no habrá persona alguna que leerá tal cantidad de filas)
6. Las transacciones deben ser cortas, lo más cortas posible así:
a. Minimizas la probabilidad de un corte de conexión mientras se están grabando los datos
b. Minimizas la probabilidad de un conflicto cuando dos usuarios quieren actualizar la misma fila (porque aunque el Firebird maneja muy bien esta parte, lo hace creando una fila "delta", y la creación de dicha fila tomará algunos milisegundos. Si los conflictos son muy frecuentes entonces la demora puede ser notoria, así que lo mejor es evitarlos)
7. El VFP te permite que las transacciones se graben:
a. Automáticamente
b. Manualmente
Personalmente prefiero grabarlas manualmente, así controlo exactamente el momento y sé lo que está sucediendo, pero es mayormente cuestión de gustos
8. Cuando ejecutas un comando lo puedes hacer:
a. Sincronicamente
b. Asincronicamente
Si sabes o sospechas que la ejecución durará mucho tiempo (más de 10 segundos) entonces es preferible que lo hagas asincronicamente y le muestres una barra de progreso o algún otro indicador al usuario, para que éste sepa que tu aplicación está trabajando ya que nunca faltan los idiotas impacientes que pueden creer que se "colgó" tu aplicación
9. No envíes para su ejecución comandos "puros" (algo como: SELECT * FROM CLIENTES) sino utiliza para ello vistas y procedimientos almacenados, eso te dará mucho mayor control sobre lo que cada usuario puede hacer y no hacer, ya que las vistas y procedimientos almacenados pueden ser restringidos de tal manera que solamente los usuarios autorizados puedan ejecutarlos.
10. A los usuarios no les des acceso a las tablas directamente, cualquier operación que quieran realizar con ellas que lo hagan a través de vistas o procedimientos almacenados. Siempre, sin excepción. El único con derecho al acceso directo a las tablas deberías ser tú.
11. Nunca permitas que se inserte basura en las tablas. Para ello, además de tus validaciones en VFP utiliza los triggers, los cuales son buenísimos para validar que solamente los datos correctos sean grabados.
12. Nunca elimines fisicamente una fila que haya sido usada alguna vez. En su lugar es preferible tener una columna que muestre el estado (Activo / Inactivo). Si quieres ser más detallista inclusive puedes grabar también la fecha y hora del cambio de estado, así como el nombre del usuario.
13. Haz backups frecuentes (completos o incrementales) de tu BD y guárdalos en otra habitación, no en la habitación donde se encuentra el Servidor.
14. Si no todas las computadoras están en una LAN entonces debes tener un mecanismo de replicación. Por ejemplo cuando:
a. Hay computadoras en ciudades diferentes o en barrios diferentes
b. Hay alguien con una notebook fuera del local de la empresa
15. No utilices shadows, están obsoletos, la replicación es preferible.
Creo que esos son los lineamientos generales, si tienes alguna duda, sólo pregunta.
Saludos.
Walter.