Säästin kiinnostavimman aiheen juttusarjan viimeiseen osaan. Nimittäin valokuvat. Voiko offlinena tehtäviin havaintoihin/liideihin/tehtäviin/jne liittää valokuvia?

Kyllä voi. Käydään tällä kertaa läpi erilaisia tapoja toteuttaa tämä.

Taulun vakioliitteet

Ensimmäisenä tulee mieleen käyttää vakiotoiminnallisuutta, eli tauluun liitettäviä liitetiedostoja.

Sallitaan taulun ominaisuuksista liitetiedostot.

Lisätään Power Appsin tehtävä-lomakkeelle liitetiedostot (Attachments) kenttä.

Näin voimme liittää tehtäviin 0-n kappaletta liitetiedostoja.

Vai voimmeko…

Kaikki toimii mainiosti työaseman selaimella. Mutta sovelluksen mobiiliversiossa kuvia ei näy missään.

Mobiililla voi kyllä liittää tehtäviin kuvia. Mutta kun tehtävän ottaa tämän jälkeen muokattavaksi, ovat kuvat kadonneet.

Mielenkiintoista.

Tietueen liitetiedostot löytyvät Notes-taulusta. Lisätään sovellukseen näyttö, joka esittää sen sisällön. Mobiililla lisätty kuva on tallentunut sinne aivan oikein.

Notes-taulun sisältö ei tule käytettäväksi sovellukseen (mobiilissa), ennen kuin lisäämme sen käyttämäämme offline-profiiliin. Haluamme ottaa mukaan ainoastaan laitteelle siirtyviin tehtäviin liittyvät kuvat (related rows only + Tasks).

Nyt voimme todeta kuvien olevan käytettävissä myös offline-sovelluksessamme.

Ongelma ei siis ole Notes-taulun käyttö, vaan lomakkeen liitetiedosto-kontrolli. Se ei toimi offline-sovelluksessa.

Liitetiedostojen lisääminen Lisää kuva -kontrollilla

Ei luovuteta. Jaetaan tehtävä-näyttö kahteen osaan. Ensimmäisellä välilehdellä syötetään tehtävän perustiedot ja toisella lisätään siihen liittyvät kuvat. Edelleen Notes-tauluun. Lopputulos näyttää seuraavalta.

Kuvagalleriassa näytetään tehtävään (inspection) liittyvät (regarding) muistiinpanot (Notes). Suodatusehto on hieman perinteistä erikoisempi. Notes voi liittyä eri tauluihin, jolloin regarding-sarakkeelle tulee ensin kertoa (AsType), mihin tauluun olemme viittaamassa.

Items = Filter(Notes, AsType(Regarding, Tasks).Inspection = gblSelectedItem.Inspection)

Kuvat eivät näy sellaisenaan. Lisätään niihin hieman metatietoja.

Concatenate("data:colon;image/jpeg;base64,",ThisItem.Document)

Lisätään näytölle lopuksi Add Picture -kontrolli. Viritetään sitä hieman. Asetetaan tekstiksi ”Add photo” myös kuvaa vaihdettaessa (Change picture text, 1). Lopuksi piilotetaan kuvan esikatselu-kontrolli (UploadedImage. 2).

Kuva lisätään Patch-komennolla painikkeen OnChange-tapahtumassa. Kuvatiedosto (UploadedImageNotes.Image) ei tallennu sellaisenaan, vaan sitä joudutaan hieman manipuloimaan.

OnChange: Patch(Notes, Defaults(Notes),
    {
        Regarding: gblSelectedItem,
        Document: Last(
            Split(
                Substitute(
                    JSON(
                        UploadedImageNotes.Image,
                        JSONFormat.IncludeBinaryData
                    ),
                    """",
                    ""
                ),
                "base64,"
            )
        ).Value,
        'Is Document': true,
        Title: "test",
        'File Name': "test.jpeg"
    }
)

Nyt kaikki toimii hienosti.

Oma taulu kuville

Mikäli Notes-taulua ei jostain syystä ole mahdollista hyödyntää, voimme aina tehdä oman taulun tehtävien liitteille.

Taulussa on sarake itse kuvalle, sekä siihen liittyvälle (Lookup) tehtävälle.

Määritellään taulun ominaisuuksista sen toimivan offline-moodissa. Lisätään taulu käyttämäämme offline-profiiliin. Otetaan mukaan ainoastaan laitteelle tuotuihin tehtäviin liittyvät kuvat. Näin saamme pidettyä laitteelle tallennettavien kuvien määrän maltillisena.

Muistetaan lopuksi julkaista (publish) muokattu profiili!

Lopuksi vaihdetaan toteutus käyttämään Task Attachment -taulua Notes-talun sijasta. Liitteiden lisääminen ja poistaminen tuntuu mobiililla nopeammalta kuin Notes-taulua käytettäessä.

Erilliset kuvasarakkeet tehtävä-taulussa

Toki kuvat voi lisätä myös suoraan tehtävälle. Tällöin rajaamme mahdollisten kuvaliitteiden määrän. Esimerkissämme tehtävällä on kolme kuvasaraketta, eli tehtävään voi liittää maksimissaan kolme kuvaa.

Jotta kuvasarakkeet toimivat myös offline-tilassa, tulee offline-profiiliin lisätä Image Descriptor -taulu. Poimitaan mukaan rivit, jotka liittyvät tehtävä-taulun (Task) kuvasarakkeisiin. Jostain mystisestä syystä käyttöliittymässä ei näytetä sarakkeiden nimiä.

Sovelluksessa pääsemme helpoimmalla lisäämällä lomakkeelle kaikki luomamme kuvakentät.

Ratkaisu on hieman kömpelö. Sitä voi parantaa hieman piilottamalla muut paitsi ensimmäisen kuvakentän. Ja näyttämällä uuden kuvakentän vasta kun edelliseen lisätään kuva.

Voimme myös esittää kuvat edellisten toteutusvaihtoehtojen tapaan galleriassa. Josta ne sitten tallennetaan omiin kuvakenttiinsä.

Tällöin kuva lisätään aina ensin kokoelmaan. Galleriassa esitetään sitten kokoelman sisältö.

Add photo -painike tulee piilottaa, kun kuvia on lisätty maksimimäärä.

Tallennuksen yhteydessä kokoelman kuvat lisätään omiin sarakkeisiinsa.

Patch(
    Tasks,
    gblSelectedItem,
    {
        'Image 1': First(
                colImages).Image,
        'Image 2': If(CountRows(colImages)>1, Last(
            FirstN(
                colImages,
                2
            )
        ).Image, Blank()),
        'Image 3': If(CountRows(colImages)>2, Last(
            FirstN(
                colImages,
                3
            )
        ).Image,Blank())
    }
);

Yhteenveto

Hieman työtä se vaatii, mutta natiivisti offlinena toimivassa canvas Power Appsissa voi liittää Dataversen riveihin kuvatiedostoja. Mikä usein on yksi vaatimuksista.

Offline-profiilin määrittelyssä kannattaa tällöin olla entistä huolellisempi. Ettei mobiililaitteille ala valumaan kuvatiedostoja, joita käyttäjät eivät koskaan tarvitse.