Apúntate a la Zona De Descargas Reservadas (ZDDR). Solo son 20 Euros
Con solo 20€ ayudarás
a mantener el foro.


Seguir a udias en Twitter
Directorio de Empresas de Foros de informática


Todo lo que sueñas, se puede diseñar.
We build your dreams.

 - Principal - Responder - Estadísticas - Registrarse - Buscar - Lista de usuarios -  - Zona de Descargas
 -Privacidad y política de cookies -
Ayuda al foro con tu donación

Búsqueda en los foros

Foros en Udias.com / FileMaker / Numeraciones superpuestas mismo campo - Problema múltiples usuarios
Autor Mensaje

Miembro

Ocasional

  Karma     25

#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 Voto positivo, si quieres penalizarlo Voto positivo
--
CarlosV3
WinXP/2k3 - FileMaker Pro 7 y 8 / Server 7

Administrador


  Karma               26354

#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 Voto positivo, si quieres penalizarlo Voto positivo
Todo lo que sueñas, se puede diseñar. FM 11 * VV 6 * PHP 5 * MySQL * Win 8.

Miembro

Ocasional

  Karma     25

#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 Voto positivo, si quieres penalizarlo Voto positivo
--
CarlosV3
WinXP/2k3 - FileMaker Pro 7 y 8 / Server 7

Administrador


  Karma               26354

#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 Voto positivo, si quieres penalizarlo Voto positivo
Todo lo que sueñas, se puede diseñar. FM 11 * VV 6 * PHP 5 * MySQL * Win 8.

Miembro

Ocasional

  Karma     25

#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 Voto positivo, si quieres penalizarlo Voto positivo
--
CarlosV3
WinXP/2k3 - FileMaker Pro 7 y 8 / Server 7

Miembro

Ocasional

  Karma     25

#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 Voto positivo, si quieres penalizarlo Voto positivo
--
CarlosV3
WinXP/2k3 - FileMaker Pro 7 y 8 / Server 7

Administrador


  Karma               26354

#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 Voto positivo, si quieres penalizarlo Voto positivo
Todo lo que sueñas, se puede diseñar. FM 11 * VV 6 * PHP 5 * MySQL * Win 8.
Su respuesta

Estilo Negrillas  Estilo Italico  Estilo Subrayado  URL De La Imagen  URL De La Web  Preformatted Text  YouTube URL  Sin código BB
Emoticones
:) ;) :up: :down: :biglol: :confused :cool: :mad: :sad: :shame: :smirk: :tongue: ... Más  Emoticones desactivados
Color de texto
Texto en negro Texto en blanco Texto en gris Texto en rojo Texto en azul Texto en verde Texto en rojo oscuro Texto en cian Texto en azul oscuro Texto en púrpura Texto en amarillo Texto en rosa Texto en naranja Texto en verde oliva Texto en marrón



 » Usuario  » Contraseña 
Solo Usuarios Registrados Pueden Postiar Aqui.
 

Tópicos relacionados con Numeraciones superpuestas mismo campo - Problema múltiples usuarios

Mismo encabezado en hojas multiples
Restriccion de usuarios multiples en una BD comun - Como se hace?
Dos usuarios en mismo registro
FileMaker Server, varios usuarios al mismo tiempo... y privilegios
problema con selecciones multiples


Conectados: Invitados - 9
Miembros - 0
En verde usuarios ZDDR

Realizado con miniBB © 2001-2021
Para Udias.com © 1996-2021
Hosting con Interdominios