Power BI tietolähteiden vaihto kantapalvelimen (nimen) vaihdoksen yhteydessä?

Tässä blogissa käydään läpi, miten voidaan helposti vaihtaa datalähteet yhteen työtilaan (Workspace).

Esimerkissä käytössä on Power BI ja organisaatiossa on paljon raportteja osa keskitettyjä ja hajautettuja eli käyttäjien itsenäisesti tekemiä. Nyt SQL palvelin vaihtuu ja raporttien pitäisi toimia myös tämän jälkeen. Tietenkin tämä onnistuu käsin, mutta jos työtiloja ja niissä olevia datalähteitä on paljon, voi vaihto olla työlästä.

Jokaiseen työtilassa olevaan datamalliin, missä on käytetty vaihdettavaa palvelinta, pitää käydä vaihtamassa uusi palvelin lähteeksi ja tämän joutuu tekemään avaamalla datamalli Power BI desktopilla. Työtiloja voi olla lukuisia ja jokaista työtilaa kohden vaihdettavia datamalleja voi helposti olla kymmeniä, ellei paljon enemmän.

Miten tästä selviää ilman käsityötä ja raportointikatkoja?

Ensin pitää selvittää missä työtiloissa ja datalähteissä vanhapalvelin on käytössä. Jos nämä ei ole tiedossa helpoin tapa löytyy täältä.

Lisäksi tarvitaan admin oikeudet niihin työtiloihin mihin muutokset on tehtävä. Tämän voin antaa esimerkiksi työtilan nykyinen admin. Jos admin tunnus ei ole tiedossa löytyy se esimerkiksi myös samasta datasetistä kuin mitä käytettiin työtilojen löytämiseen.

Ensimmäisenä pitää avata PowerShell ja asentaa Power BI moduuli PowerShelliin, jos ei ole asennettuna jo, ja kirjautua sisään Power BI:n tätä kautta. Tarkemmat ohjeet täällä:

Moduuli:

Kirjautuminen Power BI:

 

Nyt kun muut valmistelut on tehty voidaan siirtyä asiaan. Kopioi artikkelin lopussa oleva koodi PowerShelliin ja vaihda koodissa olevien parametrien arvot (kaikki rivit missä on lopuksi #Edit)

  • $groupId on työtilan id, minkä saa joko näin(samasta datasetistä kuin millä selvitimme muutettavat datasetit ja adminit) tai sitten esimerkiksi kopioimalla se menemällä työtilaan selaimella ja kopioimalla id osoite riviltä
  • $DatasourceType tätä ei tarvitse muuttaa jos kyseessä on SQL Server. (muita määrittelyn mukaan toimivia lähteitä ovat SQL Server, Azure SQL Server, Analysis Services, Azure Analysis Services, OData Feed ja SharePoint, mutta saattaa vaatia muutoksia koodiin)
  • $Server nykyisen serverin nimi
  • $DataBase tietokannan nimi
  • $ServerNew uuden serverin nimi
  • $DataBaseNew tietokannan nimi jos tietokanta pysyy samana niin sama kuin $DataBase. Vastaavasti voidaan vaihtaa vain tietokanta pitämällä serverin nimi samana.

Koodi vaihtaa vain täsmälleen niiden datasettien lähteet joiden tyyppi, serveri ja datasetti vastaavat parametreissa olevia. Jos samasta serveristä käytetään myös toista osoitetta on se muutettava erikseen.

Lisäksi jos parametreissa esiintyy ”\” on kyseinen merkki toistettava että Json lukee sen oikein ”\\”. Eli jos ”yritys\palvelin1” niin pitää muuttaa ”yritys\\palvelin1”.

Lisää rajoituksia ja tarkempaa tietoa:

https://docs.microsoft.com/en-us/rest/api/power-bi/datasets/updatedatasources

Nyt voi ajaa koodin.

Pitäisi näyttää kutakuinkin tämän näköiseltä:

Kuvassa näkyvistä varoituksista ei tarvitse välittää.

 

Huomioita koodista:

  • Koodi ottaa muutettavan datasetin haltuun, mutta ajon jälkeen tämän voi käydä vaihtamassa sopivammaksi, jos sillä on merkitystä.
  • Jos työtiloja on useampia, niin vaihdetaan työtilan ID($groupId) ja ajetaan koodi uudelleen.
  • Jos muutoksen jälkeen lataa tiedoston Power BI työpöytäsovellukseen on siinä edelleen vanha datalähde. Tämä on kätevä tapa korjata tilanne, jos jotakin menee pieleen, mutta aiheuttaa myös sen, että jos datalähdettä päivitetään, joutuu sen lähteen päivittämään samalla manuaalisesti.
  • Jos ajon jälkeen tulee ilmoitus, että on ei muutettuja datasettejä (kuvassa ei ole) voi ajaa koodin uudelleen, jos tämä ei auta kannattaa datasetti käydä vaihtamassa manuaalisesti, ellei muuten tiedä mistä ongelma voisi johtua.

Koodi:

  1. Etsii työtilasta kaikki lähteet missä on käytetty parametreissa määriteltyjä lähteitä.
  2. Koodi ottaa datasetin haltuun tunnukselle millä sitä ajetaan.
  3. Koodi vaihtaa datasettien lähteet parametreissa määriteltyihin.
  4. Lopuksi koodi hakee vielä datasetit missä datasetin vaihto epäonnistui ja näyttää näiden ID.
#Set group ID and server paremeters
$groupId = 'e23ec697-4f08-4f44-8818-ae3c518fbaaf'#Edit
$DatasourceType = 'Sql'

$Server = 'etl' #Edit
$DataBase = 'reportserver' #Edit

$ServerNew = 'etl2' #Edit
$DataBaseNew = 'reportserver' #Edit

###############################
write-host("Getting all datasources")
$AllDataSetsinWorkspacestoNewSource = Get-PowerBIDataset -WorkspaceId "$groupId"| Foreach {
$dsId = $_.Id; Get-PowerBIDatasource -DatasetId $dsId -Scope Organization |
Where-Object {
$_.DatasourceType -eq $DatasourceType -and ($_.ConnectionDetails.Server -eq "$Server" -and $_.ConnectionDetails.Database -eq $database)
} | Foreach { $dsId }
}
write-host("Got datasources:" + $AllDataSetsinWorkspacestoNewSource.count)
write-host("$AllDataSetsinWorkspacestoNewSource")

#Takeover datasets
write-host("Takeover datasets")
$AllDataSetsinWorkspacestoNewSource | Foreach {
$datasetId = $_.Guid;
Invoke-PowerBIRestMethod -Url "groups/$groupId/datasets/$datasetId/Default.TakeOver" -Method Post;
}

#Create Body for change sources
$updateDetails= '{
"updateDetails": [
{
"datasourceSelector": {
"datasourceType": "'+$DatasourceType+'",
"connectionDetails": {
"server": "'+$Server+'",
"database": "'+$database+'"
}
},
"connectionDetails": {
"server": "'+$ServerNew+'" ,
"database": "'+$DataBaseNew+'"
}
}

]
}'

