Συνάρτηση Patch

Ισχύει σε: Εφαρμογές καμβά Εφαρμογές βάσει μοντέλου Power Platform CLI Ροές επιφάνειας εργασίας

Τροποποιεί ή δημιουργεί μία ή περισσότερες καρτέλες σε μια προέλευση δεδομένων ή συγχωνεύει καρτέλες εκτός μιας προέλευσης δεδομένων.

Χρησιμοποιήστε τη συνάρτηση Patch για να τροποποιήσετε εγγραφές σε σύνθετες καταστάσεις, όπως όταν κάνετε ενημερώσεις που δεν απαιτούν αλληλεπίδραση του χρήστη ή όταν χρησιμοποιείτε φόρμες που εκτείνονται σε πολλές οθόνες.

Για να ενημερώσετε τις καρτέλες σε μια προέλευση δεδομένων ευκολότερα για απλές αλλαγές, χρησιμοποιήστε το στοιχείο ελέγχου Edit form αντί για αυτό. Όταν προσθέτετε ένα στοιχείο ελέγχου Edit form, παρέχετε στους χρήστες μια φόρμα για συμπλήρωση και, στη συνέχεια, αποθηκεύετε τις αλλαγές σε μια προέλευση δεδομένων. Για περισσότερες πληροφορίες, ανατρέξτε στο θέμα Κατανόηση φορμών δεδομένων.

Παρακολουθήστε αυτό το βίντεο για να μάθετε πώς να χρησιμοποιείτε τη συνάρτηση Patch:

Επισκόπηση

Χρησιμοποιήστε τη συνάρτηση Patch για να τροποποιήσετε μία ή περισσότερες καρτέλες μιας προέλευσης δεδομένων. Τροποποιούνται οι τιμές συγκεκριμένων πεδίων χωρίς να επηρεάζονται άλλες ιδιότητες. Για παράδειγμα, αυτός ο τύπος αλλάζει τον αριθμό τηλεφώνου για έναν πελάτη που ονομάζεται Contoso:

Patch( Customers, First( Filter( Customers, Name = "Contoso" ) ), { Phone: "1-212-555-1234" } )

Χρησιμοποιήστε τη συνάρτηση Patch μαζί με τη συνάρτηση Defaults για να δημιουργήσετε καρτέλες. Χρησιμοποιήστε αυτή τη συμπεριφορά για να δημιουργήσετε μία μόνο οθόνη τόσο για τη δημιουργία όσο και για την επεξεργασία καρτελών. Για παράδειγμα, αυτός ο τύπος δημιουργεί μια καρτέλα για έναν πελάτη που ονομάζεται Contoso:

Patch( Customers, Defaults( Customers ), { Name: "Contoso" } )

Ακόμη και αν δεν εργάζεστε με μια προέλευση δεδομένων, μπορείτε να χρησιμοποιήσετε τη συνάρτηση Patch για να συγχωνεύσετε δύο ή περισσότερες καρτέλες. Για παράδειγμα, αυτός ο τύπος συγχωνεύει δύο καρτέλες σε μία που προσδιορίζει τόσο τον αριθμό τηλεφώνου όσο και την τοποθεσία για την Contoso:

Patch( { Name: "Contoso", Phone: "1-212-555-1234" }, { Name: "Contoso", Location: "Midtown" } )

Περιγραφή

Τροποποίηση ή δημιουργία καρτέλας σε μια προέλευση δεδομένων

