Automazione dell'esportazione di un numero elevato di celle da un cubo di memorizzazione di aggregazione

Utilizzare lo script di PowerShell descritto in questa sezione per esportare un numero elevato di celle da un cubo di memorizzazione di aggregazione (ASO, Aggregate Storage).

A causa dei limiti imposti da Essbase QUERYRESULTLIMIT, è impossibile esportare un'elevata quantità di dati dall'interfaccia utente. Lo script di PowerShell descritto in questa sezione suddivide l'operazione di esportazione in un numero specificato di job, esegue ogni job, scarica i dati esportati e concatena i file di esportazione in un unico file di esportazione verificando che sia presente solo un'intestazione.

Nota:

  • Questo script esegue un job esistente di tipo esportazione dati. Per istruzioni dettagliate sulla creazione dei job in Planning, fare riferimento alla sezione " Gestione dei job " in Amministrazione di Planning .

  • In caso di utilizzo della versione in formato PDF di questo documento: per evitare le interruzioni di riga e le informazioni dei piè di pagina che renderebbero inutilizzabile questo script, copiare lo script dalla Versione HTML di questo argomento.

  1. Copiare lo script seguente e salvarlo nel file system, ad esempio come ASOCellExport.ps1.
    $user = '<USERNAME>'
    $pass = '<PASSWORD>'
    $serverURL = '<URL>'
    $applicationName = '<APPLICATIONNAME>'
    $cubeName = '<CUBENAME>'
    $splitDimension = '<DIMENSION_TO_SPLIT_THE_EXPORT>'
    $topLevelMemberForExport = '<TOP_MEMBER_FOR_EXPORT>'
    $exportJobName = '<EXPORT_JOB_NAME>'
    $exportFilePrefix = '<PREFIX_FOR_EXPORT_FILE>'
    $columnMembers = '<MEMBERS_ON_COLUMNS>'
    $povMembers = '<POV_MEMBERS>'
    $numberOfExportFiles = <NUMBER_OF_FILES_TO_SPLIT_THE_EXPORT>
    
    $memberArray = @()
    $exportFileArray = @()
    
    function getLevel0 ($parent) {
        $parent.children.ForEach({
            if ( $_.children.count -eq 0 ) {
                $script:memberArray += $_.name
            }
            getLevel0($_)
        })
    }
    
    function findMember ($tree, $memberName) {
        $subtree = ""
        if ($tree.name -eq $memberName){
            return $tree
        } else {
            $tree.children.ForEach({
                #Write-Host $_.name
                if ($subtree -eq ""){ $subtree = findMember $_ $memberName}
            })
            return $subtree
        }
    }
    
    #putting together base64 encoded authentication header based un user and password
    $encodedCredentials = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($($user) + ":" + $($pass)))
    $headers = @{ Authorization = "Basic $encodedCredentials" }
    
    #test login
    $testRequest = $serverURL + '/HyperionPlanning/rest/v3/applications'
    
    try {
        $response = Invoke-RestMethod -Uri $testRequest -Method Get -Headers $headers -UseBasicParsing
    }
    catch {
        Write-Host $_
        return
    }
    
    #retrieve dimension hierarchy from application 
    Write-Host "Retrieving member list for split dimension " $splitDimension
    $request = $serverURL + '/HyperionPlanning/rest/v3/internal/applications/' + $applicationName + '/plantypes/' + $cubeName + '/dimensions/' + $splitDimension
    try {
        $response = Invoke-RestMethod -Uri $request -Method Get -Headers $headers -UseBasicParsing
    }
    catch {
        Write-Host $_
        return
    }
    Write-Host $splitDimension " member list retrieved"
    
    #search for the top of the export hierarchy
    Write-Host "Searching for member " $topLevelMemberForExport " in hierarchy"
    $member = findMember $response $topLevelMemberForExport
    if ( $member.name -ne $topLevelMemberForExport ) {
        Write-Host $topLevelMemberForExport " not found in hierarchy, exiting ..."
        return 128
    }
    Write-Host "Found member " $topLevelMemberForExport " in hierarchy"
    
    #retrieve level 0 memebers in export hierarchy
    Write-Host "Retrieving Level 0 members for hierarchy"
    getLevel0($member)
    if ( $memberArray.Length -eq 0 ) {
        Write-Host "no level 0 members found in hierarchy, exiting ..."
        return 128
    }
    Write-Host $memberArray.Length " Level 0 members for export hierarchy retrieved"
    
    
    $request = $serverURL + '/HyperionPlanning/rest/v3/applications/' + $applicationName + '/jobs'
    
    #splitting member list into the number of export files
    $numberOfEntitiesPerFile = [math]::truncate($memberArray.Length / $numberOfExportFiles)
    for ($i = 1; $i -le $numberOfExportFiles; $i++) {
        $memberList = ""
        $firstMember = ($i - 1) * $numberOfEntitiesPerFile
        if ($i -lt $numberOfExportFiles) {
            $lastMember = $i * $numberOfEntitiesPerFile
        } else {
            $lastMember = $i * $numberOfEntitiesPerFile + $memberArray.Length % $numberOfExportFiles
        }
        for ($j = $firstMember; $j -lt $lastMember; $j++) {
            $memberList += $memberArray[$j]
            if ($j -lt $lastMember - 1) {$memberList += ","} #avoid adding a comma (,) after the last member of each set
        }
    
        $jobDetails='
        {
        "jobType":"EXPORT_DATA","jobName":"' + $exportJobName + '",
        "parameters":{
                      "exportFileName":"Export-' + $i + '.zip",
                      "rowMembers":"' +  $memberList + '",
                      "columnMembers":"' + $columnMembers + '",
                    "povMembers":"' + $povMembers + '"
                     }
        }'
    
        #start export job
        try{
            $response = Invoke-RestMethod -Uri $request -Method Post -Headers $headers -Body $jobDetails -ContentType "application/json"}
        catch {
            Write-Host $_
            return
        }
    
        Write-Host "Started export job " $i " out of " $numberOfExportFiles
    
        #checking job status, continue once jos is completed
        $statusRequest = $serverURL + '/HyperionPlanning/rest/v3/applications/' + $applicationName + '/jobs/' + $response.jobId
        $statusResponse = Invoke-RestMethod -Uri $statusRequest -Method Get -Headers $headers -UseBasicParsing
    
        while ( $statusResponse.descriptiveStatus -eq "Processing" ) {
            Write-Host $statusResponse.descriptiveStatus
            Start-Sleep -s 10
            $statusResponse = Invoke-RestMethod -Uri $statusRequest -Method Get -Headers $headers -UseBasicParsing
        }
        Write-Host $statusResponse.descriptiveStatus
    
        Write-Host "Downloading export file ..."
        $downloadRequest = $serverURL + '/interop/rest/11.1.2.3.600/applicationsnapshots/Export-' + $i + '.zip/contents'
        $statusResponse = Invoke-RestMethod -Uri $downloadRequest -Method Get -Headers $headers -OutFile "$exportFilePrefix-$i.zip"
    
        Write-Host "Expanding archive ..."
        Expand-Archive -Force -LiteralPath "$exportFilePrefix-$i.zip" -DestinationPath "$exportFilePrefix-$i"
        Remove-Item "$exportFilePrefix-$i.zip"
    
        Get-ChildItem -Path "$exportFilePrefix-$i" -File -Name | ForEach-Object { $exportFileArray += "$exportFilePrefix-$i\" +  $_ }
    }
    
    Write-Host "creating outputfile ..."
    #write header to outputfile
    Get-Content $exportFileArray[0] | Select-Object -First 1 | Out-File "$exportFilePrefix.csv"
    
    #write content to outputfile skipping header
    ForEach ($exportFile in $exportFileArray) {
        Get-Content $exportFile | Select-Object -Skip 1 | Out-File -Append "$exportFilePrefix.csv"
    }
    
    Compress-Archive -LiteralPath "$exportFilePrefix.csv"  -DestinationPath "$exportFilePrefix.zip"
    
    Write-Host "cleaning up ..."
    Remove-Item "$exportFilePrefix-*" -Recurse
    Remove-Item "$exportFilePrefix.csv"
    
  2. Modificare lo script di PowerShell, ad esempio ASOCellExport.ps1, in modo da impostare i valori dei parametri della tabella seguente.

    Tabella 3-7 Valori di variabili da includere nello script di PowerShell

    Variabile Descrizione
    $user Dominio e nome uente di un Amministratore servizi nel formato DOMAIN.USER .

    Esempio: $user = 'exampleDomain.jDoe'

    $pass Password dell'utente con ruolo Amministratore servizi o posizione in cui è disponibile il password file cifrato. Fare riferimento al comando encrypt per informazioni sulla creazione di un password file cifrato.

    Esempio: $pass = 'Example'

    $serverURL URL dell'ambiente Oracle Enterprise Performance Management Cloud che ospita l'applicazione Planning.

    Esempio: $serverURL = 'https://example .oraclecloud.com'

    $applicationName Nome di un'applicazione Planning.

    Esempio: $applicationName = 'Vision'

    $cubeName Nome di un cubo nell'applicazione.

    Esempio: $cubeName = 'VisASO'

    $splitDimension Nome di una dimensione i cui membri vengono utilizzati per suddividere l'esportazione in gruppi.

    Esempio: $splitDimension = 'Account'

    $topLevelMemberForExport Nome di un membro della gerarchia secondaria della dimensione in cui viene creato un elenco di membri di livello 0.

    Esempio: $topLevelMemberForExport = 'Total Cash Flow'

    $exportJobName Nome di un job esistente di tipo esportazione dati. Le impostazioni specificate in questo job verranno sovrascritte dai parametri impostati nello script.

    Esempio: $exportJobName = 'ASO Cell Export'

    $exportFilePrefix Prefisso di nome file per identificare in modo univoco i file generati dal job di esportazione.

    Esempio: $exportFilePrefix = 'cashflow'

    $columnMembers Colonne di membro da includere nell'esportazione.

    Esempio: $columnMembers = 'Period'

    $povMembers

    Punti di vista da includere nell'esportazione. I membri POV devono includere tutte le altre dimensioni e possono includere funzioni come mostrato di seguito.

    ILvl0Descendants(YearTotal), ILvl0Descendants(Year), ILvl0Descendants(Scenario), ILvl0Descendants(Version), ILvl0Descendants(P_TP), ILvl0Descendants(AltYear)

    Esempio: $povMembers = 'YTD'

    $numberOfExportFiles Numero di job da eseguire per l'operazione di esportazione. Se l'esportazione continua ad avere esito negativo a causa dei limiti di query, aumentare questo numero.

    Esempio: $numberOfExportFiles = 3

  3. Utilizzare Utilità di pianificazione di Windows per programmare lo script di PowerShell, ad esempio ASOCellExport.ps1. Vedere Automazione dell'esecuzione degli script per informazioni sulla procedura dettagliata.