Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-11-2006
bohemioloco bohemioloco is offline
Miembro
 
Registrado: Nov 2006
Ubicación: Tarija - Bolivia
Posts: 20
Poder: 0
bohemioloco Va por buen camino
Unhappy Error al llenar tabla desde archivo txt

Saludos
En un anterior hilo pregunte si era posible llenar una tabla (socios) con datos de un archivo txt y Neftali me respondio:

Cita:
Empezado por Neftali
(1) Sí.
(2) Básicamente se trata de ir leyendo la información del Archivo de texto (previamente cargado en un TStrings, por ejemplo) y luego ir haciendo Insert/Update (vía TTable o TQuery) en la tabla.
Siguiendo su consejo (el cual agradezco mucho) y algunas cosas que investigué por mi cuenta utilicé un Tmemo donde cargo el contenido del archivo txt para ir leyendo la información y un Tquery para hacer el llenado de la tabla (porque me pareció el metodo más facil para mi que soy totalmente nuevo en delphi )

Resumiendo me salió el siguiente código


Código Delphi [-]
procedure TfrmNumeroUno.iM1Click(Sender: TObject);
var y,d,a,ci,num,nom,cat:string;i,j,x,k:integer;
v: array [1..4] of string;
begin
query1.Close;
Query1.ExecSql;
frmNumeroUno.Memo1.Lines.Clear;
frmNumeroUno.OpenDialog1.Title:='Exportacion de Socios'; //ABRE DIALOGO Y BUSCA EL ARCHIVO
frmNumeroUno.OpenDialog1.DefaultExt:='.txt';
frmNumeroUno.OpenDialog1.InitialDir:='C:\windows\escritorio\BD';
frmNumeroUno.OpenDialog1.Execute;
frmNumeroUno.Memo1.Lines.Clear;
frmNumeroUno.Memo1.Lines.LoadFromFile(frmNumeroUno.OpenDialog1.FileName); //cuenta las lineas del archivo de texto
y:='';
for i:=0 to frmNumeroUno.Memo1.Lines.Count do //desde 1 hasta elnumero de lineas del texto
begin
           x:=1;
           d:='';
           for k:=1 to 4 do //desde uno hasta numero de campos
           begin
                 v[k]:=''; //vector de valores
           end;
 
          y:=frmNumeroUno.Memo1.Lines.Strings[i]; 
 
          for j:=1 to length(y) do 
          begin
                 if y[j]<>'|' then
                 begin
                        d:=d+y[j];
                 end
                 else
                begin
                       v[x]:=d;
                       inc(x);
                       a:=d;
                       d:='';
               end;
           end; 
 
          ci:=v[1]; //dato del primer campo
          num:=v[2]; //dato del segundo campo
          nom:=v[3]; // dato del tercer campo
          cat:=v[4]; // dato del cuarto campo
          //Aqui tiene que cargar los datos en la tabla//
         frmNumeroUno.Query2.SQL.Clear;
         frmNumeroUno.Query2.SQL.Add('insert into socios (ci,Ncta,Nombres,Calf) values('+ci+','+num+','+nom+','+cat+')');
         Query2.Close;
         frmNumeroUno.Query2.Active:=true;
         Query2.ExecSql;
end 
end;
El problema es que en tiempo de ejecución me sale el siguiente error

"Project miproyecto.exe raised exception class EDBEngineError whyt message Invalid use of keyword"

o sea me da error al encontrar un espacio en blanco dentro del texto.

¿Que me falta? ¿que me sobra? ¿Que hice mal? Alguien me puede aconsejar

Les agradezco de antemano su ayuda

Última edición por dec fecha: 10-11-2006 a las 04:20:24.
Responder Con Cita
  #2  
Antiguo 10-11-2006
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: May 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Yo simplificaría todo, no tengo tiempo para leer el código, pero si un registro es una línea de tu fichero de texto y los campos, tienen un separador o son de longitud fíja.

Leería mediante un bucle las líneas, por cada línea leida, utilizado la función Copy si los campos son de longitud fija iría rellenando los campos de la BD y me ahorraría el paso intermedio de cargarlo en un memo.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 10-11-2006
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: Jul 2004
Ubicación: Barcelona - España
Posts: 15.730
Poder: 10
Neftali [Germán.Estévez] Tiene un aura espectacularNeftali [Germán.Estévez] Tiene un aura espectacular
Cita:
Empezado por bohemioloco
...Neftali me respondio...
Lo lógico en estos casos es seguir con el hilo original; Ahora en este hilo falta la información que diste en el otro.

