Da QlikView 9 ci sono importanti novità sui costi delle licenze. Il listino prezzi è stato completamente rivisto, unificando i tipi delle licenze presenti fino ad oggi.
Se volete un preventivo specifico per le esigenze della vostra azienda sentitevi liberi di scriverci o, in alternativa, compilate il modulo verde a destra di questa pagina.

Ordinamento di stringhe

| | Comments (0)

Io me ne sono accorto solo recentemente... QlikView è senza dubbio un prodotto originale, ma che lo fosse anche nell'ordinamento delle stringhe ...non me lo aspettavo !


Provate a chiedergli di ordinare questi valori:


load * inline [

Stringa

002501A76

1ABAC2244

2500A7600

A BA00000

A-B000000

];

Vi aspettereste che vengnano presentati esattamente come sono scritti, o eventualmente potreste avere il dubbio se le cifre vanno prima delle lettere, oppure il contrario

Invece il risultato è questo:


aa.gif

Quando l'ho visto la prima volta ho pensato: "lo fa a caso"; e subito dopo "è un baco della release"


Invece la spiegazione della casa madre è stata circostanziata:


"L'ordinamento in Qlikview viene fatto sul carattere (da sinistra a destra) in base alle impostazioni locali, ma solo i caratteri alfanumerici sono interessanti per la sequenza di ordinamento: tutti gli altri caratteri non-alfanumerici vengono gestiti nello stesso modo, sullo stesso livello. Ad esempio: "A-B" verrà ordinato prima "A BA" perché "-" e "" verranno trattati in maniera uguale.

Se la stringa contiene valori numerici, QlikView ordina la parte numerica della stringa, prima di applicare l'ordinamento alfanumerico. Questo spiega il perché 1ABAC2244 viene ordinate prima di 002500A76 nell'esempio. La parte numerica di 002500A76 sarà 002500 (o 2500) che verrà confrontata con 1 (parte numerica di 1ABAC2244).


Tutti i valori numeri identici ricevono lo stesso simbolo, indifferentemente dalla loro presentazione - ad esempio 0025, 025, 25 etc. sono considerati identici ed i simboli usati per rappresentarli è semplicemente quello che appare nel primo array ("0025" in questo caso) e questo implica che questi valori vengono raggruppati condividendo uno stesso simbolo ..."



E se uno volesse l'ordinamento classico ?


Se invece provate a fare il rank(Stringa), l'ordinamento è ancora diverso....

bb.gif

Che dire ? 
Forse è un brutto sogno... 

QlikView 9

| | Comments (0)

QlikView 9 ha infine raggiunto lo stato di release candidate.
Uscirà fra qualche mese, ma in Italia sarà probabilmente annunciato ufficialmente verso fine anno.

Ha così tante novità che se chiedete a più sviluppatori quali siano le cose nuove, ognuno di loro vi dirà qualcosa di diverso... e avranno tutti ragione. Provare per credere.

