Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

In questo tutorial imparerai come ottimizzare una misura in LuckyTemplates. L'ottimizzazione delle misure nel report migliora le prestazioni dei codici nella produzione di informazioni e dati preziosi. Imparerai anche i diversi metodi di valutazione e come applicarli per ottimizzare il tuo rapporto. Puoi guardare il video completo di questo tutorial in fondo a questo blog.

Sommario

1. Analizzare le prestazioni del codice

In questo esempio, devi ottimizzare questo rapporto:

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Questo è il modello di dati che utilizzerai:

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

La tabella Jobs contiene tutte le informazioni relative a qualsiasi lavoro che è stato eseguito in un determinato periodo di tempo.

Questa tabella è la base di tutte le misure che intendi ottimizzare:

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Innanzitutto, è necessario testare le prestazioni del report.

Vai alla scheda Visualizza e scegli Performance Analyzer . Quindi, fai clic su Avvia registrazione e aggiorna immagini . Attendere che l'analizzatore esegua il rendering dell'immagine.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Al termine, apri l' elenco Riepilogo incentivi e fai clic su Copia query .

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Selezionare quindi Strumenti esterni per passare a DAX Studio e esaminare il codice generato da LuckyTemplates.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Quindi, incolla la query copiata all'interno dell'area di lavoro.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Variabili nella misura

La prima variabile è DateClosed che è l'affettatrice sul dashboard. Utilizza una colonna della tabella dei fatti per ottenere i valori di determinati periodi nell'affettatrice.

La variabile successiva è JobLost che controlla False o Blank dei dati Job Lost.

L'ultima variabile è MatrixVisual . Questo è il cuore del codice. Mostra la colonna di riepilogo generata da LuckyTemplates per popolare gli oggetti visivi matrice. Raggruppa il Job Loss Type in questa matrice e inietta i filtri provenienti dagli slicer. Quindi, aggiunge colonne estese.

Una volta che la colonna di riepilogo completa l'esecuzione, vedrai i risultati nel riquadro sotto il codice.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

LuckyTemplates usa il risultato per popolare gli oggetti visivi matrice.

Cache fredda per DAX Studio

Successivamente, è necessario controllare il tempo impiegato per eseguire l'intero codice. Per farlo, attiva Server Timings e quindi scegli Clear Cache Then Run .

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Quando si tenta di ottimizzare una misura in LuckyTemplates usando DAX Studio , è preferibile operare nello scenario di cache a freddo in modo che l'ora che si ottiene sia corretta. Successivamente, premi F5 e attendi il completamento dell'operazione nella scheda Server Timings .

Una volta completato, puoi vedere che il tempo totale di esecuzione è di 3,6 secondi. Ha trascorso la maggior parte del tempo nel motore di formula e ha trascorso 57 millisecondi nel motore di archiviazione

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Puoi anche vedere che ha trovato 383 query del motore di archiviazione. Di tutte queste query, ce ne sono 327 che vengono lanciate nella memoria in modo che possano essere riutilizzate.

2. Analizzare una misura in LuckyTemplates

Successivamente, è necessario ottimizzare queste 3 misure identiche.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Devi estrarre queste misure in un file diverso e collegarlo al modello di dati che stai utilizzando.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Successivamente, avvia i tempi del server per vedere il tempo impiegato dalle 3 misure nel popolare le immagini.

I risultati dell'esecuzione mostrano che le misure impiegano 1,85 secondi per recuperare un risultato.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Il risultato mostra una tabella composta da 10 righe e 3 colonne estese che appartengono alle colonne riassunte.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

La colonna Tipo di perdita contiene 10 valori univoci che il codice calcola per ottenere le percentuali di incentivo.

Il tempo impiegato dal codice è esponenzialmente elevato. Ecco dove e quando è necessario ottimizzarli.

La misura% dell'incentivo RB in LuckyTemplates

Questa è una misura % di incentivo RB in LuckyTemplates. È una delle 3 misure principali utilizzate in questo esempio.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Puoi vedere che sta cercando di calcolare la percentuale di incentivo.

