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 30-10-2006
efelix efelix is offline
Miembro
 
Registrado: jul 2006
Posts: 84
Poder: 18
efelix Va por buen camino
Delphi y los procedimientos almacenados

Hola a todos, muchos saludos. Trabajo con delphi 7 y Microsoft Sql Server 2000. Tengo el siguiente procedimiento almacenado:
Código SQL [-]
CREATE PROCEDURE spEdadCuentasporPagar  
               @Edad int,
               @Edad1 int = NULL
AS
 IF (@Edad1 IS  Null)
 begin
    SELECT @Edad1 = 0
  end
IF (@Edad >= 90)
BEGIN
  SELECT     IdFactura, Descripcion, IdProveedor, Importe, DATEDIFF(day, FechaRecepcion, GETDATE()) AS Dia, Aplicada
  FROM         Facturas
  WHERE     (Aplicada = 0) AND DATEDIFF(day, FechaRecepcion, GETDATE())>=@Edad 
END
ELSE
BEGIN
  SELECT     IdFactura, Descripcion, IdProveedor, Importe, DATEDIFF(day, FechaRecepcion, GETDATE()) AS Dia, Aplicada
  FROM         Facturas
  WHERE     (Aplicada = 0) AND  DATEDIFF(day, FechaRecepcion, GETDATE())>=@Edad AND DATEDIFF(day, FechaRecepcion, GETDATE())<=@Edad1
END
GO
Que me devuelve un conjunto de registros que cumplen con la condición que lleva implicita el procedimiento. Y tengo otro procedimeinto almacenado construído de la sgte forma:
Código SQL [-]
CREATE PROCEDURE spImporteTotalEdadCuentasxPagar
               (@Dias integer,
               @Dias1 integer, 
               @Importe money OUTPUT)       
 AS
SELECT @Importe=IsNull(Sum(Importe),0)
FROM Facturas
WHERE(Aplicada=0) AND DATEDIFF(day,FechaRecepcion, GETDATE())>=@Dias AND DATEDIFF(day,FechaRecepcion, GETDATE())<=@Dias1
GO
El primer procedimiento me devuelve el conjunto de facturas que están sin pagar dentro del rango de días que se le específique, que puede ser 0-30,30-60,60-90 y mas de 90 días. Y el segundo lo cnstruí con la finalidad de que me devoviera el importe total de las facturas sin pagar. Esto funciona bien en sql server 2000, es decir cada procedimiento por separado lo ejecuto pasandóle los parámetros correspondientes y me dan los resultados deseados. Ahora en delphi tengo un formulario con un ado connection, un ado stored procedure, un dbgrid, tres edit y un botón de comando y por supuesto un data source, a través del siguiento código logro que el dbgrid se me llene con los datos que me devuelve el primer procedimiento almecenado:
Código Delphi [-]
begin
  ADOSPEdadCuentas.Close;
  ADOSPEdadCuentas.Parameters.ParamByName('@Edad').Value := StrToInt(EditEdad2.Text);
  if StrToIntDef(EditEdad2.Text,0) = 90 then
  begin
     ADOSPEdadCuentas.Parameters.ParamByName('@Edad1').Value := VarNull;
  end
  else
     ADOSPEdadCuentas.Parameters.ParamByName('@Edad1').Value := StrToInt (EditEdad1.Text);
  ADOSPEdadCuentas.Open;
end;
El segundo procedimiento almacenado lo tengo nada más para que me devuelva el total de las facturas sin pagar, y pienso asignarle el valor de este parámetro a un edit, ahora mi duda es la siguiente puedo manipular ambos procedimientos dentro de las mismas líneas de códigos anteriores?. Puesto como pueden pareciar este segundo procedimiento almacenado tiene un parámetro de salida y para hecerlo tendría que ejecutar el método execpro para que funcione, al menos eso es lo que tengo entendido, el hecho es que se me complica un tanto esto y aveces cuando trato de hacerlo me genera varios errorres. Ojala me hayan enetendido y puedan ayudarme a encontrar una solución. A lo mejor en vez de dos con un solo procedmiento almecenado yo podría resolver esto. Pero hasta el momento no se como hacerlo. Muchas gracias y disculpen mi desconocimiento.
Responder Con Cita
  #2  
