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)
-   -   Migrando firebird 2.5 a 3 (https://www.clubdelphi.com/foros/showthread.php?t=96606)

IVAND 14-02-2024 21:45:10

Migrando firebird 2.5 a 3
 
Hola a todos , estoy migrando mi base de 2.5 a 3 firebird utilizo los componentes ibx , al parecer todo normal le puse en configuracion que permita usar rfunc , todo funciona bien , pero al lanzar una validacion desde un stored procedure no sale como antes salia osea el mensaje de error que se dispara el trigger

Attempt to execute an unprepared dynamic SQL statement

alguno de uds les ha pasado , si pruebo desde ibexpert lanza la excepcion bien pero desde el sistema sale este error y no muestra mas

adjunto trigger
Código SQL [-]
CREATE OR ALTER trigger producto_bodega_au0 for producto_bodega
active after update position 0
AS
 declare variable nombre varchar(150);
begin
  /* Trigger text */
 if (new.cantidad<=-1) then
   Begin
     nombre = (select nombre from producto where key_producto=NEW.key_producto) ;
     exception bloquear_saldo_bodega 'El saldo de este Producto no puede estar en negativo = ' || nombre  ;
 
  End

end

Casimiro Noteví 15-02-2024 10:59:42

¿Ese mensaje lo produce el trigger o es de tu programa delphi?
Porque dices que con ibexpert no sale el error, pienso que es algo de tu programa.

En todo caso, para que quede más claro el código, en esta línea yo lo cambiaría, aunque no hace falta:

Esto: if (new.cantidad<=-1) then por esto: if (new.cantidad<=(-1)) then

IVAND 16-02-2024 15:22:35

Como siempre gracias por responder

Te explico mejor , el sp al momento que se ejecuta en firebird 3 desde ibexpert muestra este mensaje

BLOQUEAR_SALDO_BODEGA.
El saldo de este Producto no puede estar en negativo = ACAI FUTURO COM LIQ 269ML.
At trigger 'PRODUCTO_BODEGA_AU0' line: 9, col: 6
At procedure 'SPMOV_INVENTARIOS' line: 142, col: 9.
<Missing arg #1 - possibly status vector overflow>.

Si se ejecuta lo mismo de firebird 2.5 ejecuta asi
Código SQL [-]
BLOQUEAR_SALDO_BODEGA.
El saldo de este Producto no puede estar en negativo = ACAI FUTURO COM LIQ 269ML.

Parte del codigo donde se ejecuta el error obvio donde le pongo a negativo el stock

Código SQL [-]

       Begin
        UPDATE producto_bodega SET cantidad=(cantidad)-:cantidad
        WHERE key_producto_b=:key_producto_b;
            WHEN SqlCode -901 DO BEGIN
                               in autonomous transaction do
                                insert into error_update (ID_TRANSACCION,MENSAJE,ID_CLAVE_DOCUMENTO,VALOR)
                                values (:key_producto_b,:cod_transaccion||'PB',:key_cab_mov,:cantidad);
                               End
       End

Casimiro Noteví 16-02-2024 19:38:02

¿Eso es un trigger?

IVAND 16-02-2024 22:21:14

No no no , el trigger ejecuta una condicion q si la ejecuto dentro de un sp me bota ese error en firebird 3 , mientras q en 2.5 funciona bien

si ejecuto el sp desde el ibexpert sale este mensaje


Código PHP:

BLOQUEAR_SALDO_BODEGA.
El saldo de este Producto no puede estar en negativo ACAI FUTURO COM LIQ 269ML.
At trigger 'PRODUCTO_BODEGA_AU0' line9col6
At procedure 
'SPMOV_INVENTARIOS' line142col9.
<Missing arg #1 - possibly status vector overflow>. 

si lo ejecuto desde mi aplicativo sale este mensaje
Código SQL [-]

"Attempt to execute an unprepared dynamic SQL statement"

Casimiro Noteví 17-02-2024 19:04:26

La verdad es que no me queda muy claro la situación, ¿puedes subir algún ejemplo sencillo para que podamos probar?

IVAND 22-02-2024 02:28:35

Hola casimiro tendria que subir la base de datos y un programita en delphi que haga saltar la validación para que veas el error , (especificamente lo que hace es que desde delphi 2009 con los componentes ibx capturamos el mensaje de error que nos devuelve la base de datos y al querer mostrar en delphi nos da el error)

Casimiro Noteví 22-02-2024 11:15:15

Cita:

Empezado por IVAND (Mensaje 554551)
... con los componentes ibx capturamos el mensaje de error que nos devuelve la base de datos y al querer mostrar en delphi nos da el error)


Sigo sin entender, entonces ¿el error es al mostrar en delphi el mensaje devuelto?

IVAND 13-03-2024 14:42:40

Mil disculpas por no responder a tiempo

Si Casimiro , en delphi con los componentes ibx ya no muestra el mensaje de error de forma correcta , como lo mostraba cuando usaba firebird 2.5

