Ir al contenido


Foto

Error al obtener datos de otra base de datos FIREBIRD


  • Por favor identifícate para responder
14 respuestas en este tema

#1 fidl117

fidl117

    Newbie

  • Miembros
  • Pip
  • 8 mensajes

Escrito 23 febrero 2015 - 04:38

Saludos a todos! soy nuevo en esta comunidad y nuevo usuario de firebird, creo les daré mucha lata, espero me puedan orientar.
Estaba tratando de obtener datos de otra BD, primero quise obtener el nombre de un articulo de acuerdo a su ID, y no hubo problema, pero despues quise obtener el id de un articulo de acuerdo al nombre y me sale el siguiente error y no doy que pueda hacer.

asi es mi procedure:



SET TERM ^ ;
ALTER PROCEDURE FCC_2 (NOMBREART varchar (100) )
RETURNS (idart INT )
AS

declare variable lcomando varchar  (500);
  BEGIN
 
lcomando = 'SELECT ARTICULOS.ARTICULO_ID FROM ARTICULOS WHERE ARTICULOS.NOMBRE =' || NOMBREART ;

FOR EXECUTE STATEMENT
lcomando

ON EXTERNAL 'C:\basesita\bd2.FDB'
AS
USER 'sysdba'
PASSWORD 'masterkey'
INTO :idart
    DO BEGIN SUSPEND;
    END
  END^
SET TERM ; ^



cuando lo ejecuto me tira el siguiente error:

Imagen Enviada

Aparte como puedo hacer para no pasar el parámetro y solo usar:

lcomando = 'SELECT ARTICULOS.ARTICULO_ID FROM ARTICULOS WHERE ARTICULOS.NOMBRE = mesa ';


me podrian ayudar,? gracias!  :cry:
  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 23 febrero 2015 - 05:05

Prueba con:




SET TERM ^ ;
ALTER PROCEDURE FCC_2 (NOMBREART VARCHAR (100) )
RETURNS (idart INT )
AS

DECLARE variable lcomando VARCHAR  (500);
  BEGIN
 
lcomando = 'SELECT ARTICULOS.ARTICULO_ID FROM ARTICULOS WHERE ARTICULOS.NOMBRE =' || ' ||NOMBREART ||';

FOR EXECUTE STATEMENT
lcomando

ON EXTERNAL 'C:\basesita\bd2.FDB'
AS
USER 'sysdba'
PASSWORD 'masterkey'
INTO :idart
    DO BEGIN SUSPEND;
    END
  END^
SET TERM ; ^


Saludos.
  • 0

#3 fidl117

fidl117

    Newbie

  • Miembros
  • Pip
  • 8 mensajes

Escrito 23 febrero 2015 - 05:37

Prueba con:




SET TERM ^ ;
ALTER PROCEDURE FCC_2 (NOMBREART VARCHAR (100) )
RETURNS (idart INT )
AS

DECLARE variable lcomando VARCHAR  (500);
  BEGIN
 
lcomando = 'SELECT ARTICULOS.ARTICULO_ID FROM ARTICULOS WHERE ARTICULOS.NOMBRE =' || ' ||NOMBREART ||';

FOR EXECUTE STATEMENT
lcomando

ON EXTERNAL 'C:\basesita\bd2.FDB'
AS
USER 'sysdba'
PASSWORD 'masterkey'
INTO :idart
    DO BEGIN SUSPEND;
    END
  END^
SET TERM ; ^


Saludos.


No amigo, vota el siguiente error:  :

---------------------------
An IBPP error occurred.
---------------------------
*** IBPP::SQLException ***
Context: Statement::Fetch
Message: isc_dsql_fetch failed.

SQL Message : -901
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements

Engine Code    : 335544926
Engine Message :
Execute statement error at isc_dsql_prepare :
335544569 : Dynamic SQL Error
335544436 : SQL error code = -104
335544634 : Token unknown - line 1, column 70
335544382 : ||
Statement : SELECT ARTICULOS.ARTICULO_ID FROM ARTICULOS WHERE ARTICULOS.NOMBRE = || :NOMBREART ||
Data source : Firebird::C:\basesita\bd2.FDB
At procedure 'FCC_2' line: 12, col: 2