Cita:
Empezado por bohemioloco
...utilicé un Tmemo donde cargo el contenido del archivo txt
En realidad, la propiedad LInes del TMemo, no deja de ser un TStrings.

Cita:
Empezado por bohemioloco
El problema es que en tiempo de ejecución me sale el siguiente error:
"Project miproyecto.exe raised exception class EDBEngineError whyt message Invalid use of keyword"
Deberías ejecutar tu proyecto paso a paso y decirnos en qué línea da el error (aunque supongo cual es, no está de más estar seguro).

Otra cosa que estaría bien es saber cómo son las líneas del fichero de texto. ¿Puedes poner dos o tres? Para ver la estructura que tienes, los separadores,...

La idea del código es la correcta, recorrer las líneas e ir insertando en la tabla:
* Debes tener en cuenta, que los "cortes" de la línea en trozos sean correctos.
* Recuerda también que al realizar un Insert, los campos de tipo texto van entre comillas (Revisa la función QuetedStr);
* Ten en cuenta que algun campo al realizar los "cortes" puede ser vacío, al insertar ese campo debes cambiarlo por un NULL, sino en la sentencia aparecerán dos comas ( , ) seguidas y te dará error.
* Para buscar el sepoarador entre campos y "cortar" usa las funciones Pos Y Copy.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 10-11-2006
mane mane is offline
Miembro
 
Registrado: May 2005
Posts: 30
Poder: 0
mane Va por buen camino
Y si lo haces así...

Supongamos estas variables
ft : textfile;
lin : string;

y un fichero donde está la información, un código de 5 letras y una descripción, separados por una coma (o lo que sea)

Código:
  assignfile(ft,DirectoryEdit1.text+'\Anotacion.txt');
  {$I-}
    Reset(Ft);
  {$I+}
  if IOResult <> 0 then
  begin
    Showmessage('No se encuentra el fichero de anotaciones.');
    Exit;
  end;
  while not eof(ft) do
  begin
    Readln(ft,lin);
    Table1.Append;
    Table1.Fieldbyname('Codigo').asstring:=copy(lin,1,5);
    Table1.Fieldbyname('Fecha').asdatetime:=now;
    Table1.Fieldbyname('Descripcion').asstring:=copy(lin,7,80);
    Table1.Post;
  end;
  Closefile(ft);
Responder Con Cita
  #5  
Antiguo 10-11-2006
bohemioloco bohemioloco is offline
Miembro
 
Registrado: Nov 2006
Ubicación: Tarija - Bolivia
Posts: 20
Poder: 0
bohemioloco Va por buen camino
Detallando un poco mas

Gracias a todos por sus sugerencias, y sobre todo por su paciencia .
Les detallo un poco mas el problema.

- Los campos son de longitud variable (es decir.. los datos no tienen el mismo largo) por eso voy leyendo el fichero caracter por caracter.

- La linea donde aparece el error es :


Código Delphi [-]Query2.ExecSql;


datos.txt- Una muestra de los datos

Gracias de nuevo por su ayuda.. y por seguir ayudandome
Responder Con Cita
  #6  
Antiguo 11-11-2006
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: Dec 2003
Ubicación: Zamudio
Posts: 1.378
Poder: 16
fjcg02 Va camino a la fama
Hola,
personalmente en un proyecto utilicé un odbc para acceder a ficheros de texto con formatos tipo registros.
Una vez creado el odbc, al que sólo hay que indicar el directorio, cada fichero de texto se trata como una tabla/query. Es una pasada la facilidad con la que se puede manejar este tipo de información, y creo que te puede venir de maravilla. Una vez el usuario te haya seleccionado el fichero, modificas los datos del dataset y los tratas como si leyeras una tabla normal.

Echale un vistazo porque creo que merece la pena.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #7  
Antiguo 12-11-2006
mane mane is offline
Miembro
 
Registrado: May 2005
Posts: 30
Poder: 0
mane Va por buen camino
No le veo problema a la estructura de tu fichero txt.

