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)
-   -   Firebird 2.0 (que hago) (https://www.clubdelphi.com/foros/showthread.php?t=44412)

Caral 06-06-2007 21:50:49

Hola
Gracias por las respuestas, efectivamente el campo boolean no lo encuentro por ningun lado:

Cuando hago el tralado de las tablas, me lo convierte en varchar, automaticamente, y lo pone T o F, segun el caso.
Pregunta:
El tipo blob, es memo?
Esta muy bonito, si el campo es numerico sale una calculadora y todo.:D
Saludos

maeyanes 06-06-2007 21:52:12

Cita:

Empezado por vtdeleon
Seguro?:eek:, porque he tratado de hacerlo y nada nadita. De la unica manera que he podido hacer un campo de este tipo es mediante un Domain.

Fue un error mio... y esto se debe a que Interbase 7.x si tiene el tipo de datos BOOLEAN.

Acabo de verificar y si, Firebird NO cuenta con el tipo de datos BOOLEAN, así que como bien comenta jachguate, se puede usar mediante CHAR(1) o SMALLINT...

O como bien mencionas tu, con un dominio:

Código SQL [-]
CREATE DOMAIN TBOOLEAN AS
  SMALLINT
  DEFAULT 1
  NOT NULL
  CHECK (VALUE IN (0, 1));


Saludos...

Delphius 06-06-2007 21:53:07

Caral, algo, no mucho, de esas cosas te puedo ir respondiendo:

1. Tengo entendido que el CHARSET es el conjunto de caracteres permitidos a usar en la base de datos. Yo lo tengo con el ISO8859_1
Dependiendo del CharSet algunos caracteres pueden que se vean y/o almacenen y otros no...

A decir verdad, me está llamando la atención esto que pones:
Cita:

Empezado por Caral
vi ponen win1252 y asi lo hice yo.

Reconozco que no se mucho de la diferencia entre unos y otros. De que los hay los hay.... Tengo que hacer mejor mi tarea:p:D:(:o

2. No tiene campo booleano, al menos yo no le encuentro:p. Hay que ingeniarselas. Por ejemplo usar un campo VARCHAR para que almacene 'SI', 'NO' o un integer (0 para no, 1 para si).

ADo no utilizo. Ni tampoco los Zeos.
Yo empleo los componentes IBX (los de la paleta Interbase) y me funcionan.
Lo que dices sobre transacción es que para conectarse a la base de datos (empleando IBX) necesitas de:
* IBDataBase
* IBTransaction

Fijate que el componente IBDataBase tiene una propiedad DefaultTransaction. A dicha propiedad le asignas el IBTransaction. En DBTransaccion defines que acciones por defecto debe tomar ante una transacción. Por lo general con TACommit ya anda. Los componentes IBX son símiles a otros, no creo que tengas problemas...

Espero que sigas avanzando.
Saludos,

EDITO:
Al pulsar el botón enviar, me he dado con la sorpresa de que ya te habían respondido... y de paso me aclararon mi duda. No me hagas caso... que ya te dieron mejores respuestas más acabadas y certeras los maestros...
¡Gracias!

Caral 06-06-2007 22:06:32

Hola
Voy rapido, creo.:D
Ya me conecte con ado, con ib y con zeos, la mas rapida es zeos .
Pregunta:
Si en un campo integer o float, la tabla queda en null, afecta en algo?
Hay alguna manera de generar una consulta sql, dentro de IBexpert ?
Si hay forma, se pueden ligar tablas en la consulta, como?
Gracias, voy como bala, con vosotros.:)
Saludos

maeyanes 06-06-2007 22:15:16

Cita:

Empezado por Caral
Hola
Pregunta:
Si en un campo integer o float, la tabla queda en null, afecta en algo?

Siempre y cuando la columna no haya sido declarada como NOT NULL, no pasa nada...

Cita:

Hay alguna manera de generar una consulta sql, dentro de IBexpert ?
Busca el SQL Editor, desde esa ventana puedes escribir consultas SQL y ejecutarlas...

Cita:

Si hay forma, se pueden ligar tablas en la consulta, como?
Gracias, voy como bala, con vosotros.:)
Saludos
Si se pueden ligar tablas en una consulta... usando el JOIN:

Código SQL [-]
select a.campo1, a.campo2, b.campo1, b.campo2
from tabla1 a
join tabla2 b on a.campo1 = b.campo1


Saludos...

Delphius 06-06-2007 22:19:33

Para Lanzar la cosulta desde IBExpert puedes hacerlo con el Editor de SQL.
Te vas a Herramientas, Editor SQL escribes la consulta y das sobre "RUN".