---------------------------
Aceptar 
---------------------------

  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 23 febrero 2015 - 05:38

Disculpa la anterior solución da error, la forma correcta es:



SET TERM ^ ;
ALTER PROCEDURE FCC_2 (NOMBREART VARCHAR (100) )
RETURNS (idart INT )
AS

DECLARE variable lcomando VARCHAR  (500);
  BEGIN
 
lcomando = 'SELECT ARTICULOS.ARTICULO_ID FROM ARTICULOS WHERE ARTICULOS.NOMBRE = :NOM';

FOR EXECUTE STATEMENT
(lcomando) (NOM := NOMBREART)

ON EXTERNAL 'C:\basesita\bd2.FDB'
AS
USER 'sysdba'
PASSWORD 'masterkey'
INTO :idart
    DO BEGIN SUSPEND;
    END
  END^
SET TERM ; ^



Saludos.
  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 23 febrero 2015 - 05:43

Perdón, pero algo no me cuadra......

Saludos

Archivos adjuntos


  • 0

#6 fidl117

fidl117

    Newbie

  • Miembros
  • Pip
  • 8 mensajes

Escrito 23 febrero 2015 - 05:50

Perdón, pero algo no me cuadra......

Saludos


Si amigo, pero NOMBREARTICULO lo tenia declarado como Integer, asi que no es el problema  :)
  • 0

#7 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 23 febrero 2015 - 05:56

Resumiendo el SP correcto sería:


SET TERM ^ ;
ALTER PROCEDURE FCC_2 (NOMBREART VARCHAR (100) )
RETURNS (idart INT )
AS

DECLARE variable lcomando VARCHAR  (500);
  BEGIN
 
lcomando = 'SELECT ARTICULOS.ARTICULO_ID FROM ARTICULOS WHERE ARTICULOS.NOMBRE = :NOM';

FOR EXECUTE STATEMENT
(lcomando) (NOM := NOMBREART)

ON EXTERNAL 'C:\basesita\bd2.FDB'
AS
USER 'sysdba'
PASSWORD 'masterkey'
INTO :idart
    DO BEGIN SUSPEND;
    END
  END^
SET TERM ; ^


Y la forma de llamarlo es:



SELECT * FROM FCC_2('CAJA')



Saludos.
  • 0

#8 fidl117

fidl117

    Newbie

  • Miembros
  • Pip
  • 8 mensajes

Escrito 23 febrero 2015 - 05:59

Disculpa la anterior solución da error, la forma correcta es:



SET TERM ^ ;
ALTER PROCEDURE FCC_2 (NOMBREART VARCHAR (100) )
RETURNS (idart INT )
AS

DECLARE variable lcomando VARCHAR  (500);
  BEGIN
 
lcomando = 'SELECT ARTICULOS.ARTICULO_ID FROM ARTICULOS WHERE ARTICULOS.NOMBRE = :NOM';

FOR EXECUTE STATEMENT
(lcomando) (NOM := NOMBREART)

ON EXTERNAL 'C:\basesita\bd2.FDB'
AS
USER 'sysdba'
PASSWORD 'masterkey'
INTO :idart
    DO BEGIN SUSPEND;
    END
  END^
SET TERM ; ^



Saludos.


Este si me funciono amigo, muchas gracias. Pero tengo otra duda,  si lo quisiera plantear de la siguiente forma:


delphi
  1. lcomando = 'SELECT ARTICULOS.ARTICULO_ID FROM ARTICULOS WHERE ARTICULOS.NOMBRE = mesa ';



es concatenando  lo que se asigna ?, gracia!
  • 0

#9 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 23 febrero 2015 - 06:09

Este si me funciono amigo, muchas gracias. Pero tengo otra duda,  si lo quisiera plantear de la siguiente forma:

lcomando = 'SELECT ARTICULOS.ARTICULO_ID FROM ARTICULOS WHERE ARTICULOS.NOMBRE = mesa ';


es concatenando  lo que se asigna ?, gracia!


De ese modo no te funcionaría por que faltan los dos puntos que anteceden al parámetro, de la manera que te propongo (y que funciona) es manejando parámetros.
Al intentar concatenar nos da el error de la primera solución que te propuse.

