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)
-   -   Obtener Resulta de Funcion SQL con DBExpress (https://www.clubdelphi.com/foros/showthread.php?t=93195)

carlos gonzalez 12-06-2018 16:20:07

Obtener Resulta de Funcion SQL con DBExpress
 
Hola amigos buenos días.
Alguien sabe si es posible obtener el resultado de una función de SQL SERVER con DBEXPRESS del Delphi 7, he estado buscando información en los foros y no he encontrado nada lo poco que he encontrado es con ADO, como el sistema todo esta desarrollado con DBEXPRESS es por ello mi necesidad, si alguien sabe si es posible y me puede compartir el componente a usar o la sintaxis se los voy agradecer enormemente.


Su amigo Charless

Neftali [Germán.Estévez] 12-06-2018 18:33:09

Puedes ejecutarla dentro de una SELECT (dependiendo del tipo de función) y recoger el resultado de la select de la forma estandard.


Código SQL [-]
SELECT GETDATE() as fecha

carlos gonzalez 12-06-2018 22:46:58

El problema lo tengo con una función ( Un store procedure de sql server) es un store que genera varios cálculos y al final regresa un valor, quiere ver si con algún componente de dbexpress puedo obtener ese dato, para ejecutarlo no tengo problema lo hago con un tsimpledataset, para obtener el valor de retorno quise hacer esto pero no funciono:

SQLStoredProc1.Name:='validaCION';
SQLStoredProc1.ParamByName('FOLIO').VALUE := folio;
SQLStoredProc1.ExecProc;

Casimiro Notevi 12-06-2018 23:18:32

Más o menos así (depende de qué tipo sea el campo):
Código Delphi [-]
Result := FieldByName('elcampoquesea').AsString;

¡¡¡Y no olvides las etiquetas para el código fuente!!!


ecfisa 12-06-2018 23:34:50

Hola.

El problema para nosotros es que desconocemos nombres y tipos de los parámetros que se le deben enviar al procedimiento almacenado, así como también el nombre y el tipo del retorno.

No trabajo con MS-SQLServer, pero en líneas generales creo que al componente deberías darle minimamente esos datos. Pongamos, por citar un ejemplo, un stored procedure que realize lo mismo que la función Pos de Delphi:
Código Delphi [-]
...
begin
  SQLStoredProc1.SQLConnection  := SQLConnection1;
  SQLStoredProc1.StoredProcName := 'POS';  // nombre del stored procedure
  SQLStoredProc1.Params.ParamByName('SUBSTR').AsString := 'MUNDO';  // un parámetro,
  SQLStoredProc1.Params.ParamByName('STR').AsString    := 'HOLA MUNDO';  // otro...
  SQLStoredProc1.ExecProc;
  ShowMessage(SQLStoredProc1.Params.ParamByName('RESULT').AsString); { muestra: 6 }
end;
Ese es el modo en que funciona en los RDBMS que he trabajado, así que pienso que también debería hacerlo en MS-SQLServer...

Saludos :)

carlos gonzalez 13-06-2018 08:18:01

Ya hice la prueba y me marca que no encuentra el parámetro, esta es la función que espero cachar el resultado que retorna

CREATE FUNCTION [dbo].[VALIDACION]
(@FOLIO as varchar(50) )

returns varchar(10)
as
begin
declare @ent as integer, @sal as integer,@resul varchar(10)
set @ent = (select count(*) from dbo.entrada WHERE FOLIO=@FOLIO)
set @SAL = (select count(*) from dbo.SALIDAS WHERE FOLIO=@FOLIO)


set @resul = convert(varchar(10), @ent) +convert(varchar(10), @SAL)

return @resul
end

Casimiro Notevi 13-06-2018 11:04:41

Cita:

Empezado por Casimiro Notevi (Mensaje 527073)
¡¡¡Y no olvides las etiquetas para el código fuente!!!














!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

bucanero 13-06-2018 11:06:46

Hola a todos,

como ya te ha comentado CASIMIRO NOTEVI, al tratarse de una funcion debes de utilizar un TSQLQuery, el problema lo puedes tener por la forma en que hay que realizar llamadas en MSSQLServer a funciones y procedimientos, prueba este código:

Código Delphi [-]

  function validacion(folio: string): string;
  begin
    // SQLQuery1 es de tipo TSQLQuery
    with SQLQuery1 do begin
      SQLConnection := SQLConnection1;
      SQL.clear;
      SQL.Add('SELECT [dbo].[VALIDACION](:folio) as RES;');
      Params.ParamByName('folio').Value := folio;
      open;
      Result:=FieldByName('RES').value;

      close;
    end;
  end;

begin
  MessageDlg(validacion('tu valor'), mtInformation, [mbOK], 0);
end;

Neftali [Germán.Estévez] 13-06-2018 11:27:28

Generando una función como esta (que es la misma que la tuya, pero usando una par tablas mías):


Código SQL [-]
CREATE FUNCTION dbo.VALIDACION (@FOLIO as VARCHAR(10) )

returns varchar(10)
as
begin
declare @ent as integer, @sal as integer,@resul varchar(10)

set @ent = (select count(*) from usuarios )
set @SAL = (select count(*) from tablas )

set @resul = convert(varchar(10), @ent) +convert(varchar(10), @SAL)

return @resul
end
GO


Y ejecutrando esta consulta:


Código SQL [-]
  SELECT dbo.validacion('11') AS RESULTADO


Obtienes un único registro con el valor resultado.
Para obtenerlo desde Delphi, tal y como han comentado un TQuery (derivado).

ecfisa 13-06-2018 19:17:28

Hola.
Cita:

Empezado por carlos gonzalez (Mensaje 527076)
Ya hice la prueba y me marca que no encuentra el parámetro, esta es la función que espero cachar el resultado que retorna
...

Ayudaría mucho que copiaras/pegaras exáctamente el mensaje de error que te indica.

Una misma función o stored procedure debería poderse llamar desde ambos componentes, ya sea TSQLStoredProc o TSQLQuery con el mismo resultado.

Repitiendo el ejemplo anterior, del mismo modo funciona:
Código Delphi [-]
...
begin
  SQLQuery1.Close;
  SQLQuery1.SQL.Text := 'SELECT RESULT FROM POS(:SUBSTR, :STR)';
  SQLQuery1.ParamByName('SUBSTR').AsString := 'MUNDO';
  SQLQuery1.ParamByName('STR').AsString    := 'HOLA MUNDO';
  SQLQuery1.Open;
  ShowMessage(SQLQuery1.Fields[0].AsString);  { muestra: 6 }
end;
Para el primer ejemplo usé el TSQLStoredProc ya que ese figuraba en tu intento.

Saludos :)


La franja horaria es GMT +2. Ahora son las 09:57:55.

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