Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Cargar un DBGrid a mano (https://www.clubdelphi.com/foros/showthread.php?t=58808)

Lord Delfos 01-08-2008 16:32:44

Cargar un DBGrid a mano
 
Buenas, gente. A ver si alguien sabe si se puede hacer esto.

Tengo una DBGrid, pero la tengo que cargar desde un archivo de texto, no desde una consulta... (no me pregunten por qué :mad:)

A las StringGrid las llenaba a mano con toda naturalidad, pero ahora con las DB... no hay manera de entrarle a las celdas.

Gracias por el tiempo.

HombreGordo 01-08-2008 16:41:00

Quizás pueda ser que...
 
Quizás cabe la posibilidad de que el modo edición del DataSet está deshabilitado. Entonces cuando enlazas el DBGrid con el DataSet, no te permite editarlo por el simple hecho de que no está activo.

No estoy muy seguro, pero es mi experiencia. Cuando quería editar directamente con el DBGrid, simplemente ya estaba conectado con la tabla, y activa, por lo tanto, podía editar las entradas por ahí.

luisgutierrezb 01-08-2008 16:45:38

bueno, tal vez lo mejor sea llenar el dbgrid ligado con un ClientDataset el cual llenes "a mano" con los datos del archivo de texto, el clientdataset puedes guardarlo en formato XML (Texto) a lo mejor asi tambien te sirve y el codigo seria mucho menos...

enecumene 01-08-2008 16:46:39

Hola, ¿estás trabajando con algún Dataset como lo es el jvCsvDataSet de las JEDI que sólo maneja archivos de texto?

Saludos.

coso 01-08-2008 16:49:30

hola,
puedes crear una consulta, cargar en ella mediante 'bulk insert' los datos, asociarlo a un datasource y este al dbgrid.

PD: parece ser que ya se ha tratado el tema, lo digo por los mensajes que aparecen abajo.

Lord Delfos 01-08-2008 16:52:18

Gracias por contestar, gente.

No estoy usando ningún componente de terceros.

La idea de usar un ClientDataset tampoco me sirve porque los únicos controles que tengo "permitido" (entiéndase: el cliente no tiene otra cosa que hacer que exigirme a mí, porque él me paga) son grids datasource y database. Ahí está el asunto... Encima la ventana es una plantilla, viene con lo que tiene y punto.

Lo del bulk tiene su gracia, lo admito, quizás me decante por esa solución.

coso 01-08-2008 16:55:23

Tambien si puedes usar querys, existe el loadfromfile, aunque el texto tendria que estar en XML.

Neftali [Germán.Estévez] 01-08-2008 17:28:21

Deberías especificar qué estructura tiene el archivo de texto. Tal vez puedas configurar la fuente de datos para acceder al TXT. Otra opción es "preprocesar" el archivo de texto para que el DBGrid lo entienda.

Lord Delfos 01-08-2008 19:02:07

Pues el archivo de texto viene en seis formatos diferentes, pero todos son más o menos de la misma:

202548777102120545041 ESTO 1546564LOOTRO
202548777102120545041 ESTO 1546564LOOTRO
202548777102120545041 ESTO 1546564LOOTRO

Diez mil líneas de eso. Yo tengo que separar cada dato que sé que tienen, digamos un varchar(20), int, un varchar(8), 3 espacios, bla bla.

Todo un tema realmente. Con stringgrid sería tan fácil...

PD: ¿LoadFromFile? ¿Está en todas las versiones? Porque en Delphi 5 parece que no.

coso 01-08-2008 19:34:18

TAdoQuery.loadfromfile, pero solo carga XML. Tuve algo parecido...te lo muestro, y tu lo adaptas a tus necesidades...

Código Delphi [-]
procedure T_lectura.Interpretar_Families;
var
        buffer  : string;
        buf_tmp : PChar;
        codi_fam : integer;
        codi_gam,
        desc_fam : string;
        error_fam : boolean;
        k : cardinal;
        i : cardinal;
        tim : T_Timer;
begin
       _errors.Memo1.Clear;
       _errors.Memo1.Lines.Add('Inici d´interpretació de families.');
       _errors.Memo1.Lines.Add('_________________________________');

       error_fam := false;
// MemoFitxer.LoadFromFile(nombre_archivo);
       k := MemoFitxer.Lines.Count-1; // Nova linia amb EOF


       tim := T_Timer.Create(self);
       tim.Inicia(k,'Interpretació de families.');
       _lfam.Desactivar;

       // Obrim i borrem tota tFAM.

       dm.qFAM.Active := false;
       dm.qFAM.SQL.Text := 'delete from FAMILIES where id < 10000';
       dm.qFAM.ExecSQL;
       dm.qFAM.SQL.Text := 'select * from FAMILIES order by id asc';
       dm.qFAM.Active := true;;

       // Preparem variables.

       getmem(buf_tmp,115);

       i := 0;
       buf_tmp^ := chr(0);

       // Inici lectura del richedit

       codi_fam := -1;

       while (i < k) do
       begin
                Application.ProcessMessages;
                if tim.Abortat then break;

                buffer := MemoFitxer.Lines[0];

                Label4.Caption := inttostr(i);
                Update;
                MemoFitxer.Lines.Delete(0);

                // Carreguem les variables.

                strLcopy(buf_tmp,PChar(buffer),4);
                try
                codi_fam := strtoint(buf_tmp);
                except
                error_fam := true;
                _errors.Memo1.Lines.Add('línia ' + inttostr(i) + ': ' + 'No s''ha pogut interpretar ' + buf_tmp);
                continue;
                end;

                strLcopy(buf_tmp,PChar(buffer) + 4,35);
                desc_fam := buf_tmp;

                strLcopy(buf_tmp,PChar(buffer) + 39,2);
                codi_gam := buf_tmp;

                inc(i);
                tim.Seguent; // Augmentem curr_elem del timer.

                // insertem el nou registre.

                try
                dm.qFAM.Append;
                dm.qFAM.Fieldvalues['id'] := codi_fam;
                dm.qFAM.Fieldvalues['DESCR'] := _trim(desc_fam);
                dm.qFAM.Fieldvalues['id_linia'] := codi_gam;
                dm.qFAM.Post;
                except
                error_fam := true;
                _errors.Memo1.Lines.Add('línia ' + inttostr(i) +': ' +  'Error insertant ' + desc_fam + ' amb codi ' + inttostr(codi_fam));
                end;
       end;

       // Finalitzem finestra del timer.

       tim.Finalitza;

       // En el cas de cancelació.

       if tim.abortat then
       begin
         MessageDLG('Interpretació abortada',mtError,[mbOk],0);
         _errors.Memo1.Lines.Add('Interpretació abortada');
       end;
       tim.Destroy;

       // Tractament dels errors.

       if error_fam then
       begin
        MessageDLG('Hi han hagut errors d''interpretació.',mtInformation,[mbOk],0);
        _errors.Show;
       end;

       WindowState := wsNormal;

       _lfam.Activar;

       freemem(buf_tmp);
       Activada := false;
       close;
end;


aunque ponga memofitxer, es un richedit. Es curioso, pero me funcionaba mucho mas rapido que con un memo o un tstringlist.

David 01-08-2008 19:44:26

coso, por que algunas variables empiezan por _ ??

saludos

coso 01-08-2008 19:47:06

todas mis forms empiezan con _, asi en el inspector de tareas siempre aparecen las primeras, aparte que luego es mas entendible a la hora de leer el codigo. trucos del almendruco :D

roman 01-08-2008 20:02:07

Cita:

Empezado por Lord Delfos (Mensaje 305050)
Pues el archivo de texto viene en seis formatos diferentes, pero todos son más o menos de la misma:

202548777102120545041 ESTO 1546564LOOTRO
202548777102120545041 ESTO 1546564LOOTRO
202548777102120545041 ESTO 1546564LOOTRO

Diez mil líneas de eso. Yo tengo que separar cada dato que sé que tienen, digamos un varchar(20), int, un varchar(8), 3 espacios, bla bla.

Si la anchura de cada dato es fija o si hay un separador de campos, puedes usar ADO con el driver de texto para leer el archivo como si fuese una tabla de una base. Lo único que requieres es un archivo schema.ini que defina la longitud de cada campo o el separador. De eso hemos hablado aquí.

// Saludos

Neftali [Germán.Estévez] 02-08-2008 20:22:40

Creo que esto te puede servir. Sobre todo la parte del final del fichero SCHEMA.INI, donde puedes definir el ancho y tipo de cada uno de los campos.

Neftali [Germán.Estévez] 02-08-2008 20:34:39

1 Archivos Adjunto(s)
Acabo de comprobar que sí se puede. A esto me refería.

Lord Delfos 04-08-2008 13:27:05

¡Ajá! Eso de ADO parece interesantudo. Habrá que ojearlo, pues.

Gracias mil.


La franja horaria es GMT +2. Ahora son las 14:00:54.

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