Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-09-2012
liito16 liito16 is offline
Miembro
 
Registrado: ago 2010
Posts: 34
Poder: 0
liito16 Va por buen camino
Problema con procedimiento almacenado (dbexpress)

Hola que tal, foro de clubdelphi, queria pedirle ayuda:
- Uso delphi xe2
- Mysql
- Dbexpress

- Uso un modulo de datos( querys, dataset), y utilizo por el lado del formulario (providers, clientdataset, datasource.)

estoy usando el componente SQLstoredproc y nose como hacerlo funcionar, coloco la conexión, y en Storedprocname=validar (así se llama el procedimiento )

les coloco el procedimiento. que es como validar un usuario si existe y me devuelve un valor 0 o 1 en caso de que exista, para poder entrar al sistema.
Código SQL [-]
CREATE PROCEDURE `bd_ventas`.`validar` (in user varchar(10),  
                in clave varchar(6),
              out res int)
BEGIN
         DECLARE resultado int;
    select @res
    from usuarios
    where nom_user=user and key_user=clave;
    if resultado is null then
      set res=1;
    else
      set res=0;
    end if;

END

la cosa es que cuando hago todo, se activan los parametros y lo que ago es del lado del formulario en clientdataset (creo los parametros) y
utilizo este codigo:

Código Delphi [-]
procedure Tfrm_validar.btn_validarClick(Sender: TObject);
var res:integer;
begin
    if (edt_nombre.Text<>'') AND (edt_clave.Text<>'') then
    begin
      with cli_validar do
      begin
          Close;
          Params.ParamByName('user').Value:=edt_nombre.Text;
          Params.ParamByName('clave').Value:=edt_clave.Text;
          Open;
          res:=Params.ParamByName('res').Value; (esto nose si esta bien escrito, quiero capturar el resultado del procedimiento. para evaluar si es 0 o 1)
      end;
    end;
end;

end.

los errores que me tira son: invalid parameter, y otro return mause algo asi.
eh, buscado y leido un monton pero no encuentro la solucion. lo pongo aca porque es delphi.

Desde ya muchas gracias.
Responder Con Cita
  #2  
Antiguo 07-09-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola liito16.
Cita:
estoy usando el componente SQLstoredproc y nose como hacerlo funcionar, coloco la conexión, y en Storedprocname=validar (así se llama el procedimiento )
No puedo opinar sobre la declaración del procedimiento en MySQL ya que uso Firebird.

Pero de este modo el componente TSQLStoredProc tendría que funcionarte sin ningún problema:
Código Delphi [-]
...
var
  res: Integer;
begin
  ...
  with SQLStoredProc1 do
  begin
    SQLConnection  := SQLConnection1;
    StoredProcName := 'VALIDAR';  
    Params.ParamByName('USUARIO').AsString := Edit1.Text;
    Params.ParamByName('CLAVE').AsString   := Edit2.Text;
    ExecProc;
    res := Params.ParamByName('RES').AsInteger;  
  end;
  ...
end;
(Las propiedades SQLConnection y StoredProcName las configuré por código para dar mas claridad al ejemplo)

Te dejo un enlace al manual de referencia de MySQL: [CREATE PROCEDURE y CREATE FUNCTION]
Tal vez también te pueda ser útil este: [MySQL Stored procedure Tutorial]

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 07-09-2012
liito16 liito16 is offline
Miembro
 
Registrado: ago 2010
Posts: 34
Poder: 0
liito16 Va por buen camino
Hola, primero muchas gracias por responder, ,
y con respecto claro lo configuro en el componente. y lo probé en mysql workbench y funciona perfecto. osea me da 0 cuando no existe y 1 si existe. obviamente probando así:

call validar("juan","651574",@res);
Responder Con Cita
  #4  
Antiguo 07-09-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola liito16.

En el código que te puse, ¿ Notaste que ejecuto el procedimiento almacenado llamando al método ExcecProc en lugar de Open ?

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 07-09-2012
liito16 liito16 is offline
Miembro
 