Sinceramente esta parte no entiendo:
Cita:

Empezado por Caral
Si hay forma, se pueden ligar tablas en la consulta, como?

Creo que te refieres a algo como:
Código SQL [-]
select ...
where Tabla1.CampoID = Tabla2.CampoID

Si es eso, no hay problema.

Desde Delphi si hay que tener recaudos con los tipos NULL cuando se dispara una consulta. He visto un post que puso el maestro Lepe en donde explicaba bien esta situación... pero no me acuerdo de donde era... Yo también ando con problemas con el NULL.

Saludos,

EDITO: Lo econtré: http://www.clubdelphi.com/foros/show...=NULL+Firebird

Caral 06-06-2007 22:45:27

Hola
Sois mas rapidos que yo.
Ya lo hice, y funciona perfecto, con ligar tablas me referia a ver varias tablas en una consulta tipica de sql, si lo hace y perfecto.
Código SQL [-]
select * from articulos, articulomaterial where descripcion = 'ALCALA'
Una consulta de dos tablas, sencilla.
Esta consulta en especial trae 11855 registros y lo hizo muy rapido.
He notado, que las consultas son mas rapidas que en mysql, curioso.:rolleyes:
Bueno aqui sigo experimentando un poco, algun dia manejo estas cosas, por supuesto con vuestra ayuda.:)
Saludos

xander 06-06-2007 22:57:17

Cita:

Empezado por Caral
Esta consulta en especial trae 11855 registros y lo hizo muy rapido.

Si un producto natural te parece rápido, espera a que le entiendas mejor a como funcionan los "Planes de ejecución" y entonces si todo lo que hagas va a ser un tiro :D

Tambien vas a sacar mucho provecho de los procedimientos almacenados, son una chulada, yo tenía una consulta que por si sola por más que traté de optimizarla se tardaba por lo menos 5 segundos en resolverse (varias tablas y muchas relaciones entre ellas)... al final me dije: "Y porque mejor en vez de usar una consulta compleja mejor no hago un procedimiento almacenado que haga lo mismo pero por partes?"... y el procedimiento me devuelve los mismos resultados en 20 milisegundos :D

Caral 06-06-2007 23:03:11

Hola Xander
Y crees que aprenda a hacer un procedimiento almacenado.?, no se ni que es.
Por donde empiezo, donde hago este procedimiento, en delphi, en firbird en ibexpert, estas ya son palabras mayores.
Me gustaria aprender, donde busco informacion?
Saludos

xander 06-06-2007 23:10:40

En el IBExpert te pones sobre el arbolito en le nodo de "Procedures" ahi das boton derecho y "New Procedure" y te crea el esqueleto para hacer un procedimiento nuevo...

Revisa los capitulos de SQL e Interbase de la cara oculta de marteens, ahi te explica con muy buenos ejemplos como usar Procedimientos almacenados y Triggers... definitivamente es el mejor libro que puedes leer al respecto.

xander 06-06-2007 23:15:08

En general un Procedimiento almacenado se ve, como algo como esto:

Código SQL [-]
CREATE PROCEDURE CERTIFICADODEUNIDAD (
    UNIDAD INTEGER,
    MES INTEGER,
    ANHO INTEGER)
RETURNS (
    INDRAIZ INTEGER,
    INDICADOR VARCHAR(200),
    RESULTADO VARCHAR(1000),
    LEYENDA VARCHAR(200),
    META VARCHAR(100),
    DIMENSION VARCHAR(200))
