Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-08-2008
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Creación de campos en tiempo de ejecución

Hola muchachos,
aqui andamos de nuevo preguntando alguna cosilla que me trae loco.

Ando preparando una aplicacioncilla, y como me estoy haciendo mayor, cada día quiero escribir menos código.

Mi intención es , en base a cierta información que extraigo de las caracteristicas de las tablas, 'montar' unas ventanas de edición automáticamente.

Utilizo Delphi 7 y Firebir 2.*

En base a unas consultas a la BBDD, sé qué campos son primary key o foreign key. Lo que hago es crear y ocultar todos esos campos y lo que quiero es crear campos lookup para la edición y consulta. En el módulo de datos, ningún dataset tendría campos persistentes, sino que los iría creando en base a esta información.

Mi problema es el siguiente:
Puedo crear campos tipo lookup en tiempo de ejecución ? y campos calculados ?. Yo no lo he conseguido.
La documentación dice que no se utilicen TFields en tiempo de ejecución.

Seguro que algún maestro tiene experiencia al respecto, o en otro caso seguro que ilumina mi camino por otro lado.

Gracias a todos por adelantado.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #2  
Antiguo 25-08-2008
Avatar de ElDioni
[ElDioni] ElDioni is offline
Miembro Premium
 
Registrado: jul 2005
Ubicación: Murcia (España)
Posts: 935
Poder: 19
ElDioni Va por buen camino
En este hilo se habló algo del tema, mira a ver si te ayuda en algo.

http://www.clubdelphi.com/foros/show...ghlight=lookup

Éste puede que también te sirva.

http://www.clubdelphi.com/foros/show...ghlight=lookup
Responder Con Cita
  #3  
Antiguo 25-08-2008
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Gracias, lo probaré. Creo que lo que hago mal es utilizar

Campo:= TField.Create();

Por lo que veo debo hacer

Campo:= TStringField.Create(); o similar.

Cuando lo pruebe os digo cómo ha quedado.

Gracias de nuevo.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #4  
Antiguo 25-08-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola, yo tengo algo similar para las dbgrid. ¿Estas seguro que necesitas los campos de manera persistente? ten en cuenta que cuando haces una consulta, se crean en ella los objetos correspondientes a los campos, por lo que seria inecesario ir creando TStringField, etc...en principio, con tansolo los nombres de los campos, tendrias de sobras.

te dejo aqui una funcion que uso para al despues de hacer un select cualquiera me adapte la dbgrid al respecto. En ella se ve el uso del datatype, etc...

Código Delphi [-]
procedure Normalitza_camps(q : TAdoQuery; db : TDBGrid); // posem tamany de camps i alineacio
var
        i : integer;
begin
        for i := 0 to q.FieldCount - 1 do
        begin
            if q.Fields[i].DataType = ftFloat then
                (q.Fields[i] as TNumericField).DisplayFormat := '###0.00';

            if q.Fields[i].DataType = ftBoolean then
                (q.Fields[i] as TBooleanField).DisplayValues := 'ü';
        end;

        for i := 0 to db.FieldCount - 1 do
        begin
            if (i mod 2) = 0 then
            db.Columns[i].Color := $00EFF7F8
            else
            db.Columns[i].Color := $00FCFEFE;

            case db.Columns[i].Field.DataType of                        // camps de texte
            ftString,ftMemo,ftFmtMemo,ftFixedChar,ftWideString :
            begin
                db.Columns[i].Title.Alignment := taLeftJustify;
                db.Columns[i].Alignment := taLeftJustify;
                db.Columns[i].Font.Name := 'ms sans serif';
            end;
            ftSmallInt,ftInteger,ftWord,ftAutoinc,ftLargeInt :          // nombres
            begin
                db.Columns[i].Title.Alignment := taCenter;
                db.Columns[i].Alignment := taCenter;
                db.Columns[i].Font.Name := 'ms sans serif';
            end;
            ftFloat,ftCurrency :                                        // floats
            begin
                db.Columns[i].Title.Alignment := taRightJustify;
                db.Columns[i].Alignment := taRightJustify;
                db.Columns[i].Font.Name := 'ms sans serif';
            end;
            ftDateTime, ftDate, ftTime :                                // datetime
            begin
                db.Columns[i].Title.Alignment := taCenter;
                db.Columns[i].Alignment := taCenter;
                db.Columns[i].Font.Name := 'ms sans serif';
            end;
            ftBoolean :                                                 // booleans
            begin
                db.Columns[i].Title.Alignment := taCenter;
                db.Columns[i].Alignment := taCenter;
                db.Columns[i].Font.Name := 'wingdings';
            end;
            end;
        end;