Ha una variabile, JobType, che recupera il valore Lost Type nel contesto del filtro corrente. Controlla anche se c'è un solo valore visibile nel contesto del filtro corrente. È necessario utilizzare una funzione  in modo che ogni volta che viene soddisfatta una condizione, fornisca il risultato corrispondente.

Questo codice di misura genera molto grasso del motore di stoccaggio che aumenta il tempo nella durata complessiva del codice.

Ora torna a DAX Studio per controllare la quantità di query del motore di archiviazione generate dalla misura.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Puoi vedere che sono stati necessari 600 millisecondi per l'esecuzione e 43 query del motore di archiviazione per recuperare semplicemente i dati per le 10 righe.

Dati dal motore di archiviazione

Ora controlla i dati richiesti dal motore di archiviazione. Nella prima query, c'è un Jobs Loss Type e DCOUNT  del Jobs Loss Type.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

La query successiva ha Jobs Date Closed che proviene dall'affettatrice nel report.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Nel terzo codice, vedrai un altro tipo di perdita di lavoro con l'ID dati di richiamata.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

In un'altra riga, vedrai le righe di codice più importanti.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

La prima cosa che vedi è la dei pagamenti dei lavori ricevuti, fatturati e delle spese effettive.

La prossima è la funzione WHERE  che indica una condizione e il risultato corrispondente. Il risultato varierà in base alla selezione dell'affettatrice e alla dichiarazione di passaggio nella misura % dell'incentivo RB.

Noterai anche che il codice sulle righe 12 e 14 è lo stesso.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Se scorri verso destra, puoi vedere che ci sono righe con le stesse query. Le query sulle righe sono indirizzate dall'istruzione switch nella misura RB Incentive%.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Se torni alla misura RB Incentive% in LuckyTemplates, puoi vedere il numero di volte in cui una query viene ripetuta e come si riflette nelle query del motore di archiviazione.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

La logica dietro IF e Switch

Ora, per capire perché le query vengono eseguite più volte, è necessario comprendere la logica delle funzioni  e SWITCH .

Devi eseguirli separatamente su un piano di query. Ma prima di farlo, assicurati di connetterti al database e attivare il piano di query.

Eseguire l' istruzione SWITCH  nel piano di query. Quindi, evidenziare l'  istruzione e quindi premere invio.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Questo genererà un piano di query logico con diverse operazioni.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Successivamente, eseguire l' istruzione IF evidenziando l'istruzione e premendo Invio.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Puoi vedere che genera lo stesso piano di query logico.

Questo perché ogni volta che usi una funzione SWITCH , il motore converte internamente quella funzione in un'istruzione IF . Ma si consiglia un'istruzione SWITCH perché aumenta la leggibilità del codice.

Dopodiché, devi capire come viene eseguito un codice all'interno della funzione IF o SWITCH .

Questo è un codice di esempio che contiene un'istruzione SWITCH .

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Ha misure per l'utile lordo, la stima totale e il totale fatturato che sono tutte la somma di diverse colonne. Ha anche una funzione sui di Jobs Loss Type e un'istruzione SWITCH e TRUE .

Quando esegui questo codice, vedrai la logica dietro le funzioni.

La prima query ottiene il distinto Jobs Loss Type dalla tabella Jobs.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Oltre al tipo di perdita di lavoro, ottiene anche la somma della stima dei lavori.

All'interno della condizione WHERE , puoi anche vedere i valori che esistono nella colonna Jobs Loss Type.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

3. Utilizzare i metodi di valutazione del codice

In DAX sono disponibili 3 metodi per la valutazione dei codici:

  • Valutazione rigorosa
  • Valutazione impaziente
  • Valutazione IF.Eager

Questi metodi ti aiuteranno a ottimizzare un codice o una misura in LuckyTemplates.

1° metodo: valutazione rigorosa

L'esempio mostrato di seguito utilizza il metodo di valutazione rigorosa.

La logica alla base è che se il contesto del tipo di perdita di lavoro è uguale ad A, fornirà il profitto lordo. In caso contrario, fornisce la stima totale. Il codice esegue questa operazione per ogni riga nel tipo di perdita di lavoro.

Questa è un'altra misura di esempio in LuckyTemplates che usa la valutazione rigorosa.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Quando esegui questo codice, genererà 5 query del motore di archiviazione.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Con la valutazione rigorosa, il codice fornisce la stima totale se il profitto lordo moltiplicato per 1,4 è maggiore della stima media. Altrimenti, darà il profitto lordo.

