Condividi tramite


Definizione di assegnazioni con ambito utilizzando i comandi script

I due argomenti precedenti di questa lezione hanno descritto le procedure per aggiungere membri calcolati e calcoli di set denominati allo script di calcolo di un cubo. Oltre a questi due tipi specifici di calcoli MDX (Multidimensional Expressions), è possibile utilizzare Nuovo comando script per eseguire la maggior parte delle azioni supportate da MDX all'interno di un cubo.

In Microsoft SQL Server 2005 Analysis Services (SSAS) è possibile applicare gli script MDX all'intero cubo o a sezioni specifiche del cubo, in punti specifici nell'esecuzione dello script. Sono già state descritte le procedure relative al comando script predefinito, l'istruzione CALCULATE, che popola le celle del cubo con dati aggregati in base all'ambito predefinito.

L'ambito predefinito è costituito dall'intero cubo, tuttavia, come indicato nell'argomento precedente, è possibile utilizzare l'istruzione SCOPE per definire un ambito più limitato, noto come sottocubo, a cui applicare uno script MDX. L'istruzione SCOPE definisce l'ambito di tutte le espressioni MDX e di tutte le istruzioni successive all'interno dello script di calcolo finché l'ambito non termina o non viene ridefinito. In seguito viene utilizzata l'istruzione THIS per applicare un'espressione MDX all'ambito corrente. L'istruzione BACK_COLOR può essere utilizzata per specificare un colore di sfondo per le celle dell'ambito corrente, allo scopo di facilitare il debug.

Nelle procedure descritte in questo argomento vengono utilizzate le istruzioni SCOPE e THIS per definire quote vendite per ogni trimestre fiscale dell'anno fiscale 2005. In seguito vengono allocate quote vendite al livello mese per tutti gli anni fiscali del cubo. Verrà inoltre descritto l'utilizzo dei punti di interruzione per il debug dello script di calcolo.

Controllo delle assegnazioni delle quote vendite in base al tempo e ai dipendenti

Per controllare le assegnazioni delle quote vendite in base al tempo e ai dipendenti

  1. Aprire Progettazione cubi per il cubo di Analysis Services Tutorial e quindi fare clic sulla scheda Esplorazione.

  2. Eliminare tutte le gerarchie e le misure dal riquadro Dati e tutti i membri della dimensione dal riquadro Filtro.

  3. Aggiungere la misura Sales Amount Quota del gruppo di misure Sales Quotas all'area dati del riquadro Dati.

  4. Aggiungere la gerarchia definita dall'utente Fiscal Time alla colonna.

  5. Aggiungere la gerarchia dell'attributo Employee Name all'area riga.

    Si noti che non è stato definito alcun valore di quote vendite per l'anno fiscale 2005.

  6. Nell'area colonna rimuovere FY 2002 e FY 2003.

  7. Nell'area colonna espandere FY2004, espandere H1 FY 2004 e quindi Q3 FY 2004.

    Si noti che le quote vendite per ogni mese fiscale nel trimestre fiscale rappresentano lo stesso importo delle quote vendite per il trimestre fiscale. Il motivo è che il livello di dettaglio della dimensione temporale nel gruppo di misure Sales Quota è il livello trimestre, come spiegato nella Lezione 5.

    Nella figura seguente viene illustrata la quota vendite per ogni dipendente che dispone di una quota vendite per ogni mese del quarto trimestre dell'anno fiscale 2004.

    Quota di vendite per ogni mese fiscale

Definizione dell'ambito per il calcolo delle quote vendite per l'anno fiscale 2005

In questa procedura viene controllato l'ambito corrente, viene modificato l'ambito e quindi viene definito un calcolo che determina i valori delle quote vendite per l'anno fiscale 2005 in base ai valori per l'anno fiscale 2004.

