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)
-   -   Actualizar la bd por internet (https://www.clubdelphi.com/foros/showthread.php?t=61876)

PacoPepe 25-11-2008 19:47:02

Actualizar la bd por internet
 
Uso D7 y Firebird.
He montado un sistema de actualizacion de la base de datos por internet.
He probado diversos paquetes de componentes y al final he optado por Zeos.
Este paquete tiene un componente para el manejo de script (ZSQLProcessor) que funciona muy bien.
Todas las modificaciones que voy realizando durante el desarrollo las voy anotando en un fichero de texto plano, las coloco en internet, se descargan desde el programa cliente y todo funciona bien.
El problema ha surgido cuando he tenido que actualizar o crear un procedimiento almacenado o un trigger, en ese momento ya no funcionan las actualizaciones. El problema es que los triggers o los procedimientos almacenados usan internamente ; como separadores, y como separador final el ^, por lo que el ZSQLProcessor ya no trabaja adecuadamente.

Alguien sabe como solucionar el problema

Un saludo :)

cahp 25-11-2008 20:16:03

has probado con:

Código SQL [-]
SET TERM ^ ;

ALTER TRIGGER NOMBRE
 AS Declare variable I integer;
BEGIN 
I = 0; 
END
^

SET TERM ; ^

Saludos.

boreg 25-11-2008 20:21:20

Cita:

Empezado por cahp (Mensaje 327910)
has probado con:

Código SQL [-]
SET TERM ^ ;

ALTER TRIGGER NOMBRE
 AS Declare variable I integer;
BEGIN 
I = 0; 
END
^

SET TERM ; ^

Saludos.

Justo eso estaba por responder, además de que la propiedad DelimiterType del SQLProcessor debe ser dtSetTerm.


Saludos

PacoPepe 25-11-2008 22:08:30

Si que lo he probado, pero el problema es cuando mezclo sentencias terminadas con ; con definiciones de triggers o procedimientos, por ejemplo

Código SQL [-]
CREATE TABLE TERMINOS (
    IDTERMINO    T_ID NOT NULL,
    TERMINO      T_TEXTO,
    IDPROVINCIA  T_ID,
    PROVINCIA    T_TEXTO
);

INSERT INTO TERMINOS (IDTERMINO, TERMINO, IDPROVINCIA, PROVINCIA) VALUES (1001, 'ALEGRIA-DULANTZI', 1, 'ALAVA');

SET TERM ^ ;

CREATE OR ALTER PROCEDURE CALCKGSPARTIDAS 
as
declare variable partidaid integer;
declare variable kgs numeric(10,2) = 0;
begin
  for select idpartida, sum(kgsaceituna) from recepcion
      group by idpartida
      into :partidaid, :kgs
      do execute procedure kgspartidas(partidaid,kgs);
end
^

SET TERM ; ^

En este caso, no funciona

Un saludo :)

boreg 25-11-2008 23:32:39

Utiliza el terminador ^ para todo tu script


Código SQL [-]
SET TERM ^ ;
CREATE TABLE TERMINOS (    
IDTERMINO    T_ID NOT NULL,    
TERMINO      T_TEXTO,    
IDPROVINCIA  T_ID,    
PROVINCIA    T_TEXTO)^
 
INSERT INTO TERMINOS (IDTERMINO, TERMINO, IDPROVINCIA, PROVINCIA) 
VALUES (1001, 'ALEGRIA-DULANTZI', 1, 'ALAVA')^
 
CREATE OR ALTER PROCEDURE CALCKGSPARTIDAS as
declare variable partidaid integer;
declare variable kgs numeric(10,2) = 0;
begin
  for select idpartida, sum(kgsaceituna) 
       from recepcion
      group by idpartida
      into :partidaid, :kgs
   do execute procedure kgspartidas(partidaid,kgs);
end^
 
SET TERM ; ^
acabo de hacer la prueba insertando un registro, creando una tabla , creando un trigger y creando un sp con un solo SQLPRocessor y todo bien.


Avisanos como te va.

PacoPepe 26-11-2008 12:31:55

¿Y como lo haces?

Yo he probado poniendo Delimiter = ^ y DelimiterType = dtSetTerm y no me funciona

Un saludo :confused:

boreg 26-11-2008 19:08:16

Cita:

Empezado por PacoPepe (Mensaje 328042)
¿Y como lo haces?

Yo he probado poniendo Delimiter = ^ y DelimiterType = dtSetTerm y no me funciona

Un saludo :confused:

el delimitador lo debes de indicar como ; o de plano dejalo vacío, supongo que por default lo toma como ;. Probé con delimitador ^ y, en efecto, no funciona. Resumiendo:
-set term ^; desde el principio de tu script
-set term ;^ al final de todo tu script
-^ al final de cada instruccion, excepto las contenidas en los SP's o trigger's, utiliza ;
-Delimiter = ;
-DelimiterType = dtSetTerm

cualquier duda avisanos.

Saludos

PacoPepe 26-11-2008 19:47:43

Dejando Delimiter en blanco si que funciona.

:p Muchas gracias :p

PacoPepe 26-11-2008 20:19:45

Resumiendo

-set term ^; desde el principio del script
-set term ;^ al final de todo el script
-^ al final de cada instruccion, excepto las contenidas en los SP's o trigger's, utiliza ;
-Delimiter = ''
-DelimiterType = dtSetTerm
-ParamsCheck = true

Delimiter hay que definirlo como '' mediante código, porque sino el componente al segundo intento lo vuelve a poner como ;

Un saludo a todos

rastafarey 28-11-2008 13:03:56

Resp
 
Yo he usado los componenetes de ib objects. Y ejecuto el script y no tenido ningun problemas.

si te das cuenta ibexpert tiene una opcion para conparar bases de datos luego que realiza las comparaciones te devuelve un script con las modificaciones la cual debes ejecutar sin ningun problemas. Bueno es el metodo mas sencillo y jamas he tendo problemas.


La franja horaria es GMT +2. Ahora son las 18:16:57.

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