L'uso della valutazione rigorosa produce più query del motore di archiviazione perché l' istruzione IF  controlla più volte la concorrenza del profitto lordo e alla fine ostacolerà le prestazioni dell'intera operazione.

2° metodo: valutazione impaziente

Questo è lo stesso codice dell'esempio precedente.

Ma invece di calcolare le misure all'interno  dell'istruzione IF , ha calcolato tutto nel prima di RETURN .

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Significa che prima di controllare le dichiarazioni, ottiene tutti i valori del profitto lordo e della stima totale per tutti i tipi di perdita di lavoro.

Quando esegui questo codice, il numero di motori di archiviazione viene ridotto a 3.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Migliora le prestazioni dell'intera operazione.

Nella prima query di operazione, ottiene il Tipo di perdita di lavoro e la somma di Stima lavori e Profitto lordo.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

La query successiva ottiene la somma della stima dei lavori dalla stalla dei lavori. Viene utilizzato per calcolare la stima media.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

L'ultima query fornisce il tipo di perdita di lavoro distinto per i valori scritti in ADDCOLUMNS .

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

L'utilizzo di Eager Evaluation ottiene tutto in un'unica cache di dati. I dati vengono inoltre valutati e iterati sul motore di formule. L' istruzione IF  restituirà la stima totale o il profitto lordo a seconda della valutazione vera o falsa.

La valutazione ansiosa non è sempre il metodo migliore per ottimizzare i codici. La valutazione rigorosa si tradurrà in prestazioni migliori se si dispone di codici complessi. Tutto dipende dalle funzioni utilizzate all'interno del codice DAX.

Lo svantaggio di Eager Evaluation è che se crei oggetti di valore prima di un'istruzione IF  o  SWITCH  e usi quelle variabili all'interno dell'istruzione che non dovrebbero mai essere eseguite, il motore calcolerà comunque quelle variabili.

Svantaggi della valutazione impaziente

Ecco un esempio del lato negativo:

Idealmente, se il tipo di perdita di posti di lavoro è uguale ad A dovrebbe ottenere il profitto lordo. In caso contrario, ottiene la stima totale.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Poiché non esiste alcun valore all'interno della colonna Job Loss Type uguale ad A, dovrebbe sempre ottenere Total Estimate. Tuttavia, fornisce ancora il profitto lordo nella cache dei dati.

Se guardi la prima query, ottiene il tipo di perdita di lavoro e la somma del profitto lordo e della stima dei lavori.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Nella query successiva, ottiene un distinto Jobs Loss Type dalla tabella Jobs.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

3° Metodo: Valutazione IF.EAGER

Il metodo successivo è la  valutazione della funzione IF.EAGER  che replica il comportamento della valutazione Eager.

Ti consente di scrivere un codice che rappresenta la Strict Evaluation ed eseguirlo con Eager Evaluation.

Se guardi questo codice di esempio, è proprio lo stesso del codice di valutazione rigorosa. L'unica differenza è che questo usa la funzione IF.EAGER  invece di IF .

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Prima di eseguire il codice, assicurati di connetterti al modello LuckyTemplates e di attivare Server Timing. Una volta fatto, premi F5.

Puoi vedere che ha generato 3 query del motore di archiviazione.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

La prima query ottiene Jobs Loss Type e la somma di Jobs Estimate e Gross Profit.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

La seconda query ottiene la somma della stima dei lavori.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

L'ultima query ottiene il distinto Jobs Loss Type dalla tabella Jobs.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Noterai che ha eseguito lo stesso comportamento della Eager Evaluation.

Sommario dei metodi di valutazione

Nel tentativo di migliorare le prestazioni dei tuoi calcoli, devi ricordare quanto segue:

  • La valutazione rigorosa viene utilizzata per codici complessi. Vale anche per quando non si vogliono valutare tutti i valori forniti dalla tabella.
  • Eager Evaluation è meglio usare se i tuoi codici sono semplici.
  • Utilizzare IF.EAGER se si desidera scrivere codici utilizzando la Strict Evaluation ed eseguirlo con Eager Evaluation.