#Change sources
write-host("Change sources and refresh")

$AllDataSetsinWorkspacestoNewSource | Foreach {
$datasetId = $_.Guid;
Invoke-PowerBIRestMethod -Url "groups/$groupId/datasets/$datasetId/Default.UpdateDatasources" -Body $updateDetails -Method Post;
Invoke-PowerBIRestMethod -Url "datasets/$datasetId/refreshes" -Method Post;
}
write-host("All Changes done")

#Get datasets that did not change
write-host("Get not Changed datasets")
$AllDataSetsinWorkspacestoNewSource = Get-PowerBIDataset -WorkspaceId "$groupId"| Foreach {
$dsId = $_.Id; Get-PowerBIDatasource -DatasetId $dsId -Scope Organization |
Where-Object {$_.DatasourceType -eq $DatasourceType -and ($_.ConnectionDetails.Server -eq $Server -and $_.ConnectionDetails.Database -eq $DataBase)} | Foreach { $dsId }
}

write-host("Got all not changed datasources:" + $AllDataSetsinWorkspacestoNewSource.count)
write-host("$AllDataSetsinWorkspacestoNewSource")
write-host("All done")

################

Power BI: Mitä raportteja meillä on? Mistä raporttiemme data tulee?

Millä raporteilla on lähteenä käytöstä poistuva SQL palvelin? Ketkä hallinnoivat näitä raportteja? Onko tähän valmista ratkaisua?

Tässä blogitekstissä käydään läpi yksi ratkaisu yllämainittuihin kysymyksiin tai esimerkiksi ratkaisu koko Power BI ympäristön automaattiseen dokumentointiin. Blogissa näytetään miten PowerShellillä saadaan organisaation kaikkien ryhmien (groups, workspace), niiden datamallien ja datalähteiden tiedot automaattisesti helppoon muotoon.

Oikeudet

Jos tarvitaan pääsy koko organisaation tietoihin, on oltava Power BI Admin oikeudet, mikä on mahdollista saada O365 admin portaalin kautta. Muussa tapauksessa omilla tunnuksilla pääsee käsiksi niihin tietoihin mihin omilla tunnuksilla on oikeudet.

