Automatizar a Exportação de um Grande Número de Células de um Cubo de Armazenamento Agregado

Use o script do PowerShell nesta seção para exportar um grande número de células de um cubo de Armazenamento Agregado (ASO).

Como os limites impostos pelo Essbase QUERYRESULTLIMIT, é impossível exportar um grande volume de dados na interface de usuário. O script do PowerShell disponível nesta seção divide a operação de exportação de um número específico de jobs, execute cada job, faz download dos dados exportados e concatena os arquivos exportados em um único arquivo de exportação assegurando que só o cabeçalho exista.

Nota:

  • Este script executa um job existente do tipo exportação de dados. Para obter instruções detalhadas sobre como criar jobs no Planning, consulte Gerenciamento de Jobs em Administração do Planning .

  • Se você estiver usando a versão PDF deste documento: para evitar quebras de linha ou informações de rodapé que impedirão a utilização desse script, copie o script da Versão em HTML deste tópico.

  1. Copiar o script a seguir e salve-o no seu sistema de arquivos, por exemplo, como 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. Modifique o script do PowerShell, por exemplo,ASOCellExport.ps1 para definir os valores dos parâmetros na tabela a seguir.

    Tabela 3-7 Valores de Variáveis a Serem Incluídos no Script do PowerShell

    Variável Descrição
    $user O domínio e o nome de usuário de um Administrador de Serviço no formato DOMAIN.USER .

    Exemplo: $user = 'exampleDomain.jDoe'

    $pass Senha do Administrador de Serviço ou a localização do arquivo de senha criptografado. Consulte o comando encrypt para obter informações sobre a criação de um arquivo de senha criptografada.

    Exemplo: $pass = 'Example'

    $serverURL O URL do ambiente do Oracle Enterprise Performance Management Cloud que hospeda o aplicativo do Planning.

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

    $applicationName Nome de um aplicativo do Planning.

    Exemplo: $applicationName = 'Vision'

    $cubeName Nome de um Cubo no aplicativo.

    Exemplo: $cubeName = 'VisASO'

    $splitDimension Nome de uma dimensão dos membros dos quais são usados para dividir a exportação em grupos.

    Exemplo: $splitDimension = 'Account'

    $topLevelMemberForExport Nome de um membro da sub-hierarquia da dimensão sob a qual a lista de membros de Nível 0 é criado.

    Exemplo: $topLevelMemberForExport = 'Total Cash Flow'

    $exportJobName Nome de um job existente do tipo Exportar Dados. As configurações especificadas neste job será substituída pelos parâmetros que você definiu no script.

    Exemplo: $exportJobName = 'ASO Cell Export'

    $exportFilePrefix Um nome de prefixo que identifica de forma exclusiva os arquivos gerados pelo job de exportação.

    Exemplo: $exportFilePrefix = 'cashflow'

    $columnMembers As colunas de membros a serem incluídas na exportação.

    Exemplo: $columnMembers = 'Period'

    $povMembers

    Pontos de Vista a serem incluídos na exportação. Os Membros de PDV devem incluir todas as outras dimensões e podem incluir funções, como mostrado a seguir:

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

    Exemplo: $povMembers = 'YTD'

    $numberOfExportFiles Número de jobs a serem executados para essa operação de exportação. Se, ainda assim, a exportação falhar devido a limitações do limite de consulta, aumente esse número.

    Exemplo: $numberOfExportFiles = 3

  3. Utilizando o Agendador do Windows, agende o script do PowerShell, por exemplo,ASOCellExport.ps1. Consulte Automação da Execução de Scripts para obter as etapas detalhadas.