Trasferimento dati relazionali da Access a FM7

FileMaker è un database relazionale. Vediamo come...

Moderatore: Moderatori

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

Trasferimento dati relazionali da Access a FM7

Messaggio da MaT » venerdì 30 settembre 2005, 12:55

Ho un DB Access abbastanza complesso, con parecchie tabelle e relazioni, i cui dati devo recuperare ed importare in FM7 (forse 8 fra poco, ma è lo stesso) mantenendo ovviamente tutte le relazioni esistenti fra loro.

Facile, dite voi, e sarei anche d'accordo. Purtroppo il DB Access da cui arrivano i dati è un DB replicato, nel quale i campi ID di tipo Contatore hanno un comportamento un pò strano.

Per mantenere le relazioni fra i dati in FM volevo rigenerare tutti gli ID e i campi esterni delle relazioni.

Purtroppo riesco ad importare i dati da Access, a generare dei nuovi campi ID, ma non poi a modificare i nuovi campi esterni.

ESEMPIO:

In ACCESS ho:
Tabelle: EDIFICI e AMBIENTI (1 a Molti)
Chiavi: IdEdificio, IdAmbiente
Chiave esterna in Ambienti: CodEdificio

In FM ho creato la stessa cosa, aggiungendo i campi chiave:
NuovoIdEdificio, NuovoIdAmbiente, NuovoCodEdificio
con gli stessi impieghi dei vecchi.

Quando importo il tutto, poiché NuovoIdEdificio e NuovoIdAmbiente sono impostati per essere riempiti automaticamente e progressivamente ottengo delle chiavi già belle e numerate.
Manca solo la compilazione della chiave esterna NuovoCodEdificio sulla quale poi potrò basare la relazione fra le tabelle in FM.

Quello che dovrei fare ora è compilare tutti i NuovoCodEdificio con i valori di NuovoIdEdificio dove CodEdificio è uguale a IdEdificio.

Per capirci, in SQL maccheronico qualcosa come:

UPDATE Ambienti SET NuovoCodEdificio=Edifici.NuovoIdEdificio WHERE Ambienti.CodEdificio=Edifici.IdEdificio


Che ne dite? Come si può fare questo aggiornamento in automatico?
Grazie!
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 » sabato 1 ottobre 2005, 12:18

Quello che dovrei fare ora è compilare tutti i NuovoCodEdificio con i valori di NuovoIdEdificio dove CodEdificio è uguale a IdEdificio.
hai provato con :

creando una relazione Ambienti::codEdificio=Edifici::Idedificio

dopodichè (dalla tabella ambienti)

sostituisci contenuto campo(NuovoCodEdificio;if(conteggio(nomerelazione::Idedificio)=0; NuovoCodEdificio; NuovoIdEdificio)

dovrebbe funzionare (salva i dati prima).

.g.

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

Messaggio da MaT » sabato 1 ottobre 2005, 18:50

Qualcosa è successo! Grazie! :D

Ora dovrò controllare tutto il procedimento e controllare che i link siano corretti.

A parte questo, non capisco bene il funzionamento del comando, in particolare il significato della parte
conteggio(nomerelazione::Idedificio)=0

Mi sono fatto un'idea, ma vorrei capire bene il meccanismo e l'help non cita un utilizzo di questo tipo.

Grazie ancora.
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 » sabato 1 ottobre 2005, 23:11

lo scopo delle relazioni è quello di mostrare solo i record che le soddisfino, giusto?
conteggio mostra il numero di valori in un certo campo se il conteggio dei valori di un campo dei reord correlati è 0 vuol dire che non ci sono record correlati, ergo il valore che hai posto come parte della relazione non ha corrispettivo. ergo, non sostituiamo il valore ma lasciamo quello già presente.
Se invece uno o più record correlati esistono (in questo caso se idEdificio ha un valore univoco, ci sarà un solo valore che soddisfa la relazione) allora sostituisci il valore nel campo che vuoi con quello che ti interessa.

stessa cosa del tuo esempio in sql, tradottta in Filemaker.

.g.

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

Messaggio da MaT » lunedì 3 ottobre 2005, 11:16

Capito.

Mi ha confuso il fatto che in tutto il resto del mondo se dici "conteggio" o COUNT o qualsiasi altra cosa simile il DB si mette a contare tutto, a meno che tu stesso non specifichi una condizione.

Qui invece FM si mette a contare solo i campi relazionati già per conto suo. Il ché è un pò disorientante.. Che succede se voglio contarli tutti?

Sono, come avrai capito, queste cose un pò "personalizzate" che mi disorientano di FM...

Grazie ancora!
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 » lunedì 3 ottobre 2005, 11:49

scusa, che c'è di strano?

la funzione CONTA effettivamente tutti valori del campo indicato.
ma se specifichi il campo all'interno di una relazione conta solo i valori correlati. come dici tu in questo caso hai specificato tu stesso una condizione.

non dovrebbe essere così?

se vuoi contarli tutti hai altre funzioni (es. get(contorecordtotale))

.g.

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

Messaggio da MaT » martedì 4 ottobre 2005, 12:35

Di strano c'è che se scrivo:

conteggio(Edifici::IdEdificio)

e basta, in genere si ottiene il conteggio dei record di Edifici, come succede se in SQL si scrive l'istruzione equivalente SELECT COUNT IdEdificio FROM Edifici senza indicare le eventuali Join.

Altra cosa è l'istruzione SQL SELECT COUNT IdEdificio FROM Edifici INNER JOIN Ambienti WHERE Edifici.IdEdificio = Ambienti.CodEdificio

Nell'istruzione di FM non c'è alcuna specificazione del fatto che si voglia tenere conto delle relazioni esistenti fra Edifici e la tabella da cui si sta lanciando il comando. Da quanto ho capito con il comando "Conteggio" questo è sottinteso, ma non specificato, e quindi disorientante.

Se, per assurdo, un estraneo leggesse l'istruzione FM non saprebbe cosa aspettarsi, perché in effetti nel comando non sono contenute informazioni sul fatto che esistano o meno relazioni attive fra dove si è (Ambienti) e dove si opera (Edifici).

Perdona l'insistenza, ma sono nuovo di FM e certe cose non le capisco bene, quindi mi piace approfondire così da capire bene come ci si può muovere. 8O

Grazie per i consigli! :)
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 » mercoledì 5 ottobre 2005, 11:07

mi dirai che in questo caso c'è un ambiguità, ma NON che sia strano. Infatti in questo caso la parte antecedente i :: (EDIFICI) NON indica la relativa tabella, ma la RELAZIONE fra la tabella cui si appoggia il formato in cui sei e l'altra. Il problema è che nel caso di relazione singola (tabella A correlata a Tabella B) non è possibile specificare un nome alla relazione. Di qui l'ambiguità. In generale è un discorso di filisofia operativa; se sbagli relazione o semplicemente se non esiste relazione il calcolo avrà valore 0. In ogni caso nella finestra di calcolo sono indicate le tabelle non correlate…

.g.

Rispondi