Código:
var l1,l2,l3,l4 : string;
    procedure extrae(cad:string;var t1,t2,t3,t4:string);
    var q : integer;
    begin
      t1:='';t2:='';t3:='';t4:='';
      q:=1;
      while copy(cad,q,1)<>'|' do
      begin
        t1:=t1+copy(cad,q,1);
        inc(q);
      end;
      inc(q);
      while copy(cad,q,1)<>'|' do
      begin
        t2:=t2+copy(cad,q,1);
        inc(q);
      end;
      while copy(cad,q,1)<>'|' do
      begin
        t3:=t3+copy(cad,q,1);
        inc(q);
      end;
      inc(q);
      t4:=copy(cad,q,3);  // el resto
    end;
 
 assignfile(ft,DirectoryEdit1.text+'\Anotacion.txt');
  {$I-}
    Reset(Ft);
  {$I+}
  if IOResult <> 0 then
  begin
    Showmessage('No se encuentra el fichero de anotaciones.');
    Exit;
  end;
  while not eof(ft) do
  begin
    Readln(ft,lin);
    extrae(lin,l1,l2,l3,l4);
    Table1.Append;
    Table1.Fieldbyname('Codigo').asinteger:=strtoint(l1);
    Table1.Fieldbyname('Numero').asstring:=l2;
    Table1.Fieldbyname('Nombre').asstring:=l3;
    Table1.Fieldbyname('Tipo').asstring:=l4;
    Table1.Post;
  end;
  Closefile(ft);
Responder Con Cita
  #8  
Antiguo 12-11-2006
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: Dec 2003
Ubicación: Zamudio
Posts: 1.378
Poder: 16
fjcg02 Va camino a la fama
Insisto, mira un poco lo que te digo en el mensaje anterior.
En el formulario que te adjunto, las tablas que ves en él son realmente ficheros de texto. Incluso se puede hacer maestro-detalle.
Si quieres no visualizas los registros y los utilizas a tu antojo

Un saludo
Archivos Adjuntos
Tipo de Archivo: zip Muestra.zip (26,9 KB, 30 visitas)
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #9  
Antiguo 13-11-2006
dardo dardo is offline
Miembro
 
Registrado: May 2006
Posts: 13
Poder: 0
dardo Va por buen camino
Prueba a cambiar la línea del SQL por esta:

frmNumeroUno.Query2.SQL.Add('insert into socios (ci,Ncta,Nombres,Calf) values('+QuotedStr(ci)+','+QuotedStr(num)+','+QuotedStr(nom)+','+QuotedStr(cat)+')');

Teniendo en cuenta que todos los campos son string.
Si hubiera algún numérico no le pongas el QuotedStr()
Responder Con Cita
  #10  
Antiguo 13-11-2006
bohemioloco bohemioloco is offline
Miembro
 
Registrado: Nov 2006
Ubicación: Tarija - Bolivia
Posts: 20
Poder: 0
bohemioloco Va por buen camino
Gracias a todos

Al fin lo solucioné..... mejor dicho.. lo solucionaron ustedes

Use la sugerencia:

Cita:
Empezado por dardo
Prueba a cambiar la línea del SQL por esta:

frmNumeroUno.Query2.SQL.Add('insert into socios (ci,Ncta,Nombres,Calf) values('+QuotedStr(ci)+','+QuotedStr(num)+','+QuotedStr(nom)+','+QuotedStr(cat)+')');
aunque anteriormente recibi esta
Cita:
Empezado por Neftali
Recuerda también que al realizar un Insert, los campos de tipo texto van entre comillas (Revisa la función QuetedStr);
pero, como buen primerizo no me ubiqué.... en mi descargo dire que esta es mi primera vez en Delphi (y en entorno visual) ya que siempre programé en en lenguajes de script, por eso es que utilicé las herramientas que mas me recordaban a lo que anteriormente hice.

A todos los que dieron sugerencias muchas gracias, les aseguro que las estoy revisando para aprender un poco mas y utilizarlas en futuros programas(muy pronto por cierto).. asi que seguro que pronto sabran de mi de nuevo...

De nuevo gracias a todos

A los moderadores: no se si esto es spam... si es asi mil disculpas
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Llenar menú desde Tabla... vladimirbp Varios 2 10-11-2006 19:26:53
Error de Sintaxis al Insertar datos a una tabla desde otra alastor SQL 9 28-09-2006 19:27:09
llenar una tabla dbf con un query de mysql coletaun Varios 4 03-01-2006 23:04:14
Llenar una tabla con datos de otras dos tablas jovehe Tablas planas 2 23-08-2004 18:21:55
Necesito llenar un DBGrid desde una consulta con dbexpresss vivim82 Varios 5 05-05-2004 19:31:02


La franja horaria es GMT +2. Ahora son las 21:50:22.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi