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)
-   -   ¿ Alias obligatorios en Select ? (https://www.clubdelphi.com/foros/showthread.php?t=94183)

rretamar 20-09-2019 01:44:51

¿ Alias obligatorios en Select ?
 
Hola. Posteo una consulta bastante simple, hace poco que estoy trabajando con Firebird 3 y me encuentro con lo siguiente, al hacer un consulta simple a una base de datos:

Si utilizo esta sentencia de pruebas, obtengo el error de "columna desconocida" (unknown column) tanto desde Lazarus como desde Flamerobin o incluso IBExpert:

Select * From ENVIADOS
Where turno_id > 100
Order by turno_id


Para que funcione, tengo que escribirla así:

Select * From ENVIADOS
Where enviados."turno_id" > 100
Order by enviados."turno_id"


O sea que me está obligando a colocar de forma obligatoria el nombre de la tabla ENVIADOS en los nombres de campo. Recuerdo que antes no era necesario, sólo usaba eso cuando tenía un SELECT que se aplicaba a más de una tabla...¿ es alguna particularidad de Firebird 3 ? ¿ Se puede configurar para evitar eso ?. Es una consulta sobre una simple tabla. Tengo componentes como la fantástica grilla RxDbGrid que si activo el orden al hacer clic en el títulos de una columna muestra el mismo error "unknown column", como que usa el nombre de campo directamente sin colocarle el nombre de la tabla antes. Me estoy perdiendo de algo.

:confused:

Casimiro Notevi 20-09-2019 09:54:02

Así, sin verlo, diría que has creado la base de datos con los nombres de campos entrecomillados, algo así:
Código SQL [-]
create table tbEnviados (
  "Id" integer not null,
  "Nombre" varchar(64),
  etc.
);
Si has hecho eso, entonces tendrás que referirte a los campos exactamente de cómo lo has escrito: "Id", "Nombre", etc.
Yo siempre lo creo así:
Código SQL [-]
create table tbEnviados (
  id integer not null,
  nombre varchar(64),
  etc.
);

rretamar 20-09-2019 15:03:35

Gracias por responder Casimiro. Efectivamente, al revisar la sentencia SQL de definición (DDL), veo que los nombres de campò están entrecomillados :eek: .Desconozco cómo ocurrió esto, desde la lista de campos en las tablas usando IBExpert o Flamerobin los veía sin comillas, lo mismo dentro de Lazarus. Ya volví a crear la tabla sin las comillas, aprovechando las definicioes del DDL (es una base de datos de prueba, sin contenido más que uno o dos registros de prueba por tabla).

Sigo sin entender en que momento se crearon los campos de TODAS las tablas con comillas. :eek:

Saludos cordiales y gracias.

rretamar 20-09-2019 15:38:12

A propósito, por si alguien no lo conoce, aquí hay un excelente blog dedicado a FIREBIRD con mucho material, todo en español.

https://firebird21.wordpress.com/

ecfisa 20-09-2019 16:53:22

Cita:

Empezado por Casimiro Notevi (Mensaje 533534)
Así, sin verlo, diría que has creado la base de datos con los nombres de campos entrecomillados, algo así:
...
Si has hecho eso, entonces tendrás que referirte a los campos exactamente de cómo lo has escrito: "Id", "Nombre", etc.
...

Nunca usé comillas en los nombres de campo pero agendo la lección ^\||/

Saludos amigo :)

carnace 21-09-2019 17:05:06

Gracias Casimiro por la aclaración. Sabía que tenía algo mal en mi Base de Datos, pero no le había prestado atención a las comillas. Resulta que por ahorrar tiempo convertí un archivo de access a firebird 3 con un programa llamado "DbConvert for MS Access & Firebird" y en las tablas que pasé todas aparecieron con comillas dobles. Las tablas que ya tenía creadas en Firebird desde cero no tienen comillas, pero en el IBExpert se manejaban bien tanto con comillas como sin ellas.
Código Delphi [-]
          if BotonSeleccionado=mrOk then //Si presiono OK actualizar descripción en BD
          begin
            SQLQuery1.SQL.Clear;
            SQLQuery1.SQL.Add('   UPDATE "TCodEPS"');
            SQLQuery1.SQL.Add('   SET "Nom_eps" = '+QuotedStr(s2));
            SQLQuery1.SQL.Add('WHERE "Cod_EPS" = '+QuotedStr(s));
            SQLQuery1.ExecSQL(False);
          end;
{y en otro lado tengo esto: }
  with SQLQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG=0;');
    ExecSQL(True);
    Open;
  end;
{ Me pareció extraño que tuviera que usar comillas para que funcionara el código }

Casimiro Notevi 21-09-2019 18:07:52

Claro, es que para "curarse en salud" esos programas los pasan entrecomillados porque con access puedes crear campos incluso con espacios, ejemplo: "Codigo Cliente", y es por lo que lo pasan todo con comillas y se acabó. Así que luego hay que estar recordando los nombres exactos de cómo se crearon y poniendo las comillas.


La franja horaria es GMT +2. Ahora son las 00:02:46.

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