FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Usar variables en un strored procedure
Tengo un procedimiento en una BB.DD. en FB 2.5 definido así:
El problema es que me acabo de dar cuenta que en la tabla sobre la que actúa la clave primaria tiene dos campos: De los dos campos de la clave, el primero de ellos (CodPrv) es fijo y va asociado a la instalación (para los que seáis de España el valor es: 13 Ciudad Real, 28 Madrid, 45 Toledo, etc.); está pensado para si en un futuro se integran las bases de datos que hay en diversas provincias en una única base de datos central. Lo que no se me ocurre es como asignar ese valor fijo CodPrv, que se guarda en una variable desde el momento que se lanza la aplicación, a la hora de ejecutar ese procedimiento. Me he vuelto loco buscando documentación. Última edición por Casimiro Notevi fecha: 06-11-2015 a las 19:53:15. |
#2
|
||||
|
||||
Pásale el parámetro que necesites:
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código Únete al grupo Teaming clubdelphi | Colabora mediante Paypal Última edición por Casimiro Notevi fecha: 06-11-2015 a las 20:03:21. |
#3
|
||||
|
||||
Garcias por la respuesta Casimiro. Un modelo de código similar lo había visto pero no entiendo como asignar el valor a la variable de entrada; es decir: ¿cómo le digo al procedimiento, que además vendrá lanzado desde un trigger, que por ejemplo iProvincia vale 45? En este tema de tirggers y procedires estoy muy verde y os juro que me pierdo hasta con mapa
|
#4
|
||||
|
||||
Me explico mejor. Entiendo que la llamada al procdure sería algo así:
Código PHP:
Código PHP:
Código PHP:
|
#5
|
||||
|
||||
Creo que te estás liando, o seguramente no te estoy entendiendo
Tienes una tabla con 2 campos, el código de la provincia y un código incremental, supongo. Tú das de alta un registro con esos 2 campos, tan sólo que el código incremental se genera automáticamente mediante un trigger en el before insert de la tabla. No necesitas crear ningún stored procedure para eso. El inconveniente que veo es que por ejemplo: provincia madrid 28 y código 1= 281. Sin embargo, la provincia Albacete es 2 y el código 81 formarían: 281 también. Debes hacer un "cast" a ambos valores si no quieres tener problemas, bueno, bastaría con hacerle el cast a la provincia para que tenga siempre 2 caracteres, Para ello, el campo provincia debe ser varchar(2) y rellenar con cero por la izquierda: 01, 02, etc. Algo así: cast(new.provincia as varchar(2)) Tal vez te interese tener una clave ID autoincremental y un campo provincia+código indexado, de tipo varchar. No sé he entendido bien. |
#6
|
||||
|
||||
Gracias por la respuesta. Creo que no me he explicado bien y me has dado una pista para solucionarlo. Vamos por partes.
La tabla a la que me refiero en el ejemplo es esta: Como ves los dos primeros campos son los que están en la clave primaria. No se me había ocurrido ese posible problema que indicas con la clave; es evidente que poniendo el código provincial como VARCHAR(2) se elimina dicho problema. El campo Codigo es (o debería serlo) autoincremental. Y es aquí donde me surgen las dudas: Si no estuviera el campo de la provincia no tendría problema; pero al estar ese campo en la calve primaria ¿cómo haría para crear dicho valor? Es decir, y poniendo el código provincial como VARCAHR (tienes razón: es mejor), para que fuera 011, 012, 013, etc. Con un trigger, por lo que llevo leído y entendido, no se podría ya que en los mismos no se pueden usar variables y si se pueden usar no veo como llamar a una que está definida en el programa. Es decir: en un query podría hacer esto: Código PHP:
Última edición por Casimiro Notevi fecha: 07-11-2015 a las 12:44:35. |
#7
|
||||
|
||||
La clave primaria puede estar compuesta por varios campos, no hay ningún problema en ello.
Tendrás que hacer la búsqueda por ambos campos: La verdad es que todavía no entiendo qué problema tienes. No entiendo lo que preguntas del trigger. |
#8
|
||||
|
||||
Tienes razón. Me acabo de dar cuenta que me estaba liando de mala manera en las preguntas y todo el lío que estoy montando es absurdo: Dado que las BB.DD. están separadas, cada una en su provincia y no están conectadas entre sí, me da lo mismo que el contador tenga en cuenta o no el código provincial.
|
#9
|
||||
|
||||
Hola,
independientemente de que lo necesites o no, el tema que has propuesto es fácil de solucionar. Igual que pones el id mediante un generador, puedes poner la provincia. En éste último caso, iría a piñón. Para que puedas utilizar el mismo código para todas las sucursales, sólo te haría falta una tabla de parámetros o similar para coger el valor. Algo así
yo te sugiero una tabla de parámetros. En cada provincia pones un valor diferente, y el código del trigger es para todas igual. Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino - |
#10
|
||||
|
||||
Cita:
|
#11
|
||||
|
||||
El problema es que desconoces cómo funcionan los triggers, por eso te estás liando. Lo primero es entender el funcionamiento de los mismos, revisa el capítulo 23 de La cara oculta de Delphi, habla de "Stored procedure y triggers". Concretamente el apartado " Las variables new. y old. ".
Es sencillo, pero hay que tener los conceptos claros. |
#12
|
||||
|
||||
De memoria... con errores sintácticos y demás...
Ahora, te hace falta leer mucho, tal y como te ha remoendado Casimiro. Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino - |
#13
|
||||
|
||||
Gracias a los dos. Partiendo de la base de que efectivamente estoy aprendiendo a usar triggers y strored procedures; leí el capítulo que me indicáis de la Cara oculta de Builder y mucha información que he encontrado, especialmente en Teoría y Práctica sobre Firebird. Pero en todo lo que he leído no me aclara la duda que tengo.
A ver si lo he entendido bien, y perdonad si soy un pesado: En el código que pone de ejemplo fjcg02 se busca un valor en la tabla de parámetgros (SELECT FIRST ...) pero es que no es el caso que yo planteo. Yo ya sé cual es el valor de ese campo (pongamos por ejemplo, ya que resido en Toledo, el 45); por lo tanto no tengo que buscar cuál es su valor, y esa es mi pregunta: ¿Cómo le digo al trigger o al procedimiento que el código provincial es 45? El otro día Casimiro me sugería un código: Pero sigo sin entender, y por más que he leído no lo entiendo, como decirle a ese procedimiento que iProvincia vale 45. Y reitero mis dusculpas por ser tan bruto. |
#14
|
||||
|
||||
Es que hay muchas formas de hacerlo y no sabemos cómo lo estás haciendo tú.
Supongamos que grabas el registro desde delphi/builder. El trigger before insert sabe qué código de proveedor estás grabando, el 45, no tienes que hacer nada. Ummm... sigo sin entender el problema |
#15
|
||||
|
||||
Gracias. Ahora sí me has resuelto la duda.
|
#16
|
||||
|
||||
Ten en cuenta que los triggers se "disparan" automáticamente. Una vez programados no hay que preocuparse por ellos, hacen el trabajo repetitivo y pesado, no se interactua con ellos desde delphi/builder, son independientes.
Por ejemplo, en el ejemplo anterior que he puesto (el insert), el trigger tiene acceso al registro que se está creando. Si necesitas hacer algo con el codprov, su valor está en new.codprov
En los triggers Before/After update tienes disponible las variables new. y old. Ejemplo, automáticamente vamos a mudar a los proveedores de Madrid hacia Toledo: trigger before update ...
Depende si es un trigger insert/update/delete tienes a disposición solamente new. / old. y new. / solamente old. |
#17
|
||||
|
||||
Aqui el tema es que si pones a piñón el valor de la provincia, tendrás que tener un trigger diferente para cada BBDD de cada provincia.
Si coges el codigo de una tabla de parámetros, el trigger siempre será igual, y sólo tendrás que poner una pantalla de configuración que posibilite cambiar el valor para cambiarlo. Incluso podrías tener una tabla de provincias para hacer la selección más fácil. Creo que es más fácil hacerlo así de cara al futuro mantenimiento de la BBDD y/o aplicación que acordarse de que hay que cambiar el trigger y poner el código correspondiente. Creo que es un ejemplo de la típica decisión chunga que haces al principio de la que luego te arrepientes toda la vida... , generalmente después de cagarla alguna vez que otra. Cada uno puede hacer lo que quiera, pero ya tengo una cana, y más sabe el zorro por viejo que por zorro. Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino - |
#18
|
||||
|
||||
¿Tu mensaje es para mí o para Ángel?
Si es para mí, obviamente lo que he puesto es solo un ejemplo para que Ángel entienda el funcionamiento de los triggers. Jamás se me ocurriría escribir un código así en "la vida real" |
#19
|
||||
|
||||
Jajaja,
me has hecho reir Casimiro.... el mensaje no era para tí... Bajo mi punto de vista es más fácil tener ciertos datos en tablas de configuración que desperdigados por el código. Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino - |
#20
|
||||
|
||||
Cita:
Cita:
Código PHP:
Código PHP:
¿Cómo hago para meter en un stored procedure ese valor ProvTit que he sacado de una tabla y que no se modifica en toda la vida del programa? Esto es lo que no entiendo; meterlo "a capón" lo había comprendido desde el primer ejemplo que me puso Casimiro. Y los siento de veras por la paliza que os estoy dando y las molestias para explicármelo pero ya os dicho que soy bastante bruto. ¡Digo la sartén al cazo...! De canas tampoco ando mal servido, pero nunca es tarde para aprender. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Usar objetos con variables. | jularaXD | Varios | 3 | 14-05-2013 11:06:20 |
En que momentos usar variables? | Gerson12 | Varios | 13 | 08-05-2012 03:49:43 |
procedure con parametros variables | rruffino | SQL | 1 | 05-03-2009 01:58:55 |
usar un procedure en varios formularios | adonai | Varios | 21 | 30-03-2007 17:42:34 |
Número máximo de variables en un Procedure | Ana Tudela | Firebird e Interbase | 0 | 26-04-2005 12:32:35 |
|