Edellisessä kirjoituksessa tutustuttiin Canvas Power Appsin muokkaamiseen GitHub Copilotilla. Tämä onniastuu Power Apps -taitojen (skills) avulla. Jatketaan samalla teemalla ja tutustaan GitHub Copilot CLI:n Dataverse -taitoihin.

Dataverse-taidot ovat käytännössä seuraavat:

  • dv-connect osaa ottaa yhteyden Dataverse ympäristöön.
  • dv-data osaa luoda, päivittää ja poistaa tietoja Dataversen tauluista. Se siis pystyy manipuloimaan dataa.
  • dv-metadata osaa luoda uusia tauluja, sarakkeita, relaatioita, lomakkeita ja näkymiä.
  • dv-overview on ylätason taito joka ohjaa tehtäviä oikeille taidoille
  • dv-query osaa lukea ja analysoida tietoja Dataversen tauluista
  • dv-solution osaa esim. luoda ratkaisupaketin, lisätä sinne komponentteja viedä sen haluttiuun ympäristöön

Mitäs hauskaa tässä nyt sitten on?

Voit laittaa AI:n tekemään tyypillisiä tehtäviä, joita olet aiemmin kliksutellut käsin kasaan maker-portaalissa.

Tutustutaan tähän kykyyn hieman tarkemmin esimerkin avulla.

Esimerkki – Tietomalli laiterekisterille

Ennen aloitusta koneelle tulee asentaa

Ja tämän perään asennetaan Dataverse-taidot.

copilot plugin marketplace add microsoft/Dataverse-skills
copilot plugin install dataverse@dataverse-skills

Tietomallin suunnittelu

Tyypillinen lähtötilanne low-code maailmassa on, että asiakkaalla on Excel-pohjainen ratkaisu (tai ratkaisun alku), mutta nähdään ettei se tule taipumaan kaikkiin nykyisiin tai tulevaisuuden tarpeisiin. Tilalle halutaan oikea sovellus.

Tässä Excelissä on usein yksi taulukko, jossa on kaikki tieto. Alla esimerkki tällaisesta laiterekisteristä.

Kustakin laitteesta kerrotaan:

  • Nimi
  • Kuntoluokka
  • Haltija
  • Missä rakennuksessa laite sijaitsee
  • Missä rakennuksen kerroksessa laite sijaitsee

Tarvittavat tiedot ovat kaikki tässä, mutta sovellusta varten haluamme järkevämmän tietomallin.

Ladataan Excel työkansioomme ja pyydetään GitHub Copilottia suunnittelemaan sen pohjalta kunnollinen tietomalli.

There is devices.xlsx file in this directory. There is list of devices. Plan datamodel for dataverse to store this
information. I like to have: device condition as choice, device owner to be lookup to systemuser table. And please
separate buildings and floors in them own tables. Make plan for datamodel in datamodel.md file.

Copilot pyytää luvan, mikäli sen tarvitsee tehdä koneellani jotain. Kuten lukea tiedoston sisältö tai luoda uusi tiedosto.

Lopputulos näyttää juuri siltä mitä hain.

Koko suunnitelma on seuraava.

# Dataverse Data Model – Device Management

## Source Data (devices.xlsx)

| Device | Condition | Owner | Building | Floor |
|---------|-----------|--------------|----------|-----------|
| MacBook | New | Timo Pertilä | Main | 1st floor |
| MacBook | Poor | Timo Pertilä | Main | 2nd floor |
| MacBook | Good | Timo Pertilä | UKK | 3rd floor |

---

## Tables

### 1. Building (`cr_building`)

Stores physical buildings.

| Column | Type | Notes |
|----------------|---------------|------------------------|
| `cr_buildingid`| GUID (PK) | Auto-generated |
| `cr_name` | Single Line Text (required) | e.g. "Main", "UKK" |
| `createdon` | Date & Time | Standard audit column |
| `modifiedon` | Date & Time | Standard audit column |

---

### 2. Floor (`cr_floor`)

Stores floors within buildings. Each floor belongs to exactly one building.

| Column | Type | Notes |
|-----------------|-----------------------|-------------------------------|
| `cr_floorid` | GUID (PK) | Auto-generated |
| `cr_name` | Single Line Text (required) | e.g. "1st floor", "2nd floor" |
| `cr_building` | Lookup → `cr_building` | Required – parent building |
| `createdon` | Date & Time | Standard audit column |
| `modifiedon` | Date & Time | Standard audit column |

---

### 3. Device (`cr_device`)

Main table that stores device records.

| Column | Type | Notes |
|-----------------|-------------------------------|---------------------------------------------------|
| `cr_deviceid` | GUID (PK) | Auto-generated |
| `cr_name` | Single Line Text (required) | Device name / model, e.g. "MacBook" |
| `cr_condition` | **Choice** (required) | Values: `New`, `Good`, `Poor` (extensible) |
| `cr_owner` | Lookup → `systemuser` | Device owner (Dataverse system user) |
| `cr_floor` | Lookup → `cr_floor` | Floor where device is located |
| `createdon` | Date & Time | Standard audit column |
| `modifiedon` | Date & Time | Standard audit column |

> **Note:** Building is derivable via the Floor lookup (`cr_floor → cr_building`), so no direct building column is needed on Device. This avoids redundancy and keeps data consistent.

---

## Choice: Device Condition

Global choice set `cr_devicecondition`:

| Label | Value |
|-------|-------|
| New | 1 |
| Good | 2 |
| Poor | 3 |

---

## Relationships

```
systemuser (1) ─────────────────── (N) cr_device

cr_building (1) ──── (N) cr_floor (1) ──┘ (via cr_floor lookup)
```

