Custom import di dati

Custom import di dati

0
0

Ciao a tutti,

sto sviluppando una applicazione con FM ma lo uso da pochissimo 🙂

Ho postato una prima domanda e la risposta mi ha aiutato tantissimo per cui eccomi qui di nuovo a chiedervi supporto.

Il database che ho modellato serve per la gestione di pazienti ed esami per cui ho diverse relazioni molti-a-molti. Per fare un esempio e capire di cosa sto parlando, ad un paziente possono essere associate diverse provette (con numeri identificativi diversi), ciascuna provetta può poi essere associata ad uno o più esami. Ovviamente esame è un nome generico ("esame del ferro", "emocromo") , per cui può essere associato a più provette e a più pazienti.

Le relazioni molti-a-molti le ho modellate con le tabelle di connessione e ho creato diverse TO che mi servono per accedere e visualizzare in modo corretto il dato.

Al momento mi trovo però ad affrontare un problema che riguarda l'import dei dati. Il file che verrà usato per importare i dati è un file excel in cui ogni riga contiene tutte le informazioni su paziente, provetta, esame etc. che invece nel mio DB sono correttamente separate e legate da tabelle relazione. Ho capito che questo tipo di import va gestito con gli script a step diversi, andando a popolare manualmente le tabelle relazione e pensavo di utilizzare variabili per memorizzare temporaneamente il dato.

Mi chiedevo quindi, esiste un modo per salvare in una variabile il valore di un campo in excel? Mi spiego meglio, se pensiamo alla riga di excel come ad un array io vorrei poter dire:

var1 = row[3]

Ovvero il terzo valore della riga associalo a var1. In questo modo potrei salvare ogni campo in una variabile e popolare le varie tabelle (fermo restando che tra un insert e l'altro devo recuperare i valori di PK che vengono generati in maniera automatica per popolare le tabelle relazione). Ho cercato a lungo in rete ma purtroppo non sono riuscita a trovare niente che mi abbia aiutata.

Se non è possibile, esiste un modo per definire l'import su diverse tabelle magari specificando l'ordine dei campi?

Spero di aver spiegato bene il problema e che possiate aiutarmi.

Grazie mille, Stefania

Segnalato come spam
Pubblicato da (Domande: 5, Risposte: 14)
Domandato il 9 Marzo 2020 16:41
55 visualizzazioni
0
Domanda privata

Buongiorno, Stefania.

è un approccio molto C o Swift :D

comunque, fare si può fare, ma secondo me un approccio migliore è quello di importare i dati in una tabella temporanea e poi da li gestirla a colpi di relazioni, eseguiSQL, script e loop.

in sostanza ricavi gli id per ciascuna riga mediante calcoli, e crei i record nelle tabelle corrette mediante relazioni e/o script :)

facci sapere!

.g.

 

p.s. piccola notazione "da moderatore": l'area "Laboratorio di Scripting FileMaker" in cui hai inserito il post è riservata alle domande relative agli studenti che seguono il nostro Laboratorio di Scripting FileMaker, quindi per evitare confusione, ti suggerisco di usare una delle altre aree.

Segnalata come spam
Pubblicato da (Domande: 0, Risposte: 2451)
Risposto il 9 Marzo 2020 20:35
0
Domanda privata

Ciao Giulio,

grazie mille per la risposta e mi scuso tantissimo per l'errore! Ho provato dalla mia area a modificare la domanda ma non mi fa cambiare la categoria :(
Potresti indicarmi un tutorial/guida per usare l'approccio che suggerivi della tabella temporanea? Detto così non riesco proprio a immaginare la soluzione :)

Grazie mille e mi scuso ancora tantissimo!

Segnalata come spam
Pubblicato da (Domande: 5, Risposte: 14)
Risposto il 10 Marzo 2020 09:22
0
Domanda privata

Non devi scusarti. non lo sapevi :)

per la tabella temporanea, è più semplice a farlo che a spiegarlo:

- crei tabella dal tuo file excel (normalmente in un contesto separato)

- crei relazioni con le TO in cui importare i dati (magari anche con creazione diretta del record)

- crei script che:
a) importa automaticamente il file da un percorso definito (o dalle email, o da ftp o da Url o d dove vuoi).
b) dalla tabelle "smista" i dati nelle tabelle giuste mediante le TO correlate
c) elimina i record importati

le specifiche precise dipendono molto da come hai impostato i dati e da che dati ci sono nell'excel.

.g.

Segnalata come spam
Pubblicato da (Domande: 0, Risposte: 2451)
Risposto il 10 Marzo 2020 09:29
0
Domanda privata

Grazie mille!! Una ultima domanda, per contesto separato intendi un altro file filemaker correlato?
Mi metto subito allo sviluppo e ti farò sapere, ancora grazie mille!

Segnalata come spam
Pubblicato da (Domande: 5, Risposte: 14)
Risposto il 10 Marzo 2020 09:46
0
Domanda privata

no, intendo un contesto. È un concetto proprio di FileMaker, fondante per la modellazione dati , per semplificare al massimo diciamo "un gruppo indipendente di TO" ;)

.g.

p.s. se ti interessa sviluppare in FM, mi permetto di suggerirti il mio libro (se ti interessa puoi anche scaricare l'estratto e valutare):
https://www.filemakerguru.it/sviluppo-filemaker-consapevole/
non è un manuale quanto un insieme di concetti, di tecniche fondamentali, good practice e cose da evitare , e la parte di modellazione dati è a mio parere eccellente.

Segnalata come spam
Pubblicato da (Domande: 0, Risposte: 2451)
Risposto il 10 Marzo 2020 13:17
0
Domanda privata

Grazie mille per il libro! Molto interessante e lo tengo in considerazione.
Sopratutto perché è un modo di sviluppare totalmente diverso da quello che uso abitualmente e mi rendo conto fa proprio un mondo a se :)
Da un certo punto di vista è molto più semplice e immediato, ma per chi è vecchio stampo come me abituata a scrivere righe di codice, alcuni meccanismi sono "strani" e anche difficili da apprendere :D

PS: sto lavorando alla temp table e agli script... sono ancora un pò in alto mare ma piano piano sto trovando il bandolo della matassa :)

Segnalata come spam
Pubblicato da (Domande: 5, Risposte: 14)
Risposto il 10 Marzo 2020 14:15
0
Domanda privata

un suggerimento:

per iniziare sviluppa come se lo scripting non esistesse. Lo scripting è un oggetto di interfaccia che agisce sopra la modellazione. Se sbagli modellazione non esiste scripting che tenga :)

.g.

Segnalata come spam
Pubblicato da (Domande: 0, Risposte: 2451)
Risposto il 10 Marzo 2020 14:32
0
Domanda privata

Ciao!
Ho creato la tabella tmp per inserire i dati e correttamente riesco ad aggiornare quasi tutte le tabelle. Ma al momento sono bloccata su un problema.
In sostanza devo recuperare la chiave primaria di un record che ha come campo descrizione il valore che si trova in un campo nel file che l'utente importa. La chiave mi serve per aggiornare la tabella "connessione".
Ad esempio, nel file che viene importato è contenuta la stringa "ESAME1", io devo recuperare dalla tabella esami la chiave primaria del record che nel campo descrizione ha il valore ESAME1.
Ho provato ad usare l'istruzione ExecuteSQL in diversi modi ma non sono mai riuscita a farla eseguire correttamente.
Allego lo schema delle relazioni e delle TO, magari c'è qualcosa che sto sbagliando li ed è possibile aggiornarli in automatico senza codice...

PS: ho ricevuto le mail degli ultimi giorni e vorrei ringraziarvi per quello che state facendo, sia per i seminari che per la tavola rotonda.. mi spiace non poter partecipare a quest'ultima ma spero di poter partecipare a qualche seminario.

Grazie ancora!

Segnalata come spam
Pubblicato da (Domande: 5, Risposte: 14)
Risposto il 14 Marzo 2020 11:28
0
Domanda privata