Antiguo 30-10-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
No estoy ducho en sqlServer, pero si un procedimiento te devuelve datos (para mostrar en un Grid, por ejemplo, si deseas usar ese mismo componente para llamar al segundo SP tendrás que cerrarlo, configurarlo y abrirlo de nuevo, por tanto pierdes el resultado del grid.

Lo que quiero decir es que debes usar:
- O bien 2 AdoSP.
- O bien abrir primero el que da los totales, guardas el resultado en un Edit (u otro control que no sea de Acceso a datos dbaware), por último lo cierras, modificas las propiedades del AdoSP para llamar al primer SP y dejas abierto dicho SP.


Como verás el segundo método es bastante lioso, y si necesitas solicitar de nuevo los totales, implica doble trabajo, quizás sea más cómodo usar 2 AdoSP.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 01-11-2006
efelix efelix is offline
Miembro
 
Registrado: jul 2006
Posts: 84
Poder: 18
efelix Va por buen camino
Lepe te doy las gracias nuevamente por tus rápidas respuesta, seguí tu consejo y agregué al formulario un nuevo ado stored procedure, modifiqué el segundo procedimiento almacenado de la siguiente forma:
Código SQL [-]
CREATE PROCEDURE spImporteTotalEdadCuentasxPagar
               (@Dias integer,
                @Importe money OUTPUT,
               @Dias1 integer = NULL)       
 AS
   IF (@Dias1 IS Null)
   begin
       SELECT @Dias1=0
   end 

IF (@Dias>=90)
BEGIN
  SELECT @Importe=IsNull(Sum(Importe),0)
  FROM Facturas
  WHERE(Aplicada=0) AND DATEDIFF(day,FechaRecepcion, GETDATE())>=@Dias AND DATEDIFF(day,FechaRecepcion, GETDATE())<=@Dias1
END
ELSE
BEGIN
  SELECT @Importe=IsNull(Sum(Importe),0)
  FROM Facturas 
  WHERE(Aplicada=0) AND DATEDIFF(day,FechaRecepcion, GETDATE())>=@Dias AND DATEDIFF(day,FechaRecepcion, GETDATE())<=@Dias1
END
GO
y en código del evento click del botón de comando pusé lo siguiente:
Código Delphi [-]
begin
  ADOSPEdadCuentas.Close;
  ADOSPEdadCuentas.Parameters.ParamByName('@Edad').Value := StrToInt(EditEdad2.Text);
  ADOSPImporteCuentasxPagar.Parameters.ParamByName('@Dias').Value := StrToInt(EditEdad2.Text);
  if StrToIntDef(EditEdad2.Text,0) = 90 then
  begin
     ADOSPEdadCuentas.Parameters.ParamByName('@Edad1').Value := VarNull;
     ADOSPImporteCuentasxPagar.Parameters.ParamByName('@Dias1').Value := VarNull;
  end
  else
     ADOSPEdadCuentas.Parameters.ParamByName('@Edad1').Value := StrToInt (EditEdad1.Text);
     ADOSPImporteCuentasxPagar.Parameters.ParamByName('@Dias1').Value := StrToInt (EditEdad1.Text);
     ADOSPImporteCuentasxPagar.ExecProc;
     EditImporte.Text := ADOSPImporteCuentasxPagar.Parameters.ParamValues ['@Importe'];
  ADOSPEdadCuentas.Open;
end;
Cuando lo ejecuto, es decir cuando click en el botón de coamando me duveuelve el siguiente mensaje de error, se levanta una excepción en la clase EConvertError with the message is not a valid integer value. He mirado, pero estoy como el pescado en nevera, no encuentro donde está el error. Gracias amigo y disculpa tanta molestia.
Responder Con Cita
  #4  
Antiguo 30-10-2006
donki donki is offline
Miembro
 
Registrado: oct 2006
Posts: 24
Poder: 0
donki Va por buen camino
Te propongo lo siguiente:

El código del segundo lo añades al primero y lo calculas al principio guardando el valor en @Importe.

Esta variable la añades como una columna añadida más en tus queries siguientes o bien lo pones como parámetro de salida.


Suerte!!!
__________________
Grandes frases de nuestro tiempo:
"La pasta no és para tirarla, es para el Tunning"

"TodoOK=False...."

Enjoy it!!!
Responder Con Cita
  #5  
Antiguo 01-11-2006
efelix efelix is offline
Miembro
 
Registrado: jul 2006
Posts: 84
Poder: 18
efelix Va por buen camino
Hola, gracias por tu sugerencia, pero no entiendo lo que me dijiste, me gustaría si pudieras fueses un poco mas explicito. Pues todavía tengo lagunas en el trabajo con los procedimientos alamacenados.
Responder Con Cita
  #6  
Antiguo 02-11-2006
donki donki is offline
Miembro
 
Registrado: oct 2006
Posts: 24
Poder: 0
donki Va por buen camino
Por lo que me comentas creo que solo puede ser problema de la linia
Código Delphi [-]
EditImporte.Text := ADOSPImporteCuentasxPagar.Parameters.ParamValues ['@Importe'];

Mira de hacer la conversión a mano junto con un try except...

Saludos
__________________
Grandes frases de nuestro tiempo:
"La pasta no és para tirarla, es para el Tunning"

"TodoOK=False...."

Enjoy it!!!
Responder Con Cita
  #7  
Antiguo 02-11-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Yo de refilón he visto otro detalle:
Código Delphi [-]
 else begin
     ADOSPEdadCuentas.Parameters.ParamByName('@Edad1').Value := StrToInt (EditEdad1.Text);
     ADOSPImporteCuentasxPagar.Parameters.ParamByName('@Dias1').Value := StrToInt (EditEdad1.Text);
     end;
     ADOSPImporteCuentasxPagar.ExecProc;
     EditImporte.Text := ADOSPImporteCuentasxPagar.Parameters.ParamValues ['@Importe'];
  ADOSPEdadCuentas.Open;
end;
Aunque el código original está bien identado, falta el begin .. end del else, espero que sea error de copiar y pegar.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 03-11-2006
vinicc vinicc is offline
Miembro
 
Registrado: ago 2006
Posts: 31
Poder: 0
vinicc Va por buen camino
OJO con el strtoint

Hola, a vista de pájaro vi tu sp, muy bueno. hace poco hice uno parecido utilizando un editmask, pero tuve que anteponer un trim para evitar que me diera problemas con un digitador malicioso. posiblemente no sea tu caso pero OJO con eso. (StrToInt(Trim(EditMask1.text)))

ok.
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
Procedimientos almacenados AS/400 Carlos A Ortega DB2 1 12-12-2006 00:32:39
procedimientos almacenados datorar Conexión con bases de datos 8 03-01-2006 17:05:43
Procedimientos almacenados en delphi con storeprocedure pgl Firebird e Interbase 7 05-11-2005 00:58:53
procedimientos almacenados Gabriel2 SQL 1 13-01-2005 14:50:09
Procedimientos Almacenados Gabriel A Reyes MS SQL Server 5 07-07-2003 14:08:46


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


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