| Relationship | Type | From Table | To Table |
|---------------------------|------------|---------------|---------------|
| Building → Floors | 1:N | `cr_building` | `cr_floor` |
| Floor → Devices | 1:N | `cr_floor` | `cr_device` |
| SystemUser → Devices | 1:N | `systemuser` | `cr_device` |

---

## ER Diagram

```
┌─────────────────┐ ┌─────────────────┐
│ cr_building │ │ systemuser │
│─────────────────│ │─────────────────│
│ cr_buildingid │ │ systemuserid │
│ cr_name │ │ fullname │
└────────┬────────┘ └────────┬────────┘
│ 1:N │ 1:N
▼ │
┌─────────────────┐ │
│ cr_floor │ │
│─────────────────│ │
│ cr_floorid │ │
│ cr_name │ │
│ cr_building │◄── lookup │
└────────┬────────┘ │
│ 1:N │
▼ ▼
┌──────────────────────────────────────┐
│ cr_device │
│──────────────────────────────────────│
│ cr_deviceid │
│ cr_name │
│ cr_condition (Choice: New/Good/Poor)│
│ cr_owner (Lookup → systemuser) │
│ cr_floor (Lookup → cr_floor) │
└──────────────────────────────────────┘

Tietomallia voi tässä kohtaa vapaasti muokata. Itse tai Copilotin avulla. Mutta mennään nyt tällä.

Tietomallin luonti

Seuraavaksi pyydämme Copilotia luomaan suunnitelman mukaiset taulut annettuun ympäristöön. Haluamme että kaikki tehdään Devices Demo ratkaisuun (solution) ja julkaisina (publisher) käytetään olemassa olevaa Timo Pertilä -julkaisijaa.

This looks good! Can you create solution for this (Devices Demo) using Timo Pertilä publisher. Then create needed custom tables with sample data. Use this environment :
https://make.powerapps.com/environments/a238d77b-b9b4-e570-8464-6833e6a98d56 in tenant f8c98920-c3d7-46b3-b802-ae70afd4b77a

Copilot miettii aikansa miten se saa yhteyden oikeaan ympäristöön ja miten koko tehtävä tulisi ylipäätään tehdä. Mutta sille annettuja työkaluja hyödyntäen se etenee kohti maalia.

Matkan varrella se esimerkiksi löytää ympäristöstä olemassaolevan julkaisijan jota käyttää.

Käytännössä se kirjoitaa python-skriptin, joka luo taulut ja sarakkeet Dataverseen.

Aikaa tässä kaikessa menee tovi, mutta lopulta kaikki on luotuna kuten pitääkin.

Excelin sisältö on luotu valmiiksi tauluihin.

Jopa LookUp-kentät on nimetty tyylikkäästi.

Python-koodia tähän kaikkeen tarvittiin melkein 1000 riviä.

Lomakkeiden ja näkymien päivittäminen

Lopuksi pyydämme Copilotia lisäämään tarvittavat kentät näkymiin ja lomakkeille.

Could you modify views and forms to be like following:

Default Views (for looking Active items)
- Floor: Name, Building
- Building: Name
- Device: Name, Condition, Owner, Floor, Building (from the floor table), created on

Main Forms
- Floor: Name, Building, Created on, owner, subgrid showing devices
- Building: Name, Created on, owner
- Device: Name, Condition, Owner, Floor, created on, owner

Copilot alkaa samantien suunnittelemaan muutoksia.

Hetki siinä taas vierähtää, mutta lopulta kaikki on tehty kuten halusin.

Kerros (floor) -lomaketta hieman jännitin, mutta ihan oikein sekin tuli.

Lopuksi koitetaan omaa inhokkihommaani.

Sarakkeen poistaminen

Haluan poistaa laiteelta sen kuntoa kuvaavan sarakkeen. Mutta sepä on jo mukana lomakkeella ja näkymässä. Eli se pitää ensin poistaa kaikkialta missä se on käytössä ja vasta sitten sen voi oikeasti poistaa.

Annetaan tämä tylsä tehtävä Copilotille.

can you remove condition column from the device table? 

Copilot ymmärsi heti mitä sen tulee tehdä, jotta poisto onnistuu.

Tässä ei mennyt kauaa. Sarake on poistettu näkymästä sekä lomakkeelta ja lopulta kokonaan. Mahtavaa!

Mallipohjaisen sovelluksen (model-driven) luonti

Lopuksi kokeillaan osaako Copilot tehdä myös mallipohjaisen sovelluksen. Tätä ei sen taidoissa ole kuvattu.

Can you create model driven app?

Lopputuloksena on tyhjä sovellus. Toisaalta en muuta pyytänytkään.

Pyydetään lisäämään sovellukseen tarvittavat taulut.

Add also tables to the app (devices, buildings, floos and users)

Tähän pähkäilyyn menikin sitten oikeasti kauan. Matkan varrella Copilot loi 6 identtistä tyhjää sovellusta. Mutta kyllä se tämänkin lopulta (melkein) oikein sai tehtyä. Jostain kumman syystä sovellukseen tuli pyytämättä piiloon myös asiakkaat (accounts) -taulu.

Yhteenveto

Tästä on vaikea olla pitämättä. Vaikka tehtävät kestävät aika pitkään (näksyttelisin itse nämä paljon nopeammin kasaan), niin ennemmin sitä tekee itse jotain hieman hyödyllisempää, kun Copilot naputtelee tauluihin uusia sarakkkeita ja laittaa perusnäkymät ja lomakkeet kuntoon. Tai poistaa poistettavan sarakkeen n:ltä lomakkeelta ja näkymältä että sen saa poistettua.