Για να χρησιμοποιήσετε αυτή τη συνάρτηση με μια προέλευση δεδομένων, καθορίστε την προέλευση δεδομένων και, στη συνέχεια, καθορίστε μια καρτέλα βάσης:

  • Για να τροποποιήσετε μια καρτέλα, η καρτέλα βάσης πρέπει έχει προέλθει από μια προέλευση δεδομένων. Η καρτέλα βάσης μπορεί να έχει προέλθει από την ιδιότητα Items μιας συλλογής, να έχει τοποθετηθεί σε μια μεταβλητή περιβάλλοντος ή να προέρχεται από κάποια άλλη διαδρομή. Ωστόσο, μπορείτε να εντοπίσετε την καρτέλα βάσης στην προέλευση δεδομένων. Αυτό είναι σημαντικό, καθώς η καρτέλα θα περιλαμβάνει πρόσθετες πληροφορίες για να σας βοηθήσουν να βρείτε ξανά την καρτέλα για τροποποίηση.
  • Για να δημιουργήσετε μια καρτέλα, χρησιμοποιήστε τη συνάρτηση Defaults για να δημιουργήσετε μια καρτέλα βάσης με τις προεπιλεγμένες τιμές.

Στη συνέχεια, καθορίστε μία ή περισσότερες καρτέλες αλλαγής, κάθε μία από τις οποίες περιέχει νέες τιμές ιδιοτήτων που αντικαθιστούν τις τιμές ιδιοτήτων της καρτέλας βάσης. Η επεξεργασία των καρτελών αλλαγής γίνεται με τη σειρά από την αρχή μέχρι το τέλος της λίστας ορισμάτων και οι πιο πρόσφατες τιμές ιδιοτήτων αντικαθιστούν τις παλαιότερες.

Η τιμή επιστροφής της συνάρτησης Patch είναι η καρτέλα που τροποποιήσατε ή δημιουργήσατε. Εάν δημιουργήσατε μια καρτέλα, η τιμή επιστροφής μπορεί να περιλαμβάνει ιδιότητες που δημιούργησε αυτόματα η προέλευση δεδομένων. Ωστόσο, η τιμή επιστροφής δεν παρέχει μια τιμή για πεδία ενός σχετικού πίνακα.

Για παράδειγμα, χρησιμοποιείτε το Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); και, στη συνέχεια, το MyAccount.'Primary Contact'.'Full Name'. Σε αυτήν την περίπτωση, δεν μπορείτε να αποδώσετε ένα πλήρες όνομα. Αντ' αυτού, για να αποκτήσετε πρόσβαση στα πεδία ενός σχετιζόμενου πίνακα, χρησιμοποιήστε μια ξεχωριστή αναζήτηση, όπως:

LookUp(Accounts, Account = MyAccount.Account).'Primary Contact'.'Full Name'

Όταν ενημερώνετε μια προέλευση δεδομένων, ενδέχεται να προκύψουν ένα ή περισσότερα προβλήματα. Χρησιμοποιήστε το IfError και το IsError με την τιμή επιστροφής από το Patch για να εντοπίσετε και να αποκριθείτε σε σφάλματα, όπως περιγράφει ο Χειρισμός σφαλμάτων. Μπορείτε επίσης να χρησιμοποιήσετε τη συνάρτηση Errors για να εντοπίσετε και να εξετάσετε προβλήματα, όπως περιγράφεται στο θέμα Εργασία με προελεύσεις δεδομένων.

Οι σχετικές συναρτήσεις περιλαμβάνουν τη συνάρτηση Update, για να αντικαταστήσετε μια ολόκληρη καρτέλα, και τη συνάρτηση Collect, για να δημιουργήσετε μια καρτέλα. Χρησιμοποιήσετε τη συνάρτηση UpdateIf για να τροποποιήσετε συγκεκριμένες ιδιότητες πολλών καρτελών με βάση μια συνθήκη.

Τροποποίηση ή δημιουργία ενός συνόλου καρτελών σε μια προέλευση δεδομένων

Η συνάρτηση Patch μπορεί επίσης να χρησιμοποιηθεί για τη δημιουργία ή τροποποίηση πολλών καρτελών με μία μόνο κλήση.

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

Όταν χρησιμοποιείτε τη συνάρτηση Patch με αυτόν τον τρόπο, η τιμή που επιστρέφεται είναι επίσης ένας πίνακας όπου κάθε καρτέλα αντιστοιχεί μίας προς μία με τις καρτέλες βάσης και αλλαγής.

