PDA

Ver la Versión Completa : Sigo con problemas con los indices


Antuan
06-10-2005, 20:30:30
Envio el ejemplo por si alguien me lo puede corregir yo me siento incapaz por ser un novato.
Ya me fucnciona pero me genera la base de nuevo y me borra los datos con lo cual he intentado eliminar la parte que genera los campos y entonces no me genera los indices.
De la manera que lo tengo. Me genera solo un indice si le dejo los 3 me da error y no me lo genera.
Solo quiero que me cree los 3 indices y no me genere la base de datos para que no me machaque los datos.
Os agradezco mucho vuestra ayuda.
Muchas gracias

Neftali [Germán.Estévez]
07-10-2005, 09:55:05
Vamos a ver. ëste es el texto que tú tienes:



procedure TForm1.Button1Click(Sender: TObject);
var
Table1 : TTable;
begin
{ Criar arquivos }
Table1 := TTable.create(Application);
{ Cria arquivo }
with Table1 do
begin
Active := False;
DatabaseName := 'C:\prueba';
TableName := 'amigos.dbf';
TableType := ttdBASE;
with FieldDefs do
begin
Clear;
Add('Nombre', ftString, 20, False); // que puedo hacer
Add('Apellido1', ftString, 20, False); // para eliminar
Add('Apellido2', ftString, 20, False); // estas 3 lineas y que funcione
end;
CreateTable;
AddIndex('indice1', 'Nombre', [ixExpression]);
// AddIndex('indice2', 'Apeddido1', [ixExpression]); y dejar estas
// AddIndex('Indice3', 'Apellido2', [ixExpression]); dos lineas
// lo he intentado muchas veces y no me finciona
// pero segun esta si funcioan pero tengo que quitar esas 3 lineas para que no me
// elimine los datos de la tabla y dejar las dos de abajo para que me cree 3 indices.
end;
end;


Algunas cosillas:
(1) Si eliminas los campos y los vuelves a crear el logico que pierdas los datos. Si quieres crear índices, ¿porqué eliminas los campos?
(2) Algo similar pasará (supongo si haces el CreateTable)
(3) Al crear el segundo campo estás utilizando el nombre de campo 'Apellido2', que seguro que da error ya que el campo se llama: Apellido (eso debe ser un despiste).
(4) Puesto que ya tienes un componente visual llamado Table1, no hace falta que lo definas y que lo crees de nuevo.
(5) Por último y como recomendación, siempre que se generen errores, por favor, descríbelos detalladamentre (pon el texto exacto), eso nos puede dar una idea de lo que está pasando.

Utiliza éste código:


procedure TForm1.Button1Click(Sender: TObject);
begin
with Table1 do begin
Active := False;
DatabaseName := 'C:\temp\prueba';
TableName := 'amigos.dbf';
TableType := ttdBASE;
// Crear los tres indices
AddIndex('indice1', 'Nombre', [ixExpression]);
AddIndex('indice2', 'Apellido1', [ixExpression]);
AddIndex('Indice3', 'Apellido2', [ixExpression]);
end;
end;


Si cuando se ejecute abres la BD con el DataBase desktop, verás que tienes los tres indices creados correctamente.

Neftali [Germán.Estévez]
07-10-2005, 10:04:59
Te he añadido la comprobación de que existen y enel adjunto.

Antuan
07-10-2005, 20:08:16
Muchas gracias por tu correcion este codigo lo pondre en un boton y de vez en cuando indexare de nuevo los indices.
Por cierto el ejemplo que me envias me da error y no puedo ejecutarlo.
Salen como dos botones al ejecutarlo y sin embargo en tiempo diseño solo hay un boton y el codigo es el mismo que yo te envien.
Es algo muy raro.
De todas formas muchas gracias

marcoszorrilla
07-10-2005, 21:15:02
procedure TForm1.Button3Click(Sender: TObject);
begin
table1.DeleteIndex('Indice1');
table1.DeleteIndex('Indice2');
table1.DeleteIndex('Indice3');
end;


Pon otro botón con este código para empezar primero eliminando los índices y verás como te funciona correctamente.

Un Saludo.

Neftali [Germán.Estévez]
10-10-2005, 10:48:45
....Por cierto el ejemplo que me envias me da error y no puedo ejecutarlo. Salen como dos botones al ejecutarlo y sin embargo en tiempo diseño solo hay un boton y el codigo es el mismo que yo te envien.

Revisa las Units que estás cogiendo, he bajado el ejemplo que yo mismo subí y lo compilo sin problemas en Delphi 6; Además las Units están correctas.
Hay dos botones y un ListBox; El código de ambos botones es el siguiente:


procedure TForm1.Button1Click(Sender: TObject);
begin
{ Crea arquivo }
with Table1 do begin
Active := False;
DatabaseName := 'C:\temp\prueba';
TableName := 'amigos.dbf';
TableType := ttdBASE;
// Crear los tres indices
AddIndex('indice1', 'Nombre', [ixExpression]);
AddIndex('indice2', 'Apellido1', [ixExpression]);
AddIndex('Indice3', 'Apellido2', [ixExpression]);
end;

end;

procedure TForm1.Button2Click(Sender: TObject);
var
i:Integer;
iDef:TIndexDef;
begin

with Table1 do begin
Active := False;
DatabaseName := 'C:\temp\prueba';
TableName := 'amigos.dbf';
TableType := ttdBASE;
end;

// Referescar info.
Table1.IndexDefs.Update;
// Recorrer los índices
for i := 0 to (Table1.IndexDefs.Count - 1) do begin
iDef := Table1.IndexDefs.Items[i];
// Nombre
ListBox1.Items.Add('Nombre: ' + iDef.Name);
// Campos
ListBox1.Items.Add(' Campos: ' + iDef.Fields);
end;

end;

Antuan
10-10-2005, 20:52:11
Muchas gracias por los ejemplos. Esto me ha ayudado bastante a comprender el manejo de los indices.
Lo que siento es que como son bases antiguas. No disponer de informacion acerca del manejo de este tipo de bases.
Ahora ya se utilizan otro tipo de bases y la documentacion que se encuientra es de estas bases mas modernas y no de las de tipo DBF.
Muchas gracias.