Autor |
Mensaje |
Miembro
Ocasional
|
#1 Publicado: 28 Ene 2011 16:19 - Editado por: carlosv3
Hola a todos, ante todo saludarlos y agradecer por toda la ayuda que he encontrado en este foro.
Este es mi primer mensaje, estoy intentando resolver un tema y a pesar de haber buscado en el foro decidí preguntar porque no encuentro solución.
ESCENARIO:
Instalación con FM Server 7 dedicado, y varios clientes usando FM Pro 7 y FM pro 8.
En una de las bases necesito numerar secuencialmente los registros en función de su destino.
Campo Destino Campo NumeroDeSerie
Es decir, en "Destino" tendré valores como "Argentina", "Chile", "UniónEuropea", "USA", etc.
Necesito que la numeración del campo "NumeroDeSerie" sea secuencial para cada destino, o sea, numerar correlativamente por destino aunque los destinos estén intercalados. Ejemplo
Destino="Argentina" NumeroDeSerie=1 Destino="Argentina" NumeroDeSerie=2 Destino="USA" NumeroDeSerie=1 Destino="Argentina" NumeroDeSerie=3 Destino="Chile" NumeroDeSerie=1 Destino="USA" NumeroDeSerie=2 Destino="Argentina" NumeroDeSerie=4 ... ... etc.
Aclaro antes que nada que en dicha base NO está permitido borrar registros, eso se maneja por otro mecanismo con un campo de "Estado" con valores de Activo/Anulado.
PROBLEMA:
Si la base es usada por 1 único usuario a la vez, no hay ningún problema.
Pero cuando varios usuarios (desde distintas terminales) generan registros al mismo tiempo, resulta que obtengo valores repetidos en "NumeroDeSerie".
Asumo que esto se da porque un cliente no se entera de que otro ha generado un nuevo registro, las peticiones parten al mismo tiempo de distintos puntos de la red y resuelven el mismo número.
Hasta ahora he intentado 2 aproximaciones y muchas variantes de estas.
Primer aproximación:
Script de creación de registros que realiza lo siguiente:
- Busca todos los registros usando como criterio de búsqueda el campo "Destino" (Ej. Chile) - Se dirige al último registro encontrado. - Guarda el valor del campo "Destino" en un campo global "TempGlobalDestino" - Guarda el valor del campo "NumeroDeSerie" en un campo global "TempGlobalNumeroDeSerie" - Genera un nuevo registro - Guarda el valor de "TempGlobalDestino" en el campo "Destino" del registro recién creado. - Guarda el valor de ("TempGlobalNumeroDeSerie"+1) en el campo "NumeroDeSerie" del registro recién creado.
Segunda aproximación:
- He creado un campo global "TempGlobalDestinoNuevoRegistro". Mediante este campo hice una auto-relación con una segunda instancia de la misma tabla, hacia el campo "Destino". De tal forma que en la segunda tabla aparecen solo los registros de un mismo Destino en función del valor de "TempGlobalDestinoNuevoRegistro"
- Definí el campo "NumeroDeSerie" para que Auto-Ingrese el valor al momento de crearse el registro por medio del siguiente cálculo.
If( Count( AutoRelacionPorDestino::NumeroDeSerie ) = 0 ; 1 ; Max( AutoRelacionPorDestino::NumeroDeSerie ) + 1 )
De manera tal que si no hay registros de ese tipo se genere el Número 1, y si ya existen, se genere un valor equivalente al mayor encontrado más 1.
- He creado un Layout en el cual solo hay 2 elementos, el campo "TempGlobalDestinoNuevoRegistro" y un botón que ejecuta un script.
Este script, simplemente verifica que "TempGlobalDestinoNuevoRegistro" no esté vacío, y luego crea un nuevo registro.
Hasta ahora, con ambas aproximaciones, no he logrado evitar el problema de la concurrencia de varios usuarios al mismo tiempo, siempre que dos usuarios generan registros al mismo tiempo aparecen números de serie repetidos.
Aclaro que he intentado variantes mediante portales pero la situación es la misma.
La base ya está en producción, hace poco que la mantengo, no tengo contacto con su creador, y este no ha dejado nada documentado, por lo que he tenido que ir descifrando que ha querido hacer su anterior responsable.
Actualmente a modo de solución de compromiso, he bloqueado la creación de registros restringiéndola a un solo usuario, al que todos necesitan acudir cada vez que necesitan un nuevo registro. Entiéndase que esto es sumamente inapropiado, pero una numeración duplicada traería aparejadas consecuencias legales.
Sepan disculpar lo extenso del mensaje, espero haber explicado bien el problema.
Agradezco cualquier ayuda que me pudiesen brindar.
Si este mensaje te ha servido de ayuda dale tu voto
, si quieres penalizarlo
--
CarlosV3
WinXP/2k3 - FileMaker Pro 7 y 8 / Server 7
|
Administrador

