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)
-   -   Parameters y ProcedureName de TAdoStoreProc (https://www.clubdelphi.com/foros/showthread.php?t=25568)

Cabanyaler 27-09-2005 11:32:20

Parameters y ProcedureName de TAdoStoreProc
 
Hola.
Estoy realizando una consulta bastante extensa que ataca a muchas tablas relacionadas con INNER JOIN. Para simplificar su implementación, lo que quiero hacer es realizar varias Store Procedure en el servidor SQLServer y ha razón de los parametros que el usuario rellene que servirán de valores para los parametros de dicha consulta, realizar el siguiente trabajo:

Si p.e.
elige parametros que ataquen a un par sólo de tablas relacionadas entonces cargar un SP del servidor al TADOStoreProc especifico que realize la consulta sobre esas dos tablas.
Si elige más parametros que ataquen a otras tablas, cargar otro SP al TADOStoreProc que ataque a ese determinado conjunto de tablas.

Esto he pensado en hacerlo en tiempo de ejecución asignándole:
DataModule.ADOSP_Consulta.ProcedureName := 'ADOQ_ConsultaUNO;1';
De modo que por una serie de condiciones asigne al TADODataSet el procedure del servidor que me convenga en cada momento en tiempo de ejecución, pudiendo ser según otra condición en otra ejecución: DataModule.ADOSP_Consulta.ProcedureName := 'ADOQ_ConsultaDOS;1';... y así con un conjunto limitado de consultas diferentes.

Problema: El problema lo encuentro a la hora de los parametros, los cuales debo asignarlos en tiempo de ejecución además de asignarle un valor de inicio, aunque este sea 'null', ya que al cambiar el nombre del SP asociado al DataSet, los parametros establecidos en tiempo de diseño se pierden.

He estado viendo que existe el mtd :
ADOStoredProc1.CreateParameter('Parm1', ftString, pdInput, 10, nil);pero mi consulta tiene.... :rolleyes: .... 79 parametros.

¿Existe alguna orden o metodo o polvos mágicos que me permitan copiar el conjunto de parametros establecido por defecto en tiempo de diseño al TADOStoreprocedure en tiempo de ejecución sin necesidad de crear de nuevo todos los parametros? o bien que, el TADOStoreprocedure tenga siempre los mismos parametros independientemente del valor que le asigne al DataModule.ADOSP_Consulta.ProcedureName, es decir, que no se me pierdan los parametros al reasignar el procedimeinto almacenado en el servidor al TADOSP local del dataModule.

Gracias, espero haberme explicado.

Nelet 27-09-2005 11:58:01

No se si he entendido bien lo que quieres hacer, pero pienso que podrías probar algo como esto, después de asignar el nombre del procedimiento. Sustituyendo el ADOQuery por ADOStoredproc.
Código:

procedure TForm1.Button1Click(Sender: TObject);
var
  parametros:TParameters;
begin
  parametros:=AdoQuery1.Parameters; //recoges los parametros definidos en diseño
  AdoQuery2.Parameters:=parametros; //se los asignas al objeto que quieras.
  AdoQuery2.Parameters.ParamByName('SOC').Value:='01';
  AdoQuery2.SQL:=AdoQuery1.SQL;
end;

Suerte.

Nelet 27-09-2005 12:01:28

No se si he entendido bien lo que quieres hacer, pero pienso que podrías probar algo como esto, después de asignar el nombre del procedimiento. Sustituyendo el ADOQuery por ADOStoredproc.
Código:

procedure TForm1.Button1Click(Sender: TObject);
var
  parametros:TParameters;
begin
  parametros:=AdoQuery1.Parameters; //recoges los parametros definidos en diseño
  AdoQuery2.Parameters:=parametros; //se los asignas al objeto que quieras.
  AdoQuery2.Parameters.ParamByName('SOC').Value:='01';
  AdoQuery2.SQL:=AdoQuery1.SQL;
end;

Aunque lo que no se pasa así son los valores de los parámetros.
Si el numero de parametros es el mismo y quieres pasar los mismos valores con recorrer todos los parametros y asignando el valor que tenian en el storedproc1 al storedproc2 creo que lo tendrias solucionado.

Espero haberte ayudado, y sino, por lo menos me he escaqueado un ratito..leches.

Suerte.

lgarcia 27-09-2005 21:15:42

Parametros y ProcedureName
 
Hola:

Yo tuve una vez un problema parecido al que tienes y la solucion es la creacion dinamica del texto de la consulta en SQL y en Delphi lo unico que tienes es conformar la cadena con los parametros que deseas. Te envio un ejemplo para ver si le puedes sacar algo.

CREATE PROCEDURE MostrarBolsoJTurno
@cadena nvarchar(4000)
AS
declare @SQLString nvarchar(4000)
set @SQLString = 'SELECT dbo.Bolsos.id, dbo.Bolsos.cartaporte, dbo.Bolsos.sek, dbo.Bolsos.jpy, dbo.Bolsos.total, dbo.Bolsos.ruta' + CHAR(13)
set @SQLString = @SQLString + 'FROM dbo.Bolsos INNER JOIN dbo.Usuarios ON dbo.Bolsos.usuario = dbo.Usuarios.id' + CHAR(13)
set @SQLString = @SQLString + 'WHERE ' + @cadena + CHAR(13)
set @SQLString = @SQLString + 'Order by fecha, ruta'
EXEC sp_executesql @SQLString
GO


donde el parametro cadena se lo pasas desde Delphi.

Saludos
Luis Garcia

_____________________________
La mejor manera de decir es hacer

Cabanyaler 28-09-2005 08:28:42

Hola, antes de nada agradecer vuestras ideas, propuestas o sugerencias a todos.
Ya las tenia en mente, pero creo que aunque del modo en que lo he hecho yo es un tanto más tedioso que alguno que me sugerís, creo que es más efectivo.
Lo he hecho en pocas palabras "a pelo" es decir con el metodo CreateParameters para cada uno de los parametros del Store Procedure, teniendo un SP en el servidor para cada una de las posibles combinaciones de tablas a consultar entrelazadas por las claves ajenas y unidas por LEFT JOIN y asignándole en tiempo de ejecución al TADODataSet el Sp del servidor deseado en cada momento y llamando al procedure de creación de los parametros posteriormente.
De este modo, y aunque haya debido escribir más por el gran número de parametros potenciales de las posibles consultas, el Sp reside en el servidor, por lo que sólo se compilará la primera que se ejecute y no en el lado cliente si realizase en tmp de ejecución las Strings de las consultas de modo dinámico.
No obstante, gracias nuevamente y un saludo a todos.
:p

TriLoCBA 29-09-2005 18:29:53

Colección de parametros...
 
No entiendo muy bien lo que necesitas hacer; pero con respecto a la creacion de los parametros del ADOStoredProc, la forma de tomar los mismos del Stored Procedure, sin necesidad de crearlos, es hacer un Refresh de los mismos.

Ej.:
Código Delphi [-]
var
SP1:TADOStoredProc
....
  
with SP1 do begin
   SP1:=TADOStoredProc.Create(self);
   Connection:= conSQL; //Tu conexion con el SQLServer...
   ProcedureName:= 'SPTuProcedure';  //Nombre de tu SP...
   Parameters.Refresh;  //Actualiza la coleccion de parametros del SP...
   Parameters.ParamByName('@Parametro1').Value:= Valor1 ;
   Parameters.ParamByName('@Parametro2').Value:= Valor2 ;
   Parameters.ParamByName('@Parametro3').Value:= Valor3 ;
....
   Active:= True;
end;
Espero te sirva.
Un abrazo.

GonzaloDias 20-06-2012 14:14:10

Gracias, de esta manera si funciono, refrescando los parametros, el tema es editar antes el SP. saludos


La franja horaria es GMT +2. Ahora son las 05:31:27.

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