Registrado: ago 2010
Posts: 34
Poder: 0
liito16 Va por buen camino
Código Delphi [-]
var res:integer;
begin
    //if (edt_nombre.Text<>'') AND (edt_clave.Text<>'') then
   // begin
      with DM_VENTAS.sp_validar do
      begin
          SQLConnection:=SQLConnection;
          StoredProcName:='validar';
          Params.ParamByName('user').AsString:='juan';//edt_nombre.Text;
          Params.ParamByName('clave').AsString:='651574';//edt_clave.Text;
          ExecProc;
          res:=Params.ParamByName('res').AsInteger;

          ShowMessage(IntToStr(res));
      end;
    //end;
end;

Así probé, y sigue tirando invalid parameter, pero es lógico que yo tenga el modulo de datos? y haga with DM_ventas.sp_ventas... antes que con el client directamente?, digo por como lo estoy armando yo, si se puede hacer así lo hago.
lo que hice fue pasarle directamente los datos correctos pero sigue tirando el mismo error.
Responder Con Cita
  #6  
Antiguo 07-09-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola liito16.
Cita:
pero es lógico que yo tenga el modulo de datos? y haga with DM_ventas.sp_ventas... antes que con el client directamente?
No entiendo bién a que te refieres con la pregunta, pero es totalmente aconsejable el uso del componente TDataModule, y si el TSQLStoredProc reside en él, referirse del modo: DataModule.SQLStoredProc es correcto.

Otra consulta: ¿ Agregaste parámetros en tiempo de diseño (desde el Object Inspector) ?

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 07-09-2012
liito16 liito16 is offline
Miembro
 
Registrado: ago 2010
Posts: 34
Poder: 0
liito16 Va por buen camino
ehm me exprese mal, jaja en realidad es que utilizo por ejemplo la conexión así
En el modulo de datos coloco el storedproc y del lado del formulario provider, clientdataset y datasoruce el provider esta conectado al modulo de datos y al procedimiento. mi pregunta es si es lo mismo que lo coloque así como dm_ventas.storedproc, o lo hago a mi manera. que es with clientdataset ......, solo pregunto si es lo mismo ,

Osea al usar el componente lo configure no con codigo sino en tiempo de diseño y se crean solo los parametros, si lo hago como me dices con código. los creo yo en la propiedad params y al ejecutarlo me dice parameter 'user' not found.
Responder Con Cita
  #8  
Antiguo 07-09-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Post

Cita:
Empezado por liito16 Ver Mensaje
Osea al usar el componente lo configure no con codigo sino en tiempo de diseño y se crean solo los parametros, si lo hago como me dices con código. los creo yo en la propiedad params y al ejecutarlo me dice parameter 'user' not found.
Hola liito16.

Para salir de toda duda, renombrá a sp_validar como sp_validar_old, poné otro componente TSQLStoredProc y nombralo como sp_validar.
De este último sólamente configura la propiedad SQLConnection con su SQLConnection (nada mas) y proba con el siguiente código:
Código Delphi [-]
  ...
  with DM_VENTAS.sp_validar do
  begin
      Params.ParamByName('user').AsString  := 'juan';
      Params.ParamByName('clave').AsString := '651574';
      ExecProc;
      res := Params.ParamByName('res').AsInteger;
      ShowMessage(IntToStr(res));
  end;
  ...
Si no funciona el problema está en otro lado. Tal vez en el SQLConnection, tal vez algun tratamiento especial que necesite MySQL con estos componentes (o los componentes con MySQL ) , pero como te dije antes no conozco MySQL.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 07-09-2012
ElMug ElMug is offline
Miembro
NULL
 
Registrado: jul 2012
Posts: 163
Poder: 12
ElMug Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola liito16.

No puedo opinar sobre la declaración del procedimiento en MySQL ya que uso Firebird.

Pero de este modo el componente TSQLStoredProc tendría que funcionarte sin ningún problema:
Código Delphi [-]... var res: Integer; begin ... with SQLStoredProc1 do begin SQLConnection := SQLConnection1; StoredProcName := 'VALIDAR'; Params.ParamByName('USUARIO').AsString := Edit1.Text; Params.ParamByName('CLAVE').AsString := Edit2.Text; ExecProc; res := Params.ParamByName('RES').AsInteger; end; ... end;