Ma tieni presente che devi testare questi tre metodi per scoprire cosa è veramente meglio usare nel tuo rapporto.

4. Ottimizza una misura in LuckyTemplates

La lezione principale di questo tutorial è l'ottimizzazione dei codici.

Torna indietro e osserva la misura % dell'incentivo RB eseguita utilizzando la valutazione rigorosa. Successivamente, prova a valutarlo utilizzando Eager Evaluation.

Inizia creando variabili e inserendo la funzione  RETURN .

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Modificare i riferimenti di misura con le variabili.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Successivamente, conferma la misura e vai a DAX Studio per vedere se ha migliorato le prestazioni.

Mostra che il tempo totale è di 642 millisecondi e il numero totale di query del motore di archiviazione è stato ridotto a 39.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Ora, crea le variabili per tutti i dati e modifica tutti i riferimenti alle misure nelle variabili corrispondenti.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Successivamente, confermare la misura ed eseguire il codice nello studio DAX.

Il tempo di esecuzione totale e la quantità totale di query del motore di archiviazione sono stati ridotti rispettivamente da 600 millisecondi a 170 millisecondi e da 43 query a 15 query.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Puoi anche vedere che non ci sono duplicati. La presenza di variabili nel codice ne migliora la leggibilità e le prestazioni.

Ottimizzazione avanzata per una misura in LuckyTemplates

Successivamente, è necessario ottimizzare ulteriormente i codici DAX.

Invece di utilizzare , utilizzare la funzione  .

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

HASONEVALUE  conta il numero di valori disponibili nel contesto del filtro che è un'operazione molto impegnativa. Nel frattempo, ISINSCOPE controlla se la colonna che viene fornita è utilizzata per il raggruppamento o meno.

Dopo aver modificato le funzioni, confermare la misura ed eseguirla in DAX Studio.

Puoi vedere che il numero di query del motore di archiviazione è ora 12. Anche il tempo di esecuzione totale è diventato 105 millisecondi.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Nella seconda query, noterai un ID dati di richiamata.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Questo a volte accade quando usi SELECTEDVALUE con il campo di testo. Quando vedi i dati di richiamata, il motore di archiviazione chiama il motore delle formule per aiutare a risolvere la complessità del codice. Questo rallenta le prestazioni della misura.

Rimuovi i dati di richiamata

È necessario rimuovere i dati di richiamata per ottenere prestazioni migliori nel rapporto. Per fare ciò, è necessario creare una tabella di configurazione nel modello di dati.

Vai all'opzione Inserisci dati e incolla i dati. Denominare la tabella LossTypeConfigTable .

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Successivamente, fai clic su Modifica per modificare il tipo di dati della colonna che intendi importare.

Il tipo di dati dell'ID del tipo di perdita deve essere un valore dell'insegnante in modo che possa essere utilizzato all'interno della funzione SELECTEDVALUE .

Dopo che è stato caricato nel modello, creare una relazione tra la tabella Jobs e la tabella LossTypeConfigTable in base al Loss Type.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Dopo aver creato una relazione, vai alla tabella Jobs e aggiungi una nuova colonna. Chiamalo ID perdita e quindi inserisci la formula.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Utilizzare la funzione  per la tabella di configurazione e quindi estrarre l'ID del tipo di perdita.

Successivamente, torna alla misura RB Incentive% e fai riferimento al campo numerico anziché al campo di testo. All'interno di SELECTEDVALUE , sostituisci Tipo di perdita con ID perdita.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Successivamente, modifica tutte le misure all'interno del codice. Utilizzare un valore intero invece dei valori di testo nel controllo del tipo di lavoro.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Dopo aver modificato il codice, confermare la misura ed eseguirla in DAX Studio.

L'ID dati Callback viene eliminato nella query e il tempo di esecuzione del codice viene ridotto a 93 millisecondi.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

La misura RB Incentive% è ora completamente ottimizzata.

5. Ottimizza altre misure in LuckyTemplates

È inoltre necessario ottimizzare le misure WR Incentive% e QB Incentive%.

Copia e incolla il codice esatto utilizzato nella misura RB Incentive%. Quindi, esegui le 3 misure insieme.

