PDA

Ver la Versión Completa : ayuda con procedimiento y delphi


herbert
13-09-2005, 02:07:36
Hola a todos..!!!!
tengo un problema que me esta volviendo loco y me harian un gran fabor si me ayudaran:
tengo el siguiente procedimiento en SQL SERVER:

CREATE PROCEDURE Qry_buscardocente
(
@var varchar(50),
@sw smallint
)
AS
Begin
IF (@sw=1)
select * from docentes where nombre like @var+'%' order by nombre
IF (@sw=2)
select * from docentes where ci like @var+'%' order by nombre
End

Ejecutando des el ANALISADOR DE CONSULTAS funciona una maravilla

exec Qry_buscardocente 'b',1

El problema es a la hora de conectar con DELPHI, hago los siguientes pasos:

1.- databasename=nominate
2.- storedprocname=Qry_buscardocente
3.- params
@var
datetype=ftString
Paramtype=ptImput
Type=String

@sw
datetype=ftSmallint
Paramtype=ptImput
Type=Integer
4.- active=true
es en esta parte donde me sale un error:"Error creating cursorhandle"
y no quiere activarse, he tenido este error antes con procedimiento de actualizacion pero a la hora
de ejecutar el programa funcionaba con el siguiente codigo:

DM.SPqry_nom_docente.Close;(esta linea solo cuando al ACTIVE=TRUE de lo contrario lo quito)
DM.SPqry_nom_docente.Prepare;
DM.SPqry_nom_docente.Params[0].AsString:=Ebuscar.Text;
DM.SPqry_nom_docente.ExecProc;
DM.SPqry_nom_docente.Open;(esta linea solo cuando al ACTIVE=TRUE de lo contrario lo quito)
DBGbdocentes.DataSource:=DM.DSqry_nom_docente;

El programa corre pero no muestra ningun resultado en el DBGRID
ahhh algo que me olvidaba estoy utilizando el BDE nativo
¿sera que es mejor con ADO? y si es asi me podrian decir los pasos de como hacerlo

Se los agradecere y como muestra de ello mensionare la ayuda que me den en mi PROYECTO..

Herbert's Quispe

lucasarts_18
13-09-2005, 02:29:07
Hola:

Asocias el Datasource después de abrir el procedimiento almacenado ?? :confused:

Ponlo en tiempo de diseño y ve que sucede...

Xianto
13-09-2005, 09:09:23
Buenas...

Nunca he llamado un procedimiento de MSSQL desde delphi de esa forma, siempre he preferido, poner una query en formulario y indistintamente si es query o procedimiento o lo que sea, ejecutarlo...

Ademas no necesitas usar el EXEC para ejecutar un procedemiento, con tan solo su nombre el procedimiento se ejecuta siempre y cuando este en la DB que estes usando en ese momento.

Intenta algo asi:

Query.SQL.Text := 'mi_procedimiento_con_parametros ' + chr(39) + texto1 + chr(39) +',' + IntToStr(numero1)

lucasarts_18
13-09-2005, 15:27:54
Hola:

Aquí tienes otro ejemplo que puede servirte:



procedure TFrm_MantenedorClientes.IngresarCliente;
var Sp:TStoredProc;
begin
Sp:=TStoredProc.create(self);
Sp.DatabaseName:='DBCOMLIMA';
Sp.StoredProcName:='SP_InsertarCliente';
Sp.Params.Clear;