|
#2 Publicado: 28 Ene 2011 17:00
carlosv3: concurrencia de varios usuarios Cuando varios usuarios concurren al mismo tiempo, para que no pase esto, puedes utilizar un registro único que dejas abierto mientras se crea la numeración, de forma que ese registro, mientras permanezca abierto solo uno lo puede modificar, el que lo está utilizando. SI todos tienen que pasar por ese registro, al estar ocupado no podrán entrar hasta que el que lo ocupa lo suelte.
Si este mensaje te ha servido de ayuda dale tu voto
, si quieres penalizarlo
Todo lo que sueñas, se puede diseñar.
FM 11 * VV 6 * PHP 5 * MySQL * Win 8.
|
Miembro
Ocasional
|
#3 Publicado: 28 Ene 2011 17:13
Muchas gracias por la pronta respuesta.
jcu: dejas abierto mientras se crea la numeración, de forma que ese registro, mientras permanezca abierto solo uno lo puede modificar, el que lo está utilizando. SI todos tienen que pasar por ese registro, al estar ocupado no podrán entrar hasta que el que lo ocupa lo suelte. Si no es mucho pedir. ¿Podrías ilustrarme con un ejemplo de como harías esto?
La verdad no se me ocurre como.
No sé si entendí bien lo siguiente:
jcu: SI todos tienen que pasar por ese registro Gracias.
Si este mensaje te ha servido de ayuda dale tu voto
, si quieres penalizarlo
--
CarlosV3
WinXP/2k3 - FileMaker Pro 7 y 8 / Server 7
|
Administrador

|
#4 Publicado: 28 Ene 2011 19:18
Para entendernos, cuando un usuario modifica un registro, solo ese usuario puede hacerlo a la vez. Por lo tanto, si tu ocupas un registro, mientras realizas los cambios que tienes que hacer, ningún otro usuario podrá tocarlo.
Si este mensaje te ha servido de ayuda dale tu voto
, si quieres penalizarlo
Todo lo que sueñas, se puede diseñar.
FM 11 * VV 6 * PHP 5 * MySQL * Win 8.
|
Miembro
Ocasional
|
#5 Publicado: 29 Ene 2011 22:05 - Editado por: carlosv3
Muchas gracias jcu creo que ya está resuelto, voy ha hacer un poco de testing antes de pasarlo a producción, pero parece que ya solucioné.
Describo lo que hice.
En la base que que necesita bloquear la concurrencia generé una nueva tabla llamada "Bloqueo" Destro de esta tabla generé solo 1 campo llamado "Bloqueado"
Luego he creado un Layout llamado "Bloqueo", lo único que contiene es el campo "Bloqueado" de la tabla "Bloqueo"
luego en la otra tabla, en la que tengo que generar los registros con acceso exclusivo he generado un script que hace lo siguiente.
[code] - allow user abort [off] - go to layout "Bloqueo" - go to record / request [first] - if ( "bloqueado" = 1 ) - show message "Atención - Otro usuario está generando registros, espere unos seugndos y vuelva a intentar" - go to layout "original layout" - exit script - else - set error capture [on] - set field "Bloqueado" = 1 - if ( not( get( lasterror ) = 0 ) - show message "Atención - Otro usuario está generando registros, espere unos seugndos y vuelva a intentar" - else - go to layout "original layout" - new record/request - go to layout "Bloqueo" - go to record / request [first] - set field "Bloqueado" = 0 - end if - go to layout "original layout" - exit script [/code]
* editado para dejar el script completo (hubo un error al pegarlo).
Si este mensaje te ha servido de ayuda dale tu voto
, si quieres penalizarlo
--
CarlosV3
WinXP/2k3 - FileMaker Pro 7 y 8 / Server 7
|
Miembro
Ocasional
|
#6 Publicado: 1 Feb 2011 21:50
Solamente quisiera agregar algo más, luego de hacer algunas pruebas
If( Count( AutoRelacionPorDestino::NumeroDeSerie ) = 0 ; 1 ; Max( AutoRelacionPorDestino::NumeroDeSerie ) + 1 ) Esto no funciona del todo porque Count() devuelve la cuenta de todos los valores no nulos, entonces hay que tener cuidado de que cuando procedamos a contar siempre lo hagamos sobre un campo que sea imposible que esté vacío.
En mi caso se resolvió realizando la cuenta sobre el id de la tabla, que por supuesto, nunca devuelve vacío.
Muchísimas gracias nuevamente jcu, tu aporte fue de gran ayuda para poder pensar el problema de manera diferente a como lo venía haciendo.
Si este mensaje te ha servido de ayuda dale tu voto
, si quieres penalizarlo
--
CarlosV3
WinXP/2k3 - FileMaker Pro 7 y 8 / Server 7
|
Administrador

|
#7 Publicado: 1 Feb 2011 21:58
De nada... siempre es un placer que "a veces" el foro sierve para algo.
Si este mensaje te ha servido de ayuda dale tu voto
, si quieres penalizarlo
Todo lo que sueñas, se puede diseñar.
FM 11 * VV 6 * PHP 5 * MySQL * Win 8.
|