Ecco le innovazioni principali secondo il mio punto di vista:

  1. forte incentivo all'utilizzo del server (ci saranno novità per le licenze)
  2. client per iPhone (già disponibile nell'App Store, si può collegare a QlikView Server precedenti alla 9, ad esempio 8.50)
  3. tutti i client hanno ora le stesse funzionalità, mentre prima il client Java (ad esempio) era indietro rispetto al plugin per Internet Explorer; anche la grafica è stata resa omogenea
  4. possibilità di aprire un altro documento mantenendo le selezioni di quello attivo (le grandi aziende che analizzano tutti i loro processi con QlikView saranno con le bave alla bocca, era una funzionalità molto richiesta)
  5. Dynamic Data Update: ricaricamenti in background dei dati, qualcosa concettualmente simile al Partial Reload ma che potrà anche eliminare righe (era il grosso limite del Partial Reload), il Server invierà al client i dati in push (modalità asincrona, automaticamente)
  6. le Azioni permetteranno di implementare la maggior parte delle funzionalità che prima si creavano con le macro, in maniera decisamente più elegante
  7. possibilità di inserire dei link http (tramite azione collegata ad un pulsante oppure come tipo di visualizzazione dei dati di una colonna in una tabella)
  8. Sparklines: possibilità di inserire un grafico con una dimensione all'interno della cella di una tabella (si decide la dimensione nella rappresentazione dell'espressione)
  9. nuove possibilità di rappresentazione grafiche attraverso i Trellis (grafici iterati su una dimensione)
  10. possibilità di esportare/importare un XML con gli sheet e gli oggetti di presentazione del .qvw (ciò apre le porte a due cose: generazione programmatica di documenti QlikView; inserimento di documenti QlikView in sistemi di controllo versione, seppur in modo "manuale" esportando ed importando... Ma c'è potenziale per superare anche questo ostacolo in versioni future)
  11. le listbox potranno mostrare in visualizzazione ad albero i valori dei campi generati con Hierarchic Load (non solo, ad esempio analizzando i log di un webserver si potrà usare la visualizzazione ad albero col separatore / per analizzare gli URL delle richieste)
  12. eliminato il limite di due miliardi di righe nelle tabelle (non che io abbia mai visto qualche documento che lo raggiungesse), ora sul serio non c'è limite se non quello imposto dalla RAM del server
  13. non sarà più necessaria la licenza professional per creare oggetti su QlikView Server, e sarà possibile creare anche degli sheet nuovi (fino ad oggi non si poteva fare, e si aggirava il problema prevedendo già uno sheet vuoto per personalizzazioni dei singoli utenti)
  14. l'utente che crea oggetti in un documento sul server potrà decidere se mostrarli selettivamente agli utenti che vorrà (invece che a tutti oppure solo a sé stesso)
  15. nuovo tipo di oggetto: campo di ricerca, permetterà di creare una casellina che cercherà in tutti i campi del documento, oppure in determinati campi impostati nelle proprietà, mostrando i risultati dei singoli campi (utile ad esempio per cercare contemporaneamente in un campo codice e in un campo descrizione, senza doverli necessariamente concatenare in un terzo campo)
  16. man mano che si fa una ricerca in un campo, la stringa di testo cercato verrà evidenziata in giallo nei risultati
  17. wizard per creare grafici a boxplot oppure candele giapponesi (che era comunque già possibile fare a mano, si veda http://blog.querit.it/2008/03/grafici-a-candele-giapponesi.html
  18. eseguendo QlikView senza licenza si attiverà QlikView Personal: sarà possibile creare documenti senza alcuna limitazione, ma non potranno essere aperti da altri utenti; sarà possibile pubblicarli e scaricarli su un sito della QlikTech dedicato ad applicazioni QlikView opensource

Sto scrivendo a memoria, quindi di sicuro ho dimenticato qualcosa.

E a voi quale novità in particolare sembra innovativa?

Era metà Maggio 2007 quando HP annunciò la sua nuova piattaforma di data warehouse, Neoview. Cercava di essere una soluzione verticale e all-in-one, ideale per grandi aziende che volessero basare tutti i processi, non solo quelli decisionali, sulla Business Intelligence; chiaramente HP era ben felice di metterci sia il software che l'hardware.
Diverso approccio aveva inizialmente QlikView, apprezzato per lo più da medie aziende a causa di un limite delle tecnologie di allora più che per un design flaw, ma già mentre Neoview nasceva molte grandi aziende avevano adottato QlikView per gestire enormi moli di dati, dimostrando l'eccellenza del design lungimirante.

Il risultato? Forse perché entrambi i sistemi puntano allo sviluppo di applicazioni trasversali in tempo breve, forse perché (ora) sono entrambi ideali per grandi aziende, ma poche ore fa QlikTech ha annunciato la partnership con HP e la possibilità per QlikView di caricare dati da Neoview.

Il mio parere? Un ottimo accordo in tempi di crisi, mutua pubblicità ed un modo per HP per risollevarsi (si è aggrappata ad una scala mobile); una notizia forse meno interessante dal punto di vista puramente tecnico.
Mi riservo di cambiare idea in futuro analizzando qualche caso pratico, ma per ora mi sembra soltanto l'ennesimo custom data source.

E voi che ne pensate?

Buffer load

| | Comments (0)

IT

Spesso sviluppando capita di avere a che fare con caricamenti molto lenti, ad esempio da viste con molte join (che sarebbe opportuno rifare a livello QlikView, ma questa è un'altra storia) oppure server o DBMS obsolescenti.
Durante la fase di sviluppo si fanno molti ricaricamenti consecutivi per provare piccole modifiche, e perdere tempo risulta inutile, inefficiente, fastidioso. Per aggirare il problema è possibile dire a QlikView di ricordarsi ciò che gli ha ritornato una load (o una select) tramite il comando buffer:

buffer (stale 8 hours) sql select * from tabella;
buffer (stale 1 hour) load id, capitalize(desc) as desc from tab2.qvd (qvd);

Così facendo QlikView la prima volta che viene eseguito crea un QVD temporaneo e, finché non "scade" (la durata viene specificata fra le parentesi) dalla seconda volta in poi carica da quello anziché dalla vera fonte dati.
E caricare da QVD significa caricare a circa 30 megabyte al secondo, mentre una vista pesante potrebbe restituire cento righe al secondo, che magari sono soltanto 2 kb.
Se dovesse essere modificato il testo della load (ad esempio viene caricato un campo in più, o viene usato capitalize() per un campo di testo) QlikView sarà sufficientemente furbo da ricaricare dalla vera fonte dati e sostituire il buffer.

EN

Quite often when developing you keep reloading your document, just to test slight changes. Having to wait slow SELECTs is really upsetting, so here is a way to tell QlikView not to reload them every single time, but rather save its content on a fast QVD when the query itself is unchanged:

buffer (stale 8 hours) sql select * from tabella;
buffer (stale 1 hour) load id, capitalize(desc) as desc from tab2.qvd (qvd);

QlikView will reuse the same data for 8 and 1 hours (in the example above).

Qlik bloccato. non disperare

| | Comments (0)
IT
qualche volta accade che dopo un reload o la modifica ad un grafico, l'applicazione rimane bloccata, senza rispondere a nessun input,magari dopo aver fatto modifiche importanti.Si è quindi costretti a terminare il programma attraverso il task manager.In tali situazioni premendo CTRL+S riesci a salvare comunque il lavoro fatto ( ovviamente se vuoi salvare).

EN
Sometimes Qlikview environment doesn't accept any input and it ramains blocked. It would be happen after you get a reload or you modify a chart. You have to kill the application by Task Manager. Before you kill the application , try the keystroke CTRL+S : you could able to save the application anyway ( obviusly if you would).


Boxplot e Delivery Time

| | Comments (3)
IT
Supponiamo di essere il reponsabile acquisti della ACME inc. . Dobbiamo valutare 4 aziende per la fornitura di Nitrato di ammonio,fondamentale per i nostri prodotti. Il fornitore che consegna in minor tempo e con più affidabilità il prodotto diventerà il nostro partner di fiducia.
Nei mesi di maggio e giugno abbiamo fatto ordini e ricevuto consegne. Ora siamo pronti per l'analisi dei dati. 

OrderDelivery:
load * INLINE [
SUPPLIER,DATE ORDER,DATE DELIVERY
Nitro & C.,01/05/08,02/05/08
Nitro & C.,11/05/08,12/05/08
Nitro & C.,14/05/08,16/05/08
Nitro & C.,18/05/08,21/05/08
Nitro & C.,23/05/08,29/05/08
Nitro & C.,02/06/08,03/06/08
Nitro & C.,04/06/08,07/06/08
Nitro & C.,10/06/08,12/06/08
Nitro & C.,16/06/08,19/06/08
Nitro & C.,19/06/08,23/06/08
Nitro & C.,22/06/08,26/06/08
Nitro & C.,02/05/08,06/05/08
Ammonium Speed,03/05/08,04/05/08
Ammonium Speed,12/05/08,13/05/08
Ammonium Speed,15/05/08,16/05/08
Ammonium Speed,19/05/08,23/05/08
Ammonium Speed,27/05/08,29/05/08
Ammonium Speed,05/06/08,07/06/08
Ammonium Speed,03/06/08,06/06/08
Ammonium Speed,11/06/08,16/06/08
Ammonium Speed,13/06/08,18/06/08
Ammonium Speed,19/06/08,06/07/08
Ammonium Speed,22/06/08,23/06/08
Ammonium Speed,12/05/08,13/05/08
Nitram,03/05/08,07/05/08
Nitram,12/05/08,16/05/08
Nitram,15/05/08,19/05/08
Nitram,19/05/08,22/05/08
Nitram,27/05/08,01/06/08
Nitram,05/06/08,10/06/08
Nitram,03/06/08,07/06/08
Nitram,11/06/08,15/06/08
Nitram,13/06/08,17/06/08
Nitram,19/06/08,23/06/08
Nitram,22/06/08,28/06/08
Nitram,12/05/08,19/05/08
NH4NO3,03/05/08,09/05/08
NH4NO3,12/05/08,13/05/08
NH4NO3,15/05/08,21/05/08
NH4NO3,19/05/08,22/05/08
NH4NO3,27/05/08,06/06/08
NH4NO3,05/06/08,06/06/08
NH4NO3,03/06/08,12/06/08
NH4NO3,11/06/08,13/06/08
NH4NO3,13/06/08,19/06/08
NH4NO3,19/06/08,27/06/08
NH4NO3,22/06/08,29/06/08
NH4NO3,12/05/08,19/05/08
];


EN
We pretend to be the ACME Inc. purchasing department manager. We're testing four suppliers for Ammonium nitrate, primary row material for our company. Supplier with best performance in delivery time and reliability will be our partner.We purchase Nitrate on may and june from these four supplier. Now we analyze data to choose the partner.
 

IT
Ipotizziamo di affidarci alla media statistica del tempo di consegna. La media migliore appartiene a Nitro& C. . Test concluso? Abbiamo scelto il nostro partner?
EN
At the begining we look at mean of delivey time for each supplier. Ntiro & C. seems to have the best results.  Test finished? We've choose the partner?
mean.GIF

IT
Proviamo a utilizzare un classico strumento di statistica descrittiva: il boxplot.
Questo strumento permette di evidenziare la distribuzione su misure quali mediana, I e III quartile e limiti di tolleranza,i cosidetti baffi. Dati oltre i baffi 
sono considerati outlier o dati anomali.
Ulteriori info a http://en.wikipedia.org/wiki/Box_plot

EN
We decide to use  boxplot a classic tool in descriptive statistics. Boxplot is a convenient way of graphically depicting
groups of numerical data through their five-number summaries (the smallest observation, lower quartile (Q1), median (Q2), upper quartile (Q3), and largest observation) ( http://en.wikipedia.org/wiki/Box_plot)

IT
In Qlikview creiamo un combo Chart. Impostiamo come dimensione SUPPLIER e generiamo la seguente espressione fractile([DELIVERY TIME],0.75), rappresentante il III° quartile.
Dopodichè flagghiamo la check Boxplot. L'espressione diventerà una misura con 5 sotto-espressioni, rappresentanti le 5 misure del boxplot come segue 

EN
In Qlikview we create a Combo Chart and create the following expression: Fractile(Total <SUPPLIER> [DELIVERY TIME],0.75) this represent the III° quartile. Then we flag the boxplot check and finally we set the other four expressions.

I°quartile :fractile([DELIVERY TIME],0.25)
Mediana (Median ) : median([DELIVERY TIME])
Upper Whisker : fractile([DELIVERY TIME],0.75) + 1.5 *(fractile([DELIVERY TIME],0.75)-fractile([DELIVERY TIME],0.25))
Lower whisket : fractile([DELIVERY TIME],0.25) - 1.5 *  (fractile([DELIVERY TIME],0.75)-fractile([DELIVERY TIME],0.25))

Ora siamo pronti per l'analisi.
Now we analize data.

boxplot2.GIF

IT
Nitro & C. conferma l'indicazione data dalla media. Ma Ammonium speed possiede una mediana più bassa.  Inoltre presenta un dato outlier a 17 giorni,
ben al dì la della concentrazione dei tempi di consegna. Escludendo tale dato, la media di Ammonium è la più performante. Nitram, pur avendo tempi di consegna più alti, ha una variabilità esigua. La certezza della consegna è assicurata. 
NH4NO3 ha prestazioni basse rispetto gli altri tre fornitori e alta variabilità.

EN
The Boxplot Tecnique show us that Ammonium could be the best supplier: Median , I° and III° quartile show us the better performance the other Supplier. 
But a data results very outside from the Ammonium usual performance in delivery.
If we exclude this data the Ammonium speed delivery time mean becomes the better than the others supplier ones. 

IT
Chi scegliere dunque? Concentrerei la mia attenzione sui primi due fornitori. Io investigherei sul dato outlier di Ammonium speed. Potrebbe essere un dato inserito sbagliato. Poi sceglierei o Ammonium speed o Nitro & C.

EN
Who choose? May be Ammonium speed outlier data is only a wrong data or something strange happened. After investigation on that outlier we will choose Nitro & C. or Ammonium speed.
 


Conteggio distinct progressivo - Count distinct...progressive

| | Comments (2)
IT

Un caso d'uso particolare della funzione Count([distinct] expression), si ha quando vogliamo estendere il conteggio "a progressivo".

Ad esempio:
"quanti clienti ci sono in gennaio; quanti ce ne sono fino a febbraio; ... "

Purtroppo le funzioni di accumulo nelle chart sono disponibili solo per le sum()

Che fare ?

Quella che propongo è una soluzione brutale... a voi propormi qualcosa di più elegante

Supponiamo di avere questi dati:

Vendite:
load * inline [
mese, cliente
2, A
2, B
3, B
3, D
11,A
11,D
11,F];

io faccio così:

ConteggioClienti:
load distinct
 mese + iterNo() - 1 as mese
,cliente as _cliente
,1 as ctrCliente
resident Vendite 
while iterNo() <= 13-mese;

In pratica mi creo una tabella di appoggio, in cui per ogni mese colleziono tutti i diversi valori del codice da conteggiare, e la cifra 1 per contarli in modo più efficiente.
iterNo() mi serve per replicare i clienti su tutti i mesi, fino a fine anno.

il risultato è questo:

ProgressiveCountDistinct.gif


EN

There is a very specific use case, for the function: count([distinct] expression), when a "progressive" counting is requested.

For exemple:
"how many customer you have in gen, how many up to feb, etc... "

Unfortunately, for charts,  the "accumulate" options are avalable only when you use sum() aggregate functions..

How to do ?

I will sugget you a dirty solution...  I am sure you can give me a better one !

Let's have this data:

Sales:
load * inline [
month customer
2, A
2, B
3, B
3, D
11,A
11,D
11,F];

this is my suggestion:

CountingCustomers:
load distinct
 month + iterNo() - 1 as month
,customer as _customer
,1 as ctrCustomer
resident Sales 
while iterNo() <= 13-month;

Basically, I loaded a table with, for each month, the distinct codes to be counted.
I used the field ctrCustomer at 1, for best counting.
I used iterNo() to replicat customers code for every month, up to end of the year.

;-)

calendar.jpgIT

QlikView gestisce le date come il numero (decimale) di giorni passati dal 30 Dicembre 1899. Non ho mai capito perché, è una scelta abbastanza strana. Speravo che fosse un tributo a qualche evento interessante del 30 dicembre 1899, ma l'unico fatto apparentemente rilevante è la morte di un politico comunista svedese... Che delusione.
Tornando a noi, ciò significa che:

  • il giorno 2 è il primo Gennaio 1900 a mezzanotte
  • il giorno 2.5 è il primo Gennaio 1900 a mezzogiorno

Ne consegue un gran numero di proprietà comode per elaborare date, ma giocando con una data come se fosse un numero, la sua rappresentazione diventa numerica. Per tornare alla rappresentazione di data basta mettere attorno date() (o timestamp() se vogliamo mostrare anche l'ora; oppure impostare il formato nell'oggetto che mostra il campo con la data in questione).

Qualche esempio:

  • floor(now()) equivale a today(), cioè la mezzanotte di oggi (solo molto più pesante)
  • ceil(now()) è la mezzanotte di domani
  • now()+7 è fra una settimana a quest'ora
  • data_pagamento - data_scadenza_fattura è il numero di giorni di ritardo di pagamento
  • today() + 365*4 non è oggi fra 4 anni causa anni bisestili, per quello è più furbo usare addyears(today(), 4)
  • today() + 30 probabilmente non è lo stesso giorno del mese prossimo, per quello è più furbo usare addmonths(today(), 1)
  • 37145 + 0.36575 è circa uguale a makedate(2001, 9, 11) + maketime(8, 46, 40) che equivale a '11/09/2001 8.46.40'
  • 39739 è il mio prossimo compleanno

Una piccola nota sulla funzione date(espressione [, formato]): serve per formattare il primo argomento secondo la stringa di formato, se non viene specificata viene usato il valore della variabile DateFormat (impostato ad inizio script).
Attenzione però: modifica solo la rappresentazione, ma non tocca il dato. Infatti date(makedate(2008)+maketime(12), 'DD/MM/YYYY') ci mostrerà '01/01/2008' ma conterrà anche l'ora (mezzogiorno). Per capire come mai la rappresentazione sia diversa dal valore numerico sottostante, vedere il mio vecchio post sulla rappresentazione testuale, numerica, duale. Volendo togliere ora, minuti, secondi è sufficiente approssimare per difetto con floor(), come dico più sopra.

EN

QlikView stores dates as the number of days since 30 december 1899. Thus:

  • 2 is 1 jan 1900, at midnight
  • 2.5 is 1 jan 1900, at midday
  • floor(now()) is the same as today() (just slower)
  • ceil(now()) means tomorrow
  • now()+7 means next week at this time
  • payment_date - invoice_due_date is the number of payment delay days
  • today() + 365*4 is not today in 4 years, which in fact is addyears(today(), 4)
  • today() + 30 is probably not this day next month, which is addmonths(today(), 1)
  • 37145 + 0.36575 is almost makedate(2001, 9, 11) + maketime(8, 46, 40) which is '11/09/2001 8.46.40'
  • 39739 is my next birthday

Just a note: date(expression [, format]) doesn't actually modify the date, it justs shows it with a given format. Thus date(now(), 'YYYY-MM-DD') = now() yields true, even if it's not midnight.
If it seems odd to you, see my post about dual().

QlikView 8.50.6206

| | Comments (1)

IT

È uscito QlikView 8.50.6206.5: nessuna funzionalità nuova, come si intuisce dal numero di versione è soltanto un hotfix della precedente 8.50.6091.
Corregge un bel po' di bug piccoli ma fastidiosi, fra cui prestazioni del client Java, piccoli dettagli del copia e incolla di oggetti QlikView dentro Office (che è una novità di QlikView 8.x), e soprattutto finalmente si riesce a ridimensionare le colonne delle tabelle senza impazzire! Per quest'ultima ragione consiglio l'aggiornamento a chiunque stia utilizzando l'8.50.6091.

EN

QlikView 8.50.6206.5 is out: no new features, just a hotfix release.
It fixes a huge number of small bugs, including the resize of columns in table objects and graphs, which was kind of broken since 8.50.6091.