Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-11-2004
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Al creo SP, error con caracter "

Tengo un codigo en Sql, que estoy generando automaticamente (un requisito para mi aplicacion de logging), que corre bien en IB Expert y no por dbExpress.

Llevo ya 3 dias llendo de aqui para alla y nada...

El error que saca es "Token Unknow - Line 5 char 82 ?", que segun mis cuentas es esta linea:

SELECT "IdFileGroup" FROM "GrupoArchivosBinarios" WHERE "IdFileGroup"=:"IdFileGroup" INTO :lvIdFileGroup;


Uso D7, dbExpert, Firebird 1.5 con la opcion de embebed engine, configurada la conexion asi:

Código Delphi [-]
  
 object dbCon: TSQLConnection
     ConnectionName = 'IBConnection'
     DriverName = 'Interbase'
     GetDriverFunc = 'getSQLDriverINTERBASE'
     LibraryName = 'dbexpint.dll'
     LoginPrompt = False
     Params.Strings = (
       'DriverName=Interbase'
       'Database=D:\Proyectos\FileLog\Servidor\Data\FileLog.gdb'
       'RoleName=RoleName'
       'User_Name=sysdba'
       'Password=masterkey'
       'ServerCharSet='
       'SQLDialect=3'
       'ErrorResourceFile='
       'LocaleCode=0000'
       'BlobSize=-1'
       'CommitRetain=False'
       'WaitOnLocks=True'
       'Interbase TransIsolation=ReadCommited'
       'Trim Char=False')
     VendorLib = 'gds32.dll'
     Left = 16
     Top = 8
   end
   object ExeSql: TSQLQuery
     MaxBlobSize = -1
     Params = <>
     SQLConnection = dbCon
     Left = 56
     Top = 8
   end

El codigo que ejecuto es exactamente:

Código SQL [-]
 CREATE PROCEDURE GrupoArchivosBinarios ("IdFileGroup" INTEGER  ,"ParentIdFileGroup" INTEGER  ,"GroupName" CHAR(30)  ,"FileExtensions" CHAR(150)  ) 
 AS
 DECLARE VARIABLE lvIdFileGroup INTEGER;
  begin
    SELECT "IdFileGroup"  FROM "GrupoArchivosBinarios" WHERE "IdFileGroup"=:"IdFileGroup" INTO :lvIdFileGroup;
    IF (:lvIdFileGroup IS null) THEN
    BEGIN
    INSERT INTO "GrupoArchivos"
    (   "IdFileGroup",   "ParentIdFileGroup",   "GroupName",   "FileExtensions")
    VALUES
    (   :"IdFileGroup",   :"ParentIdFileGroup",   :"GroupName",   :"FileExtensions");
 
    INSERT INTO "GrupoArchivosBinarios"
    (   "IdFileGroup")
    VALUES
    (   :"IdFileGroup");
 
    END ELSE BEGIN
 
    END
 end

Para crear la tabla corro este codigo (sin problemas, lo pongo para poder reproducir)

Código SQL [-]
 CREATE TABLE "GrupoArchivos" (
 "IdFileGroup" INTEGER NOT NULL,
 "ParentIdFileGroup" INTEGER NOT NULL,
 "GroupName" CHAR(30) NOT NULL,
 "FileExtensions" CHAR(150) NOT NULL);
 
 CREATE GENERATOR "Gen_GrupoArchivos_IdFileGroup";
 
 SET GENERATOR "Gen_GrupoArchivos_IdFileGroup" TO 0;
 
 CREATE TRIGGER "GrupoArchivos_TK" FOR "GrupoArchivos" ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW."IdFileGroup" IS NULL) THEN NEW."IdFileGroup" = GEN_ID("Gen_GrupoArchivos_IdFileGroup",1); END
 
 ALTER TABLE "GrupoArchivos" ADD CONSTRAINT PK_GrupoArchivos PRIMARY KEY ("IdFileGroup")
__________________
El malabarista.
Responder Con Cita
  #2  