Συγχώνευση καρτελών εκτός μιας προέλευσης δεδομένων

Καθορίστε δύο ή περισσότερες καρτέλες που θέλετε να συγχωνεύσετε. Η επεξεργασία των καρτελών γίνεται με τη σειρά από την αρχή μέχρι το τέλος της λίστας ορισμάτων και οι πιο πρόσφατες τιμές ιδιοτήτων αντικαθιστούν τις παλαιότερες.

Η συνάρτηση Patch επιστρέφει τη συγχωνευμένη καρτέλα και δεν τροποποιεί τα ορίσματά της ή καρτέλες σε οποιαδήποτε προέλευση δεδομένων.

Σύνταξη

Τροποποίηση ή δημιουργία καρτέλας σε μια προέλευση δεδομένων

Patch( DataSource, BaseRecord, ChangeRecord1 [, ChangeRecord2, … ])

  • DataSource – Υποχρεωτικό. Η προέλευση δεδομένων που περιέχει την καρτέλα που θέλετε να τροποποιήσετε ή που θα περιέχει την καρτέλα που θέλετε να δημιουργήσετε.
  • BaseRecord – Υποχρεωτικό. Η καρτέλα για τροποποίηση ή δημιουργία. Εάν η καρτέλα προήλθε από μια προέλευση δεδομένων, η καρτέλα εντοπίζεται και τροποποιείται. Εάν χρησιμοποιείται το αποτέλεσμα της συνάρτησης Defaults, δημιουργείται μια καρτέλα.
  • ChangeRecord(s) – Υποχρεωτικό. Μία ή περισσότερες καρτέλες που περιέχουν ιδιότητες για τροποποίηση στο BaseRecord. Η επεξεργασία των καρτελών αλλαγής γίνεται με τη σειρά από την αρχή μέχρι το τέλος της λίστας ορισμάτων και οι πιο πρόσφατες τιμές ιδιοτήτων αντικαθιστούν τις παλαιότερες.

Τροποποίηση ή δημιουργία ενός συνόλου καρτελών σε μια προέλευση δεδομένων

Patch( DataSource, BaseRecordsTable, ChangeRecordTable1 [, ChangeRecordTable2, … ] )

  • DataSource – Υποχρεωτικό. Η προέλευση δεδομένων που περιέχει τις καρτέλες που θέλετε να τροποποιήσετε ή που θα περιέχει τις καρτέλες που θέλετε να δημιουργήσετε.
  • BaseRecordTable – Υποχρεωτικό. Ένας πίνακας καρτελών για τροποποίηση ή δημιουργία. Εάν η καρτέλα προήλθε από μια προέλευση δεδομένων, η καρτέλα εντοπίζεται και τροποποιείται. Εάν χρησιμοποιείται το αποτέλεσμα της συνάρτησης Defaults, δημιουργείται μια καρτέλα.
  • ChangeRecordTable(s) – Υποχρεωτικό. Ένας ή περισσότεροι πίνακες καρτελών που περιέχουν ιδιότητες για τροποποίηση για κάθε καρτέλα από το BaseRecordTable. Η επεξεργασία των καρτελών αλλαγής γίνεται με τη σειρά από την αρχή μέχρι το τέλος της λίστας ορισμάτων και οι πιο πρόσφατες τιμές ιδιοτήτων αντικαθιστούν τις παλαιότερες.

Συγχώνευση καρτελών

Patch( Record1, Record2 [, …] )

  • Record(s) - Υποχρεωτικό. Τουλάχιστον δύο καρτέλες που θέλετε να συγχωνεύσετε. Η επεξεργασία των καρτελών γίνεται με τη σειρά από την αρχή μέχρι το τέλος της λίστας ορισμάτων και οι πιο πρόσφατες τιμές ιδιοτήτων αντικαθιστούν τις παλαιότερες.

