REPLICATE Parsing failed

Hallo,
ich versuche eine Replikation von Daten aus einem 4D Sever mit einem 4D Client.
Nach erfolgreichem SQL Login lautet der Befehl:

Begin SQL
	REPLICATE vTFieldList
	FROM Artikel
	FOR REMOTE STAMP :$vLremoteStamp
	REMOTE OVER LOCAL
	INTO Artikel ( vTFieldList );
End SQL

Nur leider erhalte ich immer nur diesen Fehler:
Error code: 1102 (SQLS)
Parsing failed.
component: ‘SQLS’

Kopiere ich die Feldnamen im Klartext in den Befehl (z.B. ArtNr, ArtHoehe) statt der Verwendung der Variablen vTFieldList funktioniert die Replikation.
Ich würde jedoch gerne die Feldnamen auslesen und nicht statisch hinterlegen.

Danke für eine Hilfe!

Mit freundlichen Grüßen

Replicate/Syncronize wurde ausschließlich für die Replikation zwischen zweier 4D Server erstellt, d.h. der Code muss auf dem Server ausgeführt werden.

Allgemein:
die Replikation über SQL wurde über Replikationslisten durchgeführt, d.h. neben der Struktur gibt es zwei Dateien die alle Änderungen seit Aktivierung der Replikation mitführen. Im Laufe der Jahre können diese Dateien sehr groß werden.
Ab v18 gibt es ein besseres Verfahren über ORDA.
Sofern in der Struktur die Tabelle __DeletedRecords und Felder __GlobalStamp (siehe https://developer.4d.com/4d-for-ios/docs/en/structure.html - Enable structure adjustments) existieren, führt 4D diese automatisch mit. Es gibt dann einen “Stamp” für jede gewünschte Tabelle.

Auf der “Cient”-Seite merkt man sich den letzten Sync-Stamp und fordert dann vom Server alle Änderungen neuer xx an. Dies ist viel effizienter als das bisherige Verfahren auf dem Server für jeden geänderten Datensatz für jeden Sync-Client dies zu getrennt zu protokollieren.
Außerdem auch viel einfacher zurück zusetzen…

Hallo Herr Maul,

Naja, zumindest mit dem Programm 4D (also kein Client am Server) funktioniert eine Replikation auch.

Danke für den Hinweis mit ORDA, gibt es dazu ein konkretes Beispiel, wie Daten an einem entfernten 4D-Server verwendet werden können. Auch unter der Massgabe, dass nur bestimmte Records am entfernten Server vorhanden sein dürfen. Dies ist aus Sicherheitsgründen eine Voraussetzung. Ihr Link bezieht sich auf 4D for iOS.

Unklar bleibt noch, warum der von mir verwendete Befehl REPLICATE einen Fehler wirft.

Einzelplatz/Server geht, da Sie “4D Client” geschrieben haben, dachte ich es wäre ein 4D Remote.

REPLICATE wurde für feste Feldliste entwickelt, da auf beiden Seiten die Felder existieren müssen, sahen wir keinen Sinn in einer dynamischen Konfiguration.

Der Link geht auf 4D for iOS weil das Feature dafür entwickelt wurde und es von 4D for iOS für inkrementelle Synchronisation verwendet wird. Serverseitig ist es 4D aber egal wer die Daten später abruft, es wird bei jeder Änderung (oder Löschung) eben der Stamp mitgeführt, sofern die Felder existieren.
Kontrollen müssen Sie selbst entwicklen, also wenn nicht alle Datensätze syncronisiert werden sollen oder bestimmte Regeln eingehalten werden sollen, das ist bei Replicate aber auch nicht anders.

Hallo Herr Maul,
ich fände ein konkretes Beispiel für die Synchronisation mit ORDA dennoch sehr gut. Vielleicht etwas für den Blog?

Und eine Antwort auf die initiale Frage, warum bei REPLICATE der Fehler geworfen wird.

REPLICATE wurde für feste Feldliste entwickelt, da auf beiden Seiten die Felder existieren müssen, sahen wir keinen Sinn in einer dynamischen Konfiguration.

mir sind generell 2 Gründe bekannt, bei denen es zu einem Fehler 1102 kommen kann:

  1. Invalid relation name (Name beinhaltet ngültige Zeichen oder ist leer
  2. Column does not exist (feste Feldliste benötigt, Feld oder Spalte kann nicht dynamisch angelegt werden).

Hallo Herr Peschke,
danke für die Info, aber wie am Anfang beschrieben klappt der Befehl, wenn ich die Feldnamen im Klartext verwenden, nicht jedoch, wenn sie in einer Variable stehen.
Das muss doch einen Grund haben - oder?

ja sicher wird das einen Grund haben. Bevor Sie sich nun aber an der falschen Stelle festbeißen. Wie bereits schon 2-mal in vorigen Antworten geschrieben, der Befehl wurde nicht für dynamische Feldlisten entwickelt. Oder gemäß dem Handbuch geantwortet: Pass a list of fields (virtual or standard) separated by commas in replicated_list. Und das heißt, nein, Felder nicht als Variable übergeben, direkt angeben als Komma-separierte “Liste”. Nicht als Variable mit einer Komma-separierten Liste. Und da das ja geht, brauchen wir das eigentlich nicht weiter untersuchen.