Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Variable en un update. (https://www.clubdelphi.com/foros/showthread.php?t=54861)

mcalmanovici 01-04-2008 20:58:33

Variable en un update.
 
Hola gente:
tengo el siguiente problema y como siempre aca le encuentran solúcíon planteo el mismo;
Quiero ejecutar desde un store procedure en firebird la sentencia insert into tabla (campo1,variable) values (:campo,:campo3). Siendo la variable distinta para cada insert. Es decir el insertt está en un while y la variable puede ser la primera vez que ingresa en el while campo2 (o sea variable = campo2) pero la segunda vez puede ser campo3 (o sea variable = campo3).
Mi pregunta es como hago para que me tome la variable en el insert.
Probé haciendo insert into tabla1 (campo1,:variable) values (:campo,:campo3), también como insert into tabla1 (campo1,"variable") values (:campo,:campo3) y también insert into tabla1 (campo1, '+variable+') values (:campo,:campo3) pero de ninguna manera de estas me deja compilar. Alguna idea??.....

Muchas gracias por el tiempo que le dedican a este foro.
Saludos.
Mariano.

BlueSteel 01-04-2008 21:04:26

Hola mcalmanovici

en realidad no entendí muy lo que quieres hacer... sobre todo

Cita:

Siendo la variable distinta para cada insert.
según lo que entedí... quieres insertar en una tabla a través de un SP en Interbase... un dato en un campo, pero no siempre será en el mismo campo...

si es así... creo que debes hacer un SP que inserte datos en todos los campos y que le pases datos por variables para todos los campos..

acuerdate que si los campos no permite nulos... no podrás insertar un solo campo de un registro por que te dará error....

salu2.... :p:D

PS: pon algo de ejemplo...

RONPABLO 01-04-2008 22:26:31

depronto puede encontrar una idea importante para organizar lo que quiere aquí

RONPABLO 01-04-2008 22:33:14

o por aquí también hay otra idea

mcalmanovici 03-04-2008 14:37:30

A ver si me explico un poco mejor.
 
Voy a poner un ejemplo más concreto.
En el store procedure tengo:


Código SQL [-]CREATE PROCEDURE PROCESAR_DIA_DEL_MES (
MES INTEGER,
ANIO INTEGER,
DIA INTEGER)
AS/*----*/
declare variable remoteterminalid integer;
declare variable cantidad_total_reporte integer;
declare variable cnt integer;
declare variable fechaIni date;
declare variable fechaFin date;
declare variable sla date;
BEGIN
/* Procedure body */
fechaIni = Anio||'-'||Mes||'-'||Dia||' 00:00:00';
fechaFin = Anio||'-'||Mes||'-'||Dia||' 23:59:59';
sla = 'DIA'||:DIA||'_SLA'; //esta es la variable que quiero poner
//en el insert o en el update y no puedo porque me tira error de compilación.
for SELECT tr.remoteterminalid AS REMOTETERMINALID,
count (tr.datetime) as CANTIDAD_TOTAL_REPORTE
from tsdreport tr left join remoteterminal rt on (tr.remoteterminalid=rt.remoteterminalid)
where tr.datetime >= :fechaIni and
tr.datetime <= :fechaFin
group by tr.remoteterminalid
into:remoteterminalid,:cantidad_total_reporte
do
begin
select count(*)
from TEMPO_MCA_SLA
where REMOTETERMINALID = :remoteterminalid
into:cnt;
/*EL PROBLEMA ES QUE NO ACEPTA QUE PONGA UNA VARIABLE EN EL SET Y EN EL INSERT INTO, EN ESTE
CASO SLA*/
if (cnt <> 0) then
begin
update TEMPO_MCA_SLA set sla = :cantidad_total_reporte where REMOTETERMINALID = :remoteterminalid;
end
else
begin
insert into TEMPO_MCA_SLA (REMOTETERMINALID,sla) values (:remoteterminalid,:cantidad_total_reporte);
end
end
SUSPEND;
END




El problema lo tengo con el sla que esta en negrita que como verán es una variable que va cambiando cada vez que llamó al store procedure, ya que la tabla TEMPO_MCA_SLA tiene 31 campos y yo los voy a ir actualizando uno por uno.
No sé si ahora me pude explicar un poco mejor.

Muchas gracias por la ayuda que me dan siempre.

RolphyReyes 03-04-2008 15:07:20

Saludos.

Como bien explica los enlaces indicado por RONPABLO puedes utilizar EXECUTE STAMENT para esta operación.

Puedes buscar referencia sobre esta sentencia también en el Release Notes de Firebird.

Hasta luego.

mcalmanovici 03-04-2008 15:52:32

Sigo con el mismo problema
 
Hola,
si con ese execute stament hago lo siguiente:
Código SQL [-]
   stins = 'insert into TEMPO_MCA_SLA (REMOTETERMINALID,sla) values (:remoteterminalid,:cantidad_total_reporte)';
   EXECUTE STATEMENT :stins;

Y me sale un error que no conoce remoteterminalid. Si pongo
Código SQL [-]
   stins = 'insert into TEMPO_MCA_SLA (REMOTETERMINALID,sla) values (1,2)';
   EXECUTE STATEMENT :stins;
me sale que no conoce sla que es la variable que yo quiero que vaya cambiando según el día que yo le pasé.
Por lo cual con el exectue statement tengo el mismo problema. No sé si lo estaré usando mal o existe alguna otra solución.

Muchas gracias.
Mariano.

RONPABLO 03-04-2008 16:04:31

y que tal si lo pones así??
Código SQL [-]
stins = 'insert into TEMPO_MCA_SLA (REMOTETERMINALID,' || sla || ') values (1,2)';
     EXECUTE STATEMENT :stins;
Me imagino que sla es una variable de tipo texto donde va el nombre del campo que quiero usar

jhonny 03-04-2008 16:07:41

Tienes que concatenar dichos valores en esa variable que haz llamado stins, así:
Suponiendo que tienes un parámetro de entrada llamado Nombre_campo y otro llamado Valor_campo, la cosa sería...

Código SQL [-]
stins = 'insert into TEMPO_MCA_SLA ('||:Nombre_campo||',sla) values ('||Valor_campo||',:cantidad_total_reporte)';
   EXECUTE STATEMENT :stins;

Quizá me falte alguna comilla antes y después de ||Valor_campo||, todo depende del tipo de campo que estas manejando, si es de tipo char, varchar o Date por ejemplo... las vas a necesitar, si el tipo de campo es numérico, no.

jhonny 03-04-2008 16:10:32

Cita:

Empezado por RONPABLO (Mensaje 277282)
y que tal si lo pones así??

Código SQL [-]
stins = 'insert into TEMPO_MCA_SLA (REMOTETERMINALID,' || sla || ') values (1,2)';
EXECUTE STATEMENT :stins;




Me imagino que sla es una variable de tipo texto donde va el nombre del campo que quiero usar

Ahhh, ¿Era SLA?, crei que era REMOTETERMINALID, bueno, pero la idea es esa, creo que con esos dos ejemplos ya haz aprendido a usar el Execute statement :).

