PDA

Ver la Versión Completa : Cual es la forma correcta de llamar y ejecutar un ProcAlmacenado en IB6 y Delphi 7???


Saltamontes
08-07-2007, 05:04:59
Buenos(as) DIas/Tardes/Noches

Estoy trabajando en un proyectito con Delphi7 e InterBase 6, la cosa es que intento ejecutar un procedimiento almancenado y me salen errores al momento de ejecutarlo desde el delphi, porque no me muestran errores de sintaxis, el codigo del query en Delphi es:

pinventario := txt_inventario.Text;
pmarca := txt_marca.Text;
pmodelo := txt_modelo.Text;
pserie := txt_serie.Text;
pdescripcion := txt_descripcion.Text;
pprecio := strToFloat(txt_precio.Text);
pedofunc := txt_edofunc.Text;
ptitular := txt_titular.Text;
pfecha := DateToStr(DTPfecha.Date);
pidArea := DBLCBox_Areas.KeyValue;
DM.IBQ_Inventario.Close;
DM.IBQ_Inventario.SQL.Clear;
DM.IBQ_Inventario.SQL.Add('execute procedure PR_Ins_InvCatArea("' + pinventario + '"," + pmarca + "," + pmodelo + "," + pdescripcion + "," + pprecio + "," + pedofunc + "," + pfecha + "," + pidArea + "," + ptitular + ")');
DM.IBQ_Inventario.ExecSQL;
DM.IBQ_Inventario.Open;

y el procedimiento hecho en el InterBAse 6 es:

set term !!;
create procedure PR_Ins_InvCatArea(pinventario VARCHAR(12),pmarca VARCHAR(20),pmodelo VARCHAR(20),pserie VARCHAR(20),pdescripcion VARCHAR(50), pprecio FLOAT, pedofunc VARCHAR(15), pfechainv DATE, pidArea integer ,pdepositario VARCHAR(70))
as
declare variable vidInventario integer;
Begin
insert into Inventario (Inventario,Marca,Modelo,Serie, Descripcion, Precio,EdoFuncional, Fecha_Inv)
VALUES(:qinventario,:qmarca,:qmodelo,:qserie,:qdescripcion,:qprecio,:qedofunc,:qfechainv);

select idInventario from Inventario where Inventario = :qinventario into :vidInventario;
insert into Inv_CatAreas VALUES(:qidArea,:vidInventario,:qdepositario);
End!!
set term ;!!

y ya lo ejecute en el Interbase y si se deja, pero desde delphi no,
inclusive intente "insert into PR_Ins_InvCatArea VALUES(parametros)"
y pos tampoco.

Les agradezco su tiempo y la asesoria que me puedan brindar.
Sales pues :D
Nos vemos

Delphius
08-07-2007, 05:17:54
Hola, veo que eres miembro desde hace ya medio año, y que tienes 5 mensajes escritos... da la impresión de que todavía eres "iniciado en clubdelphi" Pero igualmente, creo que debo hacerte notar que por favor escribas el código entre las etiquetas [ DELPHI ] y [ /DELPHI ] (sin espacios), ¡No se entiende el código que expones!
Te remito a la guia de estilo.

No soy moderador, pero igualmente creo que es recomendable de que te haya hecho la observación.

Te pido amablemente que edites tu mensaje y que emplees las etiquetas. Veras que el texto sale bonito y legible. De ese modo, podríamos detectar cual es problema con mayor facilidad.

Saludos,

Delphius
08-07-2007, 19:08:45
A primera vista parece que todo está bien. Yo no uso Interbase, uso Firebird y lo que me llama la atención son los !! ¿Es correcto eso? Por lo general se usa el ^

Si es posible, podrías exponer cual/es es/son el/los error/es que te arroja/n?
Saludos,

Saltamontes
08-07-2007, 21:21:49
Hola nuevamente, los !! son de la declaracion del procedimiento "a manita", pero en la pestaña METADATA de InterBase me lo muestra de esa manera:

COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;

/* Stored procedures */