Per definire l'ambito per il calcolo delle quote vendite per l'anno fiscale 2005

  1. Selezionare la scheda Calcoli e quindi selezionare Visualizzazione Form nella barra degli strumenti.

  2. Nel riquadro Libreria script selezionare Large Resellers e quindi fare clic su Nuovo comando script nella barra degli strumenti della scheda Calcoli.

    Si noti che viene visualizzato uno script vuoto nel riquadro Espressioni di calcolo e che tale comando script viene visualizzato con un titolo vuoto nel riquadro Libreria script.

  3. Digitare l'espressione seguente nel riquadro Espressioni di calcolo:

    /* Changing Scope to All or Default Member */
    SCOPE (ROOT())
    

    Questa istruzione SCOPE cambia l'ambito del cubo nel membro Totale, o predefinito, per tutti gli attributi del cubo.

  4. Fare clic su Nuovo comando script nella barra degli strumenti della scheda Calcoli e quindi digitare l'istruzione seguente nel riquadro Espressioni di calcolo:

    /* Defining the cube scope for the sales amount quotas for FY2005 */
    SCOPE ()
    

    Si noti che viene visualizzata una riga rossa ondulata sotto la parentesi finale, per indicare che è stato definito un set di membri all'interno delle parentesi dell'istruzione SCOPE. Aggiungere innanzi tutto la misura Sales Amount Quota all'istruzione SCOPE per includere tale misura all'ambito.

  5. Nella scheda Metadati nel riquadro Strumenti di calcolo espandere Measures, espandere Sales Quotas e quindi trascinare la misura Sales Amount Quota nelle parentesi dell'istruzione SCOPE nel riquadro Espressioni di calcolo.

    Si noti che la riga rossa ondulata scompare. Il passaggio successivo consiste nell'aggiunta del membro della dimensione FY 2005 all'istruzione SCOPE per aggiungere questo membro della dimensione temporale all'ambito corrente.

  6. Nella scheda Metadati del riquadro Strumenti di calcolo espandere Date, espandere Fiscal, espandere Fiscal Time, espandere Fiscal Year e quindi trascinare il membro FY 2005 nell'istruzione SCOPE del riquadro Espressioni di calcolo dopo il membro [Sales Amount Quota] del set che si sta definendo.

    Si noti la riga rossa ondulata sotto la parte [Date] di questo nuovo membro del set, che informa dell'esistenza di un errore di sintassi subito prima il membro della dimensione, perché è necessario inserire una virgola tra ogni membro del set all'interno dell'istruzione SCOPE.

  7. Aggiungere la virgola necessaria prima della parte [Date] del membro FY 2005 della dimensione Date.

    Si noti che la riga rossa ondulata iniziale scompare. Il passaggio successivo consiste nell'aggiunta dei membri della gerarchia definita dall'utente Employees della dimensione Employee all'istruzione SCOPE per aggiungere tali membri all'ambito corrente.

  8. Nella scheda Metadati del riquadro Strumenti di calcolo espandere Employee e quindi trascinare la gerarchia definita dall'utente Employees nell'istruzione SCOPE del riquadro Espressioni di calcolo immediatamente dopo il membro [Date].[Fiscal Time].[Fiscal Year].&[2005] del set che si sta definendo.

    Si noti la riga rossa ondulata sotto la sezione [Employee] del nuovo membro di questo set, che indica che è necessario inserire una virgola tra ogni membro del set all'interno dell'istruzione SCOPE.

  9. Aggiungere la virgola necessaria prima della sezione [Employee] del nuovo membro.

    Si noti che la riga rossa ondulata iniziale scompare.

  10. Alla fine del membro [Employee].[Employees] di questo set all'interno dell'istruzione SCOPE, aggiungere la clausola seguente per completare la definizione del terzo membro del set:

    .Members
    

    Questa clausola specifica che tutti i membri della gerarchia Employee della dimensione Employee devono essere inclusi nell'ambito del cubo corrente.

  11. Verificare che l'istruzione SCOPE completata corrisponda allo script seguente:

    SCOPE ([Measures].[Sales Amount Quota],[Date].[Fiscal Time].[Fiscal Year].&[2005], [Employee].[Employees].Members)
    

    A questo punto è stata completata la definizione dell'ambito del sottocubo al quale si applicherà un'espressione MDX per calcolare le quote vendite per l'anno fiscale 2005.

  12. Nella barra degli strumenti della scheda Calcoli fare clic su Visualizzazione Script e quindi controllare i comandi script appena aggiunti.

    Si noti che ogni comando script viene visualizzato allo stesso modo in cui è stato digitato nel riquadro Espressioni di calcolo, ma con l'aggiunta di un punto e virgola finale. Si noti inoltre che il commento che precede ogni comando script consente di comprendere ogni comando separato, come illustrato nella figura seguente.

    Riquadro Espressioni di calcolo