mcalmanovici 03-04-2008 16:10:57

Ya pude solucionarlo
 
Cita:

Empezado por jhonny (Mensaje 277283)
Tienes que concatenar dichos valores en esa variable que haz llamado stins, así:
Suponiendo que tienes un parámetro de entrada llamado Nombre_campo y otro llamado Valor_campo, la cosa sería...


Código SQL [-]stins = 'insert into TEMPO_MCA_SLA ('||:Nombre_campo||',sla) values ('||Valor_campo||',:cantidad_total_reporte)';
EXECUTE STATEMENT :stins;




Quizá me falte alguna comilla antes y después de ||Valor_campo||, todo depende del tipo de campo que estas manejando, si es de tipo char, varchar o Date por ejemplo... las vas a necesitar, si el tipo de campo es numérico, no.


Muchas gracias RONPABLO y jonnhy. Después probando me di cuenta que era como ustedes me están diciendo. Y cuando iba a postear la solución ya vi que me respondieron.
Vuelvo a agradecer por su cooperación y por la rapidez que contestaron.

Saludos.

Mariano.

Pd: igual copio el cógido tal cual como a mí me anduvo:
Código SQL [-]
stins = 'insert into TEMPO_MCA_SLA (REMOTETERMINALID,' ||:sla|| ') values (' ||:remoteterminalid|| ',' ||:cantidad_total_reporte||')';
   EXECUTE STATEMENT :stins;
    end


La franja horaria es GMT +2. Ahora son las 10:24:07.

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