Saludos.


  • 0

#10 fidl117

fidl117

    Newbie

  • Miembros
  • Pip
  • 8 mensajes

Escrito 23 febrero 2015 - 06:17


Este si me funciono amigo, muchas gracias. Pero tengo otra duda,  si lo quisiera plantear de la siguiente forma:

lcomando = 'SELECT ARTICULOS.ARTICULO_ID FROM ARTICULOS WHERE ARTICULOS.NOMBRE = mesa ';


es concatenando  lo que se asigna ?, gracia!


De ese modo no te funcionaría por que faltan los dos puntos que anteceden al parámetro, de la manera que te propongo (y que funciona) es manejando parámetros.
Al intentar concatenar nos da el error de la primera solución que te propuse.

Saludos.


Si me funciono esa forma, la segunda entonces no es posible ? Saludos!
  • 0

#11 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 23 febrero 2015 - 06:21

Ya me confundí. :D :D :D :D

Lo que funciona es lo de la respuesta #6.

Saludos.
  • 0

#12 fidl117

fidl117

    Newbie

  • Miembros
  • Pip
  • 8 mensajes

Escrito 23 febrero 2015 - 06:23

Ya me confundí. :D :D :D :D

Lo que funciona es lo de la respuesta #6.

Saludos.


Si esa funciona, y te preguntaba sino es posible realizar la otro que te comento.
  • 0

#13 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 24 febrero 2015 - 04:36

Desde el principio no te funciono porque mesa no está entre comillas, por lo que entiende que se refiere al nombre de un campo, por eso te decia que no encontraba la columna "baja" al principio y ahora la columna "mesa".

Vamos, que no puedes hacer esto:



delphi
  1. lcomando = 'SELECT ARTICULOS.ARTICULO_ID FROM ARTICULOS WHERE ARTICULOS.NOMBRE = mesa ';



Tienes dos soluciones: usar un parametro y darle valor antes de ejecutar como te han propuesto, o bien escribir el dato entre comillas.

En delphi escribir dos veces la comilla simple significa que es un caracter mas de la cadena, no el final de la misma, asi que para añadir un texto con una comilla simple has de escribir 4 comillas simples seguidas:



delphi
  1. lcomando = 'SELECT ARTICULOS.ARTICULO_ID FROM ARTICULOS WHERE ARTICULOS.NOMBRE = '+''''+mesa+'''';



En lugar de añadir las comillas a mano, que es complicado porque el texto podría contener ya comillas por dentro, usa la funcion QuotedStr() de SysUtil.pas, con lo que lo correcto hubiese sido desde el principio:



delphi
  1. lcomando = 'SELECT ARTICULOS.ARTICULO_ID FROM ARTICULOS WHERE ARTICULOS.NOMBRE = '+QuotedStr('mesa');



Resumen: Nunca uses valores de texto directamente en sentencias sql sin pasarlos antes por QuotedStr() o tendras problemas!
  • 0

#14 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 24 febrero 2015 - 10:41

Nomás que la solución no es desde Delphi sino desde un SP en Firebird  (y) así que la concatenación es con doble pipe ||, no existe el QuotedStr aunque si es importante tener mucho cuidado con las comillas, así que como bien dicen es mejor el uso de los parámetros...

Saludox ! :)
  • 0

#15 fidl117

fidl117

    Newbie

  • Miembros
  • Pip
  • 8 mensajes

Escrito 24 febrero 2015 - 02:39

Nomás que la solución no es desde Delphi sino desde un SP en Firebird  (y) así que la concatenación es con doble pipe ||, no existe el QuotedStr aunque si es importante tener mucho cuidado con las comillas, así que como bien dicen es mejor el uso de los parámetros...

Saludox ! :)


así es, uso FIREBIRD y lo que sabia es que se concatena con

delphi
  1. ||

y ya he solucionado mi duda:



delphi
  1. lcomando = 'SELECT ARTICULOS.ARTICULO_ID FROM ARTICULOS WHERE ARTICULOS.NOMBRE = '||'''vaso''';



es necesario que sepa eso pues en un futuro hara combinando esto pasando parametro y asignado esto, agradesco a todos haberme ayudado!

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.