Definizione e test del calcolo delle quote vendite per l'anno fiscale 2005

In questa procedura si aggiungerà un nuovo comando script allo script di calcolo che calcola le quote vendite per l'anno fiscale 2005 per tutti i membri della dimensione Employee. Il comando script verrà tuttavia aggiunto direttamente alla visualizzazione Script invece che alla visualizzazione Form. Nella visualizzazione Script è necessario accertarsi di aggiungere un punto e virgola tra ogni comando script.

Per definire ed eseguire il test del calcolo delle quote vendite per l'anno fiscale 2005

  1. Nella visualizzazione Script digitare le istruzioni seguenti su una nuova riga alla fine dello script di calcolo:

    /* Applying a calculation to the subcube */
    THIS = [Date].[Fiscal Time].[Fiscal Year].&[2004] * 1.25;
    

    L'istruzione THIS assegna un nuovo valore alla misura Sales Amount Quota all'intersezione tra il membro Employee e il membro FY 2005 del sottocubo. Il nuovo valore è basato sul valore esistente per l'intersezione tra il membro Employee e la misura Sales Amount Quota in Fiscal Year 2004 moltiplicato per 1,25.

  2. Nel riquadro Espressioni di calcolo fare clic sul margine a sinistra dell'istruzione THIS per impostare un punto di interruzione.

    Si noti che viene visualizzato un punto rosso su tale margine e che l'istruzione viene evidenziata in rosso, come illustrato nella figura seguente. Quando si esegue questo progetto in modalità debug, le modifiche apportate al progetto vengono distribuite all'istanza di Analysis Services, il cubo viene elaborato e lo script di calcolo viene eseguito fino al punto di interruzione. A questo punto è possibile analizzare gli script rimanenti, uno per uno. Se non si imposta un punto di interruzione e si esegue il progetto in modalità debug, lo script di calcolo si interromperà al primo script di calcolo, l'istruzione CALCULATE.

    Punto di interruzione impostato nel riquadro Espressioni di calcolo

  3. Scegliere Avvia debug dal menu Debug o premere F5.

    Il progetto viene distribuito ed elaborato e lo script di calcolo viene eseguito fino al punto di interruzione.

  4. Nascondere tutte le finestre ancorate per disporre di un'area di visualizzazione maggiore per il riquadro Tabella pivot visualizzato nella parte inferiore della scheda Calcoli.

    Il riquadro Tabella pivot visualizzato, come illustrato nell'immagine seguente, consentirà di eseguire il debug in modo semplificato.

    Riquadro dei dati per riferimento durante il debug

  5. Nel riquadro Tabella pivot aggiungere la misura Sales Amount Quota all'area dati, aggiungere la gerarchia definita dall'utente Date.Fiscal Time all'area colonna e quindi aggiungere la gerarchia dell'attributo Employee Name della dimensione Employee all'area riga.

    Si noti che il membro FY 2005 del livello Fiscal Year per la misura Sales Amount Quota per ogni dipendente non contiene alcun valore nell'area dati relativa alla misura Sales Quota Amount, come illustrato nella figura seguente. Per impostazione predefinita, le celle vuote vengono visualizzate nel riquadro Tabella pivot in modalità debug.

    Celle vuote nel riquadro dei dati durante il debug

  6. Premere F10 per eseguire l'istruzione THIS e calcolare le quote vendite per l'anno fiscale 2005.

    Si noti che le celle nel riquadro Tabella pivot all'intersezione tra la misura Sales Amount Quota, il membro della dimensione FY 2005 e il membro Employee Name vengono ora calcolate. Si noti inoltre che le celle interessate dall'istruzione THIS sono evidenziate in giallo. È presente un'icona sulla barra degli strumenti che consente di attivare o disattivare l'evidenziazione delle celle modificate. Per impostazione predefinita le celle sono evidenziate.

  7. Nel riquadro Tabella pivot rimuovere FY 2002, FY 2003 e FY 2004 dall'area colonna.

  8. Fare clic con il pulsante destro del mouse in un punto qualsiasi nell'area dati e quindi fare clic su Mostra celle vuote per rimuovere il segno di spunta accanto all'opzione e nascondere tutte le celle vuote. Questa opzione è inoltre disponibile sulla barra degli strumenti della scheda Calcoli. Ciò facilita la visualizzazione di tutti i dipendenti con valori di quote vendite, come illustrato nella figura seguente.

    Valori Sales Amount Quota visualizzati nel riquadro dei dati

  9. Nel riquadro Tabella pivot provare a espandere FY 2005 nell'area colonna.

    Si noti che non è possibile espandere FY 2005 poiché i valori relativi al membro H1 FY 2005 all'intersezione della misura Sales Amount Quota e la gerarchia dell'attributo Employee Name non sono stati calcolati poiché esterni all'ambito corrente.

  10. Per visualizzare le celle vuote per i valori dei membri H1 FY 2005, fare clic in un punto qualsiasi del riquadro Tabella pivot e quindi fare clic su Mostra celle vuote sulla barra degli strumenti della scheda Calcoli per visualizzare tutte le celle vuote, come illustrato nella figura seguente.

    Anno fiscale 2005 visualizzato nel riquadro dei dati

  11. Scegliere Termina debug dal menu Debug, oppure premere Maiusc-F5.

  12. Rimuovere il punto di interruzione dallo script di calcolo facendo clic su esso nel margine sinistro.

Assegnazione di quote vendite ai semestri e ai trimestri dell'anno fiscale 2005

In questa procedura si modificherà l'ambito in modo da includere i membri del semestre fiscale dell'anno fiscale 2005 al posto del membro dell'anno fiscale 2005 e si assegnerà quindi metà del valore delle quote vendite per l'anno fiscale 2005 a ogni semestre dell'anno fiscale 2005. In seguito si modificherà l'ambito in modo da includere i membri del trimestre fiscale dell'anno fiscale 2005 al posto del membro dell'anno fiscale 2005 e quindi si assegnerà un quarto del valore delle quote vendite per l'anno fiscale 2005 a ogni trimestre dell'anno fiscale 2005. Al termine si eseguirà un test di tali assegnazioni.

Per assegnare quote vendite ai semestri e ai trimestri dell'anno fiscale 2005

  1. Nella visualizzazione Script del riquadro Espressioni di calcolo digitare l'istruzione seguente su una nuova riga alla fine dello script di calcolo:

    /* Allocation of Sales Amount Quota to the 2005 Fiscal Semesters */
    SCOPE ( [Date].[Fiscal Semester].[Fiscal Semester].Members ); 
    

    Quest'istruzione SCOPE è un'istruzione SCOPE nidificata poiché nessuna istruzione END SCOPE è presente tra questa istruzione SCOPE e l'istruzione SCOPE precedente. Quando un'istruzione SCOPE è nidificata, eredita l'ambito padre per quegli attributi per il quale non è stato ridefinito l'ambito. L'istruzione SCOPE precedente non modifica direttamente la misura Sales Amount Quota, la gerarchia definita dall'utente Employees o la gerarchia definita dall'utente Fiscal Time. L'istruzione aggiunge invece ogni membro della gerarchia dell'attributo Fiscal Semester alla definizione del sottocubo mediante la funzione Members. Per ulteriori informazioni, vedere Members (Set) (MDX). Dall'istruzione SCOPE nidificata risulta che ora lo spazio del cubo include tutti i membri che si trovano presso l'intersezione tra il membro Employee e la misura Sales Amount Quota in qualsiasi semestre fiscale dell'anno fiscale 2005, che contiene attualmente un solo semestre fiscale.

  2. Nel riquadro Espressioni di calcolo digitare l'istruzione seguente su una nuova riga alla fine dello script di calcolo:

    THIS = [Date].[Fiscal Time].CurrentMember.Parent / 2;
    

    Questa istruzione assegna il valore calcolato per il trimestre fiscale a ogni semestre fiscale nello spazio definito del cubo. La funzione CurrentMember.Parent viene utilizzata per assegnare a ogni membro un quarto del valore del relativo padre. Per ulteriori informazioni, vedere CurrentMember (MDX) e Parent (MDX).

  3. Nel riquadro Espressioni di calcolo digitare l'istruzione seguente su una nuova riga alla fine dello script di calcolo:

    /* Allocation of Sales Amount Quota to the 2005 Fiscal Quarters */
    SCOPE ( [Date].[Fiscal Quarter].[Fiscal Quarter].Members ); 
    

    Quest'istruzione SCOPE è un'istruzione SCOPE nidificata poiché nessuna istruzione END SCOPE è presente tra questa istruzione SCOPE e l'istruzione SCOPE precedente. L'istruzione SCOPE precedente non modifica direttamente la misura Sales Amount Quota, la gerarchia definita dall'utente Employees o la gerarchia definita dall'utente Fiscal Time. L'istruzione aggiunge invece ogni membro della gerarchia dell'attributo Fiscal Quarter alla definizione del sottocubo mediante la funzione Members. Ne risulta che ora lo spazio del cubo include tutti i membri che si trovano presso l'intersezione tra il membro Employee e la misura Sales Amount Quota in qualsiasi trimestre fiscale dell'anno fiscale 2005, il quale contiene attualmente un solo trimestre fiscale.

  4. Nel riquadro Espressioni di calcolo digitare l'istruzione seguente su una nuova riga alla fine dello script di calcolo:

    THIS = [Date].[Fiscal Time].CurrentMember.Parent / 2;
    

    Questa istruzione assegna il valore calcolato per il trimestre fiscale a ogni trimestre fiscale nello spazio definito del cubo. La funzione CurrentMember.Parent viene utilizzata per assegnare a ogni membro metà del valore del relativo padre.

  5. Nel riquadro Espressioni di calcolo fare clic sul margine accanto all'ultima istruzione SCOPE per impostare un punto di interruzione e quindi premere F5.

    Lo script di calcolo viene eseguito fino al punto di interruzione.

  6. Fare clic in un punto qualsiasi dell'area dati nel riquadro Tabella pivot e quindi fare clic su Mostra celle vuote sulla barra degli strumenti della scheda Calcoli per nascondere le celle vuote.

    Si noti che il riquadro dei dati viene popolato con le stesse misure e gerarchie utilizzate nell'ultimo passaggio del debugger e che il valore del membro H1 FY 2005 è stato calcolato nel modo illustrato nella figura più avanti in questa sezione, ovvero metà del valore del relativo padre.

    Si noti infine che il valore di ogni membro FY 2005 viene ricalcolato in base all'aggregazione dei suoi membri, che in questo caso è il primo semestre fiscale dell'anno fiscale. Il calcolo del membro Fiscal Semester 2005 ha effetto sul valore del membro Fiscal Year 2005 perché ogni script viene eseguito come sessione separata. Per bloccare un valore esistente in modo che non venga interessato dalle istruzioni successive dello script di calcolo, utilizzare l'istruzione FREEZE. Per ulteriori informazioni, vedere Istruzione FREEZE (MDX).

    Valori esistenti bloccati tramite FREEZE

  7. Nell'area colonna, espandere H1 FY 2005.

    Si noti che il valore per il membro Q1 FY 2005 non è ancora stato calcolato.

  8. Fare clic in un punto qualsiasi dell'area dati nel riquadro Tabella pivot e quindi fare clic su Mostra celle vuote sulla barra degli strumenti della scheda Calcoli.

  9. Nell'area colonna, espandere Q1 FY 2005.

    Si noti che non viene assegnato alcun valore ai due mesi del primo trimestre dell'anno fiscale 2005 perché tali membri non sono ancora inclusi nell'ambito del sottocubo corrente, perché non sono ancora state eseguite le ultime due istruzioni dello script. La dimensione temporale nel cubo di Analysis Services Tutorial contiene solo i primi due mesi dell'anno fiscale 2005, di conseguenza non è presente alcun membro Q2 FY 2005.

  10. Premere F10 per eseguire l'istruzione SCOPE e quindi premere di nuovo F10 per eseguire l'istruzione finale nello script di calcolo che applica il calcolo nel sottocubo corrente.

    Si noti che il valore del membro Q1 FY 2005 viene calcolato e che il valore dei membri H1 FY 2005 e FY2005 viene ricalcolato come aggregazione dei relativi membri figlio, come illustrato nella figura seguente. Si noti inoltre che il valore di ogni mese fiscale dell'anno fiscale 2005, ovvero luglio e agosto 2005, non viene calcolato. Nella procedura successiva si assegneranno valori appropriati a ogni trimestre.

    Valore calcolato per il membro Q1 FY 2005

  11. Scegliere Termina debug dal menu Debug, oppure premere Maiusc-F5.

  12. Rimuovere il punto di interruzione dallo script di calcolo.

