Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-06-2007
Roilo Roilo is offline
Miembro
 
Registrado: nov 2005
Ubicación: Mayarí, Cuba
Posts: 143
Poder: 19
Roilo Va por buen camino
ejecutar Procedimiento almacenado en SQL Server, Intraweb.

Un abraso al FORO.
Quisiera que le hecharan un vistaso a cómo quiero ejecutar un procedimiento almacenado en SQL Server desde una aplicación IntraWeb:
Para ello uso los componentes de dbExpress.

El procedimiento es para buscar todos los nombres que tengan incluido la cadena @palabra:
Código SQL [-]
CREATE PROCEDURE [dbo].[busqueda] 
@palabra nvarchar
AS
SELECT Nombre,CentroTrab FROM control WHERE Nombre like '%@palabra%'
GO

En el Delphi selecciono el componente SQLStoredProc:
propiedades:
SQLConnection=SQLConnection1
StoredProcName=busqueda
Params : defino el parámetro @palabra

Para ejecutarlo al hacer clic en un boton:
Código Delphi [-]
procedure TFInsertar.buscarClick(Sender: TObject);
begin
 SQLStordProc1.ParamByName('@palabra').asstring := IWEdit1.Caption ; 
 ConsolaDatos.busqueda.ExecProc ;
end;

Bueno: el problema es que me da el error :
..."List Index Out of bounds(0)"

Si alguien sabe de lo que hablo y sabe qué ne falta por configurar, le agradecería la ayuda.
Gracias de antemanos.
__________________
...que la libertad sólo existe cuando no es de nadie.
Responder Con Cita
  #2  
Antiguo 28-06-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Creo mas bien, que el problema esta desde el procedimiento.

¿ya trataste de ejecutarlo desde el analizador de consultas?
¿Funciona?

Te pregunto esto porque a mi no me funciona de esa manera.
Al utilizar el comando like '%@palabra%'
el procedimiento buscar todo slos que coincidan con "@palabra" no con el valor del parámetro.

Tendrías que definir tu procedimiento como:

Código SQL [-]
...
WHERE Nombre like '%'+@palabra+'%'
...
__________________


Última edición por ContraVeneno fecha: 28-06-2007 a las 00:05:47.
Responder Con Cita
  #3  
Antiguo 28-06-2007
Roilo Roilo is offline
Miembro
 
Registrado: nov 2005
Ubicación: Mayarí, Cuba
Posts: 143
Poder: 19
Roilo Va por buen camino
Parece que no...

Parece que el error no está en el procedimiento, porque lo definí como:
Código SQL [-]
CREATE PROCEDURE [dbo].[busqueda] 
@palabra nvarchar
AS
SELECT Nombre,CentroTrab FROM control WHERE Nombre = @palabra
GO
...y nada. Me sigue el error.
Incluso, le asigné un valor predefinido al parámetro: es decir, en la propiedad Value del parámetro @palabra del objeto TSQLStoredProc le asigné una cadena y cuando le doy active=true en la propiedad del propio componente me suelta el "List index out of bounds(0)".
además...hay otro detalle que encuentro raro: a penas le asigno la conección al componente TSQLStoredProc me debería desplegar en StoredProcName todos los procedimientos almacenados que tiene el servidor en esa bd, como lo hace ADO, y apenas se seleccione un SP el propio Delphi define los parámetros...
Bueno, mientras sigo por acá...
GRACIAS de antemanos.
__________________
...que la libertad sólo existe cuando no es de nadie.
Responder Con Cita
  #4  
Antiguo 28-06-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
¿ya lo probaste desde el query analizer ?
__________________

Responder Con Cita
  #5  
Antiguo 28-06-2007
Roilo Roilo is offline
Miembro
 
Registrado: nov 2005
Ubicación: Mayarí, Cuba
Posts: 143
Poder: 19
Roilo Va por buen camino
No!!!

si me pides que lo pruebe con el Query analizer para chequear si el SP está correcto, pierde cuidado que lo está. Lo probé con los componentes de ADO y me funcionó... aunque tube que sustituir la sentencia ExecProc por close - open.
Por otro lado me dirigí a la ayuda de Delphi y entendí que no todos los componentes para SP te devuelven la lista de procedimientos almacenados en el Server, por eso hay que especificar el nombre manualmente.
Bueno, Sigo con duda.
Gracias.
__________________
...que la libertad sólo existe cuando no es de nadie.

Última edición por Roilo fecha: 28-06-2007 a las 17:40:47.
Responder Con Cita
  #6  