mamcx 13-03-2024 15:53:22

Cita:

Empezado por IVAND (Mensaje 554517)
Código SQL [-]

"Attempt to execute an unprepared dynamic SQL statement"

Eso suena a que es este problema:

Código SQL [-]
 values (:key_producto_b,:cod_transaccion||'PB',:key_cab_mov,:cantidad);

Es erroneo concatenar un parametro con lo que sea. Cambia cod_transaccion para que tenga el texto completo.

IVAND 21-05-2024 02:47:29

Hola a todos , el problema es una unidad en los componentes ibx pero no se como actualizarlos

Casimiro Noteví 21-05-2024 09:09:22

Cita:

Empezado por IVAND (Mensaje 555708)
Hola a todos , el problema es una unidad en los componentes ibx pero no se como actualizarlos

Explícate, no se entiende lo que dices.

IVAND 27-05-2024 20:40:45

Cita:

Empezado por Casimiro Notevi (Mensaje 555710)
Explícate, no se entiende lo que dices.


Estimados amigos , intentare explicar de mejor manera mi pregunta y mi duda

Estoy migrando a firebird 3 , delphi 2009 y los componentes IBX , todo esta perfecto ya esta en produccion y todo , pero resulta que hay un problema al monento de mostrar un mensaje que viene de un stored procedure , he leído que esto se debe a que ibx tal como esta tiene ese problema con firebird 3 , he leido que se debe cambiar la unidad en los fuentes de los componentes IBX alguno de uds ha cambiado algo para q los mensajes que vengan de un store procedure cuando se produzca un error se muestre correcto , como se mostraba cuando se trabajada con firebird 2.5 , espero a ver sido claro en mi duda , si esta en sus manos espero sus comentarios

Casimiro Noteví 27-05-2024 21:02:06

Estimado IVAND, no aclaras nada, sólo dices "...hay un problema...", "...he leído que...", "...tiene ese problema...", "...he leido que se debe..." ...

Creo que lo mejor es que simplemente pegues aquí el stored procedure, que nos digas exactamente qué quieres conseguir, y que nos copies exactamente el mensaje de error o problema que te está surgiendo.

IVAND 27-05-2024 21:19:19

Estimado gracias por su tiempo en leer , pero creo que soy muy malo para explicar mi problema , he tratado de explicarlo de mil maneras y nada que me puedo hacer entender , la verdad no se como mas poder explicar el error q me da al usar firebird 3 con delphi 2009 y los componentes ibx

He enviado los mensajes que salen cuando trabajo con firebird 2.5 y lo q sale ahora con la version 3 , pero les quedo agradecido la verdad , voy a tener que comprar otros componentes que manejen mejor este error
Igual vuelvo a intentar explicarme otra vez

El mensaje usando firebird 2.5 se muestra en delphi super bien , indica el producto que esta quedando en negativo y esta perfecto se entiende y se puede revisar
Código PHP:

BLOQUEAR_SALDO_BODEGA.
El saldo de este Producto no puede estar en negativo ACAI FUTURO COM LIQ 269ML.
At trigger 'PRODUCTO_BODEGA_AU0' line9col6
At procedure 
'SPMOV_INVENTARIOS' line142col9.
<Missing arg #1 - possibly status vector overflow>. 



al utilizar firebird 3 el mensaje que retorna cuando se produce la exception en muy generico
Código PHP:

"Attempt to execute an unprepared dynamic SQL statement" 


indico ademas el trigger q debe lanzar la exception

Código PHP:

CREATE OR ALTER trigger producto_bodega_au0 for producto_bodega
active after update position 0
AS
begin
  
/* Trigger text */
 
if (new.cantidad<=-1then  exception bloquear_saldo_bodega ;

end 

Se que es un problema de los componentes IBX al manejar el mensaje de error , pero no se cual unidad de las ibx corregir


De antemano espero se me entienda , caso contrario quedare igual de agradecido como siempre de ustedes

Casimiro Noteví 28-05-2024 09:57:50

Código SQL [-]
CREATE OR ALTER trigger producto_bodega_au0 for producto_bodega
active after update position 0
AS
begin
 if (new.cantidad<=-1) then  exception bloquear_saldo_bodega ;
end
O sea, quieres decir que con firebird 3 no sale ese mensaje "bloquear_saldo_bodega". Y con firebird 2.5 sí sale el mensaje.
¿Es eso?

IVAND 28-05-2024 15:40:00

Exacto , el mensaje sale pero generico
Código SQL [-]
Attempt to execute an unprepared dynamic SQL statement"
y realmente no dice nada ,

con firebird 2.5 sale bien
Código SQL [-]
El saldo de este Producto no puede estar en negativo = ACAI FUTURO COM LIQ 269ML.
At trigger 'PRODUCTO_BODEGA_AU0' line: 9, col: 6
At procedure 'SPMOV_INVENTARIOS' line: 142, col: 9.

lo muestra perfecto , por ende es un problema en el manejo de errores en los componentes IBX , a nadie le ha pasado esto ??

Gracias

mamcx 28-05-2024 17:48:25

Cita:

Empezado por IVAND (Mensaje 555773)
Exacto , el mensaje sale pero generico
Código SQL [-]
Attempt to execute an unprepared dynamic SQL statement"
y realmente no dice nada ,

????

Esto no es un mensaje "generico" y te esta diciendo exacto el problema, que ya te respondi que era. Presta atencion;).


Ahora si hiciste el arreglo al problema, entonces tienes otro lugar donde haces una concatenacion con parametros, que es erronea.

Casimiro Noteví 28-05-2024 17:52:34

Ten en cuenta que el componente IBX que estás usando es el mismo tanto con firebird 2.5 como con firebird 3.0
Así que, por lógica, en teoría, no puede ser un fallo de IBX.

mamcx 28-05-2024 18:36:10

El error suena mas a ser del motor, no del componente (aunque hay este reporte: https://stackoverflow.com/questions/...statement-in-d))

Casimiro Noteví 28-05-2024 18:59:09

Eso parece según ese mensaje, que es algún error en el componente TIBStoredProc.
Yo no lo he detectado porque no lo uso, sino que para ejecutar procedures utilizo el TIBDataSet normal.

IVAND 30-05-2024 18:53:39

Exacto mamcx , el error es de los componentes , quedo muy agradecido de uds voy a intentar seguir averiguando como se soluciiona esto , por el momento creo que comprare los IBDAC , Gracias

Casimiro Noteví 30-05-2024 19:40:49

IVAND, en ese enlace están usando un TIBStoredProc ¿tú estás usando un TIBStoredProc?
Si es así, simplemente utiliza un TIBDataset y en su sql.text pon "execute procedure ......" y se acabó el problema.
Suponiendo que ese sea el problema, que todavía no lo tengo muy claro.

IVAND 06-06-2024 03:56:27

Gracias a todos , por su tiempo pero no es problema del sp , es los manejo de errores de los componentes , ya compre los ibdac empezare hacer pruebas , en estos si me sale el mensaje bien

IVAND 01-12-2024 04:33:14

Hola despues de muchas pruebas y buscar lo poco que hay en internet , pues si es problema de el manejo de errores cuando se dispara un trigger , he echo lo que indicas casimiro pero parece que realmente no es el problema en ejecutar un stored procedure , el verdadero problema es manejar el error que da en el trigger , cuando este tiene alguna validacion en mi caso es cuando no debe permitir colocar una cantidad en valor negativo

Código SQL [-]
CREATE OR ALTER trigger producto_bodega_au0 for producto_bodega
active after update position 0
AS
 declare variable nombre varchar(150);
begin
  /* Trigger text */
 if (new.cantidad<=-1) then
   Begin
     exception bloquear_saldo_bodega ;

  End

end


en firebird 2.5 funciona bien y sale el mensaje muy claro , en firebird 3 sale el mensaje generico que ya les indique ( en este caso el store procedure ejecuta un procedimiento q descuenta el saldo de los inventarios y si un producto se coloca en negativo el error debe enviar la validacion y es ahi donde falla

Como valida estos los companeros que trabajan ya con firebird 3 y los componentes IBX uso delphi 2009

Casimiro Noteví 01-12-2024 13:04:47

Cita:

Empezado por IVAND (Mensaje 560308)
Como valida estos los companeros que trabajan ya con firebird 3 y los componentes IBX uso delphi 2009

Es que no hay ninguna diferencia, es igual. Yo tengo programas con firebird 3, 4 y 5 y funciona igual, salta el mensaje de excepción que pongas.
Aunque se me está ocurriendo que a partir de cierta versión, que no recuerda cuál, los mensajes tienes que declararlos como excepción para poder llamarlos.
A ver si es eso lo que te está ocurriendo.
Código SQL [-]
 CREATE EXCEPTION ex_cantidad_invalida 'Valor inválido en el campo cantidad.';
Código SQL [-]
CREATE OR ALTER TRIGGER trg_check_cantidad
BEFORE INSERT OR UPDATE
ON tbVentas
AS
BEGIN
  IF (NEW.cantidad <  0) THEN
  BEGIN
    -- Lanza una excepción personalizada
    EXCEPTION ex_cantidad_invalida 'La cantidad debe ser mayor que cero.';
  END
END;
El texto que se define al crear la excepción sirve como un mensaje predeterminado, y el texto que se usa al lanzar la excepción dentro del trigger puede ser un mensaje más específico o detallado para esa situación particular.

IVAND 02-12-2024 03:02:33

Exactamente asi lo hago , pero sigue el error usando los componentes IBX , pense que algun companero del foro tenia algun problema similar

Casimiro Noteví 02-12-2024 09:58:45

Creo que lo único que queda por comprobar es la versión de IBX que estás usando.


La franja horaria es GMT +2. Ahora son las 06:11:23.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi