Fieldtype zur Laufzeit ändern

    Fieldtype zur Laufzeit ändern

    Ich möchte dem User die Möglichkeit geben die Stringfelder einer Tabelle auf Widestring umzustellen.
    Die eigentliche Umstellung der Felder per SQL ist dabei kein Problem.

    Der Zugriff auf die umgestellte Tabelle führt aber beim Start nach der Umstellung zu einem Laufzeitfehler und zwar obwohl ich per Ttable.fieldbyname().SetFieldtype(ftWideString) den neuen Typ deklariere.

    Die Typdeklaration der entsprechenden Felder unter "Type" (tTableField: TStringField;) habe ich gelöscht um keine Compilervorbelegung zu haben.

    Sieht jemand einen Weg?
    Leider sagst du uns nicht, welcher Laufzeitfehler auftritt. Aber ich denke mir, dass das Löschen der Typen bei den einzelnen Feldern zum Laufzeitfehler führt. Statt Löschen müsstest du hier für jedes Feld den Typ ftWideString eintragen.

    Welche Datenbank liegt denn darunter? Darfst du überhaupt den Feldtyp in der Tabelle mit bereits vorhandenen Daten ändern?

    Grüße
    Mikhal
    Computer erleichtern die Arbeit -
    und die Welt ist eine Scheibe!
    Hallo Mikhal,
    die Löschung der Typdeklaration kann nicht das Problem sein denn ohne eine Typänderung gibt es damit keinen Laufzeitfehler.

    Die Datenbank ist AidAim EasyTable. Ob ich den Feldtyp dabei ändern darf weiß ich leider nicht.
    Der Fehler ist etwas kryptisch "TEasyDataset.GetRecordcount - no table was opened".

    Grüße,
    Steffen
    Ich weiß nicht, wie du auf EasyTable zugreifst, aber offensichtlich wird mit der Löschung der Typdefinitionen die Tabelle geschlossen, das würde zumindest die Fehlermeldung erklären.

    Andererseits liest TTable die Tabellendefinition und damit die Typdefinitionen beim Öffnen aus der Datenbank aus. Du musst also anders an dein Vorhaben gehen. Wenn der Benutzer also unbedingt einen anderen Datentyp einsetzen will, musst du vor dem Öffnen der Tabelle dafür Sorge tragen, dass der gewünschte Datentyp in der Tabelle eingetragen ist - also änderst du die Tabellendefinition auf der Datenbank (wenn ich mich richtig erinnere ist EasyTable wie Paradox Datei-orientiert, heißt: für jede Tabelle gibt es eine eigene Datei, richtig?).

    Trotzdem stellt sich mir hier die Frage: Ist das überhaupt sinnvoll und praktikabel? Überlege dir mal, was passiert, wenn Benutzer A seine Daten mit ftString eingibt und auch lesen will, Benutzer B aber ftWideString verwendet. Die Daten die Benutzer B in WideString eingegeben hat, werden von Benutzer A in das Format ftString gewandelt, was im Extremfall zu Datenverlust bzw. Verfälschung führt (ftWidestring 16 Bit-Zeichensatz, ftString 8Bit-Zeichensatz). Ich denke, dass das nicht zielführend ist.

    Oder möchtest du deinem Programm, das nur als Einzelplatz-Version konzipiert ist und nur von einem Benutzer verwendet wird, die Möglichkeit mitgeben, vor der ersten Nutzung die Tabellendefinitionen individuell anzupassen?

    Grüße
    Mikhal
    Computer erleichtern die Arbeit -
    und die Welt ist eine Scheibe!
    Hallo,

    es handelt sich um ein Einzelplatz Programm. Die Umstellung auf Unicode bedeutet im Falle von Easytable der Ersatz von Memo- durch WideStringfelder, da Easytable kein WideMemo unterstützt. Dadurch wird die Datenbank auch deutlich größer. Daher fände ich es gut wenn der User selbst bestimmen könnte ob er Unicode überhaupt braucht.

    Zudem fände ich eine solche Umstellung aus programmiertechnischer Sicht interessant, da offenbar nicht trivial.

    Zu Mikhals Frage: Ja, in einer Easytable Datenbank stecken beliebig viele Tabellen. Eine Änderung des Typs durch SetFieldType() wie im ersten Post beschrieben ist mir aber bislang nicht gelungen.
    Ist hierbei etwas grundsätzliches zu beachten?
    Wahrscheinlich wird dir an der Stelle nichts übrig bleiben, als folgendermaßen vorzugehen:
    1. Neues Datenfeld mit dem gewünschten ftWideString mit einem neuen Namen anlegen
    2. Daten aus dem alten Feld in das neue Feld kopieren (ggf. konvertieren)
    3. altes Feld löschen
    4. neues Feld umbenennen in alten Feldnamen
    Am einfachsten sollte das via SQL gehen, ich weiß aber nicht, ob EasyTable SQL unterstützt und kenne auch nicht den Sprachumfang. Hier wirst du die Dokumentation zu Rate ziehen müssen.

    Grüße
    Mikhal
    Computer erleichtern die Arbeit -
    und die Welt ist eine Scheibe!
    Setzt du persistente Felder ein, also hast du die Felder über die rechte Maustaste auf die TTable-Komponente im Delphi-Quelltext angelegt?

    Damit werden die Feldtypen bereits bei Programmstart festgelegt. Eine nachträgliche Änderung der Feldtypen verursacht dann natürlich eine (stille?) Exception, die auch die Tabelle wieder schließt. Wenn du dann auf die geschlossene Tabelle zugreifst, läuft dein Programm in eine Exception, die dir den oben genannten Fehler anzeigt.

    Wie gesagt, ich frage mich, ob deine Vorgehensweise zielführend ist. Speicherplatz sollte eigentlich heute kein Thema mehr darstellen.

    Grüße
    Mikhal
    Computer erleichtern die Arbeit -
    und die Welt ist eine Scheibe!
    Wieso macht man das nicht so:
    1. Dem Anwender eine Mail schicken, die ihn darüber aufklärt, daß nun eine Unicode-Variante des Programms zur Verfügung steht; eventuell über Vor- und Nachteile aufklären und deutlich machen, dass es sich um eine Einbahnstrasse handelt und in Zukunft nur noch die Unicode-Version gepflegt wird oder die Non-Unicode-Version nur noch bis Ende des Jahres usw.
    2. In der Mail einen Link für das Herunterladen der Unicode-Version anbringen.
    3. Im Installationsprogramm die Daten von der Non-Unicode-Datenbank in die Unicode-Datenbank kopieren.
    Das wars dann auch schon.