(Las propiedades SQLConnection y StoredProcName las configuré por código para dar mas claridad al ejemplo)

Te dejo un enlace al manual de referencia de MySQL: [CREATE PROCEDURE y CREATE FUNCTION]
Tal vez también te pueda ser útil este: [MySQL Stored procedure Tutorial]

Saludos.
Tal vez parte del problema sea esto:

En el stored procedure Clave es Integer y en el codigo del boton Clave, parece ser que es texto:
Params.ParamByName('clave').Value:=edt_clave.Text;
Responder Con Cita
  #10  
Antiguo 08-09-2012
liito16 liito16 is offline
Miembro
 
Registrado: ago 2010
Posts: 34
Poder: 0
liito16 Va por buen camino
nono, va la clave la puse varchar(6), osea el campo con el cual se iguala es key_user varchar(6) y asi también declare la variable de entrada in clave varchar(6) porque es en realidad un login de usuario como "pedorro" por asi decirlo, es solo para ver si existe el usuario y si existe que entre al sistema.

lo que voy a hacer ahora es probar con interbase haber que pasa,
solo que me tira error en el if. -.-! me dice precompiler error: me dice que es el if pero busque y se hace asi. ahora estoy bajando otro EMS interbase manager para probar.

muchas gracias, cualquier ayuda es bienvenida.
Responder Con Cita
  #11  
Antiguo 08-09-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola liito16.

Si lo vas a hacer en Interbase o Firebird (es casi lo mismo) ya la cosa cambia....

Esto si te funcionará correctamente:
Código SQL [-]
/* Devuelve 0 si no hay coincidencia o mayor que 0 si la hay */
SET TERM ^;

CREATE OR ALTER PROCEDURE VALIDAR (USUARIO VARCHAR(10), CLAVE VARCHAR(6))
RETURNS (RESULT INTEGER)
AS
BEGIN
  SELECT COUNT(*) FROM TABLA
  WHERE (NOM_USER = :USUARIO) AND (KEY_USER = :CLAVE) INTO :RESULT;
END^

SET TERM ;^

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  with SQLStoredProc1 do
  begin
    SQLConnection := SQLConnection1;
    StoredProcName := 'VALIDAR';
    ParamByName('USUARIO').AsString := Edit1.Text;
    ParamByName('CLAVE').AsString   := Edit2.Text;
    ExecProc;
    if ParamByName('RESULT').AsInteger > 0 then
      ShowMessage('Usuario encontrado')
    else
      ShowMessage('Usuario incorrecto');
  end;
end;
Y puedo asegurártelo por que está probado.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 08-09-2012 a las 19:52:36.
Responder Con Cita
  #12  
Antiguo 08-09-2012
liito16 liito16 is offline
Miembro
 
Registrado: ago 2010
Posts: 34
Poder: 0
liito16 Va por buen camino
Si muchas gracias estaba pensando algo asi. justamente. el tema ahora es que no me deja conectar con la base de datos delphi -.-! me tira error
yo tengo windows 7 - 64 bits. así que capas reinstalo todo de nuevo. muchas gracias!!!, y ni bien pruebe pongo como corresponde la respuesta de como me fue. saludos!
Responder Con Cita
  #13  
Antiguo 25-09-2012
liito16 liito16 is offline
Miembro
 
Registrado: ago 2010
Posts: 34
Poder: 0
liito16 Va por buen camino


Revivo, porque nose como solucionarlo ese es el error que aparece, e intentado por forma de metodo de ejecucion y por propiedades del componente y no funciona y probado con un dataset de dbexpress y tampoco, pero eh probado traer campos y mostrarlos en un grid y funciona todo.

Desde ya muchas gracias
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
Ejecución Procedimiento Almacenado dbexpress nejamube Firebird e Interbase 1 10-04-2011 02:13:29
problema con procedimiento almacenado aladelta Firebird e Interbase 7 14-02-2007 01:52:34
Problema con Procedimiento almacenado Tauro78 Firebird e Interbase 6 12-02-2007 17:43:06
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


La franja horaria es GMT +2. Ahora son las 10:46:30.


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