To ελληνικό blog για το Power Automate και το Dataverse

Τι είναι το scope και γιατί να το χρησιμοποιώ στα flows

Το σημερινό post αφορά στο action Scope στα Cloud Power Automate flows. Θα δούμε τι ακριβώς είναι, πως το χρησιμοποιούμε και που μπορεί να φανεί χρήσιμο.

Τι είναι το scope

Παρόλο που το scope τυπικά είναι action, στην ουσία είναι ένα container για άλλα actions. Ένας τρόπος χρήσης του είναι για την οργάνωση και την ομαδοποίηση άλλων actions, ώστε να είναι πιο εύκολο να τα διαβάσουμε και να τα κατανοήσουμε. Επίσης μπορούμε να το χρησιμοποιήσουμε για την καλύτερη διαχείριση σφαλμάτων στη ροή ενός flow.

Οργάνωση

Οργώνοντας λογικά τα διάφορα action ενός flow μέσα σε scopes, μπορούμε να έχουμε γρήγορα μια “πανοραμική” εικόνα του και να εστιάζουμε κάθε φορά εκεί που θέλουμε να δουλέψουμε, κλείνοντας και ανοίγοντας τα αντίστοιχα scopes κάθε φορά.

Ειδικά σε σύνθετα flows και μόνο αυτή η ιδιότητα μπορεί να είναι σωτήρια. Για παράδειγμα ορίστε ένα απόσπασμα από ένα flow εγκρίσεως αδειών με τα scope κλειστά:

Με χρήση scope

και εδώ το ίδιο κομμάτι χωρίς scopes:

Χωρίς χρήση scope

Ο χρόνος και η προσπάθεια που χρειάζεται για να καταλάβεις τι κάνει το πρώτο flow σε σχέση με το δεύτερο είναι χαώδης.

Διαχείριση σφαλμάτων

Η πιο σημαντική ιδιότητα του scope είναι ότι έαν “χτυπήσει” κάποιο action που περιέχεται σε αυτό, τότε η ροή θα οδηγηθεί αυτόματα στην έξοδο του scope και το scope θα είναι failed. Ας δούμε πως μπορούμε να εκμεταλλευτούμε αυτή την ιδιότητα.

Έλεγχος για errors

Κανονικά εάν θέλουμε να διαχειριστούμε την αποτυχία κάποιου action τότε με την χρήση του “run after” βάζουμε ένα action που τρέχει στο failed και ένα που τρέχει στο success. (Περισσότερα για το run after εδώ)

Αντί λοιπόν να κάνουμε αυτή τη διαδικασία για κάθε action μπορούμε να το κάνουμε μια φορά για ένα scope που θα τα περιέχει.

Try – Catch – Finally

Χρησιμοποιώντας το scope μπορούμε να εξομοιώσουμε το try-catch-finally structure που συναντάμε σε γλώσσες προγραμματισμού. Με το structure αυτό:

  1. Εκτελείτε ότι βρίσκεται στο Try
  2. Αν κάτι από το Try αποτύχει εκτελείτε ότι βρίσκεται στο catch
  3. Αν όλα στο Try εκτελεστούν χωρίς error το catch αγνοείτε
  4. Στο τέλος, σε κάθε περίπτωση, εκτελείτε ότι βρίσκεται στο finally.

Χρησιμοποιώντας 3 scopes όπως παρακάτω έχουμε την ίδια λειτουργικότητα.

Σύνοψη

Μέσα στο scope βάζουμε άλλα actions είτε για να οργανώσουμε ένα flow σε λογικές ενότητες, είτε για να διαχειριστούμε εύκολα σφάλματα που μπορούν να προκύψουν.

Ρυθμίζοντας το Run After στο Power Automate

Τι είναι το “Run After”

Η επιλογή “Run After” μας επιτρέπει να ρυθμίσουμε αν θα τρέξει ένα action ανάλογα με το τι έχει γίνει στο προηγούμενο action. Για παράδειγμα μπορούμε να πούμε ότι ένα action θα τρέξει μόνο έαν το προηγούμενο έχει αποτύχει. Συνεπώς είναι μια πολύ χρήσιμη λειτουργικότητα όταν θέλουμε να διαχειριστούμε σφάλματα κατά την εκτέλεση ενός flow.

Οδηγός ρυθμίσεων

Για να ρυθμίσεις το “Run After” για ένα action απλά επιλέγεις τις 3 τελείες στη δεξιά μεριά του action και από εκεί “Configure run after”

Οι δυνατές επιλογές είναι 4:

  • Is successful – Το προηγούμενο action έτρεξε επιτυχώς. Είναι η default επιλογή
  • Has failed  Το προηγούμενο action απέτυχε για οπουδήποτε λόγο εκτός από timeout
  • Is skipped  Το προηγούμενο action παραλήφθηκε.
  • Has timed out  Το προηγούμενο action έκανε time out.
Παράδειγμα

