Automazione Import/Export di immagini e gestione files

Come utilizzare gli script. Automatizzare gli archivi. Utilizzo dei pulsanti

Moderatore: Moderatori

Rispondi
MaT
Messaggi: 27
Iscritto il: martedì 7 settembre 2004, 2:00

Automazione Import/Export di immagini e gestione files

Messaggio da MaT » sabato 8 luglio 2006, 13:36

Salve!

Nel DB che sto sviluppando - che funzionerà in rete FM - i client potranno fare l'upload (per incorporazione) di immagini nel DB.
Per far sì che il file poi non sia pesante, da script prendo le immagini caricate (incorporate), le salvo in una cartella dedicata e le ri-linko per riferimento allo stesso record.

Funziona tutto, ma vorrei poter controllare che l'utente non mi stia inserendo una immagine con un nome già esistente. Durante l'esportazione FM sembra infatti sovrascrivere i files che trova senza fare una piega.
Inoltre, quando elimino l'immagine, vorrei poter chiedere all'utente se vuole solo "scollegarla" dal record o anche eliminare il file che il DB si è creato (qualcuno ricorda ITunes?).

Ho letto nel Forum dell'esistenza di Shell, ma non l'ho ancora provato e non ho trovato indicazioni sul funzionamento in rete.

Le domande, quindi, sono queste:
1. Come controllo da script se un file esiste già? (in win _E_ mac)
2. Come elimino un file? (in win _E_ mac)
3. Per automatizzare l'esecuzione come controllo se sto eseguendo su win o su mac?

Grazie dell'aiuto!
Marco.

FM 10 Adv. su MacOS X 10
e FM 10 Server Advanced su MacOS X Server 10.5

Thomas
Messaggi: 162
Iscritto il: sabato 18 marzo 2006, 1:00
Versione FileMaker: 16
Sistema operativo: Mac OS X 12 Sierra

Messaggio da Thomas » sabato 8 luglio 2006, 19:29

Caro MaT,
Eccoti qualche indicazione per MAC che forse potrà esserti utile (per WIN penso che sia analogo, ma non ho esperienza diretta):
Ho letto nel Forum dell'esistenza di Shell, ma non l'ho ancora provato e non ho trovato indicazioni sul funzionamento in rete.
Su MAC c'è la possibilità di eseguire delle istruzioni AppleScript che si possono lanciare con l'istruzione di script (per i dettagli rimando alla guida online):

Codice: Seleziona tutto

Esegui AppleScript ["<testo applescript>"]
Il funzionamento di AppleScript in rete non pone particolari condizioni: semplicemente devono essere accessibili localmente i volumi remoti (ad esempio quello con depositate le fotografie).
1. Come controllo da script se un file esiste già? (in win _E_ mac)
2. Come elimino un file? (in win _E_ mac)
Su MAC lo scheletro di un AppleScript per verificare l'esistenza di un file e per cancellarlo potrebbe essere (è da modificare e completare a seconda dei bisogni):

Codice: Seleziona tutto

 tell application "Finder"
 if file "<Volume:path:>DSC_0001.JPG" exists then
         delete file "<Volume:path:>DSC_0001.JPG"
 else
      	display dialog "La fotografia DSC_0001.JPG non è disponibile."
 end if
 end tell
3. Per automatizzare l'esecuzione come controllo se sto eseguendo su win o su mac?
Utilizzando l'istruzione di script seguente:

Codice: Seleziona tutto

Get ( PiattaformaSistema )
Restituisce un numero che indica la piattaforma corrente:
-1 se la piattaforma corrente è Mac OS X
-2 se la piattaforma è Windows 2000 o Windows XP
Ulteriori dettagli li puoi trovare nella guida online.

Buona domenica :lol:
Thomas

MaT
Messaggi: 27
Iscritto il: martedì 7 settembre 2004, 2:00

Messaggio da MaT » domenica 9 luglio 2006, 14:05

Hmmm.. Interessante!
Molte grazie!

In ambiente Win, nel frattempo, ho giocato un pò con Shell (ma, dico, non potevano evitare di dover mettere le virgolette dopo il comando DOS? Gli si passava una stringa con comando e parametri e via...) e son riuscito a creare comandi che controllano se un certo file esiste in un certo path e che eliminano un certo file in un certo path, dove path e file sono definiti dinamicamente impostando una variabile a seconda del campo, del path scelto dall'amministratore, della piattaforma mac/win e del fatto se si stia importando o esportando (image/file).

Il problema resta quello che questo sudato script (se a qualcuno interessa magari lo posto che ne parliamo insieme) va cambiato ogni volta che deve essere associato ad un campo o ad un altro, perché nel caro scripting di FM non si può "variabilizzare" il nome del campo sul quale lavorare...

Ma magari c'è un sistema che io non conosco?...

Ciao!
Marco.

FM 10 Adv. su MacOS X 10
e FM 10 Server Advanced su MacOS X Server 10.5

stregatto
Messaggi: 9700
Iscritto il: lunedì 1 dicembre 2003, 1:00
Località: Roma
Contatta:

Messaggio da stregatto » domenica 9 luglio 2006, 14:31

usa shell sia per mac che per win. il funzionamento è identico, cambiano solo i comandi.
essere associato ad un campo o ad un altro, perché nel caro scripting di FM non si può "variabilizzare" il nome del campo sul quale lavorare..
stai scherzando?? o non ho capito io cosa vuoi fare.

.g.

MaT
Messaggi: 27
Iscritto il: martedì 7 settembre 2004, 2:00

Messaggio da MaT » martedì 11 luglio 2006, 12:47

Riguardo Shell:

Devo ancora fare dei test per i comandi Mac, ma mi sono fermato perché stiamo incontrando problemi con l'installazione dinamica del plugin da un ambiente FM8Server su MacOS X 10.3.9.
Poiché si lavorerà in rete FM, si voleva che, se necessario, il server facesse l'installazione del plugin nei client all'avvio dell'applicazione.
Purtroppo, mentre con la quasi totalità di altri plugin testati il metodo funziona ed il plugin si attiva senza nemmeno dover riavviare il FM client, nel caso di Shell il plugin viene correttamente copiato nella directory dedicata ma non viene attivato, nemmeno al riavvio del client FM.
Sono già stati impostati privilegi regolari, la compressione .tar e la disposizione delle cartelle delle versioni.


Riguardo i campi da "variabilizzare":

quello che intendo è se è possibile lavorare su un campo o su un altro a seconda del valore di una variabile o di un parametro passato allo script.
Esempio: devo inserire un valore in un campo. I possibili comandi di script sono "Go to field", "Set field", "Insert [Text/Picture/etc.]", e tutti e tre mi chiedono di specificare - solo selezionandolo da una finestra che mi presenta tabelle e campi del DB - il campo sul quale agire.
Nel mio caso, l'inserimento di immagini è uno scritp che mi serve in 5 layouts diversi, e per 6 campi diversi. Il chè significa che mi servono 6 script diversi e non, come vorrei, uno solo che è in grado di agire sul campo che gli viene passato per parametro.
Quindi in fase di sviluppo ogni minima correzione va duplicata e applicata a tutti gli script.
Se c'è un metodo, Dio benedica chi me lo dice e chi l'ha inventato.


Grazie!
Marco.

FM 10 Adv. su MacOS X 10
e FM 10 Server Advanced su MacOS X Server 10.5

MaT
Messaggi: 27
Iscritto il: martedì 7 settembre 2004, 2:00

Messaggio da MaT » martedì 11 luglio 2006, 18:59

Provo a stimolarvi postando lo script...
Allow User Abort [ Off ]
Set Error Capture [ On ]
# Salva il nome dell'immagine eventualmente contenuta per ripristinarla nel caso di errore
Set Variable [ $ImmaginePrecedente; Value:Edifici::PathPiantaLocalitàEdificio ]
# Va al campo e attiva l'inserimento Immagine
Go to Field [ Edifici::PiantaLocalitàEdificio ]
Insert Picture [ ]
# Copia il testo del path nel campo apposito
Go to Field [ Edifici::PathPiantaLocalitàEdificio ] [ Select/perform ]
Set Field [ Edifici::PathPiantaLocalitàEdificio; Edifici::PiantaLocalitàEdificio ]
# Imposta il path per l'esportazione
Set Variable [ $PathImmagine; Value:VariabiliApplicazione::PrefissoFile & VariabiliApplicazione::PathCartellaContenitoreImmagini & Edifici::PiantaLocalitàEdificio ]
# Controlla se già esiste un file con lo stesso nome nella cartella contenitore
Set Variable [ $EsisteImmagine; Value:RightWords ( External ( "shell-Execute"; "dir \"" & Substitute ( VariabiliApplicazione::PathCartellaContenitoreImmagini & Edifici::PiantaLocalitàEdificio & "\""; "/"; "\\" )); 3) ≠ "File non trovato" ]
If [ $EsisteImmagine ]
Show Custom Dialog [ Title: "Importazione immagini"; Message: "Attenzione!¶Impossibile importare l'immagine: un file con lo stesso nome è già presente nel Server Perseo.¶Scegliere un nome più specifico e ritentare."; Buttons: “OK” ]
Set Variable [ $PathImmagine; Value:VariabiliApplicazione::PrefissoImmagini & VariabiliApplicazione::PathCartellaContenitoreImmagini & $ImmaginePrecedente ]
Go to Field [ Edifici::PiantaLocalitàEdificio ]
Insert Picture [ “$PathImmagine” ] [ Reference ]
Set Field [ Edifici::PathPiantaLocalitàEdificio; Right ( Edifici::PiantaLocalitàEdificio; Length ( Edifici::PiantaLocalitàEdificio ) - Position ( Edifici::PiantaLocalitàEdificio; "/"; Length ( Edifici::PiantaLocalitàEdificio ); -1)) ]
Commit Records/Requests
Halt Script
End If
# Aggiorna il record
Commit Records/Requests
# Salva l'immagine esportandola nella cartella predefinita...
Export Field Contents [ Edifici::PiantaLocalitàEdificio; “$PathImmagine” ]
#... e la reimporta per Riferimento
Set Variable [ $PathImmagine; Value:VariabiliApplicazione::PrefissoImmagini & VariabiliApplicazione::PathCartellaContenitoreImmagini & Edifici::PiantaLocalitàEdificio ]
Go to Field [ Edifici::PiantaLocalitàEdificio ]
Insert Picture [ “$PathImmagine” ] [ Reference ]
Set Field [ Edifici::PathPiantaLocalitàEdificio; Right ( Edifici::PiantaLocalitàEdificio; Length ( Edifici::PiantaLocalitàEdificio ) - Position ( Edifici::PiantaLocalitàEdificio; "/"; Length ( Edifici::PiantaLocalitàEdificio ); -1)) ]
Nello script uso delle variabili d'ambiente nelle quali specifico alcuni valori:
- PrefissoImmagini = Imagewin:/
- PrefissoFile = Filewin:/
- PathCartellaContenitoreImmagini = F:/GRAFICA/CONTENITOREIMMAGINI/

Ciao!
Marco.

FM 10 Adv. su MacOS X 10
e FM 10 Server Advanced su MacOS X Server 10.5

raybaudi
Messaggi: 3616
Iscritto il: sabato 7 febbraio 2004, 1:00
Località: Roma
Contatta:

Messaggio da raybaudi » martedì 11 luglio 2006, 19:23

