Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Paradox 7 Tabelle dynamisch aus DB erstellen (https://www.delphipraxis.net/34037-paradox-7-tabelle-dynamisch-aus-db-erstellen.html)

Christian18 16. Nov 2004 12:23


Paradox 7 Tabelle dynamisch aus DB erstellen
 
Hallo,

ich möchte gerne aus meiner DB, in der Feldname, Typ und Länge gespeichert sind eine DB dynamisch erstellen. Wie mache ich das??? Ich hab schon einmal was vorbereitet, funktioniert aber leider nicht. es kommt ein Fehler. Fehler: Ungültiger Parameter. Kann mir jemand helfen??? Achso DM ist ein Datanmodul.

Mit freundlichen Grüßen

Christian18

SubData 16. Nov 2004 12:24

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Poste doch mal den Code den du bisher hast :)

MrSpock 16. Nov 2004 12:26

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Schau dir mal Delphi-Referenz durchsuchenCreateTable an. Du erstellst in Paradox in der Regel nur Tabellen. Die DB ist dann das Verzeichnis aller Dateien, die für die Tabellen erzeugt werden.

Christian18 16. Nov 2004 12:32

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Zitat:

Zitat von SubData
Poste doch mal den Code den du bisher hast :)


ok hier ist mein code:

Delphi-Quellcode:
procedure TFFFeld.BitBtn4Click(Sender: TObject);
  var i : Integer;
begin
  // Datenbank Dynamisch erstellen
  DM.Table1.Active:=false;
  DM.Table1.DatabaseName:=ExtractFilePath(Application.ExeName)+'\dynamischeDB';
  DM.Table1.TableName:=DM.TFormulareFormular.AsString;
  DM.Table1.TableType:=ttParadox;

  DM.Table1.FieldDefs.Clear;
  DM.TFelder.First;
  for i:=1 to DM.TFelder.RecordCount do
    begin
      if
        DM.TFelderFeld.AsString='T'
      then
        begin
          DM.Table1.FieldDefs.Add(DM.TFelderFeld.AsString, ftString, DM.TFelderLaenge.AsInteger, false);
          exit;
        end;
      if
        DM.TFelderFeld.AsString='Z'
      then
        begin
          DM.Table1.FieldDefs.Add(DM.TFelderFeld.AsString, ftInteger, DM.TFelderLaenge.AsInteger, false);
          exit;
        end;
      if
        DM.TFelderFeld.AsString='D'
      then
        begin
          DM.Table1.FieldDefs.Add(DM.TFelderFeld.AsString, ftDate, DM.TFelderLaenge.AsInteger, false);
          exit;
        end;

      DM.TFelder.Next;
    end;
  DM.Table1.CreateTable;

  Close;
end;

SubData 16. Nov 2004 12:44

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Delphi-Quellcode:
if
  DM.TFelderFeld.AsString='T'
then
Was ist denn TFelder? auch ne Datenbank?

Müsste das dann nich etwa so aussehen?

Delphi-Quellcode:
if DM.TFelder.FieldByName('FeldName').asString = 'T' then

Christian18 16. Nov 2004 12:49

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Zitat:

Zitat von SubData
Delphi-Quellcode:
if
  DM.TFelderFeld.AsString='T'
then
Was ist denn TFelder? auch ne Datenbank?

Müsste das dann nich etwa so aussehen?

Delphi-Quellcode:
if DM.TFelder.FieldByName('FeldName').asString = 'T' then

so funktioniert es doch auch oder nicht???
Delphi-Quellcode:
if
  DM.TFelderFeld.AsString='T'
then

SubData 16. Nov 2004 12:54

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Also bei mir nicht -g-

Christian18 16. Nov 2004 12:59

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Zitat:

Zitat von SubData
Also bei mir nicht -g-

um noch mal was zu der DB zu sagen. es gibt eine DB die heißt Formulare an dieser DB hängen über einen Index die Felder drann. und jetzt wollte ich anhand dieser Informationen eine Weitere Db erstellen und zwar mit den Informationen die in der ersten und zweiten Db gespeichert sind.

mit freundlichen grüßen

Christian18

