Board index » delphi » Crear DBF en runtime

Crear DBF en runtime

Hola,
Trabajo con Delphi 1.0 y quiero crear una base de datos en RUNTIME
definiendo cada uno de los campos.
Estoy trabajando con FieldDefs y FieldDef, pero estoy hecho un lio y
no he logrado poderlo resolver.
?Me pueden pasar informacin o un procemiento?.
Algn libro que entre en estas materias en castellano.
Un saludo.
 

Re:Crear DBF en runtime


evel...@jet.es (Eloy Velzquez Lpez) wrote:

Quote
>Hola,
>Trabajo con Delphi 1.0 y quiero crear una base de datos en RUNTIME
>definiendo cada uno de los campos.
>Estoy trabajando con FieldDefs y FieldDef, pero estoy hecho un lio y
>no he logrado poderlo resolver.
>?Me pueden pasar informacin o un procemiento?.

Veamos si puedo hacerlo.

Supongamos que quieres crear una base de datos con la siguiente
estructura:

  Cdigo : string[10];
  Nombre : string[40];
  Direccin : string[60];
  Deuda : double;

Para crearla en tiempo de ejecucin deberas hacer:

  procedure Form1NoseQueClick(sender:TObject);
  var
    TableEjemplo:TTable;
  begin
    TableEjemplo:=TTable.Create(self);
    try
      with TableEjemplo do begin
        DatabaseName:='DelphiAlias';  { el alias que sea }
        TableName:='xxx.db';          { el nombre  de tabla }
{ el 1er. parmetro de "Add" es el nombre del campo, si trabajas en
Paradox puedes utilizar acentos; el segundo es el tipo de campo, el
tercero el tama?o, que ser cero para aquellos de longitud fija (como
los ftFloat; y el ltimo indica si el campo es requerido o no }
        FieldDefs.Add('Cdigo',ftString,10,False);
        FieldDefs.Add('Nombre',ftString,40,False);
        FieldDefs.Add('Direccin',ftString,60,False);
        FieldDefs.Add('Deuda',ftFloat,0,False);
{ ahora hay que definir el o los ndices, en Paradox debe haber un
ndice primario que podra ser compuesto por varios campos (Ej:
'Cdigo;Nombre' ) separados por "punto y coma" pero obligatoriamente
han
de estar en el mismo orden en que se a?adieron a "FieldDefs" }
        IndexDefs.Add('','Cdigo',[ixPrimary]);
        CreateTable;
        Open;
      end;
      ...
      { aqu ira todo el cdigo para procesar los datos }
      ...
   finally
     TableEjemplo.Close;
     TableEjemplo.Free;
   end;
  end;

Si el mbito de utilizacin de la tabla fuese superior a un simple
mtodo, deberas definir la tabla como parte de la TForm en que se
utilizar:

type
  TForm1=class(TForm)
    ...
    { definiciones normales }
    ...
    TableEjemplo:TTable;
  private
    ...
  public
    ...
  published
    ...
  end;

La podrs crear en el procedure Create, siendo innecesarios tanto el
"try" como el "finally", asegurndote de hacer que el "Owner" de la
tabla sea Form1 (o como se llame):

procedure TForm1.Form1Create(sender:TObject);
begin
  TableEjemplo:=TTable.Create(self);
{ fijamos como Owner de la tabla a "self", es decir TForm1 }
  with TableEjemplo do begin
    DatabaseName:='DelphiAlias';  { el alias que sea }
    TableName:='xxx.db';          { el nombre  de tabla }
    FieldDefs.Add('Cdigo',ftString,10,False);
    FieldDefs.Add('Nombre',ftString,40,False);
    FieldDefs.Add('Direccin',ftString,60,False);
    FieldDefs.Add('Deuda',ftFloat,0,False);
    IndexDefs.Add('','Cdigo',[ixPrimary]);
    CreateTable;
    Open;
  end;
  ...
  { resto de OnCreate }
  ...
end;

En este caso no ser necesario ocuparse del "TableEjemplo.Free" para
liberar la memoria, pues ya se encargar de hacerlo Form1 (para ello
hemos establecido su parentesco).

Para resolver tus dudas puedes usar la ayuda en linea, busca, por
ejemplo en "Add method|Add method for TFieldDefs objects" y en "Add
method|Add method for IndexDefs objects"

Todava existe otro mtodo de crear una tabla en runtime: utilizando
un
TQuery; de este modo es facil crear tablas sin necesitar un TTable.
As
en nuestro ejemplo anterior haramos:

  with Query1 do begin
    Databasename:= 'DelphiAlias';
    with SQL do begin
      Clear;
      Add('CREATE TABLE "XXX.DB" (');
        Add('Cdigo CHARACTER(10),');
        Add('Nombre CHARACTER(40),');
        Add('Direccin CHARACTER(60),');
        Add('Deuda MONEY,');
      Add('PRIMARY KEY(Cdigo)');
      Add(')');
      ExecSQL;
      Clear;
      Add('CREATE INDEX otro ON "XXX.DB" (Nombre)');
      ExecSQL;
    end;
  end;

En este caso tambin creamos un ndice secundario de nombre "otro"
para
el campo "Nombre".

Quote
> Algn libro que entre en estas materias en castellano.

Ni idea, conozco alguno en Ingls, pero ni siquiera lo tengo.
En el "Delphi Magazine" de Febrero de 1996 publicaron una comparativa
de libros sobre Delphi pero estn todos en Ingls, aunque seguro que
ya hay alguno traducido al Castellano.

Espero haberte servido de ayuda.

Un saludo,
     Francisco.

Re:Crear DBF en runtime


evel...@jet.es (Eloy Velzquez Lpez) wrote:

Quote
>Hola,
>Trabajo con Delphi 1.0 y quiero crear una base de datos en RUNTIME
>definiendo cada uno de los campos.
>Estoy trabajando con FieldDefs y FieldDef, pero estoy hecho un lio y
>no he logrado poderlo resolver.
>?Me pueden pasar informacin o un procemiento?.

Permit me translate my answer to English.

Suppose you want to create a table with the next structure:

  Code : string[10];
  Name : string[40];
  Address : string[60];
  Amount : double;

To create it at runtime:

  procedure Form1NoseQueClick(sender:TObject);
  var
    TableExample:TTable;
  begin
    TableExample:=TTable.Create(self);
    try
      with TableExample do begin
        DatabaseName:='DelphiAlias';  { the alias or data directory }
        TableName:='xxx.db';          { you table name }
{ the first parameter in Add is the Field name, if you work with
Paradox tables you can use Spanish chars; the next one is the field
type; the third parameter is the field size, it must be zero in fixed
length types (ftFloat, ftMoney, ...),  the last parameter represents
the required validity check }
        FieldDefs.Add('Code',ftString,10,False);
        FieldDefs.Add('Name',ftString,40,False);
        FieldDefs.Add('Address',ftString,60,False);
        FieldDefs.Add('Amount',ftFloat,0,False);
{ Now you must define the indexes, in Paradox tables the first data
index is the primary one, it could contain one or more fields (ex:
'Code;Name') but always in the definition order (the same as in the
FieldDefs sentences) }
        IndexDefs.Add('','Code',[ixPrimary]);
        CreateTable;
        Open;
      end;
      ...
      { the process code }
      ...
   finally
     TableExample.Close;
     TableExample.Free;
   end;
  end;

If the scope of the table was higher than a simple method, you could
insert the table definition in a container TForm:

type
  TForm1=class(TForm)
    ...
    { your components, buttons, }
    ...
    TableExample:TTable;
  private
    ...
  public
    ...
  published
    ...
  end;

Then, you could create the table in the TForm OnCreate event handler,
therefore it's unnecessary the "try" and "finally" because freeing the
Table its a TForm Destroy method task.
Assure of assigning "self" as the Owner of the table in the
TTable.Create method.

procedure TForm1.Form1Create(sender:TObject);
begin
  TableExample:=TTable.Create(self);
  with TableExample do begin
    DatabaseName:='DelphiAlias';  
    TableName:='xxx.db';          
    FieldDefs.Add('Code',ftString,10,False);
    FieldDefs.Add('Name',ftString,40,False);
    FieldDefs.Add('Address',ftString,60,False);
    FieldDefs.Add('Amount',ftFloat,0,False);
    IndexDefs.Add('','Code',[ixPrimary]);
    CreateTable;
    Open;
  end;
  ...
  { the remainder of  OnCreate }
  ...
end;

The on line help is satisfactory at this point. To solve your
questions, try the keywords "Add method|Add method for TFieldDefs
objects" and "Add method|Add method for IndexDefs objects".

Moreover, there is another way to create a table at runtime: TQuerys.

  with Query1 do begin
    Databasename:= 'DelphiAlias';
    with SQL do begin
      Clear;
      Add('CREATE TABLE "XXX.DB" (');
        Add('Code CHARACTER(10),');
        Add('Name CHARACTER(40),');
        Add('Address CHARACTER(60),');
        Add('Amount MONEY,');
      Add('PRIMARY KEY(Code)');
      Add(')');
      ExecSQL;
      Clear;
      Add('CREATE INDEX Another ON "XXX.DB" (Name)');
      ExecSQL;
    end;
  end;

Here, we also define a secondary index on Name called "Another".

Quote
> Algn libro que entre en estas materias en castellano.

Sorry, I dont know any one. In the Feb-96 issue of "Delphi Magazine",
Bob Swart and Steve Troxell wrote about this in an useful overview
over Delphi books, but all of them in English (of course). I suppose
if you search in a good book store youll find someone translated to
Spanish.

Hope it serves.

Un saludo,
     Francisco.

Other Threads