PDA

Ver la Versión Completa : Stored Procedure,Triggers


Io
05-01-2007, 13:02:22
Saludos al Foro y Feliz Año Nuevo.

Vamos con la primera pregunta del año.:)

Tengo una pega y no encuentro ni explicación ni solución, haber si me ayudan a ver la Luz.
Entorno: D6, FB15 ,componentes interbase.

Inicialmente mediante un ibQuery desde delphi podía generar una nueva base
de datos, creando tablas dominios, indices, Stored Procedure (SP),Triggers, en fin todo era felicidad.....:rolleyes:.

Pero llego el día en que tuve que realizar una modificación en un SP, mediante un ibQuery realicé un RECREATE, y me devolvio el siguiente
error:

SQL error = 104
Token unknown -line 1,char xxx
?'. Proc.......

Es lógico pensar que me equivoque.
Tome la desición de borrar y crear el SP para evitar volver a utilizar RECREATE. Comenzo el calvario, podía perfectamente borrar el SP, pero
al crearlo me devolvía el mismo error (Cambia el char), dejaba el cuerpo
del SP vacío y me lo creaba, pero, si introducía cualquier instrucción el
error salta y no lo crea. Mi estado de crisis aumenta cuando utilizo código
de la SP original (sin tocar) y me devuelve el mismo error.

Cuando hago un Copy-Paste del SP desde delphi al editor sql del ibExpert
y lo ejecuto funciona perfectamente.
Lo mismo me ha pasado al modificar un trigger, lo he conseguido desde
ibExpert, aunque originalmnte lo podia hacer desde delphi (Creación del trigger).

No se que pasa, quizás sea un problema de los componentes de interbase....:(

Espero no haber liado mucho la pregunta.

Saludos

StartKill
05-01-2007, 22:26:55
Saludos compañero,

Has resuelto tu poblema?

Te comento que me ocurrio lo mismo.... y es como tu dices, el problema era los componentes. (habia actualizado por otra version).

Your friend,

StarKill
Lima-Perú

Io
05-01-2007, 22:47:09
Buenasssssssssss

Lo he solucionado a medias de momento.
Formateé el disco duro y volvi a instalar delphi y todo lo demas. He conseguido que la aplicación que antes genaraba bien las Bases de datos, lo vuelva a hacer, pero todavía no he conseguido cambiar el cuerpo del Trigger y Sp desde una aplicación.
Seguiré probando (Todavía estamos a principio de año :) )

Saludos

ArdiIIa
06-01-2007, 21:59:35
Supongo que metes el código DDL en un query tal que así:
/*===========================================================================*/
/*Metadata Extract performed 06-ene-2007 20:47 */
/*===========================================================================*/

/*===========================================================================*/
/*Connect to Database */
/*===========================================================================*/
connect 'blarblabla0.FDB' user 'SYSDBA' blabla;



/*===========================================================================*/
/*Stored Procedure Definitions */
/*===========================================================================*/

alter procedure BlaBlas (EJERCICIO integer, TABLA varchar(40))
returns (NUMERO integer)
as
DECLARE VARIABLE NTEMP INTEGER;
Begin

SELECT COUNT(EJERCICIO) FROM SYS_EJERCICIOS

blabla
blabla

suspend;

End
^


commit work^
set autoddl on^
set term ;^


y posteriormente lo ejetutas con Query.ExecSQL
Si es así, y según el error que aportas, la sintaxis es errónea.

Mira por si acaso en ese procedimiento que quieres ejecutar, tal vez quieras utilizar una variable tipo DATE y dependiendo del Dialecto de tu BD, a lo mejor no te lo permite y tendría que utilizar Timestamp.
Suele ser un error muy común..

Casimiro Notevi
06-01-2007, 23:25:52
Buenasssssssssss

Lo he solucionado a medias de momento.
Formateé el disco duro y volvi a instalar delphi y todo lo demas. He conseguido que la aplicación que antes genaraba bien las Bases de datos, lo vuelva a hacer, pero todavía no he conseguido cambiar el cuerpo del Trigger y Sp desde una aplicación.Seguiré probando (Todavía estamos a principio de año :) )Saludos

Comentario al margen sobre el tema:

Me impresiona, sorprende, confunde, extraña, fascina, desconcierta, me deja perplejo la "facilidad" con que muchos solucionan cualquier tipo de problema informático. :confused:

Lepe
07-01-2007, 04:46:22
Casimiro, no ha dicho explicitamente que formateando se haya quitado el error, simplemente ha dicho que ha formateado y que parcialmente ha solucionado el error... puede no que estén las dos cosas íntimamente relacionadas ;).

Claro, como tú no usas windows, no sabes que hay que formatearlo cada cierto tiempo :p

Saludos

Io
07-01-2007, 23:24:04
Saludos a todos.
Efectivamente, el formatear el disco no es una solución. Pero era algo que tenía pendiente y aproveche el momento y encontré esa solución parcial.

En contestación a ArdiIIa, el código que utilizo es:



const

SP_AE_CLI_NO_HAB =
'CREATE PROCEDURE SP_AE_CLI_NO_HAB '+
'(ALB CHAR(6),FAC CHAR(6),FECHAFAC DATE,COD2 CHAR(10)) AS '+
' DECLARE VARIABLE CODFAC CHAR(6); '+
' DECLARE VARIABLE CLI CHAR(6); '+
' DECLARE VARIABLE AGE CHAR(6); '+
' DECLARE VARIABLE ALM CHAR(6); '+
' DECLARE VARIABLE PU CHAR(6); '+
' DECLARE VARIABLE FPAGO DATE; '+
' DECLARE VARIABLE COB NUMERIC(16,2); '+
' DECLARE VARIABLE SAL NUMERIC(16,2); '+
' DECLARE VARIABLE BASI NUMERIC(16,2); '+
' DECLARE VARIABLE IV NUMERIC(16,2); '+
' DECLARE VARIABLE R NUMERIC(16,2); '+
' DECLARE VARIABLE TOT NUMERIC(16,2); '+
' DECLARE VARIABLE PA SMALLINT; '+
' DECLARE VARIABLE REI SMALLINT; '+
' DECLARE VARIABLE FECHAXX DATE; '+
' DECLARE VARIABLE AUX VARCHAR(60); '+
'BEGIN '+

