Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi .dbf BDE (https://www.delphipraxis.net/71675-dbf-bde.html)

Andy U 19. Jun 2006 14:01

Datenbank: BDE • Zugriff über: Aus Delphi direkt

.dbf BDE
 
Hallo

folgendes Problem:

ich möchte aus einer Record-Liste eine .dbf-Datei erstellen. Das ganze muss nach Vorgabe mit BDE laufen. Bisher gibt es folgenden Code, der wohl schon mal (Win16) funktioniert hat.


Folgendes ist bekannt:
list_begin : ist der Zeiger auf eine Liste der Daten, die aus der Datei gelesen wurden
FileName : Zieldateiname

Delphi-Quellcode:
...
type
  log_struc = ^struc;
  struc = record
    id                    : integer;       { Nr. des Datensatzes }
    Datum                 : string[10];    { Datum des Aufzeichnens }
    Std, Min, Sek         : byte;          { Zeit der Aufzeichnung }
    ...
    km                    : real48;
    ...
    Prev                  : log_struc;     { der Vorgänger Pointer }
    Next                  : log_struc;     { und der Nachfolger }
  end;

Table1 : TTable
listBegin
...

procedure NewDb;
var
    p : log_struc;                  { interne Struktur der Aufzeichnungsdaten }
begin
  with Table1 do
  begin
    Active      := False;                  
    DatabaseName := 'MyNewAlias';      // einen Alias vergeben
    TableName   := FileName;          // und hier den echten Namen zuordnen
    TableType   := ttDBase;           // Datentyp ist DBase
    { Nun werden falls vorhanden sämtliche Felder entfernt und dann neu
      definiert, mit Typ und Größe, hier wurde sich an das TAL Format gehalten }
    with FieldDefs do
    begin
      Clear;
      Add('Datum',  ftString, 10, false);
      Add('Std',    ftInteger, 0, false);
      Add('Min',    ftInteger, 0, false);
      Add('Sek',    ftInteger, 0, false);
      ...
      Add('km',     ftfloat,  0, false);
      ...
      Add('Text',   ftString, 10, false);
    end;
    CreateTable;                       // das wars und nun erzeugen
  end;

  { Datenbankstruktur ist damit definiert, nun können Daten eingetragen werden }
  p := list_begin;      { auf den Anfang unserer Aufzeichnungdatenliste }
  Table1.Active := True;               // Tabelle aktivieren
  while p <> nil do                    // Nun durch die ganze Liste gehen
  begin
    Table1.Append;                     // und Datensätze anhängen
    ...
    Table1.FieldByName('km').AsFloat     := p^.km;
    Table1.FieldByName('Std').AsInteger  := p^.std;
    Table1.FieldByName('Min').AsInteger  := p^.min;
    Table1.FieldByName('Sek').AsInteger  := p^.sek;
    Table1.FieldByName('Datum').AsString := p^.datum;
    ...
    Table1.FieldByName('Text').AsString  := p^.Text;
    p := p^.next;                      // auf nächsten Listenelement zeigen
  end;
  Table1.Post;                         // Datensätze in Datenbank schreiben
  Table1.close;                        // Tabelle löschen
  intro.konvstat.visible := False;     // Gauge verschwindet wieder
end;

Ergebnis: .dbf-Datei, Inhalt: Müll......
Exel zeigt irgendwelchen Schrott an, BDE-Datenbankoberfläche sagt gleich, dass sie das gar nicht erst öffnet.

Alle Tips die ich so gefunden haben liefen auf "nimm lieber...anstatt BDE" aber vielleicht kann mir doch jemand was sagen.

mkinzler 19. Jun 2006 14:12

Re: .dbf BDE
 
Hast du mal im Debugger nachgesehen, wo der "Müll" entsteht? Stimmen die Werte, die er aus der Liste lädt? Obwohl die BDE veraltet ist, vermute ich mal, das der Fehler nicht an der Speicherung in der Datenbank liegt, sondern in der Interpretation der Liste.

Andy U 19. Jun 2006 14:21

Re: .dbf BDE
 
hi,

wo entsteht der "Müll"??? Die Liste stimmt, mehrfach geprüft(!!), und in der .dbf-Datei stimmen nicht mal die Überschriften bzw. Spalten etc. (bei Exel). Und wie gesagt, das Format ist an sich nicht lesbar.

Kann es vielleicht daran liegen, dass beim Erstellen der Tabelle die Felder in einer anderen Reihenfolge angegeben werden wie beim Eintragen der Daten?

mkinzler 19. Jun 2006 14:24

Re: .dbf BDE
 
Un der Schreibcode stimmt auch. Überprüfre mal im Debugger, welcher Wert p^.km und die weiteren Felder hier
Delphi-Quellcode:
Table1.FieldByName('km').AsFloat     := p^.km;
...
haben.

EDatabaseError 19. Jun 2006 14:40

Re: .dbf BDE
 
Delphi-Quellcode:
with Table1 do begin
 active:=false; // Table-Zugriff muss auf jeden Fall geschlossen sein
 DatabaseName:=verzeichnis; // Verzeichnis, in dem die Tabelle erzeugt werden soll
 TableName:='Artikel'; // Name der Datei, die erzeugt werden soll
 TableType:=ttdBase; // Tabelle erhält das dBase-Format
 with FieldDefs do begin  
  clear;
  Add('NAME', ftString, 25, false);
  Add('BEZ', ftString, 50, false);
 end;
 CreateTable;
end;
Also hier hab ich schnell nomal ne Prozedur rausgekrammt bei der das erstellen von dbf dateien auf jeden fall läuft.

Andy U 19. Jun 2006 14:45

Re: .dbf BDE
 
@mkinzler
p^km hat z.b. den Wert 0.0175 dann hat Table1.FieldByName('km'.AsFloat) den selben Wert
Ich benutze übrigens Delphi v6.0 unter WinXP.

@EDatabaseError
wo ist der Unterschied?

EDatabaseError 19. Jun 2006 14:51

Re: .dbf BDE
 
Zitat:

Zitat von Andy U
@EDatabaseError
wo ist der Unterschied?

Du vergibst unter Databasename einen Alias / MyNewAlias in dem Webtut von mir steht das an der stelle das Verzeichnis z.B. c:\... stehen muss. Und wie gesagt die Datenbankoberfläche öffnet normalerweise alles, zeigt es dann nur komisch an. Und ich hab meins mal gepostet, da ich weiß das es mit dieser methode der erstellung zu 1000 % funkt.

Andy U 19. Jun 2006 15:16

Re: .dbf BDE
 
Sorry, sollte kein Angriff sein!

Ich habe mal
SQL-Code:
DatabaseName := 'C:\Programme';
eingegeben und die Datei dann via Dialog unter xyz.dbf nach c:\Programme gespeichert.
Geht aber immer noch nicht.

Die Datenbakoberfläche sagt:
"Die Tabelle kann nicht geöffnet werden" und nach >>
"Ungültiger Parameter"
und öffnet gar nichts.

Ich werde den Teil wohl mal aus dem kompletten Programm auskoppeln müssen und etwas experimentieren, bis ich weiß wie das ganze so richtig funktioniert. Wer weiß woher da welche Fehler kommen.

mkinzler 19. Jun 2006 15:22

Re: .dbf BDE
 
Verwende mal zum Test TDbf. So kannst du eingrenzen, wo der Fehler liegt.

marabu 19. Jun 2006 15:35

Re: .dbf BDE
 
Hi.

Als erstes würde ich prüfen, ob das CreateTable() funktioniert hat. Der Alias wird nur gebraucht, wenn eine TDatabase-Komponente eingesetzt wird. Den Aufruf der Methode Post() würde ich innerhalb der Schleife machen.

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:05 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz