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 27-09-2005
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Poder: 21
Cabanyaler Va por buen camino
Smile 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í.
Responder Con Cita
  #2  
Antiguo 27-09-2005
Nelet Nelet is offline
Miembro
 
Registrado: may 2003
Ubicación: Picassent - Valencia
Posts: 95
Poder: 22
Nelet Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 27-09-2005
Nelet Nelet is offline
Miembro
 
Registrado: may 2003
Ubicación: Picassent - Valencia
Posts: 95
Poder: 22
Nelet Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 27-09-2005
lgarcia lgarcia is offline
Miembro
 
Registrado: jul 2004
Posts: 479
Poder: 20
lgarcia Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 28-09-2005
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Poder: 21
Cabanyaler Va por buen camino
Wink

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í.
Responder Con Cita
  #6  
Antiguo 29-09-2005
TriLoCBA TriLoCBA is offline
Miembro
 
Registrado: jun 2005
Posts: 28
Poder: 0
TriLoCBA Va por buen camino
Lightbulb 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.
Responder Con Cita
  #7  
Antiguo 20-06-2012
GonzaloDias GonzaloDias is offline
Miembro
NULL
 
Registrado: ene 2012
Posts: 21
Poder: 0
GonzaloDias Va por buen camino
Gracias, de esta manera si funciono, refrescando los parametros, el tema es editar antes el SP. saludos
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


La franja horaria es GMT +2. Ahora son las 19:45:33.


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