PDA

Ver la Versión Completa : Master - Detail SQL


HectorMendez
21-04-2008, 14:51:50
Saludos...

Tengo un inconveniente con una aplicacion que estoy desarrollando con unos compañeros, sucede que la aplicacion funciona perfectamente en local, pero al momento de probar en red presenta los siguientes inconveniente.

Utilizo Delphi 7, SQLServer y para la conexion utilizo un componente externo llamado SQLDAC.....

1.- Si estoy en una captura que lleva marter-detail no me permite trabajar al mismo tiempo con usuarios diferentes, es decir tengo una tabla de Aseguradoras y otra de Planes de Seguros (hija de la primera). Si estoy agreando un plan a una aseguradora e intento hacerlo desde otra usuario la misma operacion, se frisa el programa, como puedo resolver eso.

La Prueba la hacemos en la misma pc, iniciando la aplicacion desde delphi y luego desde la carpeta.... si usamos el mismo usuario no sucede lo anterior

2.- El otro inconveniente es que por ejemplo, tenemos un campo en la tabla aseguradora que es el condigo, el cual es autoincrementado, si cargamos la aplicacion dos veces e intentamos captura saldra el mismo numero a los usuarios, es decir el numero que sigue, por ejemplo la ultima fue la 5 al iniciar la captura nuevamente seria la 6 para todos, queremos ahora que el primero que grama se le quede el numero que le corresponde y a los siguientes se aumente en base al ultimo numero, pero no encontramos forma...

:oEspero haber sido explicido... no soy muy bueno dando estos detalles si no estoy mostrando los codigos... ademas no estoy en casa donde los tengo... si no me hago entender favor hacerme saber... :o

Les agradeceria mucho si me pueden ayudar :confused:

oca
21-04-2008, 15:08:02
En cuanto al segundo problema que mencionas tuve uno bastante similar utilizando Firebird, lo solucione modificando la transacción a "Read Committed"

HectorMendez
21-04-2008, 15:11:01
El Problema es que no uso Firebird, uso SQLServer y un componente externo que se llama SQLDAC de CoreLab

oca
21-04-2008, 15:12:24
Si, pero probablemente tambien puedas configurar la manera en que el componente maneja las transacciones.

duilioisola
21-04-2008, 15:14:26
El punto 1 parece ser un problema de transacciones.
El segundo se resolvería asignando los números.
Yo no trabajo con SQLServer y utilizo poco los atoincrementales. Solo para casos en los que se hacen cosas automaticamente.
Lo que hago es tener una tabla con contadores.
Cuando necesito un número:
- hago un select de ese contador.
- le sumo uno
- lo grabo sobre ese contador (con un update)
Si me ha dejado, quiere decir que puedo usarlo. Sinó, que alguien más lo está tratando de utilizar. Espero un poco y lo vuelvo a intenter.

HectorMendez
21-04-2008, 15:18:06
Pensamos en esa solucion, el problema es que si uno de los usuarios que esta capturando cancela.... que pasa con ese numero.... ya queda guardado....
O me equivoco....:confused:

duilioisola
21-04-2008, 15:28:19
Todo se soluciona con transacciones y calculando ese valor en el momento preciso.

Yo calculo el valor justo antes de grabar.
En una tabla normal sería OnBeforePost.

Para esto abro una transacción aparte y calculo el contador. (utilizo un procedimiento almacenado que además verifica si se ha borrado un número y lo reutiliza)

TablaOnBeforePost
begin
Abro TransacciónContador
Calculo Contador
TablaCONTADO.AsInteger := Contador;
end;

TablaOnAfterPost
begin
Cierro TransacciónContador
end;

TablaOnPostError
begin
Rollback de TransacciónContador;
end;