SubData 16. Nov 2004 13:02

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Das hab ich schon verstanden allerdings musst du ja dem Programm irgendwie sagen in welcher Spalte er denn schauen soll was das fürn Wert ist. Und den Spalten namen schreibst einfach FieldByName('NAME') rein :)

FieldDefs.Add erzeugt übrigens eine neue Spalte in der Datenbank, NICHT eine neue Zeile ... Dafür musste Delphi-Referenz durchsuchenAppend bzw. Delphi-Referenz durchsuchenAppendRecord verwenden

Christian18 16. Nov 2004 13:17

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Zitat:

Zitat von SubData
Das hab ich schon verstanden allerdings musst du ja dem Programm irgendwie sagen in welcher Spalte er denn schauen soll was das fürn Wert ist. Und den Spalten namen schreibst einfach FieldByName('NAME') rein :)

FieldDefs.Add erzeugt übrigens eine neue Spalte in der Datenbank, NICHT eine neue Zeile ... Dafür musste Delphi-Referenz durchsuchenAppend bzw. Delphi-Referenz durchsuchenAppendRecord verwenden

ich will doch auch eine neue spalte in der DB erzeugen.

SubData 16. Nov 2004 13:19

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Ja dann is ok...

Solltest trotzdem mit FieldByName arbeiten sonst wird das wohl nix.

MrSpock 16. Nov 2004 13:31

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Hallo Christian,

das hat nichts mit FieldByName zu tun. Eine Tabelle wird z.B. so erzeugt:

Delphi-Quellcode:
 with Table1.FieldDefs do
  begin
    Clear;
    Add('Field1', ftInteger, 0, True);
    Add('Field2', ftString, 30, False);
  end;

  Table1.CreateTable;
D.h. du musst als ersten den Feldnamen angeben und dann den Typ. Mir ist auch noch nicht ganz klar, wo du diese Informationen herholst, was also z.B. DM.TFelderFeld.AsString sein soll?

SubData 16. Nov 2004 13:38

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Zitat:

Zitat von MrSpock
Mir ist auch noch nicht ganz klar, wo du diese Informationen herholst, was also z.B. DM.TFelderFeld.AsString sein soll?

Das war mit FieldByName gemeint => DM.TFelder.FieldByName('Feld').asString;
Ich redete vom Lesezugriff nicht vom Schreibzugriff :roll:

Christian18 16. Nov 2004 14:04

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Hallo,

ich bins nocheinmal.

ich habe jetzt mein Programm noch einmal getestet und festgestellt, dass es an folgenden code liegt:



Delphi-Quellcode:
      if
        DM.TFelder.FieldByName('Feld').AsString='T'
      then
        DM.Table1.FieldDefs.Add(DM.TFelderFeld.AsString, ftString, DM.TFelderLaenge.AsInteger, False);
      if
        DM.TFelder.FieldByName('Feld').AsString='I'
      then
        DM.Table1.FieldDefs.Add(DM.TFelderFeld.AsString, ftInteger, DM.TFelderLaenge.AsInteger, False);
      if
        DM.TFelder.FieldByName('Feld').AsString='D'
      then
        DM.Table1.FieldDefs.Add(DM.TFelderFeld.AsString, ftDate, DM.TFelderLaenge.AsInteger, False);

      DM.TFelder.Next;
PS: was habe ich hier alsch gemacht???

Mit freundlichen Grüßen

Christian18

SubData 16. Nov 2004 14:38

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Delphi-Quellcode:
      if
        DM.TFelder.FieldByName('Feld').AsString='T'
      then
==>    DM.Table1.FieldDefs.Add(DM.TFelderFeld.AsString, ftString, DM.TFelderLaenge.AsInteger, False);
      if
        DM.TFelder.FieldByName('Feld').AsString='I'
      then
==>    DM.Table1.FieldDefs.Add(DM.TFelderFeld.AsString, ftInteger, DM.TFelderLaenge.AsInteger, False);
      if
        DM.TFelder.FieldByName('Feld').AsString='D'
      then
==>    DM.Table1.FieldDefs.Add(DM.TFelderFeld.AsString, ftDate, DM.TFelderLaenge.AsInteger, False);
Du hast da genau den gleichen Fehler drin.
DM.TFelderFeld.asString => DM.TFelder.FieldByName('Feld').asString :)

Christian18 16. Nov 2004 19:52

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Zitat:

Zitat von MrSpock
Hallo Christian,

das hat nichts mit FieldByName zu tun. Eine Tabelle wird z.B. so erzeugt:

Delphi-Quellcode:
 with Table1.FieldDefs do
  begin
    Clear;
    Add('Field1', ftInteger, 0, True);
    Add('Field2', ftString, 30, False);
  end;

  Table1.CreateTable;
D.h. du musst als ersten den Feldnamen angeben und dann den Typ. Mir ist auch noch nicht ganz klar, wo du diese Informationen herholst, was also z.B. DM.TFelderFeld.AsString sein soll?

hallo Mr. Spock,

um noch mal zu dieser zeiel zu sagen.

DM.Table1.FieldDefs.Add(DM.TFelderFeld.AsString, ftInteger, DM.TFelderLaenge.AsInteger, false);

Dm ist bei mir ein Datenmodul.

ich habe eine DB die heißt Formulare in dieser Db sind die namen der Formulare gespeichert. dann habe ich auch noch eine Db die heißt Felder. in dieser DB wird gespeichert:
- Name des Feldes,
- Typ des Feldes,
- länge des Feldes.

und jetzt will ich dynamisch eine DB erstellen. der name der Tabelle die erstellt werden soll wird aus der DB Formulare geholt. und welche felder in dieser DB enthalten sein sollen, dass wird auch aus einer DB geholt. Aus der Datenbank Felder.

Also

mit

DM.TFelderfeld.AsString

damit hole ich die daten aus der DB.

Ich hoffe ich konnte meine Problematik ein bisschen verständlicher machen.

mit fruendlichen grüßen

Christian18

Mystic 16. Nov 2004 19:58

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Kann man da nicht auch einen SQL-Befehl CREATE TABLE benutzen?

MrSpock 16. Nov 2004 20:06

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Hallo Christian,

jetzt habe ich verstanden, was du willst.

Ein Fehler ist, dass du die eine Schleife benutzt (for i:=1 to ...) und dann noch mit First und next durch die Datenmenge läufst.

Delphi-Quellcode:
 DM.Table1.FieldDefs.Clear;
DM.TFelder.First;

while NOT DM.TFelder.Eof do
begin
  if DM.TFelderFeld.AsString='T' then
      DM.Table1.FieldDefs.Add(DM.TFelderFeld.AsString, ftString, DM.TFelderLaenge.AsInteger, false)
  else if DM.TFelderFeld.AsString='Z' then
      DM.Table1.FieldDefs.Add(DM.TFelderFeld.AsString, ftInteger, DM.TFelderLaenge.AsInteger, false)
  else if DM.TFelderFeld.AsString='D' then
      DM.Table1.FieldDefs.Add(DM.TFelderFeld.AsString, ftDate, DM.TFelderLaenge.AsInteger, false);
         
   DM.TFelder.Next;
end;
DM.Table1.CreateTable;
So sollte es funktionieren.

Christian18 16. Nov 2004 20:08

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
hi,

versteh ich irgendwie nicht meine schleife macht doch eigentlich auch nicht anderes als deine oder???

mfg

christian18

Christian18 16. Nov 2004 20:14

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
es kommt trotz deiner anderen schleife immer noch der gleiche fehler. der fehler war ungültiger Parameter. ich sitze jetzt schon den ganzen tag an dieser kleien procedure. ich weiß auch nicht was ich immer falsch mache.

mfg christian18

Christian18 16. Nov 2004 20:15

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
achso einz vieleicht noch hier einmal ein aktueller quellcode:

Delphi-Quellcode:
procedure TFFFeld.BitBtn4Click(Sender: TObject);
  var i : Integer;
begin
  // Datenbank Dynamisch erstellen
  DM.Table1.Active:=False;
  DM.Table1.DatabaseName:=ExtractFilePath(Application.ExeName) + 'dynamischeDB\';
  DM.Table1.TableName:=DM.TFormulareFormular.AsString;
  DM.Table1.TableType:=ttParadox;

  DM.Table1.FieldDefs.Clear;
  DM.TFelder.First;

