Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Paradox en Red (https://www.clubdelphi.com/foros/showthread.php?t=77625)

jhonalone 12-02-2012 20:28:05

Paradox en Red
 
Hola a todos.

Antes de nada, os pido disculpas por volver sobre un tema tan tratado en estos foros.

He estado leyendo muchas y buenas soluciones en los foros. Pero cada caso es particular, y no me dan luz sobre mi problema. Aparte de exigirme importantes cambios en la aplicación ya definida.

Intentaré ser breve:
Disculpad si digo alguna obviedad o barbaridad, pero soy muy novato en esto de las bases de datos.

Tengo un programa con dos bases de datos Maestro/Detalle, originalmente pensado para correr en monopuesto.
La implementación de las bases es manual, con lo que quiero decir que no he utilizado el DataModule.
Tengo dos TTable, dos TDataSource y un TDataBase, no utilizo alias, sino el propio directorio dondo están ubicadas.
Utilizo el siguiente código para abrirlas:

Código Delphi [-]
try
Fclien.database1.Session.NetFileDir:=DirActual;
FClien.ClienDB.DatabaseName:=DirActual;
FClien.ActosDB.DatabaseName:=DirActual;
FClien.ClienDB.Open;
FClien.ActosDB.Open;
except
begin
Application.MessageBox('Error en alguna Base de Datos. Utilice la opción "Reindexar Bases de Datos" del Menú Contextual, '+
                            '( Pulse el botón derecho del ratón en la pantalla principal del programa. )'+#13+
                            'Si ésto no resuelve el problema, póngase en contaco con el Servicio Técnico del programa.',
                            'Mensaje de Error',mb_OK + mb_IconError);
Exit;
end;
end; //try


Ahora necesito correrlo en Red.
No desearía tener que implantar una copia del programa en cada PC, dado que, aparte de las tablas, el programa usa distintos archivos que deben ser comunes a todos los usuarios y que deben estar accesibles en un mismo PC.

Lo he probado en una red local, llamando al programa desde otro PC de la misma red.
Aparentemente se abren los dos programas y funcionan independientemente, pero hay un problema de actualización de datos. Este problema consiste en que las modificaciones que realizo en un PC no aparecen en el otro, a pesar de que tengo puesto en el evento AfterPost:

Código Delphi [-]
ClienDB.FlushBuffers;
ActosDB.FlushBuffers;


He observado que cuando salgo del programa y vuelvo a entrar, los cambios sí están ahí. Llegando a la conclusión de que cuando cierro y abro las bases tengo acceso a las modificaciones realizadas.

Por lo tanto, he incluído en el formulario una bótón para realizar esta labor: cierrra las bases y las vuelve a abrir y así actualizo los datos.

Como entiendo que esto es una auténtica "chapuza", apelo a vuestra buena fe, y vuestros conocimientos, para que me iluminéis con una solución más elegante y práctica. Con los mínimos cambios posibles en el código, pues lo tengo muy repartido en varios formularios.

Anticipadamente os agradezco vuestro tiempo y vuestro esfuerzo.

jhonalone 12-02-2012 20:32:30

Siento que el código no haya salido enmarcado, pero en la vista previa salía bien.

Casimiro Notevi 12-02-2012 20:56:23

Cita:

Empezado por jhonalone (Mensaje 424958)
Siento que el código no haya salido enmarcado, pero en la vista previa salía bien.

Algunas veces ocurre si se se da 'vista previa' antes de enviar.
Si se envía primero entonces queda bien, luego ya se puede corregir, no hay problema.

marcoszorrilla 12-02-2012 21:56:18

El problema viene dado porque tienes abierta una instancia de la tabla en otro Pc y hasta que la cierres y la abras o hagas un Refresh de la tabla no leerá los cambios que se han producido.

Lo lógico sería proceder al revés, tener la tabla o tablas cerradas y cuando abrás el formulario abrir las tablas que por otra parte sería mejor alojarlas en un DataModule y así tenerlas centralizadas.

Aún así si tienes una rejilla abierta con los datos no verá los cambios hasta que salgas del formulario y vuelvas a entrar, para estos casos se suele poner un timer y pasado un x tiempo lanzar un refresh sobre la tabla sin tener que cerrar el formulario para estos menesteres.

Un Saludo.

jhonalone 13-02-2012 13:13:38

Gracias Marcos.
Creo que me has dado una magnífica solución.
Lo del timer no creo que lo haga, lo tengo que pensar mejor, pues tendría que actualizar tambien la rejilla para que fuera efectivo y podría interferir algún cambio que esté haciendo un usuario.
Creo que es mejor tener controlado cuándo se refresca, por ejemplo antes de leer un registro y antes de hacer un Post. También tengo que revisar el control de concurrencia... Veré cómo lo hago.
¿Que te parece?
Voy a probarlo y te cuento.
Un Saludo.

jhonalone 13-02-2012 14:01:22

Ahora me está surgiendo una duda...

¿Por qué tengo que refrescar explícitamente, si tengo la propiedad ClienDB.AutoRefresh=True?

Gracias.

jhonalone 13-02-2012 17:33:51

Bueno.

Llevo toda la tarde haciendo pruebas y os comento los resultados.

1.- Refrescar las bases no sirve de nada.
2.- Cerrar y abrir las bases actualiza los datos.
3.- Una vez me ha dado el error de Index out o date al iniciar el programa, y estoy intentando averiguar por qué.
4.- He leido por ahí que el archivo PDOXUSRS,NET no conviene que esté en el mismo directorio de las bases y voy a intentar cambiarlo a ver si se resuelve.
5.- ¡Estoy hasta el gorro del BDE!, pero no puedo hacer otra cosa, pues no conozco otro sistema de bases de datos y me da miedo meterme a estudiarlo, por el tiempo que me puede hacer perder.

Perdonar mi pesadez, acepto sugerencias.

Saludos.


La franja horaria es GMT +2. Ahora son las 16:15:50.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi