[Frage] Smartpart OPEN/OUTPUT [Gelöst]

Schlagworte:
  • Smartparts
  • OPEN
  • OUTPUT
  • Fehler
  • Plugin-Download

Schönen Tag.

Ich wollte mit dem OUTPUT-Befehl über mein SmartPart-Skript eine csv.-Tabelle befüllen bzw. erweitern.
Den Stream öffne ich mit OPEN. Wenn ich jedoch nun Versuche den OUTOUT Befehl anzuwenden kommt eine Fehlermeldung (siehe Anhang).
Ich habe mich aber an den Syntax gehalten.
OUTPUT channel, recordID, fieldID, expression1 [, expression2, ...]
Wo liegt hier der Fehler?

Code:
----------------------------------------------------------------------------------

filesave = "C:\Users\SL\Desktop\OUTPUT\2020-12-21_Test.csv"
testoutput = 10

!!!---datalink
IF filesave <> "" THEN
!!--open stream
stream = OPEN ( "TEXT" , filesave , "SEPARATOR = ';', MODE = WO, fullpath" )
!!--put in values
OUTPUT ( stream , 1 , 0 , testoutput )
CLOSE stream
ENDIF
----------------------------------------------------------------------------------

Anhänge (1)

Typ: image/png
24-mal heruntergeladen
Größe: 1,43 KiB

Lösung anzeigen Lösung verbergen

Anbei ein Beispiel zum Lesen und Schreiben von CSV-Dateien.
Ist etwas älter, aber es zeigt die grundsätzliche Vorgehensweise.

Copy and Paste, please!

Anhänge (1)

Typ: text/xml
1159-mal heruntergeladen
Größe: 60,99 KiB
11 - 16 (16)

ch = OPEN ( "TEXT" , filesave , "SEPARATOR = ';', MODE = WO, fullpath" )

MODE:
the mode of opening has to follow this keyword. There are only three modes of opening:

RO (read only)
WA (write only, append at the end of the file)
WO (write only, overwrite) the data previously stored in the
file will be lost!

A file cannot be open for reading and writing at the same time.

...würde es mit "MODE = WO" probieren.

Ich habe es mal probiert, jedoch erfolglos..

Hier das Skript dazu:

--------------------------------------

!!--filename
fnam = "C:\Users\SL\Desktop\Test.csv"

!!--read data
i = 1
ch1 = OPEN ( "TEXT" , fnam , "SEPARATOR=';',MODE=RO ,fullpath" )
REPEAT
n = INPUT ( ch1 , i , 1 , val )
IF n > 0 THEN
tst [ i ]= val
i = i + 1
ENDIF
UNTIL n < 0
CLOSE ch1
cnt = i - 1
PARAMETERS cnt = cnt , tst = tst

!!--write data
IF GLOB_UI_BUTTON_ID = 1000 THEN
cnt = cnt + 1
tst [ cnt ]= cnt
PARAMETERS cnt = cnt , tst = tst
ch2 = OPEN ( "TEXT" , fnam , "SEPARATOR=';',MODE=WO ,fullpath" )
FOR i = 1 TO cnt
OUTPUT ch2 , i , 1 , tst [ i ]NEXT i
CLOSE ch2
ENDIF

..vielleicht schon beim ersten (und einzigen) OPEN ... MODE=WO benutzen!
Sonst wird die Datei gesperrt!

In welchem Script-Teil wird "OPEN.." benutzt?
Das sollte im Parameter-Script stehen!

Der Dateiinhalt wird während der Script-Ausführung im "Speicher" gehalten,
und erst beim Beenden der SmartPart-"Ausführung" in die Datei zurückgeschrieben.

Auch wenn ich alles im gleichen OPEN schreibe funktioniert es immer noch nicht..
Das OPEN steht im Parameter-Skript.

Ich glaub das Problem liegt darin, dass die Daten IMMER gelesen werden aber nur wenn das GLOB_UI_BUTTON_ID Event eintritt geschrieben wird. Gibt es irgendeine Globale Variable, welche ausgelöst wird wenn der Smartpart gestartet wird?
In etwa so:

OPEN...

IF GLOB_... THEN
Daten einlesen
ENIDF

IF GLOB_UI_BUTTON_ID = 1000 THEN
Daten schreiben
ENDIF

CLOSE...

Blöde Frage:
Wozu müssen ausserhalb des SmartParts Parameter gespeichert werden?

Reicht es nicht, die Werte über variable Parameter-Arrays zu verwalten?
Da geht das Speichern nämlich ohne den ganzen OPEN-CLOSE-Zauber mit "Favoriten speicher/laden" unten in der Palette.

Sicher kann man die Werte mit einem anderen SmartPart "synchronisieren" wollen.
Aber das geht dann nur "auf Knopfdruck".
Wie in meinem Beispiel oben (dgm.smt) gezeigt, kann man in einer SmartPart-Edit-Session
die Werte aus der Datei entweder lesen ODER in diese Werte schreiben. Beides geht nicht!

Ich würde die Werte im Parameter-Array des SmartParts halten, und nur bei Änderungen "auf Knopfdruck" in eine "Synchronisierungs-Datei" schreiben.
In einem anderen SmartPart könnte man dann die gespeicherte "Synchronisierungs-Datei" ebenfalls auf Knopfdruck wieder einlesen.

Den Trick mit den Favoriten habe ich noch nicht gekannt!
Genau das wollte ich mit dem OPEN erreichen.

11 - 16 (16)