Announcement

Collapse
No announcement yet.

von DBase zu Interbase via TBatchMove einige Fragen ..

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • von DBase zu Interbase via TBatchMove einige Fragen ..

    Ich habe eine DBase-Tabelle mit ca. 50000 Datensätzen, die in eine
    Interbase Tabelle übertragen werden soll und anschließend täglich
    auf Änderungen überprüft werden muß. Geht mit TBachtMove prima und
    erstaunlich schnell!

    Folgende Fragen bzw. Probleme treten auf:

    Ich habe probleme mit dem Deutschen Zeichensatz, in der DBase-
    tabelle sind alle Umlaute vorhanden werden aber nicht in die
    Interbasetabelle übertragen. Welche Sprachtreiber/Charctersets muß ich auf
    der Interbase- bzw. auf der DBaseseite einstellen (via. BDE)

    Das Zweite Problem ist, wie kann ich nach einen Update/Append feststellen,
    welche Datensätze sich verändert haben, bezogen auf bestimmte Felder.
    Wird irgendwo festgehalten, welche Datensätze verändert/neu hinzugekommen /
    oder gelöscht wurden? Ich hab es mit "ChangedTableName" probiert, nur bei
    mir stehen nach einen Durchlauf alle Datensätz drin in der erstellen Tabelle!

    Kann man während eines TBachMove-Durchlaufes Berechnungen vornehmen,
    z.B. wenn sich der Feldinhalt für das Feld EK-Preis geändert hat,
    muß das Feld VK-Preis entsprechend angepaßt werden.

    Zu guter Letzt, gibt TBatchMove während eines Durchlaufes einen
    aktuellen Stand (ID) zurück, den man für eine Fortschrittsanzeige
    verwenden kann?

    Ich hoffe es kann mir hier jemand weiterhelfen.

    Jedenfalls vielen Dank, Klaus

  • #2
    Hallo,

    die TBatchMove-Komponente stellt die Eigenschaft <b>Transliterate</b> zur Verfügung, um beim Kopieren den Zeichensatz anzupassen. Die InterBase-Datenbank sollte mit dem Zeichensatz <i>ISO8859_1</i> angelegt werden, für den BDE-Alias wird dann der Eintrag <i>'ascii' ANSI</i> oder <i>'WEurope' ANSI</i> ausgewählt.

    Wenn zusätzliche Anpassungsarbeiten notwendig werden, würde ich auf TBatchMove verzichten und statt dessen auf TQuery zurückgreifen, um eine eigene parametisierte INSERT-/UPDATE-Anweisung zum InterBase zu schicken. Die Daten aus der dBASE-Tabelle werden über TTable geöffnet und in einer Schleife ausgelesen, den Parametern von TQuery zugewiesen und über ExecSQL ausgeführt. Über die WHERE-Bedingung der UPDATE-Anweisung können die Änderungen erkannt werden (die BDE kann dank LOCAL SQL in einer SQL-Anweisung gleichzeitig auf die dBASE- und die InterBase-Tabelle zugreifen).

    Beispiel mit den Delphi-Beispieldatenbanken DBDEMOS und IBLOCAL:

    Schritt 1: Die neuen Datensätze ermitteln
    <pre>
    SELECT * FROM "BDEMOS:Country.db"
    WHERE Name NOT IN (SELECT Country FROM ":IBLOCAL:COUNTRY")
    </pre>

    Schritt 2: Unterschiede zwischen den Datenbeständen ermitteln
    <pre>
    SELECT p.*
    FROM "BDEMOS:Country.db" p, ":IBLOCAL:COUNTRY" i
    WHERE p.Name = i.Country
    AND p.Capital <> i.Currency
    </pre>
    Der Vergleich zwischen Capital und Currency ist nur ein Beispiel, die diese Daten immer unterschiedlich sind.

    Hat man die zu aktualisierenden Datensätze ermittelt, kann man dann alle zusätzlichen Prüfungen und Berechnungsschritte im eigenen Programm unterbringen.<br>
    Alle INSERT-/UPDATE-Aufrufe werden in eine explizite Transaktion gekapselt, wobei ca. nach jeweils 1000 Datensätzen ein COMMIT abgeschickt wird.
    &#10

    Comment


    • #3
      Hallo Klaus,

      zu den Spracheinstellungen:

      1. für die IB-Datenbank sollte ein Datenbankweit gültiger Zeichensatz definiert sein (z.B. Win1252) - geht allerdings nur beim erzeugen der Datenbank

      zur Not kann man auch für jede Spalte extra einen Zeichensatz vorgeben (kann nachträglich geändert werden)

      2. im BDE-Alias muß der passende Sprachtreiber eingestellt werden (ich glaube "WEUROPA ANSI" - ich verzichte bereits seit längerer Zeit vollkommen auf die BDE -> deswegen kann ich es nicht genau sagen)

      inwieweit die nächsten Wünsche über die Batchmove-Komponete zu realisieren sind, kann ich Dir nicht sagen, aber sie sollten sich über <b> before Insert Trigger </b>bzw. <b>before Update Trigger </b> des IB-Servers lösen lassen.

      Tschüß

      Torste

      Comment


      • #4
        Hallo,<p>Wenn ich richtig verstanden habe, soll die dBase-Tabelle nur einmal importiert werden. Anschließend wird mit der InterBase-Datenbank gearbeitet.<p>Falls dem so ist, könnte man folgendes machen:</p>
        <code>CREATE DOMAIN DSYSDAT AS TIMESTAMP default 'now'; /*Domain für Feld mit letztem Änderungszeitpunkt erstellen*/<br>
        CREATE TABLE <Tabellenname> ( <Datenfelder>, Aenderungszeitpunkt DSYSDAT); /*in der Tabelle ein entsprechendes Feld erstellen*/<br>
        CREATE TRIGGER <Triggername> FOR <Tabellenname> BEFORE UPDATE as begin
        new.Aenderungszeitpunkt = 'now'; end /*Trigger erstellen, der bei jeder Änderung den Änderungszeitpunkt speichert*/</code><P>
        Zur Zeichensatzfrage: Ich verwende in InterBase WIN1252 und bin ganz glücklich damit.<p>
        Best Regards,<br>
        Wolfhar

        Comment


        • #5
          Vielen Dank für die Antworten,
          ich würde gern den Weg über den TRIGGER gehen wie er von
          Wolfhard Kupfer beschrieben wurde. Habe die DOMAIN so
          angelegt, wie auf den Trigger.
          Es wird allerdings kein Wert eingetragen! Ich habe ein
          völlig neue Tabelle (leer) genommen, und einen TBatch-
          durchlauf gestartet. Dieser läuft durch ohne Fehler!
          nur wird das Feld Dich aktualiesiert!
          Liegt es evtl. daran, daß dieses Feld in der Mapping Tabelle
          aufgenommen werden muß?

          Auch habe ich nach wie vor probleme mit dem Zeichensatz!
          Welchen Zeichensatz muß ich in der BDE für den NATIVE-Treiber
          dBase eintragen und welchen für den Interbase!

          Nochmals vielen Dan

          Comment


          • #6
            Hallo,

            Um welchen Triggertyp (BEFORE oder AFTER) handelt es sich und wie wurde dieser Trigger implementiert? Je nach Situation (neuer Datensatz oder Änderung eines bereits vorhandenen) sind zwei Trigger notwendig (AFTER INSERT und AFTER UPDATE).

            Wenn die InterBase-Datenbank mit dem Zeichensatz ISO8859_1 (alias Win1252) angelegt wurde, ist der Eintrag <b>'WEurope' ANSI</b> richtig. Im Fall der dBASE-Tabelle wird bei mir in der BDE-Verwaltung für den Treiber DBASE ebenfalls der Sprachtreiber <b>'WEurope' ANSI</b> verwendet. Aber das aber in Ihrem Fall passt, hängt davon ob, welcher Sprachtreiber <b>in</b> der dBASE-Tabellenstruktur (siehe Datenbankoberfläche) eingestellt wurde

            Comment


            • #7
              Vielen Dank für die gute Unterstützung
              nach dem ich die aktuelle Version von
              der BDE eingespielt habe funktioniert
              alles prima

              Comment


              • #8
                Hallo,<p>
                mit der TBatchMove-Komponente hatte ich noch nicht zu tun, da ich lediglich die IBX-Komponenten verwende.<p>Bei diesen tritt oben beschriebenes Problem auf, wenn Cached Updates verwendet werden, das vom Trigger gepflegte Feld von der entspr. TUpdateSQL-Komponete mit behandelt wird und keine visuelle Darstellungskomponente (z.B. TDBLabel) für das Feld vorhanden ist.<p>Aus diesem Grund nehme ich das entspr. Feld aus den InsertSQL, UpdateSQL und DeleteSQL der TUpdateSQL-Komponente heraus.<p>Ich hoffe, ein ähnliches Vorgehen ist auch bei der TBatchMove-Komponente möglich.<p>Best Regards<br>Wolfhar

                Comment


                • #9
                  Hallo scheint so nicht zu gehen!
                  Der vorteil von TBatchMove ist, daß man
                  ohne viel Aufwand Daten übertragen
                  kann.

                  Aber wie gesagt das klappt mittlerweile wirklich
                  gut. Das mit DBase und den falschen Zeichensatz
                  lag u.a. an einer veralteten BDE bzw. daran, daß
                  die DBF-Datei keine wirkliche DBF-Datei ist, sondern
                  aus Access bwz. aus Excel erstellt wurde

                  Comment

                  Working...
                  X