FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
autonumerico en base al maestro
Hola a todos tengo estas tres tablas en firebird 1.5
CREATE TABLE TESTILO ( ID VARCHAR(15) NOT NULL, DESCRIPCION VARCHAR(40), FECHA DATE DEFAULT 'now', ID_MATERIAL INTEGER, IMAGEN IMAGENES /* BLOB SUB_TYPE 0 SEGMENT SIZE 80 */, PRECIO FLOAT, PRODUCDESEADA INTEGER, EFICIENCIA INTEGER, CANTIDAD INTEGER, ID_CLIENTE INTEGER ); CREATE TABLE TOPERACIONES ( ID INTEGER NOT NULL, AVERVIATURA VARCHAR(10), DESCRIPCION VARCHAR(40), FECHA DATE DEFAULT 'now', PAGOSEMANA FLOAT, ID_TIPOMAQ VARCHAR(10), ID_DEPTO INTEGER, MINUTAJE TIME, MINTSEXA FLOAT, MINTOCIO FLOAT, TAREAPORHORA FLOAT, TAREAPORDIA FLOAT, PAGOOPER FLOAT ); CREATE TABLE TOPERESTILO ( ID INTEGER NOT NULL, ID_ESTILO VARCHAR(15), ID_OPER INTEGER ); el campo ID de la tabla toperaciones es autonumerico con su generator y su trigger y funciona bien, la tabla toperestilo es un maestro detalle ya que por id_estilo puede haber una o mas operaciones pero necesito que el campo id empiese a numerarse desde 1 cada que ID_Estilo cambia de valor y así despues poder saber cuantas veces la operación uno fue la primera en realizarse, cuantas fue la tercera etc. espero me puedan ayudar y sobretodo me entiendan
__________________
Espero poder seguir exprimiéndote el cerebro 8) Jorge Zamora Ginez Puebla, Pue. México |
#2
|
||||
|
||||
para esto no podes usar un generador. Es mejor que asignes los números desde tu aplicación... pues el generador partirá de 1, y no volverá "automáticamente" a este valor....
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate Última edición por jachguate fecha: 23-04-2004 a las 00:16:27. |
#3
|
||||
|
||||
Master, nuevamente mil gracias.
oye ya entrados en la exprimidera de cerebros siempre he escrito mis trigger como viene en la ayuda de interbase es decir entre los comandos SET TERM !! ; Create trigger............ . . . SET TERM; !! pero nunca he encontrado para que son me podrias esplicar su uso. gracias
__________________
Espero poder seguir exprimiéndote el cerebro 8) Jorge Zamora Ginez Puebla, Pue. México |
#4
|
||||
|
||||
esto, segun tengo entendido, ya ha sido superado en la versión 1.5 de firebird. Básicamente, es debido a que el programa cliente no era capaz de recnoocer el final del trgger/stored procedure, debido a que el caracter de fin de sentencia (;, que es el que normalmente se usa para delimitar las sentencias en un script, también se utiliza para delimitar las sentencias dentro del trigger.
Si no haces la llamada a set term... ocurrirá que, en un script como este: Código:
Create trigger mitrigger Active before insert on tabla AS Begin Update OtraTabla Set campo = campo + New.campo where llave = New.llave; Update OtraTabla2 Set campo = campo + New.campo where llave = New.llave; End; Al cambiar el caracter de terminación de las sentencias por !!, por ^ o por cualquier otro delimitador que no sea el punto y coma, se consigue determinar donde termina efectivamente la sentencia... evitando estos problemas. Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#5
|
|||
|
|||
Código PHP:
Código:
Create Procedure INICIA_GENERADOR As DECLARE VARIABLE GEN INTEGER; Begin GEN = GEN_ID(generador,0); WHILE (GEN > 0) DO GEN = GEN_ID(generador,-1); END
__________________
saludos desde Puebla Mexico.. asanxt@hotmail.com "como siempre a sus ordenes y siempre con buena cara" 'lolita me excitas, perversa piel de melocotón' |
#6
|
||||
|
||||
Pero vos estas asumiendo el caso en que no habrá necesidad de insertar un nuevo registro detalle para un registro ya existente... o que no habrá dos usuarios ingresando información concurrentemente. En cualquiera de estos dos casos, el proceso fallará generando claves duplicadas (suponiendo que la clave es clavemestro+contadordetalle)
En el post anterior, cometí el error de usar el verbo poder, cuando debi usar el deber. "Para esto no debes usar un generador"... en fin, son vicios de lenguaje. Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#7
|
|||
|
|||
Pues no le veo
Pues no le veo problema, puesto que podemos crear su generator para cada usuario diferente, en tiempo de ejecucion y asi como su Stored Procedure, y como dices el problema seria clavemaestro+clavecontador, pero como tu dices tambien se toparia con lo mismo, supongamos que sea un punto de venta y el pastelito x tiene la clave 1 y al mismo tiempo llegan dos clientes en diferentes cajas y los cajeros chechan el pastelito 1 primero ahi tambien se repetiria.. no crees¡¡¡¡, entonces la clave primaria deberia ser clavemaestro+clavecontador+numerodecaja
__________________
saludos desde Puebla Mexico.. asanxt@hotmail.com "como siempre a sus ordenes y siempre con buena cara" 'lolita me excitas, perversa piel de melocotón' |
#8
|
||||
|
||||
Cita:
Cita:
Yo no me refiero a que se duplique el número del contador, que eso es precisamente lo que se busca. Pero te voy a poner un ejemplo... suponiendo el caso ya expuesto del punto de venta. Estado Actual: Caja1: Esperando cliente Caja2: Esperando cliente Caja3: Cajero en tiempo de comida Secuencia de sucesos:
Esto es para un caso sencillo con solo 3 usuarios concurrentes... pero en la práctica puede llegar a ser mucho mas complejo. Si puede crearse un generador por usuario, dependerá que un usuario quiera usar solamente una instancia de la aplicación. El crear uno por terminal... limitará a una instancia por terminal... En fin, es mi apreciación personal, que en este caso, es mejor establecer otro método para generar este tipo de secuencias... o bien cambiar un poco la forma de pensar, y tener un único generador para todos los detalles. La mejor forma de hacerlo, será diferente de acuerdo a las especificaciones de cada aplicación, y corresponderá a su analista definir un criterio. Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#9
|
|||
|
|||
Asi es como dices
Asi es como dices estamos asumiendo que estamos haciendo el programa nosotros, jejeje y no deberiamos.. pero nada mas te explico mi idea va
Antes de tu estado actual falta el prender las cajas
Estado Actual:
Secuencia de sucesos:
Esto dependiendo del tipo de aplicación real, puede o no tener importancia. Ahora lo que pones a continuacion, asi como tu dices y como yo digo lo que debemos hacer es saber cual es el ultimo numero de item que metio. Caja 3 Regresa de comer, y le piden que agregue un item a la factura 3, que ya tenia grabados 75 items... Entonces ahi seguimos usando la potencia de los procedimientos almacenados, (de todos modos hay que consultar cuantos tiene) consultando cuantos items tiene y vamos aumentando el GCaja3 hasta 75 (en este caso) entonces entraria el 76 (error: seguramente habrá clave duplicada (3, 4) (o a estas alturas ya es una loteria)) weno ya vez alguna vez nos han de servir estas ideas no crees, y como tu dices todo empezo por el uso de nuestro lenguaje saludos
__________________
saludos desde Puebla Mexico.. asanxt@hotmail.com "como siempre a sus ordenes y siempre con buena cara" 'lolita me excitas, perversa piel de melocotón' |
#10
|
||||
|
||||
ahora dejemos la aplicación de caja... y vamos a una aplicación donde, por cualquier motivo, un usuario entra dos veces al sistema... cómo resolverias esto???
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#11
|
|||
|
|||
compañero...
si te das cuenta estoy creando generadores por maquina no por usuario, osease el usuario puede tener 3 maquinas al mismo tiempo..
resuelto..
__________________
saludos desde Puebla Mexico.. asanxt@hotmail.com "como siempre a sus ordenes y siempre con buena cara" 'lolita me excitas, perversa piel de melocotón' |
#12
|
||||
|
||||
oh.. entonces supongamos que un usuario abre dos instancias del programa en la misma máquina...
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#13
|
|||
|
|||
Pues ...
Pues que programador mas chafa si deja abrir otra instancia, por que eso se ve a leguas que puede pasar¡¡¡
ahora preguntame y si llega el raton miguelito y se mete al servidor y no deja avanzar o pone en cero el generator ¿¿pero haber que pasaria si le da post y le falta un dato que no debe de ser nulo, el generador avanza, como resolverias esto?? para que vuelva a regresar al que se quedo
__________________
saludos desde Puebla Mexico.. asanxt@hotmail.com "como siempre a sus ordenes y siempre con buena cara" 'lolita me excitas, perversa piel de melocotón' |
#14
|
||||
|
||||
El punto a resaltar, es que, evidentemente hay muchas formas de resolver el problema... algunas funcionarán en unos casos y no en otros... y como lo dije antes, será al analista a quien le corresponde determinar el mejor camino en base a los requerimientos de su aplicación. No hay una regla general aplicable a todos los casos.
Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#15
|
||||
|
||||
hola para empezar una disculpa pues no habia podido contestarles ya que me habia quedado sin conección a internet, voy a checar bien sus sugerencias y probar cuales son los pro y contra de acuerdo al sistema que estoy haciendo y les platicare despues en que quedo.
Gracias
__________________
Espero poder seguir exprimiéndote el cerebro 8) Jorge Zamora Ginez Puebla, Pue. México |
#16
|
||||
|
||||
Hola amigos les comento que para el campo autonumerico en base al maestro por la urgencia en el uso lo programe en mi aplicación pero hoy ya con calma modifique mi triger de la siguiente forma:
y las prueba que hasta el momento llevo va funcinando bien
__________________
Espero poder seguir exprimiéndote el cerebro 8) Jorge Zamora Ginez Puebla, Pue. México |
#17
|
|||
|
|||
Que bien que..
Que bien que has hecho las pruebas..
Eso si funciona bien si no tienes un indice que no sea el autoincremento.. cuando te manda el error de un indice duplicado se genera el autoincremento y se generara tambien tu contador
__________________
saludos desde Puebla Mexico.. asanxt@hotmail.com "como siempre a sus ordenes y siempre con buena cara" 'lolita me excitas, perversa piel de melocotón' |
|
|
|