FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Problema con Procedimiento almacenado
hola, quisiera saber si me pueden ayudar en esto. Uso Delphi7, FB2, MDO e IBExpert. Lo que quiero lograr es que en el momento de dar de alta un cliente me verifique por medio del SP EXIST_CLIENTE si ya existe un cliente con un campo dicose (que es la clave) igual en la tabla. Entonces ejecuto el SP y luego pregunto si el SP es vacio, entonces no existe el cliente, si no esta vacio ya existe el cliente. La verdad no se si se puede hacerlo de esta forma, ya que yo hacia esto en Paradox pero usando uan query.
El SP CLIENTES_ALTAS funciona bien, lo para que vean todo el proceso. El problema es que me deja entrar la misma clave 2 veces y por supuesto me da error en la clave primaria. Desde ya muchas gracias. Código:
SET TERM ^ ; CREATE PROCEDURE SP_EXIST_CLIENTE ( sp_dicose char(10)) returns ( dicose char(10)) as begin FOR SELECT DICOSE FROM CLIENTES WHERE DICOSE=:SP_DICOSE INTO :DICOSE do suspend; end^ SET TERM ; ^ GRANT SELECT ON CLIENTES TO PROCEDURE SP_EXIST_CLIENTE; GRANT EXECUTE ON PROCEDURE SP_EXIST_CLIENTE TO SYSDBA; Código:
SET TERM ^ ; CREATE PROCEDURE SP_CLIENTES_ALTAS ( sp_dicose char(10), sp_nombre varchar(20)) as begin insert into CLIENTES (DICOSE, NOMBRE) values (:sp_dicose, :sp_nombre); end^ SET TERM ; ^ GRANT INSERT ON CLIENTES TO PROCEDURE SP_CLIENTES_ALTAS; GRANT EXECUTE ON PROCEDURE SP_CLIENTES_ALTAS TO SYSDBA;
Última edición por Tauro78 fecha: 06-02-2007 a las 18:30:05. |
#2
|
||||
|
||||
No sería mas fácil controlar ese error y nada mas... a sabiendas de que se va a producir cuando hay un duplicado, así te ahorras el procedure SP_EXIST_CLIENTE.
Tampoco tengo muy claro para que utilizas un procedure SP_CLIENTES_ALTAS, si únicamente es para dar un alta, sin más... me parece un abuso de procedures innecesarios.
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO |
#3
|
|||
|
|||
Es que acaso lo procedimientos almacenados no deben usarse para realizar solo altas, bajas o modificaciones ?
|
#4
|
||||
|
||||
Cita:
Yo cuando camino, trato de hacerlo hacia adelante, evito ir de lado o de espaldas... A tu pregunta inicial, repito que los procedimientos que utilizas los considero superfluos siempre u cuando no haya algún otro punto que no comentes.. La forma de dar insertar un muevo registro desde Delphi, no lo puedo explicar. Lee algo sobre los métodos insert o append de los componentes dateset y la manera de controlar los errores y excepciones también podrás encontrar mucha literatura.
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO |
#5
|
|||
|
|||
Hola foro,
Muy respetable tu forma de trabajar pero te recomendaria que utilizaras los procedimientos almacenados para realizar consultas a la base de datos que no son posibles directamente con la clausula select, para hacer calculos y operaciones donde intervienen muchas tablas, para informes cross-tab (donde se trasponen las filas por las columnas) y en general para casos muy especiales. Voy acolocar un ejemplo, en un sistema que efectua liquidaciones a 10.000 clientes, si lo hiciera en codigo de Delphi, los datos de todos ellos tendrian que viajar por la red hasta el equipo que esta ejecutando el programa, con un procedimiento almacenado no tiene que viajar datos a ninguna parte y se hace la liquidacion directamente en el equipo (servidor) que contien la base de datos, esta es una de las caracteristicas de las tecnologias cliente/servidor. Otra cosa, si dicose es la llave primaria pues atrapa el error enviado por el motor en caso de presentarse vioalcion de la llave y listo. Pero volviendo al origen de tu pregunta, el codigo pasa "derecho" y no hace lo que quieres porque tu segmento de codigo
siempre dara verdadero, esto debido a que el procedimiento almacenado SP_EXIST_CLIENTE retorna en el parametro de salida dicose un valor (nullo o no), lo que debes es preguntar por el contenido del parametro de salida. Cambia la linea anterior por
Muchos exitos
__________________
Luis Fernando Buelvas T. |
#6
|
|||
|
|||
Gracias por sus respuestas, ahora me funciona bien.
En cuanto a la forma de trabajo, prefiero usar definitivamente SP sobre consultas, he leido que no hay que abusar de los SP, bueno supongo que con la practica me dare cuenta. |
#7
|
||||
|
||||
Resp
Compadre usa un trigger y listo
Anstes de insertar o actes de modificar(pono como debe ir ) Eso soluciona tu pregunta segun lo que entendi. Nota: "Msg" es un aexception en este caso vacia y le concateno el mensaje valido de firebird 1.5 en adelante (creo que es desde 1.5 bueno eso no es problema sino le pones el mensaje de uan vez)
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
problema con procedimiento almacenado | aladelta | Firebird e Interbase | 7 | 14-02-2007 01:52:34 |
Problema con procedimiento almacenado | XBart | Firebird e Interbase | 3 | 27-10-2005 09:08:17 |
problema con procedimiento almacenado | Choclito | Firebird e Interbase | 2 | 04-11-2004 20:58:46 |
Problema con procedimiento almacenado | juziel | Firebird e Interbase | 4 | 20-09-2004 18:31:41 |
Problema con un procedimiento almacenado | Markoz | Firebird e Interbase | 1 | 08-07-2003 11:47:20 |
|