Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-07-2015
Gregorio Cíber Gregorio Cíber is offline
Miembro
 
Registrado: jun 2008
Posts: 99
Poder: 19
Gregorio Cíber Va por buen camino
Esto:
LEFT JOIN Bancos H ON SUBSTRING(A.Iban FROM 5 FOR 4) = H.Codigo AND A.IdCuenta = 'A'

¿No debería ir así?
LEFT JOIN Bancos H ON (SUBSTRING(A.Iban FROM 5 FOR 4) = H.Codigo) AND (A.IdCuenta = 'A')
Responder Con Cita
  #2  
Antiguo 14-07-2015
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.691
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Código SQL [-]
SELECT SUBSTRING(field FROM 5 FOR 15) AS x FROM table;
Responder Con Cita
  #3  
Antiguo 14-07-2015
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 23
RONPABLO Va por buen camino
Hay que tener en cuenta que existe unas UDF que implementan el substring y lo usan de una forma diferente, así que es bueno ver que en los códigos del UDF no se encuentre creado substring, también sría bueno saber que versión de Firebird usa? H.Codigo es un string o un int?
Por último y aunque no creo que afecte mucho podrías cambiar el orden a lo siguiente:

Código SQL [-]
LEFT JOIN Bancos H ON H.Codigo = SUBSTRING(A.Iban FROM 5 FOR 4) AND A.IdCuenta = 'A'
LEFT JOIN Bancos I ON I.Codigo = SUBSTRING(A.Iban FROM 1 FOR 4) AND A.IdCuenta = 'B'
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #4  
Antiguo 15-07-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Gracias por las respuestas.
Cita:
Empezado por Gregorio Cíber Ver Mensaje
¿No debería ir así?
LEFT JOIN Bancos H ON (SUBSTRING(A.Iban FROM 5 FOR 4) = H.Codigo) AND (A.IdCuenta = 'A')
El resultado, en cualquier caso, sería el mismo.
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Código SQL [-]SELECT SUBSTRING(field FROM 5 FOR 15) AS x FROM table;
Esto no le he probado, pero no creo que cambie el resultado; curiosamente donde indica el error (line 6, char 43) es donde está la n de Iban.
Cita:
Empezado por RONPABLO Ver Mensaje
Hay que tener en cuenta que existe unas UDF que implementan el substring y lo usan de una forma diferente, así que es bueno ver que en los códigos del UDF no se encuentre creado substring, también sría bueno saber que versión de Firebird usa? H.Codigo es un string o un int?
La versión de FB es la 2.5 y... ¡GRACIAS! Acabo de darme cuenta al leer tu mensaje que he cambiado la estructura de la tabla y el código ahora es numérico y antes era varchar.
Responder Con Cita
  #5  
Antiguo 17-07-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
¡Mi gozo en un pozo!

Al margen de que, efectivamente, había renombrado alguna columna y se me había olvidado el problema no era esa. Sigue dándome el mismo error; por si acaso he actualizado a la versión 2.5.4 de Firebird.

Voy más allá: Estoy probando este otro código:
Código SQL [-]
SELECT * FROM Bancos WHERE SUBSTRING(Bic FROM 5 FOR 2) NOT IN (SELECT Codigo FROM Paises)

Las tablas son estas:
Cita:
Bancos
CREATE TABLE BANCOS (
ENTIDAD VARCHAR(5) CHARACTER SET NONE NOT NULL,
NOMBRE VARCHAR(66) CHARACTER SET NONE,
BIC VARCHAR(12) CHARACTER SET NONE);
Cita:
Países
CREATE TABLE PAISES (
CODIGO VARCHAR(3) CHARACTER SET NONE NOT NULL,
NOMBRE VARCHAR(51)CHARACTER SET NONE);
En el código BIC las posiciones 5 y 6 del mismo identifican el país y se referencian a la tabla ISO 3166-1 alpha-2 (por ejemplo en Códigos oficialmente asignados).

Hasta donde veo el código es correcto; de hecho en una BB.DD. Paradox funciona sin ningún problema. Sin embargo usando tanto IBManager como IBExpert me da el mismo error:
Cita:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 2, char 19.
FROM.
Ya no sé por donde pillarlo y me tiene bloqueada la adaptación de una aplicación desde Paradox a Firebird.
Responder Con Cita
  #6  
Antiguo 17-07-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Si hace falta y alguien me puede ayudar le mando las tablas implicadas.
Responder Con Cita
  #7  
Antiguo 17-07-2015
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.691
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Es que por lo visto tiene que ser "select substring" no en un "where".
Puedes crearte un Stored Procedure, algo asi como:

Código SQL [-]
for select substring(bic from 5 to 2) from bancos into :valor do
  select codigo from tbpaises where codigo= :valor
  suspend;
end
Responder Con Cita
  #8  
Antiguo 17-07-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Angel.Matilla.

Algo mas debe haber en juego. Reproduje la situación como la planteaste, ejecutando la misma consulta y no me dá ningún error.

Ambiente:
Código:
Windows 7 32 bit.
Firebird 2.5.0
IBExpert 2015.6.17.1

