Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-02-2007
Tauro78 Tauro78 is offline
Miembro
 
Registrado: sep 2006
Posts: 88
Poder: 18
Tauro78 Va por buen camino
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;
Código Delphi [-]
procedure TfrmClientesAltas.BitBtn1Click(Sender: TObject);
begin
if (Edit1.Text = '') or (Edit2.Text = '') then
  begin
    MessageDlg('Se deben completar todos los campos.', MtInformation, [MbOK], 0);
    Exit;
  end
    else
      begin
        dmTablas.MDOSPExistCPCliente.Close;
        dmTablas.MDOSPExistCPCliente.ParamByName('SP_DICOSE').AsString := Edit1.Text;
        dmTablas.MDOSPExistCPCliente.Prepare;
        dmTablas.MDOSPExistCPCliente.ExecProc;
        if (not dmTablas.MDOSPExistCPCliente.IsEmpty) then
          begin
            MessageDlg('Ya existe un cliente con este número de DICOSE.', MtInformation, [MbOK], 0);
            Exit;
          end
            else
              begin
                with dmTablas.MDOSPClientesAltas do
                  begin      
                    Params.ParamByName('SP_DICOSE').Value := Edit1.Text;
                    Params.ParamByName('SP_NOMBRE').Value := UpperCase(Edit2.Text);
                    Prepared := True;
                    ExecProc;
                  end;
              end;
      end;

Última edición por Tauro78 fecha: 06-02-2007 a las 18:30:05.
Responder Con Cita
  #2  
Antiguo 06-02-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 06-02-2007
Tauro78 Tauro78 is offline
Miembro
 
Registrado: sep 2006
Posts: 88
Poder: 18
Tauro78 Va por buen camino
Es que acaso lo procedimientos almacenados no deben usarse para realizar solo altas, bajas o modificaciones ?
Responder Con Cita
  #4  
Antiguo 06-02-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Cita:
Empezado por Tauro78
Es que acaso lo procedimientos almacenados no deben usarse para realizar solo altas, bajas o modificaciones ?
Los procedimientos se pueden utilizar para lo que se quieran... o como se quieran...
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
Responder Con Cita
  #5  
Antiguo 07-02-2007
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 21
lbuelvas Va por buen camino
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

Código Delphi [-]
if (not dmTablas.MDOSPExistCPCliente.IsEmpty) then

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

Código Delphi [-]
if (not dmTablas.MDOSPExistCPCliente.ParamByName('DICOSE').IsNull) then

Muchos exitos
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #6  
Antiguo 08-02-2007
Tauro78 Tauro78 is offline
Miembro
 
Registrado: sep 2006
Posts: 88
Poder: 18
Tauro78 Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 12-02-2007
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Compadre usa un trigger y listo

Anstes de insertar o actes de modificar(pono como debe ir )
Código SQL [-]
as
  declare variable "N" Bigint; 
Begin
   "N" = Null;
   Select "Id" from "Clientes" Where "Id" = new."Id" Into :"N" ;
   if ("N" is not null) 
     exception  "Msg"'Ya existe este cliente';
End
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 22:05:06.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi