AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Firebird Reihenfolge der Tabellen bei Insert mit Foreignkey
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird Reihenfolge der Tabellen bei Insert mit Foreignkey

Ein Thema von Kostas · begonnen am 10. Jun 2016 · letzter Beitrag vom 14. Jun 2016
 
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Firebird Reihenfolge der Tabellen bei Insert mit Foreignkey

  Alt 10. Jun 2016, 17:48
Auf Basis von Firedac:

hatte ich mal für ein ähnliches InHouse Problem bei uns so gelöst:

Delphi-Quellcode:
procedure TdbMoveOld.Execute_copy_Work;
var
  lTables: Tstringlist;
  lTablesnoReference: Tstringlist;
  lTablesWithReference: Tstringlist;
  lTablesDummy: Tstringlist;
  lTablename: string;
  lfkey: string;

  lFinishedTables: Tstringlist;
  aindex: integer;

  function getIndexforinsert: integer;
  var
    dummy: Tstringlist;
    i, temp: integer;
    s: string;
    found: boolean;
  begin
    result := -1;
    for i := 0 to lTablesWithReference.count - 1 do
    begin
      dummy := pointer(lTablesWithReference.Objects[i]);

      if dummy <> nil then
      begin
        found := true;
        for s in dummy do
          if not lFinishedTables.find(s, temp) then
          begin
            found := false;
          end;
        if found then
          exit(i);
      end;

    end;
  end;

begin
  lTables := Tstringlist.create;
  lTablesnoReference := Tstringlist.create;
  lTablesWithReference := Tstringlist.create;
  lFinishedTables := Tstringlist.create;
  lFinishedTables.Sorted := true;

  try
    // Get All Tables
    FileDestConnection.GetTableNames('', '', '', lTables, [osMy], [tkTable]);

    for lTablename in lTables do
    begin
      // CwLogSave.send(lTablename);
      metaQuery.MetaInfoKind := mkForeignKeys;
      metaQuery.ObjectName := lTablename;
      metaQuery.Open;
      if metaQuery.RecordCount > 0 then
      begin
        lTablesDummy := Tstringlist.create;
        lTablesDummy.Sorted := true;
        lTables.Duplicates := dupIgnore;

        while not metaQuery.eof do
        begin
          lfkey := metaQuery.FieldValues['PKEY_TABLE_NAME'];
          if lfkey <> lTablename then
            lTablesDummy.add(lfkey);
          metaQuery.Next;
        end;
        lTablesWithReference.AddObject(lTablename, lTablesDummy);
      end
      else
      begin
        // There is no reference so put in in the list
        lTablesnoReference.add(lTablename);
      end;
      metaQuery.Close;
    end;

    // Now try the loop


    // First all Tables without any references
    for lTablename in lTablesnoReference do
    begin
      lFinishedTables.add(lTablename);
      CopyData(lTablename); // Die must Du Dir selber bauen
    end;

    while lTablesWithReference.count > 0 do
    begin
      aindex := getIndexforinsert;
      if aindex > -1 then
      begin
        // CwLogSave.send('Insert now ' + lTablesWithReference[aindex]);
        lFinishedTables.add(lTablesWithReference[aindex]);
        if (lTablesWithReference.Objects[aindex] <> nil) then
          Tstringlist(lTablesWithReference.Objects[aindex]).free;
        lTablename := lTablesWithReference[aindex];
        lTablesWithReference.delete(aindex);

        CopyData(lTablename); // Die must Du Dir selber bauen

      end
      else
        break; // Ther is a error
    end;

    if lTablesWithReference.count > 0 then
    begin
      CwLogSave.senderror('Not all found');

      CwLogSave.entermethod('Tables with references');
      for lTablename in lTablesWithReference do
        CwLogSave.send(lTablename);
      CwLogSave.ExitMethod('Tables with references');
    end;

  finally
    lTables.free;
    lTablesnoReference.free;
    lTablesWithReference.free;
    lFinishedTables.free;
  end;

end;
Fritz
Fritz Westermann
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:00 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