cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
AlCado
Frequent Visitor

Uploading offline records issue

Hi,


I need your help to solve an issue concerning if function.
I've created an app which allows an auditor to add compressed air leaks (location, description) of the factory to a collection being offline. Then, when he grab an internet connection, a button permit him to upload those leaks to an Excel database stored on the factory's buisiness drive. There are hundreds of records to upload so the process is quite long but it doesn't matter.
The problem is that if during the upload, the internet connection crashes, all the leaks not uploaded yet are lost !
To avoid this to happen I putted the remove function in an if(Connection.Connected, remove(collection, last record uploaded). But the condition is only checked once when the upload button is actionned so when connection cut off the collect function stops while the remove function keep running.
How, without using a timer, can I force the condition to be checked each time a leak is uploaded ?

 

Here's my upload button code : 

If(Connection.Connected && CountRows(LeaksToBeAdded)>0; 
        ClearCollect(TemporaryCollection; LeaksToBeAdded);;
        ForAll(TemporaryCollection; Collect(DB_LEAKS; First(LeaksToBeAdded));; 
            If(Connection.Connected; Remove(LeaksToBeAdded;; 
                First(LeaksToBeAdded)));; 
        SaveData(LeaksToBeAdded; "NewLeaksInLocalStorage"));;
        Refresh(DB_LEAKS);;
        ClearCollect(LeaksCollection; DB_LEAKS);;
        SaveData(LeaksCollection; "LeaksInLocalStorage");;
        Back(); 
    Connection.Connected && CountRows(LeaksToBeAdded)=0;
        Notify("No leaks to be added"; NotificationType.Error);;
            Back();
        Notify("You are offline, find internet connection to proceed"; 
            NotificationType.Error))

LeaksToBeAdded corresponds to the collection which store the leaks recorded when offline.

DB_LEAKS is the database storing all the leaks in compressed air network, filled by the app.

LeaksCollection is a collection used as a cache for DB_LEAKS database.

 

Attached a flowchart of the upload button OnSelect actions.

1 ACCEPTED SOLUTION

Accepted Solutions

After a long time thinking and experimenting I've finally reached my goal !

By following your advice I realized that I misevaluated the problem: the if condition is well checked for each record, the issue was in the order and the conditions themselves !

Big thanks for your help, your kindness and for the typo in the chart.

And to answer your question, the NumLeak is created in an unvisible and uneditable field which auto increment in the NewLeakForm.

Here is the final solution (I prefered put the collect also in the forall loop to be able to see the progression of the upload):

If(Connection.Connected && CountRows(LeaksToBeAdded)>0;                                                                  
    Notify("Upload has started"; NotificationType.Information);; 
    Refresh(DB_LEAKS);; 
    ClearCollect(LeaksCollection; DB_LEAKS);;
    SaveData(LeaksCollection; "LeaksInLocalStorage");;                                                                   
    ClearCollect(TemporaryCollection; LeaksToBeAdded);; 
    ForAll(TemporaryCollection;                                                                                              
        If(Not(First(LeaksToBeAdded).NumLeak in LeaksCollection.NumLeak);
            Collect(DB_LEAKS; First(LeaksToBeAdded));;                                                                           
            Collect(LeaksCollection; Last(DB_LEAKS));;                                                                           
            SaveData(LeaksCollection; "LeaksInLocalStorage")                                                                 
        );;
        If(First(LeaksToBeAdded).NumLeak in LeaksCollection.NumLeak; 
            Remove(LeaksToBeAdded; First(LeaksToBeAdded));; 
            SaveData(LeaksToBeAdded; "NewLeaksInLocalStorage")
        )
    );; 
    Refresh(DB_LEAKS);; 
    ClearCollect(LeaksCollection; DB_LEAKS);;
    SaveData(LeaksCollection; "LeaksInLocalStorage");;                                                                   
    If(CountRows(LeaksToBeAdded)=0;                                                                                          
        Notify("Upload is over !"; NotificationType.Success);                                                                
        Notify("Upload is not over, find internet connection and relaunch to complete"; 
        NotificationType.Information)   
    );;                                                                                                                  
    Back();                                                                                            
Connection.Connected && CountRows(LeaksToBeAdded)=0; Notify("No leaks to be added"; NotificationType.Error);; Back();
Notify("You are offline, find internet connection to proceed"; NotificationType.Error)
)

 

View solution in original post

6 REPLIES 6
wyotim
Resident Rockstar
Resident Rockstar

I think a decent solution for your situation would be to set the remove condition after you refresh your dataset and check against the refreshed data for what to remove and what to keep. Basically, if you refresh the dataset and the temporary item is in there, remove it. If the temporary item is not in the dataset (either because it wasn't able to be refreshed or something else), don't remove it.


One issue this brings, however, is that if some items are uploaded but the user loses connection (and thus the dataset doesn't refresh) you may end up submitting records twice. So, you would probably need to check before uploading, skipping any duplicates, and then check again after uploading. 

 

As far as the actual code goes, I don't have the time just now to work that out but would be willing to come back to it this weekend if you need some help. 

Thank you for your response,

I tried to apply your proposal (remove after collecting the dataset by comparing the two collection's primary key). However, the problem remains: the remove condition is only checked once at the beginning.

 

Here is my new code

If(
Connection.Connected && CountRows(LeaksToBeAdded)>0; 
        ClearCollect(TemporaryCollection; LeaksToBeAdded);;
        ForAll(TemporaryCollection; 
            Collect(DB_LEAKS; First(LeaksToBeAdded));; 
            Collect(LeaksCollection; First(LeaksToBeAdded));; 
            SaveData(LeaksCollection; "LeaksInLocalStorage");; 
            If(First(LeaksToBeAdded).NumLeak in LeaksCollection.NumLeak; 
                Remove(LeaksToBeAdded; First(LeaksToBeAdded));; 
                SaveData(LeaksToBeAdded; "NewLeaksInLocalStorage")
            )
        );;
        Refresh(DB_LEAKS);;
        Back(); 
Connection.Connected && CountRows(LeaksToBeAdded)=0;
        Notify("No leaks to be added"; NotificationType.Error);;
            Back();
        Notify("You are offline, find internet connection to proceed"; 
            NotificationType.Error)
)

It would be very nice of you to help me find a solution, it's the last unsolved issue of my app before start using it.

You will find attached a docx file to help you understand the origin of names and the purpose of the app if necessary.

So first off, awesome documentation. Just great stuff there. There is a typo on the flow diagram on the Leaks to Upload? step where both options are No, just so you know. Easy to see what is going on there though. 

 

In looking at your code a bit more, what about doing a Collect of the LeaksToBeAdded to the DB_LEAKS data source, refreshing DB_LEAKS, and then running the check/removal portion on the LeaksToBeAdded? This could have the secondary effect of limiting the "exposure" time where a disconnection could happen by getting the submission done first and then handling the check/removal on the device when it won't matter if the device is connected or not. 

 

Something like this (though keep in mind, this is obviously untested so don't use it!):

If(
Connection.Connected && CountRows(LeaksToBeAdded)>0; 
        ClearCollect(TemporaryCollection; LeaksToBeAdded);;
        Collect(DB_LEAKS; LeaksToBeAdded);; 
        Collect(LeaksCollection; LeaksToBeAdded);; 
        SaveData(LeaksCollection; "LeaksInLocalStorage");;
        Refresh(DB_LEAKS);; 
        ForAll(TemporaryCollection,
            If(First(LeaksToBeAdded).NumLeak in LeaksCollection.NumLeak; 
                Remove(LeaksToBeAdded; First(LeaksToBeAdded));; 
                SaveData(LeaksToBeAdded; "NewLeaksInLocalStorage")
            )
        );;
        Back(); 
Connection.Connected && CountRows(LeaksToBeAdded)=0;
        Notify("No leaks to be added"; NotificationType.Error);;
            Back();
        Notify("You are offline, find internet connection to proceed"; 
            NotificationType.Error)
)

This also helps to isolate the check/removal section as that seems to be the issue. To help debug it, you could comment that section out and make a temporary button with that code then testing and refining the code until you reach the desired result. 

 

As it stands, I am not seeing the issue directly. I made a simple test app to try out the remove code and it worked as expected, but again I had the collecting and removal as separate functions similar to what I put above but with two buttons instead. Maybe try separating them out and see what you get? I will think on this a bit more and see if anything comes to mind as well. And maybe someone else will comment with a great answer too. 

Another thought I had on this: where is NumLeak created? I assume that is your primary key, yes? Is it possible that the collections in the check/remove section don't have that? And further, is it possible to use another field (or group of fields) to identify each record to achieve the same goal? That could be the whole issue.

After a long time thinking and experimenting I've finally reached my goal !

By following your advice I realized that I misevaluated the problem: the if condition is well checked for each record, the issue was in the order and the conditions themselves !

Big thanks for your help, your kindness and for the typo in the chart.

And to answer your question, the NumLeak is created in an unvisible and uneditable field which auto increment in the NewLeakForm.

Here is the final solution (I prefered put the collect also in the forall loop to be able to see the progression of the upload):

If(Connection.Connected && CountRows(LeaksToBeAdded)>0;                                                                  
    Notify("Upload has started"; NotificationType.Information);; 
    Refresh(DB_LEAKS);; 
    ClearCollect(LeaksCollection; DB_LEAKS);;
    SaveData(LeaksCollection; "LeaksInLocalStorage");;                                                                   
    ClearCollect(TemporaryCollection; LeaksToBeAdded);; 
    ForAll(TemporaryCollection;                                                                                              
        If(Not(First(LeaksToBeAdded).NumLeak in LeaksCollection.NumLeak);
            Collect(DB_LEAKS; First(LeaksToBeAdded));;                                                                           
            Collect(LeaksCollection; Last(DB_LEAKS));;                                                                           
            SaveData(LeaksCollection; "LeaksInLocalStorage")                                                                 
        );;
        If(First(LeaksToBeAdded).NumLeak in LeaksCollection.NumLeak; 
            Remove(LeaksToBeAdded; First(LeaksToBeAdded));; 
            SaveData(LeaksToBeAdded; "NewLeaksInLocalStorage")
        )
    );; 
    Refresh(DB_LEAKS);; 
    ClearCollect(LeaksCollection; DB_LEAKS);;
    SaveData(LeaksCollection; "LeaksInLocalStorage");;                                                                   
    If(CountRows(LeaksToBeAdded)=0;                                                                                          
        Notify("Upload is over !"; NotificationType.Success);                                                                
        Notify("Upload is not over, find internet connection and relaunch to complete"; 
        NotificationType.Information)   
    );;                                                                                                                  
    Back();                                                                                            
Connection.Connected && CountRows(LeaksToBeAdded)=0; Notify("No leaks to be added"; NotificationType.Error);; Back();
Notify("You are offline, find internet connection to proceed"; NotificationType.Error)
)

 

Happy to hear you got it worked out! Looks like a great solution too.

Helpful resources

Announcements

Community will be READ ONLY July 16th, 5p PDT -July 22nd

Dear Community Members,   We'd like to let you know of an upcoming change to the community platform: starting July 16th, the platform will transition to a READ ONLY mode until July 22nd.   During this period, members will not be able to Kudo, Comment, or Reply to any posts.   On July 22nd, please be on the lookout for a message sent to the email address registered on your community profile. This email is crucial as it will contain your unique code and link to register for the new platform encompassing all of the communities.   What to Expect in the New Community: A more unified experience where all products, including Power Apps, Power Automate, Copilot Studio, and Power Pages, will be accessible from one community.Community Blogs that you can syndicate and link to for automatic updates. We appreciate your understanding and cooperation during this transition. Stay tuned for the exciting new features and a seamless community experience ahead!

Summer of Solutions | Week 4 Results | Winners will be posted on July 24th

We are excited to announce the Summer of Solutions Challenge!   This challenge is kicking off on Monday, June 17th and will run for (4) weeks.  The challenge is open to all Power Platform (Power Apps, Power Automate, Copilot Studio & Power Pages) community members. We invite you to participate in a quest to provide solutions in the Forums to as many questions as you can. Answers can be provided in all the communities.    Entry Period: This Challenge will consist of four weekly Entry Periods as follows (each an “Entry Period”)   - 12:00 a.m. PT on June 17, 2024 – 11:59 p.m. PT on June 23, 2024 - 12:00 a.m. PT on June 24, 2024 – 11:59 p.m. PT on June 30, 2024 - 12:00 a.m. PT on July 1, 2024 – 11:59 p.m. PT on July 7, 2024 - 12:00 a.m. PT on July 8, 2024 – 11:59 p.m. PT on July 14, 2024   Entries will be eligible for the Entry Period in which they are received and will not carryover to subsequent weekly entry periods.  You must enter into each weekly Entry Period separately.   How to Enter: We invite you to participate in a quest to provide "Accepted Solutions" to as many questions as you can. Answers can be provided in all the communities. Users must provide a solution which can be an “Accepted Solution” in the Forums in all of the communities and there are no limits to the number of “Accepted Solutions” that a member can provide for entries in this challenge, but each entry must be substantially unique and different.    Winner Selection and Prizes: At the end of each week, we will list the top ten (10) Community users which will consist of: 5 Community Members & 5 Super Users and they will advance to the final drawing. We will post each week in the News & Announcements the top 10 Solution providers.  At the end of the challenge, we will add all of the top 10 weekly names and enter them into a random drawing.  Then we will randomly select ten (10) winners (5 Community Members & 5 Super Users) from among all eligible entrants received across all weekly Entry Periods to receive the prize listed below. If a winner declines, we will draw again at random for the next winner.  A user will only be able to win once overall. If they are drawn multiple times, another user will be drawn at random.  Individuals will be contacted before the announcement with the opportunity to claim or deny the prize.  Once all of the winners have been notified, we will post in the News & Announcements of each community with the list of winners.   Each winner will receive one (1) Pass to the Power Platform Conference in Las Vegas, Sep. 18-20, 2024 ($1800 value). NOTE: Prize is for conference attendance only and any other costs such as airfare, lodging, transportation, and food are the sole responsibility of the winner. Tickets are not transferable to any other party or to next year’s event.   ** PLEASE SEE THE ATTACHED RULES for this CHALLENGE**   Week 1 Results: Congratulations to the Week 1 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Community MembersNumber of SolutionsSuper UsersNumber of Solutions @anandm08  23 @WarrenBelz  31 @DBO_DV  10 @Amik  19 AmínAA 6 @mmbr1606  12 @rzuber  4 @happyume  7 @Giraldoj  3@ANB 6 (tie)   @SpongYe  6 (tie)     Week 2 Results: Congratulations to the Week 2 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Community MembersSolutionsSuper UsersSolutions @anandm08  10@WarrenBelz 25 @DBO_DV  6@mmbr1606 14 @AmínAA 4 @Amik  12 @royg  3 @ANB  10 @AllanDeCastro  2 @SunilPashikanti  5 @Michaelfp  2 @FLMike  5 @eduardo_izzo  2   Meekou 2   @rzuber  2   @Velegandla  2     @PowerPlatform-P  2   @Micaiah  2     Week 3 Results: Congratulations to the Week 3 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge.   Week 3:Community MembersSolutionsSuper UsersSolutionsPower Apps anandm0861WarrenBelz86DBO_DV25Amik66Michaelfp13mmbr160647Giraldoj13FLMike31AmínAA13SpongYe27     Week 4 Results: Congratulations to the Week 4 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge.   Week 4:Community MembersSolutionsSuper UsersSolutionsPower Apps DBO-DV21WarranBelz26Giraldoj7mmbr160618Muzammmil_0695067Amik14samfawzi_acml6FLMike12tzuber6ANB8   SunilPashikanti8

Check Out | 2024 Release Wave 2 Plans for Microsoft Dynamics 365 and Microsoft Power Platform

On July 16, 2024, we published the 2024 release wave 2 plans for Microsoft Dynamics 365 and Microsoft Power Platform. These plans are a compilation of the new capabilities planned to be released between October 2024 to March 2025. This release introduces a wealth of new features designed to enhance customer understanding and improve overall user experience, showcasing our dedication to driving digital transformation for our customers and partners.    The upcoming wave is centered around utilizing advanced AI and Microsoft Copilot technologies to enhance user productivity and streamline operations across diverse business applications. These enhancements include intelligent automation, AI-powered insights, and immersive user experiences that are designed to break down barriers between data, insights, and individuals. Watch a summary of the release highlights.    Discover the latest features that empower organizations to operate more efficiently and adaptively. From AI-driven sales insights and customer service enhancements to predictive analytics in supply chain management and autonomous financial processes, the new capabilities enable businesses to proactively address challenges and capitalize on opportunities.    

Updates to Transitions in the Power Platform Communities

We're embarking on a journey to enhance your experience by transitioning to a new community platform. Our team has been diligently working to create a fresh community site, leveraging the very Dynamics 365 and Power Platform tools our community advocates for.  We started this journey with transitioning Copilot Studio forums and blogs in June. The move marks the beginning of a new chapter, and we're eager for you to be a part of it. The rest of the Power Platform product sites will be moving over this summer.   Stay tuned for more updates as we get closer to the launch. We can't wait to welcome you to our new community space, designed with you in mind. Let's connect, learn, and grow together.   Here's to new beginnings and endless possibilities!   If you have any questions, observations or concerns throughout this process please go to https://aka.ms/PPCommSupport.   To stay up to date on the latest details of this migration and other important Community updates subscribe to our News and Announcements forums: Copilot Studio, Power Apps, Power Automate, Power Pages

Users online (723)