AS
DECLARE VARIABLE INDID INTEGER;
DECLARE VARIABLE VMES VARCHAR(15);
DECLARE VARIABLE VMUESTRA INTEGER;
DECLARE VARIABLE VTIPO INTEGER;
DECLARE VARIABLE VFILTRO VARCHAR(200);
DECLARE VARIABLE VLEYENDA VARCHAR(200);
BEGIN
   FOR SELECT IND_ID, IND_NOMBRE, DIM_NOMBRE, IND_TEXTOTITULO
    FROM EST_INIDICADOR
    LEFT JOIN EST_DIMENSION ON (IND_DIMENSION = DIM_ID)
    LEFT JOIN EST_SECUENCIA ON (SEC_INDICADOR = IND_ID)
    WHERE SEC_ANTECESOR = 0
    ORDER BY DIM_NOMBRE, SEC_ORDEN ASC
    INTO :INDRAIZ, :INDICADOR, :DIMENSION, :LEYENDA DO
    BEGIN
      /*CALCULAMOS PARA EL INDICADOR RAIZ */
      SELECT FIRST 1 MET_VALOR FROM EST_METAS
      WHERE MET_INDICADOR = :INDRAIZ
      ORDER BY MET_FECHAALTA DESC
      INTO :META;
      VFILTRO = 'AND (ENC_UNIDADMEDICA = ' || CAST( UNIDAD AS VARCHAR (10)) ||')';
      EXECUTE PROCEDURE GRAFICA(:INDICADOR, :MES, :ANHO, VFILTRO ,0, 0)
      RETURNING_VALUES :VMES, :RESULTADO, :VMUESTRA, :VTIPO;
      SUSPEND;

      FOR SELECT IND_ID, IND_NOMBRE
       FROM EST_INIDICADOR
       LEFT JOIN EST_SECUENCIA ON (SEC_INDICADOR = IND_ID)
       WHERE SEC_ANTECESOR = :INDRAIZ
       ORDER BY SEC_ORDEN ASC
       INTO :INDID, :INDICADOR DO
       BEGIN
         /*Y CALCULAMOS PARA LOS SUB-INDICADORES */
         SELECT FIRST 1 MET_VALOR FROM EST_METAS
         WHERE MET_INDICADOR = :INDID
         ORDER BY MET_FECHAALTA DESC
         INTO :META;
         VFILTRO ='AND (ENC_UNIDADMEDICA = ' || CAST( UNIDAD AS VARCHAR (10)) ||')';
         EXECUTE PROCEDURE GRAFICA(:INDICADOR, :MES, :ANHO, VFILTRO ,0, 0)
         RETURNING_VALUES :VMES, :RESULTADO, :VMUESTRA, :VTIPO;
         INDICADOR =  '             '|| :INDICADOR;
         SUSPEND;
       END
    END
END^

Es como un pequeño programa que ejecuta sentencias SQL... la ventaja es que se ejecuta dentro de la base de datos así que los datos no viajan del servidor al cliente para efectuarles el tratamiento... sino que se tratan en el servidor y se envía solo los resultados (en el caso que se tengan que devolver resultados).

Caral 06-06-2007 23:16:38

Gracias Xander, lo voy a revisar.
Saludos

Casimiro Notevi 07-06-2007 00:29:53

El enlace a 'La Cara Oculta de Delphi' no funciona porque parece que a Ian se le ha caducado el dominio y no se ha dado cuenta. Como es un libro gratuito no creo que ponga ningún impedimento si lo ponemos para descargar en clubdelphi.
Si algún moderador da permiso, lo podemos poner.

vtdeleon 07-06-2007 04:20:16

Para curarnos en salud, le he enviado un correo a Ian sobre su dominio.

Saludos

Caral 07-06-2007 21:27:22

Hola
Empiezo con el programa, y muchos problemas de sql.
Para empezar, estoy conectado con los componentes ADO por odbc.
Consulta 1:
Código SQL [-]
 QTemp.SQL.Text := 'Select CodUsuario From Usuarios WHERE Graficar = True';
Graficar es un campo boolean, por eso esta el true, la base de datos firebird lo cambia por un campo varchar y lo cambia a T.
Pregunta:
Como hago esta sentencia en delphi con ese tipo de campo (varchar).

Consulta 2:
Código SQL [-]
SELECT OrdenProd.CodOrden, Clientes.NombreCliente, OrdenProd.FechaInicio, OrdenProd.FechaRequerido, OrdenProd.FechaFinal, OrdenProd.OrdenCompra, OrdenProd.CodUsuario, OrdenProd.Prioridad,
IIf([Descripcion] Is Null,"Creación de Orden",[Descripcion]) AS Estacion, OrdenProd.CodCliente, OrdenProd.Enrutada, OrdenProd.Comentarios
FROM (Clientes RIGHT JOIN OrdenProd ON Clientes.CodCliente = OrdenProd.CodCliente) LEFT JOIN (OrdenProdItem LEFT JOIN Estaciones ON OrdenProdItem.Estacion = Estaciones.EstacionID) ON OrdenProd.CodOrden = OrdenProdItem.CodOrden
GROUP BY OrdenProd.CodOrden, Clientes.NombreCliente, OrdenProd.FechaInicio, OrdenProd.FechaRequerido, OrdenProd.FechaFinal, OrdenProd.OrdenCompra, OrdenProd.CodUsuario, OrdenProd.Prioridad,
 IIf([Descripcion] Is Null,"Creación de Orden",[Descripcion]), OrdenProd.CodCliente, OrdenProd.Enrutada, OrdenProd.Comentarios
ORDER BY OrdenProd.CodOrden DESC;
Bueno aqui se complica mas la cosa.
1-Firebird no hacepta ( [] corchetes )., se cambian a no se necesitan?
2-Firebird no acepta ( IIF Is Null ), Con que se cambian ?

Consulta 3:
Código Delphi [-]
AQItems.SQL.Text:=
       'SELECT OrdenProdItem.CodOrdenItem AS Línea, OrdenProdItem.CodParte AS Código, '+
       'Articulos.Descripcion AS Descripción, Articulos.Categoria AS Categoría, Articulos.SubCategoria AS [Sub Categoría], OrdenProdItem.NumSerie AS [# Pieza],
      IIf([EnProceso],"SI","NO") AS [En Proceso?] '+
       'FROM OrdenProdItem, Articulos, Estaciones '+
       'WHERE (((OrdenProdItem.CodOrden)=[COD]) AND ((OrdenProdItem.CodParte)=[Articulos].[CodParte]) AND ((Estaciones.Descripcion)=[EST]) AND ((OrdenProdItem.Estacion)=[Estaciones].[EstacionID])) '+
       'ORDER BY OrdenProdItem.CodOrdenItem; ';
Aqui el problema es casi el mismo:
1- Firebird no acepta ( IIF Is Null ).
2- Tanto COD como EST, son parametros que estan incluidos en parameters del query, firebird no los reconoce.
Bueno tengo mas, pero con esto ya me medio guio y tengo para un rato.
Nota: en ibexpert he hecho ya las consultas, pero o no me salen los datos del todo o me da muchos errores.
Me ayudais por favor.
Saludos

fjcg02 07-06-2007 23:52:31

Bueno, no soy un experto en Firebird pero a ver si puedo dar respuesta a tus peguntas. Seguro que algún maestro como los llamas tú me corrige, pero me arriesgo.
Cita:

Empezado por Caral
Consulta 1:
Código SQL [-]
 QTemp.SQL.Text := 'Select CodUsuario From Usuarios WHERE Graficar = True';
Graficar es un campo boolean, por eso esta el true, la base de datos firebird lo cambia por un campo varchar y lo cambia a T.
Pregunta:
Como hago esta sentencia en delphi con ese tipo de campo (varchar).

Al ser varchar, se trata igual que un campo caracter, es decir
Código SQL [-]
 QTemp.SQL.Text := 'Select CodUsuario From Usuarios WHERE Graficar =' + QuotedStr('T');
Lo unico es que por lo que conozco, para un campo de un solo caracter no es lo más aconsejable el tipo varchar, ya que varchar optimiza el tamaño que ocupa ese campo en disco. En este caso, poco va a optimizar.
Cita:

Empezado por Caral
Consulta 2:
Código SQL [-]
SELECT OrdenProd.CodOrden, Clientes.NombreCliente, OrdenProd.FechaInicio, OrdenProd.FechaRequerido, OrdenProd.FechaFinal, OrdenProd.OrdenCompra, OrdenProd.CodUsuario, OrdenProd.Prioridad,
IIf([Descripcion] Is Null,"Creación de Orden",[Descripcion]) AS Estacion, OrdenProd.CodCliente, OrdenProd.Enrutada, OrdenProd.Comentarios
FROM (Clientes RIGHT JOIN OrdenProd ON Clientes.CodCliente = OrdenProd.CodCliente) LEFT JOIN (OrdenProdItem LEFT JOIN Estaciones ON OrdenProdItem.Estacion = Estaciones.EstacionID) ON OrdenProd.CodOrden = OrdenProdItem.CodOrden
GROUP BY OrdenProd.CodOrden, Clientes.NombreCliente, OrdenProd.FechaInicio, OrdenProd.FechaRequerido, OrdenProd.FechaFinal, OrdenProd.OrdenCompra, OrdenProd.CodUsuario, OrdenProd.Prioridad,
 IIf([Descripcion] Is Null,"Creación de Orden",[Descripcion]), OrdenProd.CodCliente, OrdenProd.Enrutada, OrdenProd.Comentarios
ORDER BY OrdenProd.CodOrden DESC;
Bueno aqui se complica mas la cosa.
1-Firebird no hacepta ( [] corchetes )., se cambian a no se necesitan?
2-Firebird no acepta ( IIF Is Null ), Con que se cambian ?

Creo que efectivamente no acepta corchetes. Creo aunque no estoy seguro que puede ser el caracter " ó ' cuando hay campos con espacios en el nombre. Si no hay espacios, simplemente se quitan.
Firebir acepta iif como atajo para la estructura ( sacado del manual )
Código SQL [-]
CASE
   WHEN condicion THEN valorverdadero ELSE valor falso