Έστω ότι έχουμε ένα action που διαβάζει από το SharePoint και θέλουμε στην περίπτωση λάθους να μας στείλει ένα notification, διαφορετικά να συνεχίσει κανονικά.

Τότε το flow μας μπορεί να έχει είτε αυτή τη μορφή (χρησιμοποιώντας ένα parallel branch):

Είτε και αυτή την όχι και τόσο προφανή μορφή:

Η λογική πίσω από την τελευταία μορφή είναι ότι:

  • Το “Send me an email notification” θα τρέξει μόνο εαν το “Get Items” γίνει Failed, Skipped ή Timed Out. Διαφορετικά δεν θα τρέξει (άρα θα γίνει Skipped)
  • To “Apply to each” θα τρέξει μόνο έαν το “Send me an email notification” γίνει Skipped. Αυτό θα συμβεί μόνο έαν το “Get Items” είναι Successful
Επίλογος

Είδαμε λοιπόν πόσο εύκολα μπορεί να ρυθμιστεί το Run After και πως μπορεί να μας βοηθήσει στην διαχείριση σφαλμάτων κατά την εκτέλεση ενός flow.

Στο επόμενο post θα δούμε πώς συνδυάζοντας το Scope με το Run After μπορούμε να εξομοιώσουμε ένα Try-Catch-Finally statement.

Θέλεις να μάθεις πώς να βάλεις το ChatGPT στο Teams χωρίς κώδικα; Έλα μαζί μου στο Func No Code – Summer Edition

Με μεγάλο ενθουσιασμό ενημερώνω ότι θα είμαι ένας από τους ομιλητές στο Func No Code – Summer Edition, στις 22 Ιουνίου , 7 μ.μ. στη Microsoft Hellas.

Θα αναπτύξω το πώς μπορεί κάποιος να φτιάξει ένα chatGPT bot στο MS Teams χωρίς γραμμή κώδικα. Ακούγεται ωραίο, σωστά; Εάν θέλεις να μάθεις περισσότερα, μπορείς να εγγραφείς στην εκδήλωση εδώ:

https://lnkd.in/dnt5mvr9

Ελπίζω να σας δω εκεί!

Ότι πρέπει να γνωρίζεις για το JSON στα Power Automate Flows

Παρόλο που η πλειοψηφία των responses στα actions του Power Automate είναι JSON , συνήθως σε απλά flows η ανάγκη για επεξεργασία του κρύβεται πίσω από το Add Dynamic Content. Υπάρχουν περιπτώσεις όμως που θα χρειαστεί να χειριστούμε ένα JSON μόνοι μας. Για το κάνουμε αυτό όμως πρέπει πρώτα να καταλάβουμε τι είναι το JSON και ποια η δομή του.

Τι είναι το JSON

To JSON (JavaScript Object Notation) είναι ένα ελαφρύ πρότυπο ανταλλαγής δεδομένων. Συνήθως χρησιμοποιείται για τη μεταφορά δεδομένων ανάμεσα σε έναν διακομιστή και έναν πελάτη (Client – Server), ή ανάμεσα σε διάφορες εφαρμογές που χρησιμοποιούν διαφορετικές γλώσσες προγραμματισμού.

Είναι εύκολο για τους ανθρώπους να το διαβάσουν και γράψουν αλλά και για τις μηχανές να το αναλύσουν (parse) και να το παράγουν (generate). Το JSON ακολουθεί ένα απλό συντακτικό και περιγράφει τα δεδομένα ως αντικείμενα, συμβολοσειρές, αριθμούς, λίστες και λογικές τιμές. Η σύνταξη του JSON είναι παρόμοια με την σύνταξη των αντικειμένων JavaScript και μπορεί να περιέχει κλειδιά και τιμές.

Κανόνες σύνταξης
  • Τα δεδομένα είναι σε ζεύγη ονόματος/τιμής (name/value pairs)
  • Τα δεδομένα διαχωρίζονται με κόμμα (,)
  • Τα αντικείμενα (objects) βρίσκονται ανάμεσα σε curly braces ( {…} )
  • Οι πίνακες (arrays) βρίσκονται ανάμεσα σε square brackets ( […] )
Παραδείγματα

Ας δούμε μερικά παραδείγματα, που θα μας βοηθήσουν να καταλάβουμε τη δομή του.

{ "name": "John", "surname": "Doe", "age": 31 }

Παραπάνω έχουμε ένα object, με 3 name:value pairs: Name: John, Surname: Doe και Age: 31

{ "employees": [ "John", "Anna", "Peter" ] } 

Εδώ έχουμε πάλι ένα object, με 1 name:value pair. Το name είναι employees και το value ένα array με τρία strings John, Anna και Peter

{
	"employees": [ 
		{ "name": "Ram", "email": "ram@gmail.com", "age": 23 },
		{ "name": "Shyam", "email": "shyam23@gmail.com", "age": 28 },
 		{ "name": "John", "email": "john@gmail.com", "age": 33 },
 		{ "name": "Bob", "email": "bob32@gmail.com", "age": 41 } 
	]
 } 