Παραδείγματα

Τροποποίηση ή δημιουργία καρτέλας (σε μια προέλευση δεδομένων)

Σε αυτά τα παραδείγματα, θα τροποποιήσετε ή θα δημιουργήσετε μια καρτέλα σε μια προέλευση δεδομένων, με το όνομα IceCream, που περιέχει τα δεδομένα σε αυτόν τον πίνακα και δημιουργεί αυτόματα τομές στη στήληΑναγνωριστικό:

Παράδειγμα παγωτού.

Τύπος Description Result
Patch( IceCream,
LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } )
Τροποποιεί μια καρτέλα στην προέλευση δεδομένων IceCream:
  • Η στήλη ID της καρτέλας για τροποποίηση περιέχει την τιμή 1. (Η καρτέλα Chocolate έχει αυτό το αναγνωριστικό.)
  • Η τιμή στη στήλη Quantity αλλάζει σε 400.
{ ID: 1, Flavor: "Chocolate", Quantity: 400 }

Η καταχώρηση Chocolate στην προέλευση δεδομένων IceCream έχει τροποποιηθεί.
Patch( IceCream, Defaults( IceCream ), { Flavor: "Strawberry" } ) Δημιουργεί μια καρτέλα στην προέλευση δεδομένων IceCream:
  • Η στήλη ID περιέχει την τιμή 3, την οποία δημιουργεί αυτόματα η προέλευση δεδομένων.
  • Η στήλη Quantity περιέχει την τιμή 0, που είναι η προεπιλεγμένη τιμή για αυτή τη στήλη στην προέλευση δεδομένων IceCream, όπως καθορίζεται από τη συνάρτηση Defaults.
  • Η στήλη Flavor περιέχει την τιμή Strawberry.
{ ID: 3, Flavor: "Strawberry", Quantity: 0 }

Η καταχώρηση Strawberry στην προέλευση δεδομένων IceCream έχει δημιουργηθεί.

Μετά την αξιολόγηση των προηγούμενων τύπων, η προέλευση δεδομένων τελειώνει με αυτές τις τιμές:

Παράδειγμα παγωτού μετά.

Συγχώνευση καρτελών (εκτός μιας προέλευσης δεδομένων)

Τύπος Περιγραφή Αποτέλεσμα
Patch( { Name: "James", Score: 90 }, { Name: "Jim", Passed: true } ) Συγχωνεύει δύο καρτέλες εκτός μιας προέλευσης δεδομένων:
  • Οι τιμές στη στήλη Name κάθε καρτέλας δεν συμφωνούν. Το αποτέλεσμα περιέχει την τιμή (Jim) της καρτέλας που βρίσκεται πιο κοντά στο τέλος της λίστας ορισμάτων αντί για την τιμή (James) της καρτέλας που βρίσκεται πιο κοντά στην αρχή.
  • Η πρώτη καρτέλα περιέχει μια στήλη (Score) που δεν υπάρχει στη δεύτερη καρτέλα. Το αποτέλεσμα περιέχει αυτή τη στήλη με την τιμή (90).
  • Η δεύτερη καρτέλα περιέχει μια στήλη (Passed) που δεν υπάρχει στην πρώτη καρτέλα. Το αποτέλεσμα περιέχει αυτή τη στήλη με την τιμή (true).
{ Name: "Jim", Score: 90, Passed: true }

Χρήση του As ή του ThisRecord

Η χρήση λέξης-κλειδιού As ή ThisRecord στον τύπο αποφεύγει το διφορούμενο περιβάλλον αξιολόγησης.

Στο παρακάτω παράδειγμα, λάβετε υπόψη σας την πρώτη αναζήτηση στη δήλωση If. Το (OrderID = A[@OrderID]) αναμένεται να συγκρίνει το OrderId στο πεδίο αναζήτησης με το OrderId της συλλογής A στο πεδίο ForAll. Σε αυτήν την περίπτωση, είναι πιθανό να θέλετε το A[@OrderId] να επιλυθείτε ως τοπική παράμετρος. Αλλά είναι διφορούμενο.

Το Power Apps αυτήν τη στιγμή το μεταφράζει και το αριστερό OrderId και το δεξί A[@OrderId] ως ένα πεδίο στο πεδίο αναζήτησης. Ως εκ τούτου, η αναζήτηση θα βρει πάντα την πρώτη γραμμή στο [dbo].[Orders1] επειδή η συνθήκη είναι πάντα αληθής (δηλαδή, κάθε γραμμή OrderId ισούται με την ίδια.)

ClearCollect(
    A,
    Filter(
        '[dbo].[Orders1]',
        OrderId = 8888888
    )
);
ForAll(
    A,
    If(
        LookUp(
            '[dbo].[Orders1]',
            OrderId = A[@OrderId],
            "OK"
        ) = "OK",
        Patch(
            '[dbo].[Orders1]',
            LookUp(
                '[dbo].[Orders1]',
                OrderId = A[@OrderId]
            ),
            {
      OrderName: "val1"
       }
   ),
   Patch(
            '[dbo].[Orders1]',
            Defaults('[dbo].[Orders1]'),
            {
      OrderName: "val2"
       }
   )
    )
)

Χρήση του As ή του ThisRecord

Όποτε είναι δυνατό, χρησιμοποιήστε τον τελεστή As ως ThisRecord για να αποσαφηνίσετε την αριστερή πλευρά. Το As συνιστάται για το παραπάνω σενάριο.

Όταν ο τύπος χρησιμοποιεί πολλαπλά πεδία με ForAll, Filter και Lookup στον ίδιο προέλευση δεδομένων ή πίνακα, είναι πιθανό οι παράμετροι εύρους να συγκρουστούν με ένα ίδιο πεδίο σε άλλο σημείο. Ως εκ τούτου, συνιστάται να χρησιμοποιήσετε τον τελεστή As ή ThisRecord για να επιλύσετε το όνομα του πεδίου και να αποφύγετε την ασάφεια.

Για παράδειγμα, μπορείτε να χρησιμοποιήσετε τον τελεστή As για να αποσαφηνίσετε στο παρακάτω παράδειγμα.

ClearCollect(
    A,
    Filter(
        '[dbo].[Orders1]',
        OrderId = 8888888
    )
);
ForAll(
    A,
    If(
        LookUp(
            '[dbo].[Orders1]' As B,
            B.OrderId = A[@OrderId],
            "OK"
        ) = "OK",
        Patch(
            '[dbo].[Orders1]',
            LookUp(
                '[dbo].[Orders1]' As C,
                C.OrderId = A[@OrderId]
            ),
            {
      OrderName: "val1"
       }
   ),
   Patch(
            '[dbo].[Orders1]',
            Defaults('[dbo].[Orders1]'),
            {
      OrderName: "val2"
       }
   )
    )
)

Εναλλακτικά, μπορείτε να χρησιμοποιήσετε το ThisRecord για τον ίδιο σκοπό.

ClearCollect(
    A,
    Filter(
        '[dbo].[Orders1]',
        OrderId = 8888888
    )
);
ForAll(
    A,
    If(
        LookUp(
            '[dbo].[Orders1]',
            ThisRecord.OrderId = A[@OrderId],
            "OK"
        ) = "OK",
        Patch(
            '[dbo].[Orders1]',
            LookUp(
                '[dbo].[Orders1]',
                ThisRecord.OrderId = A[@OrderId]
            ),
            {
      OrderName: "val1"
       }
   ),
   Patch(
            '[dbo].[Orders1]',
            Defaults('[dbo].[Orders1]'),
            {
      OrderName: "val2"
       }
   )
    )
)

Για να μάθετε περισσότερα σχετικά με τη χρήση του τελεστή As και του ThisRecord δείτε το άρθρο Τελεστές.