Una alternativa a ExecuteSQL che ho testato è questa:
go to layout
perform find
set variable (v1; Value = Get(RecordID))
Purtroppo però non funziona perchè quando faccio il find sulla tabella e passo la variabile, non trova il record e in più mi cancella completamente la tabella :(

Segnalata come spam
Pubblicato da (Domande: 5, Risposte: 14)
Risposto il 14 Marzo 2020 15:07
0
Domanda privata

Finalmente ce l'ho fatta :)
Posto il risultato, magari potrebbe essere utile per qualcuno (e per altri assolutamente scontata :D )
Go To Layout
Perform Find (sigle_esami::sigla =[$analisi])
Go To Field[Select/perform]
Set Variable[$pkid_sigla; Value:sigle_esami::PK_ID]

Segnalata come spam
Pubblicato da (Domande: 5, Risposte: 14)
Risposto il 14 Marzo 2020 22:38
0
Domanda privata

non ti conviene usare lo script.

hai due possibilità:
crei una relazione per descrizione, quindi, ad esempio:
sigle_esami::sigla=tuatabella::analisi

e quindi ricavi il tuo ID con un semplice nometuarelazionededicata::PK_ID

oppure un eseguiSQL sul tipo:
EseguiSQL("SELECT PK_ID FROM sigle_esami WHERE sigla=?";"";"";tuatabella::campochetiserve)

facci sapere :)

.g.

Segnalata come spam
Pubblicato da (Domande: 0, Risposte: 2451)
Risposto il 15 Marzo 2020 16:55
0
Domanda privata

Testato il primo metodo (noSQL) e funziona alla grande!!

Decisamente più veloce e pulito :)

Grazie mille!!

Segnalata come spam
Pubblicato da (Domande: 5, Risposte: 14)
Risposto il 16 Marzo 2020 14:28
0
Domanda privata

Ho una domanda.

Ho creato una TO tra la tabella temporanea in cui importo i dati e la tabella "paziente" usando la relazione tmpTable::PKID = paziente::PKID. Nella relazione ho selezionato "Allow creation of new records via this relationship". Questo non dovrebbe essere sufficiente per inserire i dati automaticamente nella tabella "paziente" senza indicare nulla nello script? Perchè in realtà a me non funziona.

Mi manca una istruzione nello script o devo specificare la relazione in maniera diversa?

Grazie mille.

Segnalata come spam
Pubblicato da (Domande: 5, Risposte: 14)
Risposto il 17 Marzo 2020 15:20
0
Domanda privata

no, crea (o aggiorna) automaticamente il record NEL MOMENTO IN CUI SI INSERISCONO DEI DATI. Se no siamo nel campo della telepatia: come fai a capire quali dati aggiornare? :D

devi aggiungere uno (o più) Imposta campo [tuarelazione::tuocampo; tuoidati] per creare/aggiornare il record.

.g.

Segnalata come spam
Pubblicato da (Domande: 0, Risposte: 2451)
Risposto il 17 Marzo 2020 19:50
0
Domanda privata

Si scusa in effetti la mia domanda è mal posta (come la prima :D)
Nello script importo i dati nella tabella temporanea con Import record e poi faccio set field nella tabella paziente usando la TO che lega le due tabelle per ID. Quindi mi aspetto che quando importo i campi nella tmp table vengano inseriti anche nella tabella paziente

Import Records
Go to Record [first]
Loop
Go to Layout paziente
Set Field [paziente::nome; TO_tmp_table::nome]
## Set tutti gli altri campi
New record request
Go to layout tmp_table
Go to record [next]
End loop

Ma i dati vengono inseriti nella tmp table ma non vengono aggiornati nella tabella paziente, nonostante nella relazione abbia messo "Allow creation of records .... " (sul lato paziente).
Ho provato anche inserendo un record manualmente ma nella tabella paziente non succede nulla.

Segnalata come spam
Pubblicato da (Domande: 5, Risposte: 14)
Risposto il 17 Marzo 2020 22:00
0
Domanda privata

Per verificare il funzionamento ho creato un nuovo file con solo due tabelle.
I campi PK li ho indicizzati, ho settato correttamente la relazione e ho selezionato "Allow e bla bla".
Adesso mi crea un record vuoto, poi inserisce il primo record ed esce dal loop...
Stavolta ho inserito screenshot cosí magari è più chiaro:(

Segnalata come spam
Pubblicato da (Domande: 5, Risposte: 14)
Risposto il 17 Marzo 2020 22:57
0
Domanda privata

non devi andare al formato paziente. il creare record mediante la relazione serve proprio ad evitare quello. Se tu vai al formato non arrivi sul record correlato, ma sull'ultimo visitato (o in alternativa sul primo del foundset.

.g.

Segnalata come spam
Pubblicato da (Domande: 0, Risposte: 2451)
Risposto il 18 Marzo 2020 09:51
Voti
Risposte
Visite
Domanda