Delphi - Importar txt desde un dbf

   
Vista:

Importar txt desde un dbf

Publicado por jesus alba (14 intervenciones) el 07/03/2008 19:16:17
hola amigos:

tengo una bronca, necesito llenar una base de datos tipo dbase desde un archivo de texto delimitado por espacios y comillas las caracteristicas son las siguientes:
Campo Tipo Longitud

Codigo Char 8
Descrip Char 40
Linea Char 4
Precio Currency 6
Existencia Integer 6
Control Char 4

ya tengo en una form todo el Ttable, Datasource, Opendialog pero nada mas no me sale. y ya que tenga llena mi tabla deseo estarla actualizando y ponerle una validacion que me indique que el codigo ya existe.

Ojala me puedan ayudar...saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Importar txt desde un dbf

Publicado por E.T. (1106 intervenciones) el 07/03/2008 19:50:43
Podrias poner un ejemplo del archivo

es algo así:

codigo--------Descripcion---------------------------------------------------------------Linea
'########' 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' 'XXXX'

precio-----existencia--control
'####.##' '######' 'XXXX'

O sea, los valores de los campos están entre las comillas, y estos a su ves separados por un espacio??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Importar txt desde un dbf

Publicado por jesus alba (14 intervenciones) el 07/03/2008 22:11:04
el ejemplo del archivo seria asi:

Clave Descripción Línea Precio_publico Existencias Control_Al
"101B0300 ","CILINDRO FRENOS REPUES 620/710/720 72-81","1B03 ", 34.00, 107,"4BH9 "
"101C0100 ","COFRE METAL PU-620 1973-1980 ","1C01 ", 550.00, 0,"6UH0 "

slds
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Importar txt desde un dbf

Publicado por E.T. (1106 intervenciones) el 08/03/2008 00:26:26
Bueno, suponiendo que por cada conjunto de valores haya una linea en el archivo, esto es por ejemplo

Clave Descripción Línea Precio_publico Existencias Control_Al
Clave Descripción Línea Precio_publico Existencias Control_Al
Clave Descripción Línea Precio_publico Existencias Control_Al

"101B0300 ","CILINDRO FRENOS REPUES ","1B03 ", 34.00, 107,"4BH9 "
"101C0100 ","COFRE METAL PU-620 1973-1980 ","1C01 ", 550.00, 0,"6UH0 "
"101B0300 ","CILINDRO FRENOS REPUES ","1B03 ", 34.00, 107,"4BH9 "
"101C0100 ","COFRE METAL PU-620 1973-1980 ","1C01 ", 550.00, 0,"6UH0 "

que el archivo esté formado por lineas de valores por registro que llenarás, pues no hay una coma, para separar cada linea supongo que cada conjunto de 6 valores es una linea

Con el siguiente codigo lo puesdes hacer

procedure TForm1.Button1Click(Sender: TObject);
var i, j, posc, cont:integer;
archivo:textfile;
cadena, valor:string;
begin
AssignFile(archivo, 'c:1.txt');
reset(archivo);
while not(eof(archivo))do begin
readln(archivo, cadena);
valor:='';
i:=1;
j:=0;
cont:=0;
Table1.Append;
repeat
posc:=posex(',',cadena,i);
if posc=0 then
posc:=length(cadena);
valor:=copy(cadena,i,posc-cont-1);
while pos('"',valor)>0 do begin
delete(valor,pos('"',valor),1);
end;
valor:=TrimLeft(valor);
valor:=TrimRight(valor);
Table1.Fields[j].AsString:=valor;///Puede que esta linea te dé error, a mi no me pasó
inc(j);
i:=posex(',',cadena,i)+1;
cont:=posc;
until (i>=length(cadena))or(i<=1);
Table1.Post;
end;
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Importar txt desde un dbf

Publicado por jesus alba (14 intervenciones) el 08/03/2008 18:17:03
Muchas gracias E. T.

me sirvio de mucho, ahora solamente habrá que ajustarlo porque importó con todo y comillas y habrá que darle el rango para que me importe todo el contenido del archivo porque importó unicamente 8 registros.
no sé si habra una sentencia para blanquear la base de datos como en dbase que es zap tal ves sería Table1.Zap;

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Importar txt desde un dbf

Publicado por E.T: (1106 intervenciones) el 08/03/2008 19:56:39
Pues se me hace raro, a mi si me importó sin comillas, y ademas solo lo hice con dos registros
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Importar txt desde un dbf

Publicado por jesusalba (14 intervenciones) el 09/03/2008 23:47:50
el error estaba en

while pos('"',valor)>0 do begin
delete(valor,pos('"',valor),1);

aqui dice doble comilla y lo cambie a:

while pos("',valor)>0 do begin
delete(valor,pos("',valor),1);

y al declarar

valor:=";

no me dejaba asi que lo cambie a

valor:='"';

solo una pregunta : ¿habrà maner'a de que en el primer registro no me ponga los encabezados? por que me pone en la primera linea Clave=Clave, los demás campos vacios y ya toda la infomacion correcta a partir del registro 2. este es mi codigo

procedure TImpInvL.ImportarClick(Sender: TObject);
var
i, j, posc, cont:integer;
archivo:textfile;
cadena, valor:string;

begin
Assignfile(archivo,'c:Stockl.txt');
reset(archivo);
while not(eof(archivo)) do begin
readln(archivo,cadena);
valor:='"';
i:=1;
j:=0;
cont:=0;
Table1.Active:=True;
Table1.append;
repeat
posc:=posex(',',cadena,i);
if posc=0 then
posc:=length(cadena);
valor:=copy(cadena,i,posc-cont-1);
while pos('"',valor)>0 do begin
delete (valor,pos('"',valor),1);
end;
valor:=trimleft(valor);
valor:=Trimright(valor);
Table1.Fields[j].AsString:=valor;
inc(j);
i:=posex(',',cadena,i)+1;
cont:=posc;
until(i>length(cadena))or(i<=1);
Table1.post;
Table1.Close;
end;
ShowMessage('Terminado');
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Importar txt desde un dbf

Publicado por E.T. (1106 intervenciones) el 10/03/2008 17:11:33
Ha, pues como no sabia que los encabezados eran parte del arhivo no lo tomé en cuenta,
solo hay que dar un readln(archivo,cadena); antes del while

º
º
readln(archivo,cadena);
while not(eof(archivo)) do begin
readln(archivo,cadena);
º
º

con eso te lee los encabezados, luego lee la siguiente linea donde empiezan los datos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Importar txt desde un dbf

Publicado por jesusalba (14 intervenciones) el 10/03/2008 17:42:48
tengo una bronca, como aqui manejamos dos empresas, estoy intentando hacer lo mismo con otro archivo similar nada mas que alli la longitud del codigo es de 5
el total de la linea es de 106 caracteres mientras que la otra era de 109, pero me manda un error que ya me trae loco, cuando compilo me manda una pantalla con lo siguiente y truena.

debugger exception notification

Project sailef1.exe raised exception class EListError with message 'List index out of bounds (6)' Process Stopped. use step or run to continue.

y por mas que le busco no le hallo... sabes a que se deba?

te pongo parte del archivo.

Clave Descripción Línea Precio_publico Existencias Control_Al
"50101 ","CABLE INST 10GA 100 PIES NEGRO UNIVERSAL","50 ", 88.00, 0," "
"50102 ","CABLE INST 10GA 100 PIES ROJO UNIVERSAL ","50 ", 88.00, 0," "
"50121 ","CABLE INST 12GA 100 PIES NEGRO UNIVERSAL","50 ", 56.00, 0," "
"50122 ","CABLE INST 12GA 100 PIES ROJO UNIVERSAL ","50 ", 56.00, 0," "
"50123 ","CABLE INST 12GA 100 PIES AZUL UNIVERSAL ","50 ", 56.00, 0," "
"50124 ","CABLE INST 12GA 100 PIES BLANCO UNIVERSA","50 ", 56.00, 0," "
"50141 ","CABLE INST 14GA 100 PIES NEGRO UNIVERSAL","50 ", 39.00, 0," "
"50142 ","CABLE INST 14GA 100 PIES ROJO UNIVERSAL ","50 ", 39.00, 0," "
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Importar txt desde un dbf

Publicado por E.T. (1106 intervenciones) el 10/03/2008 18:23:32
Necesito que lo ejecutes linea a linea, sabes como hacerlo? para saber que linea es la que manda el error.

Veo que e, último campo está vacio, puede ser ese el error, pero primero checa ejecutar el proceso linea a linea
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Importar txt desde un dbf

Publicado por E.T. (1106 intervenciones) el 10/03/2008 18:33:50
Sospecho que es esta linea

Table1.Fields[j].AsString:=valor;

debes de checar en tu tabla que tambien haya 6 campos, pues si es uno menos te marca index out of bounds
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Importar txt desde un dbf

Publicado por jesusalba (14 intervenciones) el 10/03/2008 19:04:10
corre bien linea a linea pero nada mas llega hasta la linea .5630

pero ya halle en problema, en las descripciones hay comas (,) inmersas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Importar txt desde un dbf

Publicado por E.T. (1106 intervenciones) el 10/03/2008 19:55:52
Ha, está bien, entonces hay que buscar otro caracter de separación o no permitir comas en los valores
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Importar txt desde un dbf

Publicado por jesusalba (14 intervenciones) el 10/03/2008 21:07:29
lo que voy a hacer es que voy a editar el archivo en excel y voy a quitar las comas del campo descripcion porque el delimitador entre campos son las mismas comas.

porque el archivo lo exporto desde un sistemas llamado sae.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Importar txt desde un dbf

Publicado por jesusalba (14 intervenciones) el 12/03/2008 00:02:46
estimado et al querer importar mi cartera de clientes me manda un error porque manejo una fecha dd/mmm/aa y asigne a la base de datos tipo date y me marca que no acepta ese formato...

que puedo hacer?

por otro lado ya cambie el delimitador de campos de coma (,) a punto y coma (;) y nada mas hice el cambio en el posex

slds
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Importar txt desde un dbf

Publicado por E.T. (1106 intervenciones) el 12/03/2008 00:16:43
Hay una variable de sistema que se llama ShortDateFormat, tipo String, intenta cambiarla a 'dd/mm/yyyy' o 'mm/dd/yyyy' no recuerdo bien cual, con eso los tipo date deben usar el formato especificado,

digamos:

ShortDateFormat:='dd/mm/yyyy';
showmessage(datetostr(now));
//te debe de mostrar 11/03/2008
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar