6 Replies Latest reply: Nov 7, 2012 12:20 PM by ILARIA CREMONESI RSS

    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.

        • Re: Circular reference problem
          Luca Cavallari

          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.

            • Re: Circular reference problem

              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.

                • Re: Circular reference problem
                  Luca Cavallari

                  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).

                    • Re: Circular reference problem

                      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.

                        • Re: Circular reference problem
                          Luca Cavallari

                          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