while NOT DM.TFelder.Eof do
begin
  if DM.TFelderFeld.AsString='T' then
      DM.Table1.FieldDefs.Add(DM.TFelderFeld.AsString, ftString, DM.TFelderLaenge.AsInteger, false)
  else if DM.TFelderFeld.AsString='Z' then
      DM.Table1.FieldDefs.Add(DM.TFelderFeld.AsString, ftInteger, DM.TFelderLaenge.AsInteger, false)
  else if DM.TFelderFeld.AsString='D' then
      DM.Table1.FieldDefs.Add(DM.TFelderFeld.AsString, ftDate, DM.TFelderLaenge.AsInteger, false);

   DM.TFelder.Next;
end;
DM.Table1.CreateTable;

  DM.Table1.CreateTable;
end;

MrSpock 16. Nov 2004 20:19

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Hallo Christian,

du hast Recht dein Code macht das gleiche. War nur etwas ungewöhnlich.

Es liegt glaube ich an der Länge der Felder. Für Integer und Date muss glaube ich immer 0 übergeben werden.

[zusatz]
Du kannst zumindest bei D7 die letzten beiden Parameter auch weglassen. Sie haben default Werte für alles außer Strings.
Außerdem gibt es die neue Funkion AddFieldDefs
[/zusatz]

Christian18 16. Nov 2004 20:26

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
hallo Mr. Spock,

wenn in der erstellten DB das Feld vom Typ datum oder integer ist, dann habe ich das so gemacht das, das jeweilige längen Feld auf 0 gesetz wird. also das kann es dann auch nicht sein.

MrSpock 16. Nov 2004 20:31

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Hallo Christian,

gehe die Schleife einmal Schritt für Schritt durch und überpüfe die Werte für Feld und Laenge an der Stelle, an der der Fehler auftritt.

Könnte es sein, das keine Bedingung erfüllt ist, weil z.B. 'T ' (mit blank) in der Tabelle steht und deshalb FieldDefs leer ist, wenn die Tabelle erstellt werden soll?

Christian18 16. Nov 2004 20:35

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Hallo,

der fehler tritt immer bei Create table auf. Die Idee mit der Schleife hatte ich auch schon. :)

MFG

Christian18

MrSpock 16. Nov 2004 20:39

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Hallo Christian,

hat einer der Namen Umlaute oder Sonderzeichen?

Hänge doch einmal die Tabelle TFelder an, dann probier ich das mal aus.

Bist du auch sicher, dass die Tabelle noch nicht existiert?

Christian18 16. Nov 2004 20:43

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
hier die tabelle TFelder

Christian18 16. Nov 2004 20:54

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Zitat:

Zitat von MrSpock
Hallo Christian,

hat einer der Namen Umlaute oder Sonderzeichen?

Hänge doch einmal die Tabelle TFelder an, dann probier ich das mal aus.

Bist du auch sicher, dass die Tabelle noch nicht existiert?

eigentlich schon denn im verzeichnis wo die DB erstellt werden soll, da ist keine DB :)

MrSpock 16. Nov 2004 21:59

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Hallo Christian,

ich muss Morgen auf Dienstreise und kann mir das erst übermorgen genauer anschauen. Aber ich bin sicher, das das lösbar ist.

MrSpock 16. Nov 2004 22:04

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Hallo Christian,

Feldnamen dürfen nicht mit einer Ziffer beginnen!

MrSpock 18. Nov 2004 20:49

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Hallo Christian,

ist das Problem jetzt gelöst?

Christian18 19. Nov 2004 07:37

Re: Paradox 7 Tabelle dynamisch aus DB erstellen
 
Zitat:

Zitat von MrSpock
Hallo Christian,

ist das Problem jetzt gelöst?

Hallo Mr. Spock,

ich habe das Problem jetzt gelöst. Es lag an den Entscheidungen. ich habe es jetzt mit case gemacht und jetzt funktioniert es.

Mit freundlichen Grüßen

Christian18


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:05 Uhr.

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-2025 by Thomas Breitkreuz