end;

Última edición por coso fecha: 25-08-2008 a las 17:43:45.
Responder Con Cita
  #5  
Antiguo 26-08-2008
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Gracias Coso

Tras unas pruebas he conseguido realizar lo que quería.
Necesito crear campos en el dataset porque tengo claves foráneas. Podría hacer lo que comentas, pero tendría que crear columnas calculadas, procedimientos para calcular campos, ...
Seguro que acabo haciendo un mix de Datasets y DBGrids
Ahora me queda ver cómo crear campos calculados. Imagino que tendré que crear un parser o algo similar


Esta tarde seguiré pegándole; intentaré publicar los avances con una explicación.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #6  
Antiguo 27-08-2008
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Hola de nuevo.
Tras varias pruebas ayer tarde, estoy empezando a obtener los resultados que quiero.
Os cuelgo un ejemplo ( por supuesto mejorable ) del prototipo.

PAra probar lo unico que hace falta es lo siguiente:
DElphi 7
Firebird

Se puede utilizar cualquier BBDD ya creada.
Ejecutar CreacionSQL.sql para crear la tabla Z_DEFINICION_CAMPO y el procedure Z_TABLAS
Ejecutar el procedure Z_TABLAS y localizar las foreign keys
Añadir en la tabla Z_DEFINICION_CAMPO los campos que sean FK-s. Creo que son triviales los valores que hay que poner en los campos. En el campo QUERY_SI_FK poner lo siguiente:
SELECT IDCLIENTE, NOMBRE FROM CLIENTES ORDER BY NOMBRE
en este caso campo IDCLIENTE es la sea FK de la tabla PEDIDOS, siendo la tabla clientes la que contiene los clientes, siendo IDCLIENTE la PK.
Creo que el ejemplo es bastante descriptivo.

Una vez hecho esto, abrir el proyecto, en la query MDOQUERY1 poner la select que querais ( en le ejemplo seria SELECT * FROM PEDIDOS )
Si hubiera varias FK's habría que dar de alta tantos registros en la tabla Z_DEFINICION_CAMPO como FKs hubiera.

Y nada más... a partir de aquí, lo que se quiera. Se puede combinar con la personalización de los dbgrids tal y como comenta coso. Una mezcla de ambos métodos puede dar un resultado muy grato con poco trabajo.

Ya sólo faltan los campos calculados.... en otra ocasión.

Y por supuesto, el código es mejorable.

Mejoras pendientes:
Control de errores creando campos lookup si no existiera la definición
Otros valores para los campos.
...

Saludos
Archivos Adjuntos
Tipo de Archivo: zip Aplicacion.zip (9,4 KB, 14 visitas)
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problemas con la creación de TTimer es tiempo de ejecución vejerf OOP 3 14-04-2008 16:26:14
creacion de una base de datos en tiempo de ejecucion lokodelphi SQL 3 24-04-2006 14:37:43
Creación de componentes en tiempo de ejecución jymy788 Varios 2 27-01-2005 17:22:20
Creación de tabla en tiempo de ejecución sledgehammer Conexión con bases de datos 3 16-09-2003 15:08:01
Creacion de componente en tiempo de ejecución cone220 OOP 1 16-09-2003 03:47:16


La franja horaria es GMT +2. Ahora son las 09:48:28.


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