END
En tu caso te quedaría 
iif(Descripcion=NULL,'Creación de Orden',Descripcion)
Cita:

Empezado por Caral
Consulta 3:
Código Delphi [-]
AQItems.SQL.Text:=
       'SELECT OrdenProdItem.CodOrdenItem AS Línea, OrdenProdItem.CodParte AS Código, '+
       'Articulos.Descripcion AS Descripción, Articulos.Categoria AS Categoría, Articulos.SubCategoria AS [Sub Categoría], OrdenProdItem.NumSerie AS [# Pieza],
      IIf([EnProceso],"SI","NO") AS [En Proceso?] '+
       'FROM OrdenProdItem, Articulos, Estaciones '+
       'WHERE (((OrdenProdItem.CodOrden)=[COD]) AND ((OrdenProdItem.CodParte)=[Articulos].[CodParte]) AND ((Estaciones.Descripcion)=[EST]) AND ((OrdenProdItem.Estacion)=[Estaciones].[EstacionID])) '+
       'ORDER BY OrdenProdItem.CodOrdenItem; ';
Aqui el problema es casi el mismo:
1- Firebird no acepta ( IIF Is Null ).
2- Tanto COD como EST, son parametros que estan incluidos en parameters del query, firebird no los reconoce.
Bueno tengo mas, pero con esto ya me medio guio y tengo para un rato.
Nota: en ibexpert he hecho ya las consultas, pero o no me salen los datos del todo o me da muchos errores.
Me ayudais por favor.
Saludos

En esta tercera, la primera está contestada anteriormente, y la segunda, imagino que tendrás que cambiar la consulta para poner parámetros, que por lo que te he leido, hasta contestas como un maestro al respecto ;)

Espero que te sirva de ayuda el rollo patatero que te he metido.

Saludos

Caral 08-06-2007 01:36:04

Hola
La primera ya la solucione:
Código Delphi [-]
QTemp.SQL.Text := 'Select CodUsuario From Usuarios WHERE Graficar = ''T''';
Me costo pero lo hice, despues de mil intentos.:D
A la segunda no le llego, lo estoy intentando directamente desde IBExpert, y no lo consigo, esta parte es la que importa:
Código SQL [-]
IIf([Descripcion] Is Null,"Creación de Orden",[Descripcion]) AS Estacion
Lo he intentado asi:
Código SQL [-]
 if (Estaciones.descripcion = ' ') then 'Creación de Orden'
Y asi:
Código SQL [-]
Case when Estaciones.descripcion = ' ' then 'Creación de Orden'
No me caminan, con esto ' ' , estoy pensando en un valor nulo, no se si me equivoco.
Saludos

xander 08-06-2007 03:02:37

Cita:

Empezado por Caral
A la segunda no le llego, lo estoy intentando directamente desde IBExpert, y no lo consigo, esta parte es la que importa:
Código SQL [-]
IIf([Descripcion] Is Null,"Creación de Orden",[Descripcion]) AS Estacion
Lo he intentado asi:
Código SQL [-]
 if (Estaciones.descripcion = ' ') then 'Creación de Orden'
Y asi:
Código SQL [-]
Case when Estaciones.descripcion = ' ' then 'Creación de Orden'
No me caminan, con esto ' ' , estoy pensando en un valor nulo, no se si me equivoco.
Saludos

Sería algo como esto en tu caso:
Código SQL [-]
  Case when (Estaciones.descripcion is null) 
    then 'Creación de Orden'
    ELSE Estaciones.descripcion 
  END

aunque tambien lo resolverías elegantemente usando:
Código SQL [-]
  COALESCE(Estaciones.descripcion, 'Creación de Orden')

Coalesce devuelve el primer valor no nulo de la lista de parámetros que le pases... ;)

brakaman 08-06-2007 22:51:44

Pues yo estoy usando Firebird 2.0 y el campo booleano no lo veo por ningun sitio. Cosa que no entiendo la verdad.

Pero los expertos supongo que sabran el motivo.:cool:

maeyanes 08-06-2007 23:15:08

Ya aclaré más arriba que fue un error mío el pensar que existía el tipo de datos BOOLEAN en Firebird 2.0...

Aquí te lo pongo de nuevo...

Cita:

Empezado por maeyanes
Fue un error mio... y esto se debe a que Interbase 7.x si tiene el tipo de datos BOOLEAN.

Acabo de verificar y si, Firebird NO cuenta con el tipo de datos BOOLEAN


Saludos...


La franja horaria es GMT +2. Ahora son las 21:12:50.

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