//Creacion de Parametros
Sp.Params.CreateParam(ftInteger,'@nrrut',ptInput);
Sp.Params.CreateParam(ftString,'@dvrut',ptInput);
Sp.Params.CreateParam(ftString,'@nmcliente',ptInput);
Sp.Params.CreateParam(ftString,'@nmdireccion',ptInput);
Sp.Params.CreateParam(ftString,'@nmcomuna',ptInput);
Sp.Params.CreateParam(ftString,'@nmciudad',ptInput);
Sp.Params.CreateParam(ftString,'@nmgiro',ptInput);
Sp.Params.CreateParam(ftString,'@nrfono',ptInput);
Sp.Params.CreateParam(ftString,'@nrfax',ptInput);
Sp.Params.CreateParam(ftString,'@nmemail',ptInput);
Sp.Params.CreateParam(ftFloat,'@nrcredito',ptInput);
Sp.Params.CreateParam(ftFloat,'@nrsaldo',ptInput);
//->AGA 24/08/2005
SP.Params.CreateParam(ftInteger,'@nrplazo',ptInput);
SP.Params.CreateParam(ftfloat,'@nrdescuento',ptInput);
SP.Params.CreateParam(ftString,'@nrfiador',ptInput);
//<-AGA 24/08/2005
Sp.Params.CreateParam(ftInteger,'RETURN_VALUE',ptResult);

//Valores que entrega el Servidor
SP.ParamByName('@nrrut').AsInteger := StrToInt(Copy(Mask_Rut.Text,1,8));
SP.ParamByName('@dvrut').AsString := Copy(Mask_Rut.Text,9,1);
SP.ParamByName('@nmcliente').AsString := edt_Nombre.Text;
SP.ParamByName('@nmdireccion').AsString := edt_Direccion.Text;
SP.ParamByName('@nmcomuna').AsString := edt_Comuna.Text;
SP.ParamByName('@nmciudad').AsString := edt_Ciudad.Text;
SP.ParamByName('@nmgiro').AsString := edt_Giro.Text;
SP.ParamByName('@nrfono').AsString := edt_Fono.Text;
SP.ParamByName('@nrfax').AsString := edt_Fax.Text;
SP.ParamByName('@nmemail').AsString := edt_Email.Text;
Sp.ParamByName('@nrcredito').AsFloat := StrToFloat(edt_credito.Text);
Sp.ParamByName('@nrsaldo').AsFloat := 0;
//->AGA 24/08/2005
SP.ParamByName('@nrplazo').AsInteger := StrToInt(edt_Plazo.Text);
SP.ParamByName('@nrdescuento').AsFloat := StrToFloat(edt_Descuento.Text);
SP.ParamByName('@nrfiador').AsString := edt_Fiador.Text;
//<-AGA 24/08/2005

try
SP.ExecProc;
Case SP.ParamByName('RETURN_VALUE').AsInteger of
0:MessageDlg('Cliente Ingresado',mtInformation,[mbOk],0);
1:MessageDlg('Ya Existe Cliente',mtWarning,[mbOk],0);
90:MessageDlg('Error en la BD',mtWarning,[mbOk],0);
end;
Except
MessageDlg('Procedimiento no pudo ser Ejecutado',mtWarning,[mbOk],0);
end;
FormActivate(Self);
end;

Espero que te oriente en algo..:)

lgarcia
13-09-2005, 15:51:44
Hola:

Me parece que la variante mas optima es utilizar un ADOStoreProcedure y en la propiedad ConnectionString configurar la conexion con la BD de SQL, una vez realizado esto lo unico que tienes que hacer es ejecutarla en el evento OnActivate del formulario donde esta el DBGrid con un codigo como este

with BuscarDocente do
begin
Close;
Parameters.ParamByName('@var').Value:= Trim(EditUsuario.Text);
Parameters.ParamByName('@sw').Value:= Trim(EditContrasena.Text);
Open;
end;


Por otro lado el DataSource lo asocias al ADOStoreProcedure y el DBGrid lo asocias al DataSource, para que el ADOStoreProcedure te muestre los campos debes ponerle los parametros y darle click derecho y seleccionar Field Editor y sobre la ventana que te sale nuevamente click derecho y seleccionar Add all field ya que con esto cuando en la propiedad Column del DBGrid podras escoger los campos.

Espero haberte ayudado en algo

Saludos
Luis Garcia

_____________________________
La mejor manera de decir es hacer