PDA

Ver la Versión Completa : Cargar un DBGrid a mano


Lord Delfos
01-08-2008, 16:32:44
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 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...


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
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í (http://www.clubdelphi.com/foros/showthread.php?t=39187).

// Saludos

Neftali [Germán.Estévez]
02-08-2008, 20:22:40
Creo que esto (http://www.connectionstrings.com/?carrier=textfile) 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
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.