MaT ha scritto:Se c'è un metodo, Dio benedica chi me lo dice e chi l'ha inventato.
Corri ad aggiornare la versione di FileMaker che hai alla 8.5 !

Potrai nominare qualsiasi oggetto di un layout (anche un campo) e poi usare il nuovo comando: vai all'oggetto (da calcolo) :wink:
Raybaudi FMP 12 Adv. Windows XP SP3

Thomas
Messaggi: 162
Iscritto il: sabato 18 marzo 2006, 1:00
Versione FileMaker: 16
Sistema operativo: Mac OS X 12 Sierra

Messaggio da Thomas » martedì 11 luglio 2006, 20:34

Riguardo Shell:
What's the difference between using shell or calling an AppleScript that, in turns, calls "do shell script"?
The way FileMaker implemented AppleScript you cannot get the result of an script. You can only launch the script (without parameters, another limitation). To get the result you need to use another mechanism, such as sending the data back using AppleEvents. FileMaker did a fine job scripting its application, so you can add, edit, modify, etc, content from the outside. Alternatively, if your script or tool generates a file, you can use a plugin (or a more convoluted way importing the file to a temp FileMaker file) to get the content of the file.
Dalla pagina web di shell http://www.abstrakt.com/shell.html si potrebbe intendere che senza shell non sia possibile interagire fra AppleScript e FileMaker, a meno di usare gli AppleEvents. Invece dall'interno di un AppleScript è possibile eseguire comandi FileMaker come scrivere nei campi del database (il risultato di una determinata operazione AppleScript potrà essere scritto in un campo globale di FileMaker) oppure eseguire ricerche oppure eseguire script di FileMaker! L'interazione è quindi (quasi) completa. Io, finora, non ho avuto alcuna necessità di utilizzare shell, anche se, lo ammetto il fatto di usare AppleScript limita l'applicazione al solo ambiente Mac.
Riguardo i campi da "variabilizzare":
Per generalizzare gli script, vorrei ricordare che c'è la possibilità di passare un parametro all'esecuzione di uno script. All'interno dello script chiamato si può accedere al valore del parametro con

Codice: Seleziona tutto

Get ( ParametroScript )
Se si vogliono passare più valori ad uno script, si possono raggrupare in modo da formare una lista di valori:

Codice: Seleziona tutto

parametro1 & "¶" parametro2 & "¶" & ...
Il parametro da passare allo script rimane quindi uno solo: la lista valori.
All'interno dello script si potranno ottenere i singoli parametri ad esempio con:

Codice: Seleziona tutto

ValoriaSinistra ( get(ParametroScript) ; 1 )
ValoriinMezzo ( get(ParametroScript) ; 2 ; 1 ) 
ValoriaDestra ( get(ParametroScript) ; 1 )
In seguito nello script si potranno fare operazioni con variabili ($var1, $var2, ...) oppure in base al valore di una variabile accedere all'uno o l'altro conto, ecc. Mi rendo conto che sulla base del tuo esempio non tutto potrà essere generalizzato in questo modo, ma comunque ho l'impressione che si può fare un bel passo, aspettando la 8.5...
Spero perlomeno di averti dato qualche speranza :wink:

Buon lavoro e buona serata :lol:
Thomas

Thomas
Messaggi: 162
Iscritto il: sabato 18 marzo 2006, 1:00
Versione FileMaker: 16
Sistema operativo: Mac OS X 12 Sierra

Messaggio da Thomas » martedì 11 luglio 2006, 20:43

Ops, dimenticavo. La funzione più comoda per ricavare singoli valori naturalmente è "RIcavaValore", con cui si potrebbe fare qualcosa del genere

Codice: Seleziona tutto

Imposta variabile [$i = 1]
Loop
    RicavaValore (get(ParametroScript), $i)
    Imposta variabile [$i = $i + 1]
    Exit Loop if [$i > 3]
End Loop
Evidentemente ci si può sbizzarrire...
Di nuovo... :wink:
Thomas

Rispondi