CREATE PROCEDURE "PR_INS_INVCATAREA"
(
"PINVENTARIO" VARCHAR(12),
"PMARCA" VARCHAR(20),
"PMODELO" VARCHAR(20),
"PSERIE" VARCHAR(20),
"PDESCRIPCION" VARCHAR(50),
"PPRECIO" FLOAT,
"PEDOFUNC" VARCHAR(15),
"PFECHAINV" DATE,
"PIDAREA" INTEGER,
"PDEPOSITARIO" VARCHAR(70)
)
AS
BEGIN EXIT; END ^


ALTER PROCEDURE "PR_INS_INVCATAREA"
(
"PINVENTARIO" VARCHAR(12),
"PMARCA" VARCHAR(20),
"PMODELO" VARCHAR(20),
"PSERIE" VARCHAR(20),
"PDESCRIPCION" VARCHAR(50),
"PPRECIO" FLOAT,
"PEDOFUNC" VARCHAR(15),
"PFECHAINV" DATE,
"PIDAREA" INTEGER,
"PDEPOSITARIO" VARCHAR(70)
)
AS
declare variable vidInventario integer;
Begin
insert into Inventario (Inventario,Marca,Modelo,Serie, Descripcion, Precio,EdoFuncional, Fecha_Inv)
VALUES(: pinventario,: pmarca,: pmodelo,: pserie,: pdescripcion,: pprecio,: pedofunc,: pfechainv);
select idInventario from Inventario where Inventario = : pinventario into :vidInventario;
insert into Inv_CatAreas VALUES(: pidArea,: vidInventario,: pdepositario);
End
^

SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;

y como digo, el procedimiento ya lo probe desde InterBase y si funciona, pero desde el Delphi 7 no lo hace, me dice que el primer parametro no es una columna valida...

Ahora intente usar la otra forma, llamando el procedimiento como tal, primero agregando el Icono ese de IBStoredProc a un modulo de datos y llamandolo en el codigo asi (ya cheque la BD y seleccione el proc, que es el unico y que estuviera activo):

DM.IB_PR_Ins_InvCatAreas.ParamByName('PINVENTARIO').AsString := Trim(txt_inventario.Text);
DM.IB_PR_Ins_InvCatAreas.ParamByName('PMARCA').AsString := txt_marca.Text;
DM.IB_PR_Ins_InvCatAreas.ParamByName('PMODELO').AsString := txt_modelo.Text;
DM.IB_PR_Ins_InvCatAreas.ParamByName('PSERIE').AsString := txt_serie.Text;
DM.IB_PR_Ins_InvCatAreas.ParamByName('PDESCRIPCION').AsString := txt_descripcion.Text;
DM.IB_PR_Ins_InvCatAreas.ParamByName('PPRECIO').AsFloat := StrToFloat(txt_precio.Text);
DM.IB_PR_Ins_InvCatAreas.ParamByName('PEDOFUNC').AsString := txt_edofunc.Text;
DM.IB_PR_Ins_InvCatAreas.ParamByName('PFECHAINV').AsString := DateToStr(DTPfecha.Date);
DM.IB_PR_Ins_InvCatAreas.ParamByName('PIDAREA').AsInteger := StrToInt(txt_inventario.Text);
DM.IB_PR_Ins_InvCatAreas.ParamByName('PDEPOSITARIO').AsString := txt_inventario.Text;
DM.IB_PR_Ins_InvCatAreas.ExecProc;


y de esta forma me sale un error que dice que el valor de mi primer parametro (string de 12 caracteres) no es un valor entero valido.


Les agradezco por la orientacion que me puedan dar.
Sales pues :D
Nos vemos

Delphius
08-07-2007, 21:34:38
Disculpa, pero esto me deja confundido:

y de esta forma me sale un error que dice que el valor de mi primer parametro (string de 12 caracteres) no es un valor entero valido.

¿En que quedamos? ¿Se está esperando un string o un integer?
Por un lado estoy viendo un inventario de tipo VARCHAR, por el otro del tipo INTEGER.

¿Puedes, si no es molestia, por favor transcribir textualmente el error?
Saludos,

iuqrul
11-07-2007, 17:05:19
Debes definir en el TIBStoredProc (si usas IBX) el tipo de paramétro de cada uno, debe estar definido por defecto como integer, y lo tendrás que indicar como string.