AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DBF Spaltennamen ändern

Ein Thema von Kondzie · begonnen am 7. Aug 2019 · letzter Beitrag vom 8. Aug 2019
 
Kondzie

Registriert seit: 7. Aug 2019
5 Beiträge
 
#1

DBF Spaltennamen ändern

  Alt 7. Aug 2019, 15:41
Datenbank: DBF • Version: 3 • Zugriff über: UniDac
Hallo liebe Community!

Ich versuche gerade kopfzerbrechend einen Fehler bei mir zu finden und komme einfach nicht weiter...

Grundgedanke:
Ich möchte/muss einige Spaltennamen in DBASE III umbenennen. Da der ODBC-Treiber "dumm" ist, klappt ja kein "ALTER TABLE".
Deswegen speichere ich mir meine DBF-File in eine DBTable und führe dann mit einem Query ein "DROP", sowie ein "CREATE TABLE" mit den veränderten Spaltennamen aus.
Danach lade ich mir über den Query alle Daten aus meiner DBTabelle in die neu erstellte DBF-Tabelle.
Das möchte ich natürlich für mehrere Tabellen machen und führe deswegen ein Loop durch meinen "Datenbank-Ordner".
Diese Prozedure funktioniert einmnal und beim Laden der nächsten Tabelle in die DBTabelle tritt ein Fehler auf... ziemlich unlogischer, nebenbei bemerkt... :
"Es ist eine Exception der Klasse ESQLiteError mit der Meldung 'database table is locked' aufgetreten".

Ich verstehe weder, warum eine SQLite-Exception auftritt, noch warum die Tabelle locked ist, da ich sie ja noch nicht mal verwendet habe..

Hier meine Prozedur/Funktion:
Code:
function Tfrm_Main.Alter_DBF_Tables: Boolean;
const
  aTables:Array [0..6] of String = ('ALARM','CODBU','BACOFFST','HCLESE','HCRCAGRP','PERSCOD','SYSPARA');
var
  I,itablecnt,ibookingcnt: Integer;
  stable:string;
begin
  UniTableSource.active:=false;
  UniTableSource.Connection:=UniConDBF;
  UniQuery.Active:=false;
  UniQuery.Connection:=UniConDBF;
  ibookingcnt:=1;
  itablecnt:=0;

  while itablecnt< length(aTables) do
    begin

      stable:= aTables[itablecnt];

      if Check_BookingTable(sTable.ToUpper) then
        begin
          stable:= Format(stable+'%.*d',[2,ibookingcnt]);
          Inc(ibookingcnt);
        end;

      if not fileexists(UniConDBF.Database+sTable+'.dbf') then
        begin
          if not Check_BookingTable(sTable.ToUpper) then
              Inc(itablecnt)
          else if ibookingcnt>12 then
            Inc(itablecnt);

          continue;
        end;


      UniTableSource.active:=false;
      UniTableSource.TableName:=stable;
      UniTableSource.active:=true;

      UniQuery.SQL.Text:='DROP TABLE '+stable;
      UniQuery.ExecSQL;

      UniQuery.SQL.Clear;
      UniQuery.SQL.Add('CREATE TABLE '+stable+'(');
      for I := 0 to UniTableSource.Fieldcount-1 do
        begin
          if Check_Column(UniTableSource.Fields[i].FieldName.ToUpper) then
            UniQuery.SQL.Add('A'+UniTableSource.Fields[i].FieldName.ToUpper+' ')
          else
            UniQuery.SQL.Add(UniTableSource.Fields[i].FieldName.ToUpper+' ');

          UniQuery.SQL.Add(Lib.DataTypetoStrDBF(UniTableSource.Fields[i].DataType).ToUpper);
          if Lib.DataTypetoStrDBF(UniTableSource.Fields[i].DataType).ToUpper='CHAR' then
            if UniTableSource.Fields[i].DataSize>254 then
              UniQuery.SQL.Add(' (254)')
            else
              UniQuery.SQL.Add(' ('+UniTableSource.Fields[i].DataSize.ToString+')');
          if i<UniTableSource.Fieldcount-1 then
            UniQuery.SQL.Add(',')
          else
            UniQuery.SQL.Add(')');
        end;
      UniQuery.ExecSQL;

      UniQuery.SQL.Clear;

      while not UniTableSource.EOF do
        begin
          UniQuery.SQL.Clear;
          UniQuery.SQL.Add('INSERT INTO '+stable+' VALUES(');
          for I := 0 to UniTableSource.Fieldcount-1 do
            begin
              if Lib.DataTypetoStrDBF(UniTableSource.Fields[i].DataType).ToUpper='CHAR' then
                UniQuery.SQL.Add(QuotedStr(UniTableSource.Fields[i].AsString))
              else
                UniQuery.SQL.Add(UniTableSource.Fields[i].AsString);

              if i<UniTableSource.Fieldcount-1 then
                UniQuery.SQL.Add(',')
              else
                UniQuery.SQL.Add(');');
            end;
          UniQuery.ExecSQL;
          UniTableSource.Next;
        end;


      if not (Check_BookingTable(sTable.ToUpper)) then
        begin
          Inc(itablecnt);
          ibookingcnt:=1;
        end;

    end;

end;
Ich hoffe Ihr könnt mir irgendwie weiter helfen .. ich steh auf dem Schlauch

Grüße Kondzie!
  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 22:51 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 by Thomas Breitkreuz