Στο παραπάνω JSON το value του employees είναι πάλι ένα array. Αυτή τη φορά όμως αντί για array από strings έχουμε array από objects.

Στα responses από το Dataverse σχεδόν πάντα έχουμε τα δεδομένα σε ένα array από objects.
{
	"employee":{ 
				"name": "Ram", 
				"age": 42 
				"address": {
							 "street": "Aristomenous",
							 "number": 3
							}
				 "phones": ["2130179000","6948000000"]
				}
} 

Άλλο ένα “περίπλοκο” παράδειγμα εδώ. To value του employee είναι ένα object. Σε αυτό το object υπάρχουν:

  • Το name με τιμή RAM
  • To age με τιμή 42
  • Το address με τιμή ένα άλλο object
  • και το phones με τιμή ένα array
{
	"employees": [
		{"name": "Ram", "age": 42 ,"address": null},
		{"name": "Don", "age": 32 },
		{"name": "Lup", "age": 22 ,"address": "Aristomenous 3"},
} 

Σε αυτό το παράδειγμα έχουμε 2 τρόπους με τους οποίους μπορεί να εμφανιστεί το null σε ένα JSON response. Είτε το value στο ζεύγος θα έχει τιμή null (όπως η διεύθυνση του Ram) , είτε θα απουσιάζει τελείως το σχετικό pair από την απάντηση (όπως η διεύθυνση του Don). Δυστυχώς στα responses του Dataverse το null εμφανίζεται με το δεύτερο τρόπο.

Στα responses του Dataverse όταν υπάρχει value null απουσιάζει τελείως το αντίστοιχο pair.
Ένα τυπικό Dataverse response

Εάν κάνουμε ένα list rows στα Accounts το raw response είναι κάπως έτσι:

{
    "statusCode": 200,
    "headers": {
        "Vary": "Accept-Encoding",
        "x-ms-service-request-id": "0037d953-c395-49a1-8874-e1abdad65e8f,5b90717d-2e13-442c-8988-8f9cdd35505d",
        "Cache-Control": "no-cache",
        "Date": "Tue, 30 May 2023 10:35:21 GMT",
        "Allow": "OPTIONS,GET,HEAD,POST",
        "Content-Type": "application/json; odata.metadata=full",
        "Expires": "-1",
        "Content-Length": "196478"
    },
    "body": {
        "@odata.context": "https://xxx.crm4.dynamics.com/api/data/v9.1/$metadata#accounts",
        "#Microsoft.Dynamics.CRM.DeleteMultiple": {
            "title": "DeleteMultiple",
            "target": "https://xxx.crm4.dynamics.com/api/data/v9.1/accounts/Microsoft.Dynamics.CRM.crmbaseentity/Microsoft.Dynamics.CRM.DeleteMultiple"
        },
        "@Microsoft.Dynamics.CRM.totalrecordcount": -1,
        "@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded": false,
        "@Microsoft.Dynamics.CRM.globalmetadataversion": "75446433",
        "value": [
            {
                "@odata.type": "#Microsoft.Dynamics.CRM.account",
                "@odata.id": "https://xxx.crm4.dynamics.com/api/data/v9.1/accounts(88cea450-cb0c-ea11-a813-000d3a1b1223)",
                "@odata.etag": "W/\"58505166\"",
                "@odata.editLink": "accounts(88cea450-cb0c-ea11-a813-000d3a1b1223)",
                "numberofemployees": 50,
                "description": "Our publically traded company has been in business for 105 years. With more than 90 years’ experience in the textile industry, we are one of the most trusted names in textiles, offering an unmatched level of quality and selection of product lines. Our manufacturing facilities around the world position us to support our customers with all their textile needs.",
                "name": "Fabrikam, Inc.",
                "address1_line1": "6789 Edwards Ave.",
            },
            {
                "@odata.type": "#Microsoft.Dynamics.CRM.account",
                "@odata.id": "https://xxx.crm4.dynamics.com/api/data/v9.1/accounts(a4cea450-cb0c-ea11-a813-000d3a1b1223)",
                "@odata.etag": "W/\"58556252\"",
                "@odata.editLink": "accounts(a4cea450-cb0c-ea11-a813-000d3a1b1223)",
                "numberofemployees": 20,
                "description": "Trey Research is a manufacturer of specialty circuit boards as well as fully assembled devices and is known for quick turnaround and timely delivery of quality products, at a premium price. Trey Research takes pride in looking after its workforce and has invested heavily in a state-of-the-art cafeteria at their production facilities.",
                "name": "Trey Research",
                "address1_line1": "789 3rd St",
            }
        ]
    }
}

Τα δεδομένα του Accounts που μας ενδιαφέρουν βρίσκονται στο array από objects “values” στη γραμμή 22. Κάθε object σε αυτό το array είναι και ένα account.


Σε επόμενα posts θα δούμε πώς μπορούμε να χειριστούμε αυτά τα responses, γιατί το flow μας γεμίζει με περιττά ForEach και πώς μπορούμε να το αποφύγουμε.