Antiguo 28-06-2007
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
vamos a ver, ahora si me tengo que declarar falto de conocimientos porque a mi también me estuvo marcando ese error. En fin, esto es lo que tuve que hacer, cosa que me parece extraña ya que repito varias instrucciones. Pero bueno, así es como me funciona:
Código Delphi [-]
 with datamod1.UnStoredProcedure do begin
  if active then close;
  Prepare;
  ParamByName('@Palabra').AsString:= edtBuscar.Text;
  Prepare;
  ExecProc;
  Open;
  ............
  Close;
  UnPrepare;
 end; //with


Si no pongo el "Prepare" antes de darle valor al parámetro, me marca el error de "out fo bounds". Lo que me parece raro es que tengo que utilizar el prepare antes y después del parámetro, también tengo que utilice ExecProc y Open, ya que si no lo hago así, pues no funciona.

Ojala y alguien que ya alla utilizado este componente TStoredProc pueda ilustrarnos.
__________________


Última edición por ContraVeneno fecha: 28-06-2007 a las 18:23:47.
Responder Con Cita
  #7  
Antiguo 28-06-2007
Roilo Roilo is offline
Miembro
 
Registrado: nov 2005
Ubicación: Mayarí, Cuba
Posts: 143
Poder: 19
Roilo Va por buen camino
?

Probaste eso sobre una aplicación IntraWeb ?
Porque esa propiedad Prepare no existe(no está declarada).
Probé con prepared := true y sigue el error del que hablamos, sigue diciendo que "El índice de la lista está fuera de los límites" ... creo que se traduce así.
Código Delphi [-]
with ConsolaDatos.busqueda do
  begin
   if Active then Close ;
   Prepared := true ;
   ParamByName('@palabra').AsString := IWEditbuscar.text ;
   Prepared := true ;
   ExecProc ;
   Open ;
   Prepared := false ;
 end ; //with
Bueno. Yo sigo por acá hasta dar con la solución (Sino ).
Mientras, si alguno de ustedes tiene algo, lo tiran para acá.
Gracias.
__________________
...que la libertad sólo existe cuando no es de nadie.
Responder Con Cita
  #8  
Antiguo 19-07-2007
luisch luisch is offline
Registrado
 
Registrado: jul 2007
Posts: 2
Poder: 0
luisch Va por buen camino
hola

solucionaste el problema? bueno a mi me parece q estas haciendo mal el procedimiento almacenado en sql server.
Responder Con Cita
  #9  
Antiguo 25-07-2007
javim javim is offline
Registrado
 
Registrado: jul 2007
Posts: 3
Poder: 0
javim Va por buen camino
Hola Roilo.
No sé como funcionan estas cosas con SQLServer, pero con Oracle tuvimos el mismo problema y era porque no le especificábamos en la propiedad "SchemaName" del SQLStoredProc el usuario propietario del procedimiento en la BD, que no coincidía con el usuario de la conexión delphi.

Seguimos sin entender porqué el mensaje de error era tan poco descriptivo como "index out of bounds"

Espero que te sirva de ayuda. Un saludo.
Responder Con Cita
  #10  
Antiguo 25-07-2007
luisch luisch is offline
Registrado
 
Registrado: jul 2007
Posts: 2
Poder: 0
luisch Va por buen camino
proba asi:

Hace el procedimiento almacenado en sqlserver

CREATE PROCEDURE [busqueda]
@palabra varchar(20)
AS
select Nombre,CentroTrab
from control where (Nombre like '%'+@palabra+'%')

me imagino q sabes para que sirve el like con los comodines %...

si usas una grilla, un dataset, adoconnection y el adostoreproc haces asi:
AdoConnection conectado con la base de datos tuya;
AdoStoreProc conectado con el AdoConnection y seleccionas el procedimiento almacenado y fijate en la propiedad parametres si esta el @codigo el q aparece primero borralo.
luego el datasource conectado con el AdoStoreProc y por ultimo la grilla conectada con el datasource. una ves hecha la coneccion en el boton de buscar pones esto

procedure busqueda ......
begin
AdoStoreProc.Parameters.ParamByName('@codigo').Value := Edit1.Text;
AdoStoreProc.ExecProc;
AdoStoreProc.Active := False;
AdoStoreProc.Active := True;
end;

asi tiene que funcionar perfectamente la busqueda cualquier cosa pregunta.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ejecutar Procedimiento Almacenado en Trigger AGAG4 SQL 16 21-09-2004 03:27:47
Ejecutar un Procedimiento almacenado saul saldaña MS SQL Server 1 03-08-2004 21:20:30
Ejecutar javascript en Intraweb Brewster Internet 1 17-06-2004 22:55:38
Intraweb: Ejecutar una consulta dentro del propio ACCESS Brewster Internet 6 09-06-2004 16:20:01
Web Snap Intraweb SOAP Server etc.. Descendents Internet 0 18-07-2003 01:41:37


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


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