Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Circular reference problem

Dear all,

I am new to QlikView and I have this circular reference problem I am struggling with.

I have three tables: MACCHINE, CALENDARIFAB and MASTER CALENDAR that generates a circular reference.

MACCHINE is a table with the list of machines, each of which has its IdCalendarioFabbrica (the ID of the factory calendar).

CALENDARIFAB is a table with the factory calendars, with its IdCalendarioFabbrica (the ID of the factory calendar) and DataMovimento (date of the year)

MASTER CALENDAR is the master calendar with DataMovimento (date)

MOVIMENTIPRODUZIONE is the fact table with the production movements, each with its IdMacchina (the machine id)

I read about the concept of link table but I really don't know if this is the case I should apply it and how I could do it.

Thank you in advance for any reply, which will be very much appreciated.

1 Solution

Accepted Solutions
lucas4bi
Partner - Creator
Partner - Creator

Penso che la soluzione sia più semplice di così: avendo la chiave IdMacchina+DataMovimento sulle tabelle Movimenti e CalendarioFab, selezionando un qualsiasi record dei movimenti, ti troverà il record associato del calendario corretto proprio perchè la chiave va a parità di IdMacchina e DataMovimento. (dove DataMovimento sulla tab CalendarioFab è in realtà la data relativa al calendario)

Facendo una join tra CalendarioFab e Macchine (con chiave IdCalendario) in modo da avere sul CalendarioFab anche l'id della macchina, poi creare una chiave IdMacchina+DataMovimento cosicchè riesci ad avere la info direttamente agganciata ai Movimenti.

Droppando i campi che si collegano con la tab Macchine, altrimenti ti si ripresenta la circolarità.

In questo modo dovrebbe funzionare

View solution in original post

6 Replies
lucas4bi
Partner - Creator
Partner - Creator

E' necessario eliminare questa circolarità,

per farlo bisgna valutare se ci sono delle informazioni ridondati, o che possiamo agganciare in altro modo modificando lo script:

ad esempio: la tabella MASTER CALENDAR, è necessaria?

se ho solo bisogno di avere i campi, ANNO,MESE ecc. per la DATAMOVIMENTO, li posso ricavare anche dalla tabella dei fatti, caricando con funzioni come

Year(DataMovimento) as AnnoMovimento,

Month(DataMovimento) as MeseMovimento.

in questo modo non è necessario caricare MASTER CALENDAR e non si verificherà più il problema di circolarità.

Se invece fosse necessario, per altri motivi, caricare questa tabella, bisogna pensare a denormalizzare un po' la struttura, facendo magari delle join (in base alle esigenze) tra le tabelle che creano la circolarità facendo in modo da far risultare la struttura lineare senza perdere informazioni.

Es: una join tra CalendariFab e Macchine, con la conseguente creazione di una chiave composta da IdMacchina&'_'&DataMovimento che vada a legarsi ad un omonima chiave sulla tabella dei fatti.

Not applicable
Author

Grazie Lucas della risposta.

Se elimino la tabella Master Calendar permane la circolarità tra le tabelle MovimentiProduzione, CalendariFab e Macchine.

In alternativa dovrei quindi creare una chiave composta tra IdMacchina e Data Movimento. Come?

Ad esempio con una funzione AutoNumberHash256(IdMacchina, DataMovimento) da creare sia nel caricamento della tabella Macchine in join con CalendariFab e in MovimentiProduzione ?

Ho provato a fare così ma ottengo poi dati non corretti.

Grazie mille.

lucas4bi
Partner - Creator
Partner - Creator

Io creerei una chiave in questo modo:

Faccio una left join join sul CalendarioFab con la tab. Macchine, legando solamente l' IdMacchina.

facendo una drop del campo IdCalendarioFabbrica sulla tab. Macchine.

Dopodichè posso fare una chiave IdMacchina+DataMovimento sulla tab CalendarioFab. (droppando sempre i campi ridondanti, in questo caso i singoli IdMacchina e DataMovimento una volta creata la chiave).

Creo la stessa chiave IdMacchina+Datamovimento sulla tabella movimenti_produzione

Così Movimenti_Produzione sarà legata a Macchine tramite il semplice campo IdMacchina,

e sarà legata al CalendarioFab tramite la chiave IdMacchina-Datamovimento (as un nome a piacere).

Not applicable
Author

Grazie della risposta. Ho provato ad implementare una chiave combinata ma mi sono poi resa conto che, poichè ogni macchina può avere un IdCalendarioFab diverso, devo per forza mantenere le due chiavi IdMacchina e IdCalendario, quindi separare le date DataMovimento e DataCalendario.

Vorrei quindi ora creare un'espressione IF che funzioni nel seguente modo:

se l'utente seleziona una certa DataMovimento, allora la DataCalendario deve assumere lo stesso valore.

Tenendo conto che l'utente può selezionare Anno - Mese - Settimana - Giorno

Esempio:

if( GetSelectedCount(Date(DataMovimento)) ,  sum( { <DayCalendario = {"=Day(DataMovimento) "}>} OreDisp) ,

                if(GetSelectedCount(Settimana), sum(   {$<SettimanaCalend = {"=Settimana"} >}   OreDisp) ,

          if(GetSelectedCount(Month), sum(   {$<MonthCalendario = {"=Month"}>}   OreDisp) ,

          if(GetSelectedCount(Year), sum(   {$<YearCalendario = {"=Year"}>}   OreDisp) ,0)

)))

Vedo tuttavia che così scritto non funziona. Forse non è corretta la sintassi?

Grazie.

lucas4bi
Partner - Creator
Partner - Creator

Penso che la soluzione sia più semplice di così: avendo la chiave IdMacchina+DataMovimento sulle tabelle Movimenti e CalendarioFab, selezionando un qualsiasi record dei movimenti, ti troverà il record associato del calendario corretto proprio perchè la chiave va a parità di IdMacchina e DataMovimento. (dove DataMovimento sulla tab CalendarioFab è in realtà la data relativa al calendario)

Facendo una join tra CalendarioFab e Macchine (con chiave IdCalendario) in modo da avere sul CalendarioFab anche l'id della macchina, poi creare una chiave IdMacchina+DataMovimento cosicchè riesci ad avere la info direttamente agganciata ai Movimenti.

Droppando i campi che si collegano con la tab Macchine, altrimenti ti si ripresenta la circolarità.

In questo modo dovrebbe funzionare

Not applicable
Author

Ho implementato in questo modo con la chiave combinata su IdMacchina e DataMovimento (=Data calendario) e sembra funzionare.

Ottima soluzione! Grazie del suggerimento!