• Viernes 10 de Mayo de 2024, 00:10

Autor Tema:  Base Txt De Datos  (Leído 2733 veces)

Deiv

  • Miembro activo
  • **
  • Mensajes: 67
  • Nacionalidad: bo
    • Ver Perfil
Base Txt De Datos
« en: Viernes 12 de Enero de 2007, 15:36 »
0
¿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: Text
  1. for i:=1 to 100 do
  2. begin
  3.   ReadLn(File, Cadena);
  4.   Alumno[i].ID:= Cadena;
  5.   ReadLn(File, Cadena);
  6.   Alumno[i].Apellido:= Cadena;
  7.   ReadLn(File, Cadena);
  8.   Alumno[i].Nombre:= Cadena;
  9.   ReadLn(File, Cadena);
  10.   Alumno[i].Curso:= Cadena;
  11.   ReadLn(File, Cadena);
  12.   Alumno[i].Nota1:= StrToInt(Cadena);
  13.   ReadLn(File, Cadena);
  14.   Alumno[i].Nota2:= StrToInt(Cadena);
  15.   ReadLn(File, Cadena);
  16.   Alumno[i].Nota3:= StrToInt(Cadena);
  17. end;
  18. //Luego no sé, quizá mostrarlo con un WRITELN
  19.  
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

juanlaplata

  • Miembro activo
  • **
  • Mensajes: 28
    • Ver Perfil
Re: Base Txt De Datos
« Respuesta #1 en: Lunes 15 de Enero de 2007, 17:45 »
0
La mayoria de tus preguntas se resuelven de manera muy sencilla con SQL.
Para eso tendrias que tener los datos en una tabla( y por consiguiente una base).
Pero si aun deseas seguir con el .txt no hay por que no hacerlo.
El principal inconveniente, desde mi punto de vista es que para cualquier cosa que hagas o quieras hacer dependeras de for i:=1 to 100 do y si hay alternativas mejores las prefiero, pero como dije antes se puede y muy bien.
Otra cosa que hay que tener bien claro son las posiciones dentro del .txt de donde empieze un campo y donde termina, para la lectura del dato no?.
Entonces veamos, con esto leemos el arch. renglon a renglon.

public
archivo : TStringList;

....

FormCreate(...);
begin
archivo:= TStringList.Create;
...

FormDestroy(...);
begin
archivo.Free;
...

Procedure leerArch(...);
begin
for I:= 0 to (archivo.count)-1  do
          begin
          temp:= archivo.Strings;
          DestinoCampo1.text:=  copy(temp,PosIniCampo1,CantLetras);
          DestinoCampo2.text:=  copy(temp,PosIniCampo2,CantLetras);
          DestinoCampo3.text:=  copy(temp,PosIniCampo3,CantLetras);
          DestinoCampo4.text:=  copy(temp,PosIniCampo4,CantLetras);
          // etc
          end;
....

Con este codigo podrias llenar tranquilamente una grilla.
Ahora vamos a las preguntas.

Deberias mandar a llenar un ListBox como tu dices pero solo con el campo Curso,
esto seria

for I:= 0 to (archivo.count)-1  do
          begin
          temp:= archivo.Strings;
          ListBoxCurso.add:=  copy(temp,PosIniCurso,CantLetras);
          end;

y luego en el click del ListBox Guardar en una variable auxiliar (Aux) el contenido de la seleccion para rellenar otro ListBox2 solo que esta ves dentro del Loop (For) ir preguntando si el CampoXX tiene la info de Aux.

Bueno espero haber sido claro. Cualquier Cosa lo seguimos estudiando. Suerte

Deiv

  • Miembro activo
  • **
  • Mensajes: 67
  • Nacionalidad: bo
    • Ver Perfil
Re: Base Txt De Datos
« Respuesta #2 en: Lunes 15 de Enero de 2007, 22:47 »
0
Gracias por responder,
Saben esto de Base de Datos no me manejo bien, voy a estudiar tu sugerencia, Si bien pensé para esa mínima cantidad de DATOS un Archivo TXT era porque pensaba encriptarlo y recuperarlo en el programa (a manera de proteger la Base de Datos) No pensaba valerme de conexiones ni dependencias, no vale la pena para una Base tan pequeña.

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 por ejemplo, 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 así como sugieres con un TStringList por ejemplo, y con un botón mostrar en otros objetos como mencioné para que no se vean tan planos.
No les molestaría pedirles adjuntarme un Archivo Delphi (ZIP) para estudiar el ejemplo, por favor.
Gracias

ushedipe

  • Miembro activo
  • **
  • Mensajes: 37
    • Ver Perfil
Re: Base Txt De Datos
« Respuesta #3 en: Martes 24 de Abril de 2007, 21:17 »
0
:comp: lo que he hecho es buscar en un RichEdit cargo un plano y en él busco una cadena específica, con el siguiente código...

   SelStart:=Pos(Edit.text,RichEdit.Text)-1;
   SelLength:=Length(Edit.text);
   SetFocus;

ahora si lo que pretendes es utilizar el plano como banco de información, deberías utilizar separadores entre los datos a fin de diferenciar los campos, y separarlos al momento de la consulta para hacer la visualización de la información.

para evitar problemas con lo de los registros duplicados, antes de hacer la inserción de una núeva línes (registro para éste caso) tendrías que realizar una búsqueda exhaustiva en todo el archivo buscando que las llaves no se repitan (por aquello de la integridad)

para lo de los filtros, tendrías que realizar la misma búsqueda, encontrando concordancias en el campo deseado e ir agregando las concordancias al resultado de la búsqueda.

espero haber sido de ayuda. :ph34r: