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?


La franja horaria es GMT +2. Ahora son las 17:48:44.

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