Tabla PAISES:
Código:
CODIGO	NOMBRE
----------------
156	CHINA
840	E.E.U.U.
124	CANADA
Tabla BANCOS:
Código:
ENTIDAD	NOMBRE	                BIC
--------------------------------------------
00001	ICBC	                000015600000
00002	Wells Fargo & Co	000084000000
00003	Bank of Nova Scotia	000012400000
Consulta:
Código SQL [-]
SELECT *
FROM BANCOS
WHERE SUBSTRING(BIC FROM 5 FOR 2) NOT IN (SELECT CODIGO FROM PAISES)

Resultado:
Código:
ENTIDAD	NOMBRE	                BIC
--------------------------------------------
00001	ICBC	                000015600000
00002	Wells Fargo & Co	000084000000
00003	Bank of Nova Scotia	000012400000
(Como dato a tomar en cuenta, los países son representados por tres dígitos)

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 17-07-2015
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 23
RONPABLO Va por buen camino
A mi también me corre bien el query así tal cual está, con esos tipos de datos (osea BIC varchar(12) y CODIGO varchar(3),

por otro lado el query no es optimo y con muchos registros en ambas tamblas podría tomar mucho tiempo, lo puedes cambiar a algo similar a esto:

Código Delphi [-]
SELECT b.* FROM Bancos b WHERE exists (SELECT p.Codigo FROM Paises p where p.codigo = SUBSTRING(b.Bic FROM 5 FOR 2))
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #10  
Antiguo 18-07-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Gracias a todos por las respuestas.
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Es que por lo visto tiene que ser "select substring" no en un "where".
Pues yo lo tengo usado tal como lo he puesto con tablas Paradox y en otras aplicaciones con FB. Además, el error que da es que la palabra FROM es desconocida. Si en lugar de se código pongo, por ejemplo, este:
Código SQL [-]SELECT SUBSTRING(Bic FROM 5 FOR 2) FROM Bancos

me da el mismo error
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Puedes crearte un Stored Procedure, algo asi como:

Código SQL [-]for select substring(bic from 5 to 2) from bancos into :valor do select codigo from tbpaises where codigo= :valor suspend; end
¿Y como hago para meter esto en un CREATE VIEW o en un UPDATE de una tabla?
Cita:
Empezado por ecfisa Ver Mensaje
Hola Angel.Matilla.

Algo mas debe haber en juego. Reproduje la situación como la planteaste, ejecutando la misma consulta y no me dá ningún error.
Sí, pero no soy capaz de verlo.
Cita:
Empezado por ecfisa Ver Mensaje
Tabla PAISES:
Código:
CODIGO    NOMBRE
----------------
156    CHINA
840    E.E.U.U.
124    CANADA
Tabla BANCOS:
Código:
ENTIDAD    NOMBRE                    BIC
--------------------------------------------
00001    ICBC                    000015600000
00002    Wells Fargo & Co    000084000000
00003    Bank of Nova Scotia    000012400000
Consulta:
Código SQL [-]SELECT * FROM BANCOS WHERE SUBSTRING(BIC FROM 5 FOR 2) NOT IN (SELECT CODIGO FROM PAISES)


Resultado:
Código:
ENTIDAD    NOMBRE                    BIC
--------------------------------------------
00001    ICBC                    000015600000
00002    Wells Fargo & Co    000084000000
00003    Bank of Nova Scotia    000012400000
Pues algo no hace bien tu prueba. Fíjate que busco los que no estén en la tabla. Con la prueba que has hecho no tendría que salir ninguna fila del select.
Cita:
Empezado por RONPABLO Ver Mensaje
por otro lado el query no es optimo y con muchos registros en ambas tamblas podría tomar mucho tiempo, lo puedes cambiar a algo similar a esto:
Código:
SELECT b.* FROM Bancos b WHERE exists (SELECT p.Codigo FROM Paises p where p.codigo = SUBSTRING(b.Bic FROM 5 FOR 2))
Me da el mismo error: TOKEN UNKNOW FROM.

Última edición por Angel.Matilla fecha: 18-07-2015 a las 11:49:54.
Responder Con Cita
  #11  
Antiguo 18-07-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
A lo mejor digo una tontería: ¿Puede tener algo que ver con la definición de la base de datos? Es que no se me ocurre otra cosa. La definición, que se hace por código, es esta:
Código:
IBDatabase1->Params->Clear();
IBDatabase1->DatabaseName = "Afiliados.gdb";
IBDatabase1->Params->Add("USER 'sysdba'");
IBDatabase1->Params->Add("PASSWORD 'masterkey'");
IBDatabase1->Params->Add("PAGE_SIZE 4096");
IBDatabase1->SQLDialect = 3;
IBDatabase1->CreateDatabase();
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Replace con substring en Firebird nuxbaster Firebird e Interbase 3 18-01-2015 18:56:49
select * en firebird Carlos Lesca Firebird e Interbase 1 22-02-2011 21:45:40
Select de Dos BD´s distintas en Firebird 2.1 angelholberg Conexión con bases de datos 2 18-02-2009 19:55:10
Problema con select first en Firebird egostar Firebird e Interbase 20 17-07-2007 21:55:11
error Select firebird 1.5 ale21alito Firebird e Interbase 2 25-04-2005 20:20:03


La franja horaria es GMT +2. Ahora son las 07:41:49.


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