Antiguo 19-11-2004
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
Hola,
¿Por qué pones tantas comillas?, no es necesario que pongas todos los campos entre comillas

Esta línea debería funcionar:
Código:
CREATE PROCEDURE GrupoArchivosBinarios (IdFileGroup INTEGER, ParentIdFileGroup INTEGER, 
GroupName CHAR(30), FileExtensions CHAR(150)  ) 
AS
DECLARE VARIABLE lvIdFileGroup INTEGER;
BEGIN
  SELECT IdFileGroup  
  FROM GrupoArchivosBinarios 
  WHERE IdFileGroup=:IdFileGroup 
  INTO :lvIdFileGroup;

  IF (lvIdFileGroup IS NULL) THEN
  BEGIN
   INSERT INTO GrupoArchivos
   (IdFileGroup, ParentIdFileGroup, GroupName, FileExtensions)
   VALUES
   (:IdFileGroup, :ParentIdFileGroup, :GroupName, :FileExtensions);

   INSERT INTO GrupoArchivosBinarios 
   (IdFileGroup)
   VALUES 
   (:IdFileGroup);

  END 
  ELSE BEGIN

  END
END
__________________
Progress Openedge
https://abevoelker.com/progress_open...dered_harmful/


Delphi forever...
Responder Con Cita
  #3  
Antiguo 19-11-2004
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Ponga las comillas porque en IBExpert saca errores por todos lados sino lo hago.

Probe ejecutando directamente el codigo en IBExpert y con Delphi y en ninguno funciona.

En Delphi dice: Token Unknow, Line 9 char 8 ?

En IBExpert:

non-SQL security class defined.
Dynamic SQL Error.
SQL error code = -84.
procedure GRUPOARCHIVOSBINARIOS does not return any values.
At line 8, column 3.

Ahora esto si que me preocupa. Que la misma consulta tenga resultados diferentes con errores diferentes me va a dificultar bastante el desarrollo. Veo que tratan los caracteres diferentes (por ejemplo, en iBExpert OBLIGATORIAMENTE toca rodear de comillas los campos, poner el Select en una linea y otros cambios.. o sea como lo pase inicialmente.)

Ahora, necesito mas bien es saber como obtener iguales errores y resultados... que debo hacer?
__________________
El malabarista.
Responder Con Cita
  #4  
Antiguo 19-11-2004
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Que Dialecto SQL estás usando en tu base de datos?
Responder Con Cita
  #5  
Antiguo 19-11-2004
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Nota que en el codigo de conexion pongo 'SQLDialect=3'
__________________
El malabarista.
Responder Con Cita
  #6  
Antiguo 19-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hola mamcx,

no es que esto vaya a ser de gran ayuda pero me extraña esto de que el IBExpert te marca errores si no usas las comillas.

Usando igualmente FireBird 1.5, Dialect 3, acabo de copiar y pegar tus códigos SQL, quitando las comillas y funciona casi bien. El "casi" significa:

La tabla, el generador y el disparador me los crea sin problemas.

El procedimiento, quitando las comillas marca el error:

Código:
non-SQL security class defined.
Dynamic SQL Error.
SQL error code = -84.
procedure GRUPOARCHIVOSBINARIOS does not return any values.
At line 5, column 52.
Si pongo comillas sólo en

Código SQL [-]
SELECT IdFileGroup  FROM "GrupoArchivosBinarios" WHERE IdFileGroup=:IdFileGroup INTO :lvIdFileGroup;

me marca el error

Código:
Undefined name.
Dynamic SQL Error.
SQL error code = -204.
Table unknown.
GrupoArchivosBinarios.
At line 5, column 54.
A mi me da la impresión de que sin las comillas, IBExpert piensa que el SELECT va a tomar datos del mismo procedimiento que estás creando pero éste no regresa resultados. Con las comillas da la impresión de que intenta buscar una tabla llamada igualmente GrupoArchivosBinarios.