// SE TOMA ALBARÁN
' SELECT CODCLIENTE,CODAGENTE,CODALMACEN,PUESTO,FECHAPAGO,COBRADO,SALDO,BASEIMP,IVA,RE,TOTAL,PAGADO,'+
'REGIMENIVA,CODFACTURA '+
' FROM '+NOMBRE_DOCUMENTOS+' ' +
' WHERE CODALBARAN = :ALB '+
' INTO :CLI,:AGE,:ALM,:PU,:FPAGO,:COB,:SAL,:BASI,:IV,:R,:TOT,:PA,:REI,:CODFAC; '+

' IF (:FAC <> :CODFAC) THEN '+
' BEGIN '+

// SE ACTUALIZA FACTURA
' UPDATE '+NOMBRE_FACTURAS+' ' +
' SET ' +
' CODCLIENTE = :CLI, '+
' CODAGENTE = :AGE, '+
' CODALMACEN = :ALM, '+
' PUESTO = :PU, '+
' HORA = current_time, '+
' REGIMENIVA = :REI, '+
' IMPRIMIDO = 0 '+
' WHERE CODFACTURA = :FAC; '+

// SE ACTUALIZA ALBARAN
' UPDATE '+NOMBRE_DOCUMENTOS+' ' +
' SET ' +
' CODFACTURA = :FAC, '+
' FECHAFAC = :FECHAFAC '+
' WHERE CODALBARAN = :ALB; '+

// SE ACTUALIZA MOVIMIENTOS
' UPDATE '+NOMBRE_MOVIMIENTOS+' ' +
' SET ' +
' CODFACTURA = :FAC, '+
' FECHAFAC = :FECHAFAC '+
' WHERE CODALBARAN = :ALB; '+

// SE ACTUALIZA CNH
' UPDATE '+NOMBRE_CNH_S+' ' +
' SET ' +
' CODFACTURA = :FAC '+
' WHERE CODALBARAN = :ALB; '+
' END '+

' FECHAXX = current_date; '+
' AUX = '+''''+'PAGO FAC. '+''''+'|| :FAC || '+''''+'/'+''''+' || EXTRACT( year from :FECHAFAC); '+

// SE ACTUALIZA FACTURA
' UPDATE '+NOMBRE_FACTURAS+' ' +
' SET ' +
' FECHAPAGO = :FECHAXX, '+
' COBRADO = :TOT, '+
' SALDO = 0, '+
' BASEIMP = :BASI, '+
' IVA = :IV, '+
' RE = :R, '+
' TOTAL = :TOT, '+
' PAGADO = 1 '+
' WHERE CODFACTURA = :FAC; '+

// SE BORRA APUNTES COBROS EXISTENTE
' DELETE FROM '+NOMBRE_COBROS+' ' +
' WHERE CODIGO = :FAC '+
' AND CODIGO2 = :COD2 '+
' AND TIPO = 1; '+

// SE INSERTA APUNTES COBROS
' INSERT INTO '+NOMBRE_COBROS+' '+
' (CODIGO,CODIGO2,EMISORCOB,TIPO,FECHA,CONCEPTO,IMPORTE,FILA,CODCONCEPT,FECHADOC,CODCLIENTE,CODAGENTE) '+
' VALUES (:FAC,:COD2,:COD2,1,:FECHAXX,:AUX,:TOT,1,'+''''+'000000'+''''+',:FECHAFAC,:CLI,:AGE); '+

// SE ACTUALIZA CAJA
' EXECUTE PROCEDURE SP_ACTUALIZACAJA :FECHAXX; '+

'END ';





procedure TForm2.Button3Click(Sender: TObject);
begin
ibT1.StartTransaction;
try
ibQMovimientos.SQL.Clear;
ibQMovimientos.SQL.Add(SP_AE_CLI_NO_HAB);
application.ProcessMessages;

ibQMovimientos.ExecSQL;

ibt1.Commit;
showmessage('Ok Crea');
except
if ibt1.InTransaction then
ibt1.Rollback;
showmessage('Error Crea');
end;

end;



ibQMovimientos, es un componente TQuery, que ha sido conectado a la base de datos mediante un componte TibDatabase.

los identificadores como "NOMBRE_COBROS", son constantes que continen el nombre de la tabla.

Este código me genera el error que os he dicho, pero si lo ejecuto desde el ibExpert me funciona bien (lógicamente cambiando las constantes por los nombres de las tablas)

No utilizo el comando supend, ni tampoco utilizo el signo ^.

Saludos

ArdiIIa
08-01-2007, 14:36:59
DECLARE VARIABLE FPAGO DATE;
DECLARE VARIABLE FECHAXX DATE;

Pues efectivamente utilizas el tipo date, y tal como te comenté, dependiendo del dialecto de tu BD, esto te podría generar problemas a la hora de modificar el procedure evitándose utilizando el tipo Timestamp.

Io
08-01-2007, 16:17:55
Muchas gracias.:p
El dialecto que utilizo es el 3.
En cuanto pueda voy hacer las pruebas para comprobar esto.:D

Ya te comentaré.