Assegnazione di quote vendite ai mesi

In questa procedura si modificherà l'ambito in modo da includere il livello mese fiscale in tutti gli anni fiscali, mentre le istruzioni dell'ambito precedente limitavano i calcoli all'anno fiscale 2005. In seguito si assegnerà un terzo del valore del trimestre fiscale per le quote vendite di ogni dipendente a ogni mese fiscale.

Per assegnare quote vendite ai mesi

  1. Nel riquadro Espressioni di calcolo aggiungere l'istruzione seguente su una nuova riga alla fine dello script di calcolo:

    /* Allocate Quotas to Months */
    SCOPE ( [Date].[Fiscal Time].[Fiscal Month].Members );
    

    Questa istruzione SCOPE è un'altra istruzione con ambito nidificato che modifica lo spazio del cubo al quale si applicherà un'espressione MDX per assegnare quote vendite a ogni mese fiscale in base al valore di ogni trimestre fiscale. Questa istruzione SCOPE è simile all'istruzione nidificata SCOPE precedente, ma si noti che è stato ridefinito l'ambito della gerarchia definita dall'utente Fiscal Time. Ne consegue che i membri dello spazio del cubo includeranno ora tutti i membri del mese fiscale della dimensione Date e non solo i membri del mese fiscale dell'anno fiscale 2005.

    [!NOTA] Si confronti questa modifica all'ambito del cubo con la modifica apportata all'ambito del cubo nella procedura precedente per accertarsi di comprendere la differenza tra le due istruzioni di modifica dell'ambito.

  2. Nel riquadro Espressioni di calcolo aggiungere l'istruzione seguente su una nuova riga alla fine dello script di calcolo:

    THIS = [Date].[Fiscal Time].CurrentMember.Parent / 3; 
    

    Questa istruzione assegna a ogni membro del mese della gerarchia temporale fiscale un terzo del valore del relativo padre, ovvero il livello trimestre. Questo calcolo si applicherà a tutti i mesi fiscali all'interno del cubo.

  3. Nel riquadro Espressioni di calcolo fare clic sul margine a sinistra dell'ultima istruzione THIS per impostare un punto di interruzione e quindi premere F5.

  4. Esaminare i valori relativi ai mesi di luglio e agosto 2004.

    Si noti che attualmente non viene calcolato alcun valore per July 2004 o August 2004.

  5. Fare clic con il pulsante destro del mouse in qualsiasi punto del riquadro Dati e quindi scegliere Mostra celle vuote per visualizzare solo le celle contenenti valori.

    Ciò consentirà di vedere più facilmente l'applicazione dell'ultima istruzione nello script di calcolo.

  6. Premere F10 per eseguire l'ultima istruzione.

    Si noti che il valore Sales Amount Quota calcolato per ogni dipendente per ogni mese fiscale risulta uguale a un terzo del suo valore padre, come illustrato nella figura seguente.

    Valori calcolati Sales Amount Quota

  7. Nell'area colonna eliminare FY 2005 e quindi aggiungere Q4 FY 2004.

  8. Espandere FY 2004, espandere H2 FY 2004 e quindi Q4 FY 2004.

    Si noti che il valore di ogni mese fiscale è uguale al valore totale del trimestre fiscale, come illustrato nella figura seguente.

    Valore calcolato per ogni mese fiscale

  9. Scegliere Termina debug dal menu Debug.

  10. Rimuovere il punto di interruzione dallo script di calcolo.

  11. Nella barra degli strumenti fare clic su Salva tutto.

[!NOTA] Un progetto completato fino alla lezione 6 è incluso con il download e l'installazione degli esempi aggiornati. Per ulteriori informazioni, vedere la sezione relativa a come ottenere esempi aggiornati in Installazione degli esempi.

Lezione successiva

Lezione 7: Definizione degli indicatori di prestazioni chiave (KPI)

Vedere anche

Altre risorse

Creazione e modifica di script MDX
Istruzione SCOPE (MDX)
Contenuto di FORE_COLOR e BACK_COLOR (MDX)
This (MDX)
Istruzione FREEZE (MDX)
CurrentMember (MDX)
Parent (MDX)
Members (Set) (MDX)

Guida in linea e informazioni

Assistenza su SQL Server 2005