Il tempo di esecuzione totale è ottimizzato e ridotto da 1855 millisecondi a 213 millisecondi. Ci sono anche solo 12 query del motore di archiviazione.

Le prime due query creano il contesto del filtro e il resto rappresenta il numero esatto di valori all'interno della colonna Jobs Loss Type.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Poiché tutte le misure sono state ottimizzate, eseguire il codice originale e vedere come sono cambiate le prestazioni. I dati mostrano che ora viene calcolato in 1,9 secondi.

Misura in LuckyTemplates: suggerimenti e tecniche di ottimizzazione

Le prestazioni dell'intero codice sono ora ottimizzate, rendendo il tuo report più veloce e migliore.


Ottimizza le funzioni DAX con questo nuovo corso
Semplici trasformazioni di LuckyTemplates per dati più ottimizzati
Ottimizza le formule di LuckyTemplates utilizzando DAX avanzato

Conclusione

Nei report di LuckyTemplates, le misure devono essere ottimizzate per garantire che i codici DAX vengano eseguiti senza problemi. Ciò migliora anche le prestazioni complessive del rapporto.

Hai imparato i diversi metodi per ottimizzare la tua misura in LuckyTemplates e hai imparato a valutare quale utilizzare a seconda del contesto del tuo report.


Cosè il sé in Python: esempi del mondo reale

Cosè il sé in Python: esempi del mondo reale

Cos'è il sé in Python: esempi del mondo reale

Come salvare e caricare un file RDS in R

Come salvare e caricare un file RDS in R

Imparerai come salvare e caricare oggetti da un file .rds in R. Questo blog tratterà anche come importare oggetti da R a LuckyTemplates.

Rivisitazione dei primi N giorni lavorativi: una soluzione per il linguaggio di codifica DAX

Rivisitazione dei primi N giorni lavorativi: una soluzione per il linguaggio di codifica DAX

In questa esercitazione sul linguaggio di codifica DAX, scopri come usare la funzione GENERATE e come modificare dinamicamente il titolo di una misura.

Mostra approfondimenti utilizzando la tecnica di visualizzazione dinamica multi-thread in LuckyTemplates

Mostra approfondimenti utilizzando la tecnica di visualizzazione dinamica multi-thread in LuckyTemplates

Questo tutorial illustrerà come utilizzare la tecnica di visualizzazione dinamica multi-thread per creare approfondimenti dalle visualizzazioni di dati dinamici nei report.

Introduzione al filtraggio del contesto in LuckyTemplates

Introduzione al filtraggio del contesto in LuckyTemplates

In questo articolo, esaminerò il contesto del filtro. Il contesto del filtro è uno degli argomenti principali che qualsiasi utente di LuckyTemplates dovrebbe inizialmente conoscere.

I migliori suggerimenti per lutilizzo delle app nel servizio online LuckyTemplates

I migliori suggerimenti per lutilizzo delle app nel servizio online LuckyTemplates

Voglio mostrare come il servizio online di LuckyTemplates Apps può aiutare nella gestione di diversi report e approfondimenti generati da varie fonti.

Analizza le variazioni del margine di profitto nel tempo: analisi con LuckyTemplates e DAX

Analizza le variazioni del margine di profitto nel tempo: analisi con LuckyTemplates e DAX

Scopri come elaborare le modifiche al margine di profitto utilizzando tecniche come la ramificazione delle misure e la combinazione di formule DAX in LuckyTemplates.

Idee di materializzazione per cache di dati in DAX Studio

Idee di materializzazione per cache di dati in DAX Studio

Questo tutorial discuterà delle idee di materializzazione delle cache di dati e di come influiscono sulle prestazioni dei DAX nel fornire risultati.

Reporting aziendale tramite LuckyTemplates

Reporting aziendale tramite LuckyTemplates

Se finora utilizzi ancora Excel, questo è il momento migliore per iniziare a utilizzare LuckyTemplates per le tue esigenze di reportistica aziendale.

Che cosè il gateway LuckyTemplates? Tutto quello che devi sapere

Che cosè il gateway LuckyTemplates? Tutto quello che devi sapere

Che cos'è il gateway LuckyTemplates? Tutto quello che devi sapere