FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
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.... .... 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.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí. |
#2
|
|||
|
|||
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; |
#3
|
|||
|
|||
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; 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. |
#4
|
|||
|
|||
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 |
#5
|
||||
|
||||
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.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí. |
#6
|
|||
|
|||
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.: Espero te sirva. Un abrazo. |
#7
|
|||
|
|||
Gracias, de esta manera si funciono, refrescando los parametros, el tema es editar antes el SP. saludos
|
|
|
|