Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Problema con procedimiento almacenado (dbexpress) (https://www.clubdelphi.com/foros/showthread.php?t=80171)

liito16 07-09-2012 04:17:27

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.

ecfisa 07-09-2012 05:46:54

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. :)

liito16 07-09-2012 05:58:32

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);

ecfisa 07-09-2012 08:17:32

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.

liito16 07-09-2012 18:40:46

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.

ecfisa 07-09-2012 20:48:10

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. :)

liito16 07-09-2012 21:23:36

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.

ecfisa 07-09-2012 23:20:45

Cita:

Empezado por liito16 (Mensaje 442352)
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.

ElMug 07-09-2012 23:57:50

Cita:

Empezado por ecfisa (Mensaje 442234)
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;

liito16 08-09-2012 00:35:10

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.

ecfisa 08-09-2012 02:30:32

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.

liito16 08-09-2012 04:03:56

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!

liito16 25-09-2012 01:45:29



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


La franja horaria es GMT +2. Ahora son las 19:00:46.

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