Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Base TXT de Datos (https://www.clubdelphi.com/foros/showthread.php?t=39187)

Deiv 12-01-2007 16:14:57

Base TXT de Datos
 
¿Cómo encarar la siguiente mínima Base de Datos de Alumnos, datos recuperados de un archivo TXT?

Quiero evitarme dependencias de Base de Datos, SQL, etc, ya que el objetivo es recuperar y mostrar solamente Datos y notas de Alumnos desde un archivo TXT, pues los mismos no rebasan de una cantidad de 100 elementos, y estos Datos no serán modificados, ni renombrados, ni agregados, ni nada por el estilo, SON FIJOS de una Gestión pasada.
La idea es la siguiente:

ID...Apellido.....Nombre....Curso....Nota1.....Nota2....Nota3
01....Álvarez........David........1ro........43...........55........90
02....Oropeza.......Jorge........4to........67...........36........80
03....Camacho......Pedro........2do.......33...........75........20
04....Álvarez........Andrés.......1ro.......58...........65........40
05....Miranda........María........3ro........80...........22........30
06....Pérez...........Henry........4to.......77...........59........90
07....Campero......Joanna.......2do.......34...........96........50
08....Ruiz.............Lucy.........1ro........43...........60........70
........
100.....etc., etc.

Pensaba, recuperarlo en Delphi con:
Código Delphi [-]
for i:=1 to 100 do
begin
  ReadLn(File, Cadena);
  Alumno[i].ID:= Cadena;
  ReadLn(File, Cadena);
  Alumno[i].Apellido:= Cadena;
  ReadLn(File, Cadena);
  Alumno[i].Nombre:= Cadena;
  ReadLn(File, Cadena);
  Alumno[i].Curso:= Cadena;
  ReadLn(File, Cadena);
  Alumno[i].Nota1:= StrToInt(Cadena);
  ReadLn(File, Cadena);
  Alumno[i].Nota2:= StrToInt(Cadena);
  ReadLn(File, Cadena);
  Alumno[i].Nota3:= StrToInt(Cadena);
end;
//Luego no sé, quizá mostrarlo con un WRITELN
No sé si estoy encarando bien esta parte o existe otro mejor camino, pues para 100 datos no vale la pena como dije depender de una Base de Datos. ¿Que opinan al respecto?

Mis preguntas:
1-
¿Cómo mostrar en un TListBox un FILTRO de "Curso", donde solo me muestren los "ID"?, es decir por ejemplo para mostrar los ID de "1ro", el resultado en el TLIstBox debería ser:
01
04
08

2- Que si selecciono por ejemplo en el TListBox "01" en 3 TEdits que tengo en el Form me muestre de "01" sus valores= Nota1 (TEdit1), Nota2 (TEdit2), Nota3 (TEdit3)

3- Y lo más complicado (me parece) mostrar los "ID" en el TListBox con el FILTRO de "Curso" pero que obedezcan a una ORDENACIÓN de "Nombre". El resultado debería ser:
04
01
08

Disculpen si es demasiado sencillo la pregunta, o tal vez me digan mejor si es con SQL (no me concozco bien) pero me estoy haciendo un bollo con los algoritmos y funciones. Agradeceré vuestra ayuda.
Un Saludo

Neftali [Germán.Estévez] 12-01-2007 17:24:30

Te recomiendo que utilices ADO para acceder al fichero de texto; Utilizandolo puedes trabajar con ficheros de texto con Columnas de ancho fijo y columnas delimitadas.
Para mí la ventaja de hacerlo así es que accederás al fichero como si fuera una Base de Datos; Eso te facilitará algunas operaciones e incluso podrás utilizar componentes de B.D.

Para Columnas de Ancho fijo puedes utilizar esta ConectionString:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\txtFilesFolder\;Extended Properties="text;HDR=Yes;FMT=Fixed";

Para las delimitadas esta:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\txtFilesFolder\;Extended Properties="text;HDR=Yes;FMT=Delimited";

Deiv 14-01-2007 18:21:19

He intentado con la sugerencia del ADO, y no puedo recuperar mi Tabla TXT, no estoy bueno con componentes de Base de Datos espero comprendan; he colocado 2 componentes en mi formulario TADOConnection y TADOTable; en la propiedad ConnectionString del TADOConnection he puesto como se dijo (cambiando obviamente: c:\txtFilesFolder\) y en TADOTable en la propiedad Connection selecciono ADOConnection1, en la propiedad TableName me aparecen varios archivos de la elijo MiTabla#TXT (eso de # no sé si está bien), le doy doble click a TADOTable y la tabla está vacía. He tomado como ejemplo el siguiente TXT:

Producto,Cantidad,Precio
Sierra eléctrica,1,250
Machete,5,2.70
Detergente,1,10
Delantal,2,7.25
Afilador,3,5

¿Que estoy haciendo mal para recuperar la tabla? ¿Que me falta?
Cita:

Empezado por Neftali
Para mí la ventaja de hacerlo así es que accederás al fichero como si fuera una Base de Datos; Eso te facilitará algunas operaciones e incluso podrás utilizar componentes de B.D.

¡Que bueno!, ¿a cuales componentes? y ¿como engancho a un ARRAY? Un ejemplo...

roman 14-01-2007 21:15:06

Acabo de hacer la prueba con el ejemplo que pones, usando la segunda cadena de conexión que puso Neftali, y me ha funcionado bien. ¿Has activado la tabla luego de escoger el txt?

// Saludos

marcoszorrilla 14-01-2007 22:51:14

Pues yo, una vez de utilizar componentes de base de datos, los datos los metería en una tabla, así estarían mas protegidos y cualquier acción de filtro, ordenado etc. sería mucho más fácil.

Un Saludo.

Neftali [Germán.Estévez] 15-01-2007 13:23:38

1 Archivos Adjunto(s)
Un ejemplo de cómo configurarlo.
Puedes abrir el fichero, e incluso ordenar.

NOTA: He cambiado las "comas" por "puntos y comas"

Neftali [Germán.Estévez] 15-01-2007 13:25:33

Cita:

Empezado por marcoszorrilla
Pues yo, una vez de utilizar componentes de base de datos, los datos los metería en una tabla, así estarían mas protegidos y cualquier acción de filtro, ordenado etc. sería mucho más fácil.

Estoy de acuerdo contigo.
Me basé en la premisa de hacerlo sobre un TXT, pero si hay posibilidad, yo pasaría los datos a una tabla de DBase (por ejemplo) que se puede acceder igualmente utilizando ADO sin necesidad de BDE, simplemente cambiando la conexión.

En ese caso la dependencia es mínima (sólo las MDAC), pero eso pasa también con el TXT.

Deiv 15-01-2007 15:41:58

Hola,
Acabo de leer los post, y espero no esté demás aclararles que no tengo conexión a Internet en Casa, por lo que me valgo de un CyberCafe-Internet, y mas tarde probaré el ADO y TXT.zip de Neftali.

Seguí trabajando en el asunto, y ahora he colocado ADOConnection, ADOTable, DataSource1, DBGrid en mi tabla, si bien recupera el archivo TXT, este no me muestra en Columnas, sino que cada fila se parece IGUAL a lo que está en el texto, por ejemplo la primera fila de Tabla me muestra:
Producto,Cantidad,Precio (una sola columna con ese texto)
¿Que parte habré hecho mal? Como no tengo Delphi a mano, mas tarde revisaré el ADO y TXT.zip

Luego buscando en el Foro encontré sugerencias de trabajar con TStringList ¿Que sugerencia me dan para utilizar este componente? Pues como en un principio hablé, no editaré la Base de Datos, ni renombraré, ni borraré, ni adicionaré, nada. El único objetivo es Manejar esa Base de Datos (realizar filtros, ordenaciones) luego mostrarlos en un TMemo, TListBox, etc o las notas en TEdits, y preferí un archivo TXT para encriptarlo y esté segura mi Base de Datos.

Neftali [Germán.Estévez] 15-01-2007 19:15:13

Cita:

Empezado por Deiv
Seguí trabajando en el asunto, y ahora he colocado ADOConnection, ADOTable, DataSource1, DBGrid en mi tabla, si bien recupera el archivo TXT, este no me muestra en Columnas, sino que cada fila se parece IGUAL a lo que está en el texto, por ejemplo la primera fila de Tabla me muestra:
Producto,Cantidad,Precio (una sola columna con ese texto)


Como ya he dicho más arriba, si sustituyes las , por ; ==> Arreglado

roman 15-01-2007 19:38:41

Cita:

Empezado por Neftali
Como ya he dicho más arriba, si sustituyes las , por ; ==> Arreglado

Pero en mi caso funciona con , pero no con ;.

Según entiendo, debería poder especificarse el separador poniendo:

Extended Properties="text;HDR=Yes;FMT=Delimited(x)"

donde x es el separador a usar. Pero hasta ahora no he tenido éxito.

// Saludos

Deiv 15-01-2007 23:01:58

Gracias Neftali,
He probado el ejemplo y está muy bueno, auque esto de ADO y Base de Datos no me las conozco muy bien, me voy a ir interiorizando al respecto buscando información.

¿Por qué elegiste el delimitador (;() y no (,)? ¿Que no acepta comas? ¿Se puede usar otros delimitadores, por ejemplo guiones? ¿como?. A diferencia de Román como a mi en un principio NO me aceptaba las comas.

Ordena bien el DBGrid en tu ejemplo, ¿Puede también FILTRAR?

Como dije en mi último post, lo único que deseo es administrar esa base de datos ya que no cambiaré ni aumentaré nada. Para mi ejemplo me gustaría saber cómo filtrar por "Apellidos" ya sea en el mismo DBGrid (aunque sería mejor MOSTRARLO en otro componente que Yo desease, por ejemplo en un TListBox o en un TMemo o en TEdits u otros) para que no se vean tan planos como lo muestra el TDBGrid. En conclusión quiero enfocar esta situación de que filtre o saque promedios de notas, todo internamente, y con un botón mostrar en otros objetos como dije para que no se vean tan planos.
Seguiré atento a nuevas sugerencias.

roman 16-01-2007 00:28:05

Yo sigo sin entender por qué en unos casos acepta las comas y en otros no. El ejemplo de Neftali me funciona si cambio por comas pero no si dejo los ;.

Según he seguido leyendo, hay dos maneras de especificar el formato:
  • En el registro
  • En un archivo schema.ini

En el primer caso, los parámetros se especifican en la entrada

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Text

Ahí, entre otras cosas, puede verse el campo Format con su valor por defecto: CSVDelimited, que es el que usa comas. Otros valores posibles para el campo Format son:
  • TabDelimited - para separar con tabuladores
  • Delimited(x) - x = separador

Y, en efecto, si pongo como valor de Format a Delimited(;), me funciona el ejemplo de Neftali. Se puede usar cualquier otro separador, excepto las comillas dobles.

Si no se quiere alterar el registro, se pueden usar un archivo schema.ini que se localice en la misma carpeta que el archivo con los datos. schema.ini, será un archivo INI con una sección por cada archivo de texto que deseemos usar. Así, por ejemplo, si el archivo es datos.txt, entonces schema.ini deberá tener la sección

Código:

[datos.txt]
Format=Delimited(*)

Aquí, se indicaría que el archivo datos.txt usa un asterisco como separador de campos.

Según entiendo también, este archivo schema.ini es el que debemos usar para especificar las longitudes de los campos en el caso de que usemos columnas de ancho fijo (primera cadena que puso Neftali) en lugar de con separadores.

El formato del archivo schema.ini para estos casos, así como el resto de lo que escribí, se puede ver en http://msdn.microsoft.com/library/de...ng03092004.asp

// Saludos

Neftali [Germán.Estévez] 16-01-2007 12:18:57

1 Archivos Adjunto(s)
Pues lo has explicado "de perlas" Roman.
Un ejempillo, que muestra el separador actual del registro.

roman 16-01-2007 18:24:23

Pero aún no entiendo porqué a ti te funciona con ;. ¿Tienes CSVDelimited en el registro?

// Saludos

Neftali [Germán.Estévez] 16-01-2007 19:11:05

Cita:

Empezado por roman
Pero aún no entiendo porqué a ti te funciona con ;?

Tú has dado la explicación; Mi entrada en el Registro pone:

Format = Delimited( ; )

roman 16-01-2007 19:12:26

¿Y ese era el valor por defecto o tú se lo cambiaste en algún momento?

// Saludos

Neftali [Germán.Estévez] 17-01-2007 10:58:58

Cita:

Empezado por roman
¿Y ese era el valor por defecto?

No lo se.

Cita:

Empezado por roman
¿tú se lo cambiaste en algún momento?

No lo se.

Manualmente no lo he cambiado; Si se ha cambiado en algun momento durante "los ultimos 3 años de vida de mi Windows" (es el tiempo que hace que no reinstalo) lo desconozco.

Deiv 17-01-2007 14:44:49

Al igual que Roman, Yo también no comprendo esa parte, pero lo que más me llamó la atención sobre los delimitadores es lo siguiente, ¿Mi Base de Datos TXT estará sujeta también a la dependencia de los Delimitadores que tenga una máquina?, es decir si tienen en otro Equipo en su Registro el Delimitador "coma" o suponiendo "comillas" por ejemplo, ¿entonces mi TXT (mi BD) no servirá, no se abrirá?? y mi aplicación no trabajará?

¿O habría alguna forma de FORZAR mediante código a que lea únicamente "punto y coma" como viene en el TXT? (ejemplo de Neftali)
Bueno por el otro lado aun me quedé con aquella duda si se puede filtrar la Base de Datos, digamos todos aquellos que coincidan en CANTIDAD = 1 del ejemplo. ¿Es la propiedad FILTER que debo utilizar? Alguien mas puede ayudarme por favor

Neftali [Germán.Estévez] 17-01-2007 18:10:16

1 Archivos Adjunto(s)
Cita:

Empezado por Deiv
¿Mi Base de Datos TXT estará sujeta también a la dependencia de los Delimitadores que tenga una máquina?, es decir si tienen en otro Equipo en su Registro el Delimitador "coma" o suponiendo "comillas" por ejemplo, ¿entonces mi TXT (mi BD) no servirá, no se abrirá?? y mi aplicación no trabajará?

Para eso tienes la opción del fichero Schema.
Entiendo que la variable del registro es como si fuera el valor por defecto; El que tiene prioridad es el que se define en ese fichero.

Subo el ejemplo con un fichero de esquema.
En mi registro está el ;
En el fichero de Datos.txt he usado el -
Especificando en el fichero Schema.ini el - funciona perfectamente.

Cita:

Empezado por Deiv
...por el otro lado aun me quedé con aquella duda si se puede filtrar la Base de Datos, digamos todos aquellos que coincidan en CANTIDAD = 1 del ejemplo. ¿Es la propiedad FILTER que debo utilizar?

Filter y Filtered; Una para el filtro y otra un booleano que indica si se filtra o no. En el ejemplo también pueder verlo funcionando.

Deiv 18-01-2007 14:51:49

Vaya!
Hasta que al fin utilizaré mi primer INI desde que programo. Gracias Neftali.

¿Los INIs no son vulnerables y propensos a ser cambiados, editados o alterados? Esto podría ocasionar que la Aplicación funcione mal verdad? ¿Se puede encriptar o no tendría sentido de INI? ¿Cómo protegerlo?

Neftali [Germán.Estévez] 18-01-2007 15:18:13

Cita:

Empezado por Deiv
¿Los INIs no son vulnerables y propensos a ser cambiados, editados o alterados? Esto podría ocasionar que la Aplicación funcione mal verdad?

Yo diría que son más accesibles.
Vulnerable, no se. Tan fácil es abrir el INI con el notepad, como abrir el EXE con el notepad. Si cambias algo y grabas, en ambos casos dejará de funcionar.

Cita:

Empezado por Deiv
¿Se puede encriptar o no tendría sentido de INI? ¿Cómo protegerlo?

En este caso no puedes ya que no es un fichero que esté manejando tú, sino que lo maneja la aplicación.
Creo que no tiene sentido proteger este fichero. Si alguien lo toquetea la aplicación funcionará mal, pero es que si borran el EXE también funcionará mal, y si cambian el Datos.txt también y si borran cualquiera de ellos también,...

oregon 18-01-2007 15:45:04

Otra variante
 
Cita:

Empezado por Deiv
Vaya!
Hasta que al fin utilizaré mi primer INI desde que programo. Gracias Neftali.

¿Los INIs no son vulnerables y propensos a ser cambiados, editados o alterados? Esto podría ocasionar que la Aplicación funcione mal verdad? ¿Se puede encriptar o no tendría sentido de INI? ¿Cómo protegerlo?

Lo del fichero *.ini me parece una buena idea. Sin embargo...

Un posibilidad que me gustaría consultaros, y que creo que podría ser, en parte, la solución para el problema que plantea aquí Deiv, es la de generar el fichero *.ini al iniciar el programa, y que se borre al cerrarlo.

Me explico, con la solución, tal y como está ahora, se distribuye el fichero *.ini con la aplicación, y como dice Deiv, la pueden cambiar (accidentalemente o por malas artes). Encriptarlo o protegerlo creo que requiriría muchas líneas de código, y no es un material tan "privado" que merezca la pena, ¿no? Tal y como dice Neftali...

Cita:

Empezado por Neftali
Creo que no tiene sentido proteger este fichero. Si alguien lo toquetea la aplicación funcionará mal, pero es que si borran el EXE también funcionará mal, y si cambian el Datos.txt también y si borran cualquiera de ellos también,...

La solución que planteo (y que no se si es fácil de hacer), es crear, por código, un fichero *.ini en el directorio donde esté en ese momento la aplicación, con las dos o tres líneas que necesitemos. Así nos aseguramos que esté configurado como esté configurado el ordenador de cada usuario, nuestro ficheros se creen y se abran siguiendo una determinada configuración.
Por otra parte, al salir, se puede eliminar el fichero por código, así quitamos basurilla al equipo del usuario, no dejamos pistas, y no modificamos su configuración personal. Además es más facil de distribuir la aplicación final, porque sólo con el ejecutable sirve.
Por si fuera poco, aunque toquiteen el fichero *.ini mientras corre la aplicación, ya no importará. Además, será borrardo y generaremos uno nuevo y correcto cuando volvamos a ejecutar el programa.

No hablo por experiencia, pero creo que no es complicado generar ese fichero, ya que es un fichero de texto plano ascii, con una extensión de terminada. Y para borrarlo... como sabemos donde esta y como se llama, creo que tampoco debería ser mucho problema.

Bueno, creo que me he extendido demasiado. Pero ahí dejo la idea (o la tontería, que juzguen los expertos;) ).

Suerte!

Neftali [Germán.Estévez] 18-01-2007 16:13:28

Cita:

Empezado por oregon
...ahí dejo la idea (o la tontería, que juzguen los expertos;)

No me parece en absoluto una tontería. Con un memo, propiedad Visible a False y el texto dentro, con una línea podemos generar el fichero.

Código Delphi [-]
  // Grabar en el evento OnCreate.
  Memo1.Lines.SaveToFile(ExtractFilePath(Application.ExeName) + 'Schema.INI');

Similar para borrarlo al salir.

oregon 18-01-2007 16:35:45

Me alegra saber que no era una tontería.

Por otra parte, y con la idea de Neftali de usar un Memo, se puede complicar la cosa y dar opciones al usuario, permitiéndole que elija, mientras corre la aplicación, entre separar por comas, punto y coma, comillas, guiones,... Simplemente se puede cambiar el contenido del memo con lo que elija el usuario, y se vuelve a generar el fichero *.ini con la nueva configuración.

Otra utilidad que se me ocurre aplicando la idea de Neftali es permitir al usuario importar ficheros con otro tipo de separadores. Por ejemplo, nuestra aplicación abre ficheros separados por ";", pero resulta que nos envian, conseguimos o lo que sea un fichero exportado de excell con ",". De esta manera, se puede seleccionar el separador, regenerar un *.ini, cargar el fichero y volver a las opciones iniciales. Es más complicado, pero por ideas que no quede.

Por curiosidad... ¿cómo se haría para borrarlo?

roman 18-01-2007 17:31:17

Si únicamente se requiere configurar el separador, yo mejor optaría por alterar por código esa entrada del registro y restaurarla al terminar.

// Saludos

Neftali [Germán.Estévez] 18-01-2007 17:52:59

Cita:

Empezado por oregon
¿cómo se haría para borrarlo?

Delphi ya tiene implementada la función DeleteFile; El nombre del fichero es el mismo de antes.

Neftali [Germán.Estévez] 18-01-2007 17:55:37

Personalmente prefiero no trastear en el Registro. Primero porque me es más incómodo y segundo, porque me he encontrado ya varias veces, que segun cómo estén configurados los usuarios en los sistemas windows, no tienen permisos para leer y/o escribir en el registro.

También he de decir que en TS, también me han dado problemas de acceso los ficheros .INI; Al final tuvimos que renombrarlos a ".ISI"

roman 18-01-2007 18:02:28

Creo que ando medio dormido. ¿Qué es TS?

// Saludos

Neftali [Germán.Estévez] 18-01-2007 18:57:05

Cita:

Empezado por Neftali
...que en TS

:eek::eek::eek:

Perdón, que no se en qué estaba pensando. Con TS me refería a Terminal Server (que es como a menudo trabajamos), pero eso no tiene nada que ver con lo que hablábamos. Los permisos de los usuarios, son los permisos en todos sitios.

Wbarrantes 03-12-2010 18:13:49

buenas
 
se que ha pasado algun tiempo desde el ultimo post, pero tengo un problema muy similar que me seria de gran utilidad si alguien me puede ayudar...

se trata de un archivo txt,
1. La informacion no esta seaparada por ningun tipo de delimitador,
2. Todas las lineas tienen un largo de 200 caracteres,
3. La primera (datos especificos de identificacion del archivo)y la ultima linea (datos de cierre) tienen la misma longitud pero hacen referencia a 2 tablas diferentes, con campos diferentes, todas las lineas de en medio(minimo 1) hace referencia a un detalle...
4. El encabezado esta compuesto por 4 valores de 50 de longitud cada uno
5. Los detalles(lineas de en medio) estan compuestos por 10 valores de de 10 de largo cada uno.
6. El detalle de cierre esta compuesto por 5 valores de 40 de longitud cada uno


No existe nigun problema en que se divida en 3 diferentes grid a la hora de presentar la informacion, y luego debo ingresar esos valores a 3 tablas de bases de datos correspondientes, pero una vez teniendolas en un dbgrid, eso eslo de menos...

el problema es que aun no logro vizualizar una manera de ahcerlo, aunque este tema me ha sido de mucha utilidad, para por lo menos tener una idea de como poder empezar, pero me trabe en el uso de

Código Delphi [-]
[Test.txt]
Format=FixedLength

Col1=PrimeraColumna Text Width 50
Col2=SegundaColumna Text Width 50
Col3=TerceraColumna Text Width 50
Col4=CuartaColumna Text Width 50

Pero es solo me serviria para la primera fila (encabezado)...

estoy tirando lineas, para ver como podria resolverlo, pero agradesco muchisimo cualquier ayuda

roman 03-12-2010 18:30:31

Así leido un poco rápido, me parece que no tienes de otra que separar el archivo en encabezado y detalles y tratar cada uno como aquí se indica.

// Saludos

Wbarrantes 03-12-2010 18:46:46

???
 
puedo tener mas de un 'Schema.INI'?

roman 03-12-2010 18:51:40

No, no. A eso me refiero. Tendrías que separar el archivo original en varios y usar un schema para cada uno. Quizá no estoy entendiendo bien. ¿Podrías poner un ejemplo de datos?

// Saludos

Wbarrantes 03-12-2010 19:01:03

aca esta
 
Lo modifique para variar su tamano y que sea mas facil de visualizar

Cita:

E00000001ARCHIVOGWESSITCR0204200900130.......................................
D00000002000000000376678303661028GTHPG0000025000000111111111111
D00000034000000004000000000004418GTHPG0000000000105936050012312
F000000350000000000006174300000003302042009.................................
Basicamente la primera linea es el encabezado
siguen los detalles que podrian ser N
y un Final...

cada linea es de 200 caracteres origianlmente y se parsea segun corresponde al detalle,encabezado o final...

ya lo parseo bien con los detalles, pero como el ancho de columna no es la misma para todos los campos, debo parsear el tamano por aparte para el encabezado y para el final...

Wbarrantes 22-02-2011 19:37:12

ok ya logre solventar mi problema
1. Trabajo un archivo definido por columnas separada por tabuladores..
2. Estoy trabajando con Delphi 2010...
3. Ingreso los datos depues de realizar varias operaciones, a una base de datos


pero tengo un pequeno gran problema, necesito abrir el archivo de Datos de un fichero que el usuario me indique, y no de un fichero fijo...

osea en lugar de que sea DATOS.txt utilizar un open dialog

Cita:

//****************************************
OpenDialog1.Filter:='Datos (*.txt)|*.txt';
if OpenDialog1.Execute then
begin
if OpenDialog1.FileName <> emptystr then
begin
ADOTable1.Active := False;
ADOTable1.TableName:= OpenDialog1.FileName;
ADOTable1.Active := True;

end;
end;
//*****************************************
pero solo lo carga correctamente cuando utilizo un archivo que este dentro de la misma carpeta y con el nombre DATOS.txt…


cuando lo cargo de esta manera no me respeta las columnas, el separador ni nada de lo que contiene el archivo schema.txt

podria venir por el lado del encabezado delfichero schema [datos.txt]...
es correcto? como podria variarlo? no daria problemas por que lo cargo en el form create?

Wbarrantes 22-02-2011 22:33:23

buenas
 
ya resolvi mi problema... apunto el codigo por sialguien se le presenta una situacion similar

Código Delphi [-]
procedure TFormMain.cargar_archivo();
  var
  TSTR_Archivo:tstringlist;
begin
  TSTR_Archivo:=  tstringlist.Create;
//****************************************
 OpenDialog1.Filter:='Datos (*.txt)|*.txt';
  if OpenDialog1.Execute then
  begin
    if OpenDialog1.FileName <> emptystr then
    begin
      STR_FILE_NAME := OpenDialog1.FileName;
// debe encuentrarse el archivo  schema en la misma carpeta del exe
      TSTR_Archivo.LoadFromFile(GetCurrentDir + '\Schema.ini');
// modifico la primera linea del schema
      TSTR_Archivo[0] := '['+ ExtractFileName( OpenDialog1.FileName) +']' ;
// guardo el archivo
      TSTR_Archivo.SaveToFile(GetCurrentDir + '\Schema.ini');
 
//bajo el ADO para aplicar un cambio
      ADOTable1.Active := False;
//remplazo el tablename
      ADOTable1.TableName:= STR_FILE_NAME  ;
//vuelvo aactivar para que surja efecto
      ADOTable1.Active := True;
// aqui para abajo lo que quiera hacer
      showmessage('mi codigo ahora');

    end;
  end;

espero les sea de beneficio,y pos que sirva como una incorporacion al codigo de Neftali...


La franja horaria es GMT +2. Ahora son las 09:31:27.

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