Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Creación de campos en tiempo de ejecución (https://www.clubdelphi.com/foros/showthread.php?t=59378)

fjcg02 25-08-2008 09:36:24

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

ElDioni 25-08-2008 12:16:24

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

fjcg02 25-08-2008 13:22:46

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

coso 25-08-2008 17:40:11

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;

fjcg02 26-08-2008 07:28:57

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

fjcg02 27-08-2008 08:05:35

1 Archivos Adjunto(s)
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


La franja horaria es GMT +2. Ahora son las 14:56:38.

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