Curiosamente, si creo una tabla con ese nombre, y entrecomillo únicamente el nombre del procedimiento, entonces ya no marca ningún error y crea el procedimiento.

Así pues, ¿no será esto una confusión entre el nombre de un procedimiento y el nombre de una tabla?

// Saludos
Responder Con Cita
  #7  
Antiguo 19-11-2004
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Cita:
Empezado por mamcx
Nota que en el codigo de conexion pongo 'SQLDialect=3'
Tienes razón, no me fijé bien en eso...

Sobre lo que comenta román...

El error que da:

Código:
non-SQL security class defined.
Dynamic SQL Error.
SQL error code = -84.
procedure GRUPOARCHIVOSBINARIOS does not return any values.
At line 5, column 52.
Se debe a que en la declaración del procedimiento no se está especificando que devuelva valores, y siendo así, no se puede usar en un select.

La forma correcta de ejecutar al procedimiento sería:

Código SQL [-]
execute procedure GrupoArchivosBinarios(parámetro1, parámetro2, parámetro3)

Pruebalo así y nos dices...
Responder Con Cita
  #8  
Antiguo 19-11-2004
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Pero es que aun NO esta creado el SP! Apenas estoy corriendo la creacion.... Obviamente lo del Select se entiende, de ahi que uso la clausula INTO para que me guarde el valor... Lo que intento es saber si el registro existe y si no lo creo, de lo contrario lo actualizo...

Roman, esos son los exactos errores que me saca a mi, razon de las comillas, pero no hay otra tabla. Ahora me preocupa no obtener iguales resultados... acaso hay algun parametro o configuracion que se me pasa por alto? Porque en unos no pasa nada con comillas y en el otro si?

Voy a probar cambiando el nombre del SP haber si asi...

Gracias por la ayuda...
__________________
El malabarista.
Responder Con Cita
  #9  
Antiguo 19-11-2004
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Ya vi donde está tu error... estas haciendo un query sobre una tabla que no existe... Puesto que usas el nombre del procedimiento...

Código SQL [-]
CREATE PROCEDURE GrupoArchivosBinarios ("IdFileGroup" INTEGER  ,"ParentIdFileGroup" INTEGER  ,"GroupName" CHAR(30)  ,"FileExtensions" CHAR(150)  ) 
 AS
 DECLARE VARIABLE lvIdFileGroup INTEGER;
  begin
    /* Así lo tienes */
    SELECT "IdFileGroup"  FROM "GrupoArchivosBinarios" 
    /* Me imagino que esto es lo que quieres */
    SELECT "IdFileGroup" FROM "GrupoArchivos"

   /* .... */

ya que tienes:

Código SQL [-]
CREATE TABLE "GrupoArchivos"

UPDATE: Lo que estás haciendo es tratar de llamar al mismo procedimiento de forma recursiva, es por eso el error es que el procedimiento no devuelve resultados. En otro caso te hubiera dado un error de que la tabla no existe.


Saludos...

Última edición por maeyanes fecha: 19-11-2004 a las 21:33:36.
Responder Con Cita
  #10  
Antiguo 19-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por mamcx
Voy a probar cambiando el nombre del SP haber si asi...
Es que me parece que no es cuestión del nombre del procedimiento sino que dentro de él intentas acceder a una tabla que no existe. O te referías a la tabla GrupoArchivos o no has creado la tabla GrupoArchivosBinarios. Por ello es que cuando cree una tabla con ese nombre (y misma estructura que GrupoArchivos) sí funcionó.

// Saludos
Responder Con Cita
  #11  
Antiguo 23-11-2004
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Ya resolvi el problema.. o problemas.

Primero, hay que desactivar ParamsChecks en el query. Luego, agrege "sp" a los nombres de los procedimientos para que no se confundieran con las tablas (todas estaban creadas ya). Luego la limpieza de los ".

Gracias a todos por la ayuda!
__________________
El malabarista.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 03:49:29.


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
Copyright 1996-2007 Club Delphi