(ohjeet admin oikeuksien saamiseksi: https://docs.microsoft.com/en-us/power-bi/service-admin-role)

PowerShell ISE ja asennus

Seuraavaksi tarvitaan PowerShell ISE ja vielä admin oikeuksilla. Tämä löytyy suoraan Windows 10 käyttöjärjestelmästä:

Lisäksi pitää asentaa Power BI moduuli PowerShelliin

Kirjoitetaan:

 Install-Module -Name MicrosoftPowerBIMgmt 

tekstikenttään, maalataan kyseinen teksti ja aja valinta (Run Selection)

Jos et käynnistänyt adminoikeuksilla PowerShelliä tulee jotain tämän näköistä:

Jos pyytää hyväksyntää asennukselle se toki annetaan:

Kysymys saattaa myös olla PowerShellin puolelle, jolloin pitää painaa y ja Enter.

Power BI rajapintojen käyttö

Seuraavaksi kirjaudutaan sisään komennolla:

 Login-PowerBI 

(Valitaan teksti ja painetaan, aja valinta)

Tämän ajamalla tulee tavallinen O365 kirjautumisikkuna, johon kirjaudutaan omalla/admin tunnuksella.

Jos kaikki meni hyvin, niin pitäisi näkyä kirjautumistiedot kyseisen tunnuksen ympäristöstä.

Kokeilumielessä voi ajaa(vastaavasti kuin edellä):

 Get-PowerBIWorkspace 

Saadaan taulukko työtiloista jokseenkin tämän näköisenä:

Hienoa nyt tiedämme kaikki organisaation työtilat, ja meillä on vastaus kysymykseen mitä työtiloja organisaatiossamme on.
Lisäksi jos haluamme tallentaa tuloksen muistiin ja näyttää tuloksen ja laskea työtilojen määrä onnistuu se ajamalla tämä koodi:


$items = Get-PowerBIWorkspace
$items
$items.Count

Vastaavat ohjeet:
https://powerbi.microsoft.com/en-us/blog/announcing-apis-and-powershell-cmdlets-for-power-bi-administrators/
https://www.youtube.com/watch?v=SQ7ufcRayYY

Miten saada kaikki hyödyllinen data helppoon muotoon?

Tässä kohtaa huomataan nopeasti, että listasta tuli melko pitkä. Lisäksi siitä puuttuu tietoja kuten esimerkiksi mitä datalähteitä työtilassa käytetään ja sitä on oikeastaan lähes mahdotonta hyödyntää millään järkevällä tavalla. Toistaiseksi ei ole olemassa komentoa, mikä hakisi kaikki tiedot mitkä meitä tässä kohtaa voisi kiinnostaa ja tekisi niistä kaunista listaa.

Eli teimme tästä valmiin ratkaisun!

Ohje: 

  1. Kopioi koko koodi PowerShelliin. (Koodi ohjeiden jälkeen)
  2. Muuta parametrikohdasta osoitetta niin että se osoittaa omalla koneella olevaan kansioon mihin haluat tallentaa datan.
  3. Valitse koko koodi ja aja se samoin kuin on edellisissä kohdissa tehty.
  4. Ajoin aikana ja sen jälkeen pitäisi näyttää tältä: Workspace tarkoittaa työtilaa. Merkin” /” jälkeen näkee kuinka monta on viellä jäljellä. RowNbr kertoo montako datariviä on haettu.
  5. Avaa CSV tiedosto esimerkiksi Power BI:llä kansiosta, jonka määrittelit kohdassa 2 ja selvitä helposti vastaukset otsikossa mainittuihin kysymyksiin.

 

Ohessa on PowerShell koodi, mikä käy läpi kaikki työtilat, niiden datamallit ja datamallien lähteet, sekä kirjoittaa tiedot CSV tiedostoon.


#Parameters:
$CSV = "C:\Users\KristjanVaalberk\Desktop\AllGroupsDatasetsSources.csv" # location and name for the csv file

#Loop All workspaces, datasets, sources and save to CSV

"Start Get Datasources"
$CountRows = 0
$CountWorkspaces = 0
$workspaces = Get-PowerBIWorkspace -Scope Organization #All workspaces
$workspacesTotal = $workspaces.count
"Total workspaces :" + $workspacesTotal
$GroupDatasetSource = New-Object System.Collections.ArrayList
$workspaces | ForEach-Object -Process{ ## for every workspace/groups
    $Workspace = $_  
    $CountWorkspaces++
    "Workspace: " + $CountWorkspaces + "/" + $workspacesTotal
    $GroupDatasets = Get-PowerBIDataset -Scope Organization -Workspaceid $_.id ## get all datasets in groups/workspace and save to $GroupDatasets (array)
    IF($GroupDatasets.count -eq 0) { #group has no datasets
        $i2 = 0
        Do { # Loop all users in group
            $temp = "" | select "GroupId", "GroupName", "GroupDescription","GroupType", "GroupState", "GroupIsReadOnly", "GroupIsOrphaned", "GroupIsOnDedicatedCapacity", 
                "GroupCapacityId", "GroupUserPrincipalName", "GroupAccessRight" ,  "Datasetid", "Datasetname", "DatasetaddRowsAPIEnabled", "DatasetconfiguredBy", "DatasetisRefreshable", "DatasetisEffectiveIdentityRequired", 
                "DatasetisEffectiveIdentityRolesRequired", "DatasetisOnPremGatewayRequired" ,"SourceName","SourceConnectionString","SourceDatasourceType","SourceConnectionDetails",
                "SourceGatewayId","SourceDatasourceId"
            $temp.GroupId = $Workspace.id
            $temp.GroupName = $Workspace.Name
            $temp.GroupDescription = $Workspace.Description
            $temp.GroupType = $Workspace.Type
            $temp.GroupState = $Workspace.State
            $temp.GroupIsReadOnly = $Workspace.IsReadOnly
            $temp.GroupIsOrphaned = $Workspace.IsOrphaned
            $temp.GroupIsOnDedicatedCapacity = $Workspace.IsOnDedicatedCapacity
            $temp.GroupCapacityId = $Workspace.CapacityId
            IF($Workspace.users.AccessRight.count -eq 1) {
                $temp.GroupAccessRight = $Workspace.users.AccessRight
                $temp.GroupUserPrincipalName = $Workspace.users.UserPrincipalName
            }
            Elseif ($GroupDatasets.users -eq $null){
                $temp.GroupAccessRight = 'NotFound'
                $temp.GroupUserPrincipalName = 'NotFound'
            }
             Else {
                $temp.GroupAccessRight = $Workspace.users.AccessRight[$i2]
                $temp.GroupUserPrincipalName = $Workspace.users.UserPrincipalName[$i2]
            }
        
            $temp.Datasetid = 'NotFound'
            $temp.Datasetname = 'NotFound'
            $temp.DatasetaddRowsAPIEnabled = 'NotFound'
            $temp.DatasetconfiguredBy = 'NotFound'
            $temp.DatasetisRefreshable = 'NotFound'
            $temp.DatasetisEffectiveIdentityRequired = 'NotFound'
            $temp.DatasetisEffectiveIdentityRolesRequired = 'NotFound'
            $temp.DatasetisOnPremGatewayRequired = 'NotFound'

            $temp.SourceName   = 'NotFound'  
            $temp.SourceConnectionString = 'NotFound'
            $temp.SourceDatasourceType = 'NotFound'
            $temp.SourceConnectionDetails = 'NotFound'
            $temp.SourceGatewayId  = 'NotFound'
            $temp.SourceDatasourceId  = 'NotFound'
            
            $GroupDatasetSource.Add($temp) | Out-Null

            $CountRows++
            "RowNbr :" + $CountRows

            $i2++

        } While ($i2 -le $Workspace.users.AccessRight.count-1)      
         
     }

        $GroupDatasets | ForEach-Object -Process{ #for all datasets
            $Datasets = $_
         
            $DatassetCount = $Datasets.count
            $Datasets  | ForEach-Object -Process{ #all sources in dataset
                $Source = Get-PowerBIDatasource -DatasetId $_.id -ErrorAction SilentlyContinue 
               
                $SourceCount = $Source.count 
                $i = 0
                Do {
                     $i2 = 0
                    Do { # Loop all users in group

                        $temp = "" | select "GroupId", "GroupName", "GroupDescription","GroupType", "GroupState", "GroupIsReadOnly", "GroupIsOrphaned", "GroupIsOnDedicatedCapacity", 
                                "GroupCapacityId" , "GroupUserPrincipalName", "GroupAccessRight", "Datasetid", "Datasetname", "DatasetaddRowsAPIEnabled", "DatasetconfiguredBy", "DatasetisRefreshable", "DatasetisEffectiveIdentityRequired", 
                                "DatasetisEffectiveIdentityRolesRequired", "DatasetisOnPremGatewayRequired" ,"SourceName","SourceConnectionString","SourceDatasourceType","SourceConnectionDetails",
                                "SourceGatewayId","SourceDatasourceId"

                        $temp.GroupId = $Workspace.id
                        $temp.GroupName = $Workspace.Name
                        $temp.GroupDescription = $Workspace.Description
                        $temp.GroupType = $Workspace.Type
                        $temp.GroupState = $Workspace.State
                        $temp.GroupIsReadOnly = $Workspace.IsReadOnly
                        $temp.GroupIsOrphaned = $Workspace.IsOrphaned
                        $temp.GroupIsOnDedicatedCapacity = $Workspace.IsOnDedicatedCapacity
                        $temp.GroupCapacityId = $Workspace.CapacityId
                        IF($Workspace.users.AccessRight.count -eq 1) {
                            $temp.GroupAccessRight = $Workspace.users.AccessRight
                            $temp.GroupUserPrincipalName = $Workspace.users.UserPrincipalName
                        }
                        Elseif ($GroupDatasets.users -eq $null){
                            $temp.GroupAccessRight = 'NotFound'
                            $temp.GroupUserPrincipalName = 'NotFound'
                        }
                         Else {
                            $temp.GroupAccessRight = $Workspace.users.AccessRight[$i2]
                            $temp.GroupUserPrincipalName = $Workspace.users.UserPrincipalName[$i2]
                        }
                        $temp.Datasetid = $Datasets.id
                        $temp.Datasetname = $Datasets.name
                        $temp.DatasetaddRowsAPIEnabled = $Datasets.addRowsAPIEnable
                        $temp.DatasetconfiguredBy = $Datasets.configuredBy
                        $temp.DatasetisRefreshable = $Datasets.isRefreshable
                        $temp.DatasetisEffectiveIdentityRequired = $Datasets.isEffectiveIdentityRequired
                        $temp.DatasetisEffectiveIdentityRolesRequired = $Datasets.isEffectiveIdentityRolesRequired
                        $temp.DatasetisOnPremGatewayRequired = $Datasets.OnPremGatewayRequired
                        IF ($SourceCount -eq 0) {
                            $temp.SourceName   = 'NotFound'  
                            $temp.SourceConnectionString = 'NotFound'
                            $temp.SourceDatasourceType = 'NotFound'
                            $temp.SourceConnectionDetails = 'NotFound'
                            $temp.SourceGatewayId  = 'NotFound'
                            $temp.SourceDatasourceId  = 'NotFound'
           
                            }
                            Else{
                            $temp.SourceName   = $Source[$i].name
                            $temp.SourceConnectionString = $Source[$i].ConnectionString
                            $temp.SourceDatasourceType = $Source[$i].DatasourceType
                            $temp.SourceConnectionDetails = $Source[$i].ConnectionDetails
                            $temp.SourceGatewayId  = $Source[$i].GatewayId
                            $temp.SourceDatasourceId  = $Source[$i].DatasourceId
                            }
                        $GroupDatasetSource.Add($temp) | Out-Null
                        $CountRows++
                        "RowsNbr :" + $CountRows
                        $i2++
                        } While ($i2 -le $Workspace.users.AccessRight.count-1)
                        $i++
                } While ($i -le $SourceCount-1)
            
            }
       }

}

"Total datarows: "+ $CountRows
"Export to CSV: " + $CSV 
$GroupDatasetSource | Export-Csv  $CSV
"All done" 

Muita hyödyllisiä linkkejä:

Power BI Management module in the PowerShell Gallery https://www.powershellgallery.com/packages/MicrosoftPowerBIMgmt

Power BI cmdlets documentation https://docs.microsoft.com/en-us/powershell/power-bi/overview?view=powerbi-ps

Open Source repository for Power BI cmdlets on GitHub https://github.com/Microsoft/powerbi-powershell

Power BI SDK for .NET https://github.com/Microsoft/PowerBI-CSharp

Power BI REST API Reference https://docs.microsoft.com/en-us/rest/api/power-bi/

Quick reference for PowerShell cmdlets, REST APIs, and SDK for Power BI administration https://docs.microsoft.com/en-us/power-bi/service-admin-reference

Power BI Community site https://community.powerbi.com/

Pelaisitko tätä peliä?

Heitetään kolikkoa, jos kruuna saat 1.5 kertaa alkuperäisen sijoituksesi eli 50% kasvua. Jos klaava niin alkuperäinen sijoitus kerrotaan 0.6 eli menetät 40%.

Odotusavo on 1.05 € ensimmäiselle kierrokselle, jos sijoittaisit yhden euron. (0.5×1.5+0.5×0.6= 1.05)

Montako kierrosta pelaisit ja paljonko sijoittaisit peliin alussa?

Ohessa Power BI:llä toteutettu simulaation visuaalisaatio päätöksen tueksi. On simuloitu 1000 henkilöä ja 300 kierrosta. Alkusijoitukseksi on asetettu 1.

Lähde, ajatus ja miksi tällä on väliä: https://www.nature.com/articles/s41567-019-0732-0

Ennustetietokanta

Useissa projekteissa on tullut eteen tilanne, jossa on olemassa toteumatietoja aikasarjoista ja niistä halutaan tuottaa ennusteita hieman eri tarkkuustasolla kuin toteumat itse ovat. Miten tällaisessa tilanteessa voisi toimia?

Esittelemme alla kaksi vaihtoehtoa, toinen näistä on melko suoraviivainen, mutta molemmat edellyttävät kuitenkin sitä, että normaalia raportointiin optimoitua dimensionaalista tietomallia hieman muokataan erillisellä linkkioliolla (”bridge-table”). Normaalisti dimensiomalli ei tue M:M tyyppisiä relaatioita, vaan kaikki relaatiot dimensioiden välillä menevät faktataulun kautta ja faktan sekä dimension relaatio on M:1.

Tämän erityisen linkkitaulun vuoksi on syytä päättää miten toteuman ja ennusteen lukuja lasketaan suhteessa toisiinsa, laitetaanko joku lisäehto voimaan?

Esimerkkinä datavisualisoinnista käytetään Power BI:n tuottamaa raporttia.

Vaihtoehto 1

Vaihtoehdon tietomalli on alempana.

 

 

Eri versioihin liittyvät ennusteet saadaan näytettyä hyvin alla olevassa kuvaajassa, koska versio on vain yksi dimensioista, jota voi käyttää luokkana. Data tulee yhdestä faktataulusta eli riveillä on sekä ennustetta että toteumaa.

 

Vaihtoehto 2

Vaihtoehdon tietomalli on alempana.

Tietomalli on hieman monimutkaisempi, mutta toisaalta ennusteita ja toteumia ei säilötä samassa taulussa. Data tulee kahdesta faktataulusta ja raportilla käytetään muutamia yhteisiä dimensioita akselien arvojen tai suodatusten määritykseen.

Data Platform ja Data Analytics

Ready Solutions Oy sai äskettäin Microsoft Silver Partner statuksen osa-alueilta Data Platform ja Data Analytics. Mitä tällainen Microsoftin kokonaisuus pitää sisällään?

Palveluita datan tallentamiseen, jalostamiseen ja informaation tuottamiseen

Microsoftilla on erittäin vahva tarjoama erilaisten datapalveluiden osalta ja uskomme että asiakkaamme hyötyvät näiden laajemmasta käyttöönotosta. Lisäksi uusien palveluiden hyödyntäminen voi tapahtua monissa tapauksissa ilman että sovelluksia tarvitsee rakentaa kokonaan uusiksi.

Azuren Blob Storage tarjoaa joustavan tiedontallennusratkaisun, Table Storage NoSQL ominaisuuksia ja kuitenkin käytössä on tapahtumien hallinnan mahdollistavat Azure SQL Database sekä CosmosDB muiden palveluiden ohella. Luonnollisesti IaaS mallinen virtuaalikoneiden käyttö sekä oman tietokantalisenssin hyödyntäminen on myös mahdollista.

 

Muuttuva sovelluskehitys

 

Sovelluskehitykseen tämä luo uusia mahdollisuuksia, vaikka edelleen monet asiat kuten sovelluksen tietoturva, ovat sovelluskehittäjien vastuulla.

Infrastruktuuriin liittyvät rajoitteet on nyt helpommin ohitettavissa ja toisaalta on mahdollista kokeilla uusia palveluita sekä niiden käyttökelpoisuutta oman liiketoiminnan apuna.

Käsitteet ”Polyglot Persistence” sekä ”Polyglot Programming” kuvaavat uutta maailmaa, jossa sovelluskokonaisuudella voi olla monia osia ja eri osat hyödyntävät sellaisia komponentteja, jotka niiden luonteen mukaisesti ovat tehtäväänsä parhaita.

Näiden kehityskulkujen vuoksi onkin järkevintä keskustella sovellusten tarjoamista liiketoimintapalveluista eikä enää niinkään organisaation liiketoiminnan operoinnin vaatiman infran rajoituksista.

Kysy lisää!

Jos haluat keskustella asiasta ja kysyä miten voisimme auttaa datan hyödyntämisessänne, niin ota yhteyttä myyntiimme:

myynti@readysolutions.fi

+358451374850

 

Projekti-raportointia Power BI:llä

Projekti-raportointia Power BI:llä

Olemme toteuttaneet Projektiportfolioraportti esimerkin, jossa käytetään Microsoftin demo dataa Project Onlinesta ja sitä käsitellään eri tarpeisiin Power BI:llä.

 

Projektien hallinnan kannalta raha on yleensä kuningas ja siksi salkkutasolla olemme keränneet esille koko salkun kustannuksien datan. Esimerkiksi todelliset kustannukset, budjetoidu kustannukset ja viimeisen estimaatin kustannukset.

 

Lisäksi vohvelivalikon   kautta voimme pureutua dataan eri osastojen, projektityyppien tai projektin omistajien näkökulmasta, jolloin ennusteet ja projektit ovat paremmin vertailukelpoisia keskenään.

 

Portfolio kustannus/ päivä visuaalisaatiossa voimme seurata kuinka paljon salkku maksaa / päivä ja miten nämä kustannukset kasautuvat eri aikoihin. Esimerkin sakussa on ennustettu syyskuulle huomattavasti suurempia päiväkustannuksia kuin muulle osaa vuodesta. Olisiko tässä hyvä siirtää joitakin projekteja eri aikaan, jotta kuormitus olisi tasaisempaa? Toteutuneesta näemme, että joka tapauksessa kulut ovat seuranneet enemmän keskimääräistä päivähintaa. Erityisesti tässä raportissa Power BI pääsi osoittamaan vahvuutensa, sillä kyseinen data on projektitasolla Project Onlinessa ei päivätasolla, mitä raportointi vaatisi.

 

Mikäli rahaa käytetään huomattavasti vähemmän kuin mitä on arvioitu, voidaan siitä helposti päätellä, että projektit eivät todennäköisesti etene keskimäärin suunnitellulla nopeudella tai on mahdollisuus vapauttaa varoja muuhun käyttöön tämän vuoden osalta:

 

Koska meillä on käytössä koko projektisalkun tiedot voimme yksinkertaisella eksponentiaalisentasoituksen mallia (exponential smoothing) käyttämällä arvioida kertyviä tulevia kustannuksia ja niiden mahdollista kehittymistä.

 

Yksinkertaisilla liikennevaloilla saadaan projektisalkusta nousemaan esille projektit, mitkä kaipaavat huomiota. Tässä esimerkissä liikennevaloihin on käytetty automaattisia triggereitä perustuen esimerkiksi budjetin ylittämiseen yli 20% (Punainen).

 

Mikäli tilanne vaatii nopeampaa perehtymistä juuri tiettyyn projektiin voi raportilta helposti porautua siihen:

 

Ja nähdä mistä oikein on kyse, missä tilassa projekti on tai missä tilassa projektin välietapit ovat.

 

Projektiraporttia projektipäällikkö voi myös käyttää projektin seuraamiseen. Samalla päästään myös yhteen totuuteen, kun johto ja projektin vastuuhenkilöt näkevät samat tiedot. Tämä myös lisää näiden järjestelmien datan laatua, sillä virheet tulevat helposti näkyviin ja ne voidaan korjata suoraan järjestelmiin mistä ne ovat lähtöisin.

Power BI tarjoaa laajat julkaisuvaihtoedot raporteille kuten tämän raportin julkinen jakaminen osoittaa. Yrityksen sisäisesti julkaisun voidaan tehdä samaan tapaan tai vaikka esimerkiksi applikaation kautta suoraan puhelimeen. Lisäksi raportit on mahdollista toteuttaa niin että raportilla nähdään vain data, mihin on kirjautuneella henkilöllä oikeudet.

Tämän tyyppisen raportin lähteenä voi olla lähes mikä tahansa projekti järjestelmä. Parhaisiin tuloksiin päästään tietenkin ottamalla mukaan dataa suoraan esimerkiksi taloushallinonjärjestelmistä, jolloin projektien todelliset kustannukset voisivat olla lähes reaaliaikaisia. Vastaavasti mitä enemmän järjestelmiä huomioidaan sitä tarkempaa, data on ja sitä lähempänä ennuste voi olla toteumaa. Lisäksi Microsoftin alusta tarjoaa välineet kaikkeen datan hallintaan ja analysointiin, vaikka itse Power BI ei johonkin sovellukseen sellaisenaan toimisi.

Ota CRM – sovelluksen data hyötykäyttöön

Olemme aiemmin kirjoittaneet yrityksen CRM:n datan hyödyntämisestä, pääpaino silloin oli suorat yhteydet esimerkiksi Power BI:n avulla organisaation D365 ympäristöön.

Mutta kaikille organisaatioille tämä ei ole riittävää, vaan vaaditaan datan yhdistämistä eri sovellusten olemassa olevien datojen kanssa. Tällöin käytännössä tarvitaan tietovarastoinnin tekniikoita.

Tässä esimerkkitapauksessa oletamme, että organisaatiolla on on-premises mallilla rakennettu tietovarasto tai oikeammin data mart ja sillä on käytössään ETL – teknologia dataintegraatioihin.

Toisessa osassa kerromme hieman miten vastaava datan ottaminen hyötykäyttöön tapahtuisi, jos käytössä olisi monipuoliset Microsoft Azure – ympäristön palvelut.

 

Esimerkki energia-alalta

Energiayhtiö Oy käyttää perusjärjestelmänään energia-alalle tyypillisen lyhenteen mukaisesti ison toimittajan CIS – sovellusta, mikä viittaa sanaan Customer Information System. Tämä systeemi hoitaa laskutuksen ja sopimusten hallinnan prosesseihin liittyviä asioita.

Yhtiö on myös hankkinut liiketoiminnan johtamista varten data martin, josta voi nähdä sopimuskannan tilanteen sekä laskutukseen liittyviä asioita. Näillä tiedoilla ajateltiin aluksi pystyvän johtamaan liiketoimintaa.

 

Kohta havaitaan, että yrityksen myyntitiimit ovat ottaneet käyttöön SaaS – sovelluksen, joilla he hoitavat myyntiprosessia eikä oikein mistään aiemmasta perusjärjestelmästä näe mitä myyntiprosessissa kokonaisuutena tapahtuu. Kun liiketoimintajohto kuitenkin haluaa näkyvyyttä myynnin tilaan, niin päätetään integroida CRM – data osaksi data mart – ratkaisua ja edellinen tietomalli täydennetään myyntimahdollisuudella sekä liidien tiedoilla (Opportunity, Lead).

 

Tietomallin täydentämisen sekä data martin taulujen lisäksi tarvitaan myös dataa.

 

Kingswaysoft D365 Integration Pack for SSIS

 Pilvessä olevan datan voi ottaa hyötykäyttöön tietovarastoinnissa käyttämällä esimerkiksi SQL Server Integration Services – ohjelmistoa, johon hankitaan sopiva laajennus helpottamaan datan poimintaan SaaS – palvelusta.

Ready Solutions Oy:n konsultit ovat testanneet perinteisen on-premises tietovarastoinnin osalta Kingswaysoft – nimisen toimijan tuotetta, joka vaikuttaa lupaavalta. On tietysti olemassa myös muita vaihtoehtoja, kuten jonkinlainen replikaatiomekanismi. Mutta SaaS – sovellusten tapauksessa rajapintojen suora hyödyntäminenkin on pidettävä yhtenä tärkeimmistä integraatioiden toteutusmuodoista.

Miten CRM:n data integroidaan tietovarastoon? Yksinkertainen tapa on luoda SSIS – sovellus, joka siirtää datan staging – alueelle tietovarastoon ja lataa sen jälkeen datat kohdetauluihinsa.

SSIS – sovelluksen voi laittaa käyttämään jotain valmista teknistä O365 – sovellustunnusta, jolle on annettu D365:n puolella sopiva security role datan poimintaa varten.

Loppuosa latauksesta on kohtuullisen yksinkertaista komponenttien siirtelyä paikalleen data flow – taskin sisällä sekä haluttujen kenttien poimimista.

Staging taulusta data ladataan ensin kaikkiin dimensiotauluihin, jotka sitä lähdettä hyödyntävät ja sen jälkeen faktatauluun / faktatauluihin.

 

              Haluatko ottaa D365 datasi käyttöön        liiketoimintaraportoinnissasi?

Ready Solutions Oy:n konsulttitiimi auttaa mielellään ja selvittää parhaan ratkaisun, ota rohkeasti yhteyttä!

Asko.kauppinen@readysolutions.fi

Jonne.poutiainen@readysolutions.fi

+358451374850

Kirjoitamme myös seuraavan osan datan ottamisesta käyttöön, seuraa meitä eri sosiaalisissa medioissa ja käy sivuillamme jos haluat tietää lisää!

Onko datavisualisointi analytiikkaa?

Viimeisten vuosien aikana sanasta analytiikka on tullut ns. weasel word*, eli se voi tarkoittaa mitä tahansa.

Datavisualisointi on datan eri asteikollisten muuttujien esittämistä kuvioiden avulla niin että ihminen yrittää jäsentää sen informaatioksi. Datan muuntaminen informaatioksi vaatii useimmiten jonkinlaisen kontekstin, ja luonnollisesti yrityksessä se on liiketoiminnan joku osa-alue.

Vaikka vaatisi että oikeaa analytiikkaa voi olla vain algoritmien käsittelemän datan vasteena tuleva johdettu data, kuten ostotodennäköisyys, niin monesti datan visualisointi ennen sen syöttämistä algoritmeille on tärkeää laadun varmistuksen mielessä. Datan hyödyntäjän on tunnettava datansa.

Data informaatioksi – eri näkökulmat tuovat arvoa

Ready Solutions Oy:n osakkaan Asko Kauppisen mukaan datavisualisoinnin käyttötarpeet voidaan useimmiten täyttää hyvällä Business Intelligence – ohjelmistolla ilman että suuren joukon liiketoimintakäyttäjiä tarvitsee opetella ohjelmointikieliä. Markkinoilla on useita hyviä vaihtoehtoja, eikä ole järkevä ajattelumalli, että organisaatiolla pitäisi olla vain yksi teknologiajoukko, joka voidaan ottaa käyttöön.

Datan edistyneempi hallinta edellyttää jo jonkin verran enemmän investointeja, mutta esimerkiksi tiettyjä kehityshankkeita voidaan toteuttaa ilman suurta tarvetta kaupallisille ohjelmistoille. Nykyään Python ja R ovat suosituimpia työvälineitä Data Scientistien keskuudessa ja ne voidaan ottaa käyttöön nopeasti.

Riippumatta siitä mitä organisaatiossa tehdään tai millä välineillä, niin datan hyödyntämisen tulee palvella liiketoimintaa. Käyttötarve voi olla tuotekehitys, riskienhallinta, kannattavuus, asiakaspalvelun laatutason nostaminen taikka miltei mikä tahansa.

Ready Solutions Oy:n osakkaan Jarkko Sahlmanin mukaan informaation arvo tulee pelkästään siitä, että liiketoimintajohto tai yrityksen työntekijät operatiivisella tasolla ymmärtävät yrityksen eri toimintojen ja prosessien nykytilan suhteessa tavoitteisiin ja tämän jälkeen tekevät toimintaan muutoksia, jotta asetettuihin tavoitteisiin päästäisiin.

        Esimerkki –  mitä Google Analytics data kertoo?

Ready Solutions Oy:n markkinoinnin ja myynnin panosten vaikutusta voidaan tarkastella verkkosivujen erilaisilla kävijämäärien (käynnit, kävijät, uudet kävijät) sekä muilla, liikevaihtoon enemmän vaikuttavilla, muuttujilla mutta joita emme tässä halua avata tarkemmin.

Markkinoinnilla pyrimme avaamaan myyntimahdollisuuksia ja myyntimahdollisuus voi alkaa vaikkapa kontaktista myyntiimme verkkosivuillamme. Myyntimahdollisuudet taas pyritään muuttamaan toteutuneiksi kaupoiksi.

Heinäkuussa 2018 aloitimme useassa eri kanavassa cost per click – tyyppisen kampanjan, jolla pyrimme lisäämään liikennettä sivullamme olevaan artikkeliin sekä lisäämään LinkedInin puolella olevia yrityssivuston seuraajien määriä. Artikkeliin on tässä kampanjassa sijoitettu yhteydenottoon kannustavia CTA – elementtejä, kun joissain tilanteissa pyydämme vain kävijöitä seuraamaan yrityksemme sosiaalisten medioiden yrityssivuja.

Yllä oleva Power BI välineellä tuotettu kuvaaja on yksinkertainen, mutta tarjoaa mahdollisuuden verkkoliikenteen tarkasteluun usean eri dimension suhteen.

Mielenkiintoinen osa-alue datan visualisointiin tai perusymmärryksen luomiseen siitä, on eri julkaisujen / sivujen käytön tarkastelu. Jos saman kuukauden aikana on tehty useita erilaisia julkaisuja, jokaista markkinoitu eri variantein niin tällainen analyysi antaa mahdollisuuksia optimoida markkinointia. Alla olevassa kuvassa on alkuvuoden 2018 julkaisujen vierailudataa.

LinkedIn on lähteenä tuonut meille eniten uusia kävijöitä, joskin hinta on myös ollut kova cpc – mielessä.

                      Kehitä liiketoimintaasi datan avulla!

Ready Solutions Oy:n konsulttitiimillä on vahvaa kokemusta eri toimialoilta sekä erilaisista ohjelmistotuotteista. Erityisesti energiatoimialalla voimme auttaa liiketoimintasi kehittämisessä monia muita toimijoita syvällisemmän toimialaosaamisemme vuoksi.

Readyn konsultit vastaavat mielellään kysymyksiisi:

Asko.kauppinen@readysolutions.fi

Jarkko.sahlman@readysolutions.fi

+358451374850

 

*= näätä tyhjentää munan tekemällä siihen pienen reiän

Pilveä ja Poweria

 

Aiemman julkaisumme   dataosaamisesta mukaisesti, Ready Solutions opastaa suomalaisia pk-yrityksiä ottamaan käyttöön uusia palveluita sekä kehittämään liiketoimintaansa datan avulla. Tässä kerromme miten asiakasdatasi, myyntiprosessisi ja erilaiset aktiviteetit saadaan visualisoitua Microsoftin Power BI – välineen avulla.

Power BI on helppokäyttöinen, mutta paljon ominaisuuksia sisältävä tuote, jonka raportit voidaan jakaa pilvipalvelusta suoraan käyttäjille ilman omia investointeja erityiseen infraan. Raportteja voidaan kehittää Power BI Desktop – tuotteella, jonka löydät täältä.

 

Lähtökohdat

Kirjoitamme tämän siitä näkökulmasta mikä meille itsellemme on myös luontevin eli asiantuntijapalveluita muille yrityksille tarjoavan yrityksen. Kyse on siis B2B – myynnistä, mutta todellisuudessa tärkeimmät tiedot mitkä meillä pitää olla hyvässä kunnossa ovat asiakasyritysten tai potentiaalisten asiakasyritysten yhteyshenkilöt. Yhteyshenkilö voi olla yrityspäättäjä tai muu erilaisten palveluiden hankintaan muuten merkittävästi vaikuttava henkilö.

Alla oleva lista asioista, joita asiakkuuksien parissa työskentelyä helpottaviin tietojärjestelmiin yleensä kuuluu, havainnollistaa kokonaisuutta.

  • Lead
  • Account
  • Contact
  • Opportunity

Mitä nuo pitävät sisällään? Meille asiakas, potentiaalinen asiakas tai yhteistyökumpani on organisaatio ja Account – entiteetin jäsen.

Edellisillä on aina 1..N kappaletta yhteyshenkilöitä. Oikeastaan yhteyshenkilöiden kanssa kommunikointi tai interaktiot, jotka näyttäytyvät tietojärjestelmässä aktiviteetteina, on koko myynnin prosessimme ydin.

Yhteys yrityksen Dynamics 365 – instanssiin

Käytämme yleensä OData  – protokollaa yhdistämään Power BI:n D365 instanssimme tietoihin.

Linkki instanssisi  rajapintaan löytyy kohdasta ”Asetukset/Mukautukset/Kehittäjien resurssit”

 

 

Power BI Desktopin puolella taas voit tehdä tällaiset valinnat:

Myyntiprosessisi tilanne

Myyntisi raportointi perustunee suurelta osin Myyntimahdollisuus / Opportunity objektin tietoihin, jotka saat helposti valittua kun valitset oikean ”taulun” Power BI Desktopin avulla.

Millaiset tietoryhmät ovat kiinnostavia myynnin raportoinnin kannalta?

  • Myyntimahdollisuuteen liittyvä potentiaalinen asiakas tai asiakas
  • Myyntimahdollisuuden arvioitu euromäärä
  • Myyntimahdollisuuden myyntiprosessin vaiheiden ajankohdat
  • Myyntimahdollisuuteen ehkä liittyvät tuotteet tai palvelut

Noiden tietojen sisältö sekä laajuus riippuvat hyvin paljon organisaatiosi tavasta tehdä myyntiä.

 

Hyödyt

Power BI mahdollistaa hyvin nopean yhteyden asiakasdataasi pilvessä sekä mahdollistaa tämän datan hyödyntämisen liiketoimintasi kehittämisessä.

 

Lopuksi

Pienikin yritys voi ottaa käyttöön ratkaisun, joka avaa sille aivan uusia mahdollisuuksia raportointiin eikä kustannuskaan per käyttäjä ole liian suuri.

Toki täytyy myöntää että tässä näkökulma on pienen yrityksen konkreettinen operatiivisen toiminnan raportointi ja liiketoiminnan kehitys sekä ohjaus sen datan perusteella. Suurelle yritykselle tällaiset järjestelmät tyypillisesti tarjoavat muitakin etuja ja lisäksi data voidaan yhdistää erilaisten tietovarastointitekniikoiden avulla muuhun organisaation dataan.

Seuraa Ready Solutions Oy:tä LinkedIn:ssä ja sivuillamme, niin saat lisää tietoa siitä miten erilaiset teknologiat oikeasti tarjoavat hyötyjä käyttäjäorganisaatioilleen!