web
You’re offline. This is a read only version of the page.
close
Skip to main content

Announcements

News and Announcements icon
Community site session details

Community site session details

Session Id :
Power Platform Community / Forums / Power Apps / Record Write Fail not ...
Power Apps
Answered

Record Write Fail not returning error

(0) ShareShare
ReportReport
Posted on by 1,146

Thank you for taking the time to read my question... a bit of a long one. Sorry.

 

I have the following code on a button. The idea of this simple app is to get a new unique code (a code generating app). The app is in TEAMS and the table is in Dataverse for TEAMS.

 

It works great if one person is using the app, but if two people click the button at approximately the same time, one person updates the "empty" record, the other doesn't, they both get notified that they secured the new code and two new exact same "empty" records are created in the table.

 

Empty: No UserID, CreatedDate, ProdDescription and Facility = Facility

 

My Table:

iwonder_0-1619098819218.png

 

I was testing with another person and we clicked the button at about the same time. The green box shows the record that the app told us we both secured. We then created a new "empty" record. The new record is supposed to be unique based on FirstLetter, SecondLetter and CodeNumber.

 

I tried to add a LookUp to see if, after updating the record, the users().Email was the one written to the record based on tID, but no matter what I do, all code after it is red underlined... I also tried using the IsEmpty(Errors) but also get red underlines... I really don't know why.

 

The IsEmpty(Errors) at the bottom of the code also does not seem to catch any errors when the app tries to write to the table even though it's not successful.

 

We've been able to replicate this several times.

 

Any suggestions or ideas would be great!

 

My Code OnSelect:

//Get the open record
ClearCollect(
 LastCode,
 Filter(
 CodeLists,
 Facility = "Facility"
 )
);
ClearCollect(
 UseCode,
 First(LastCode)
);
Set(
 varFacility,
 tiBrillPlant.Text
);
Set(
 varDesc,
 tiItemDesc.Text
);
Set(NewCode,"");
//Get the Record ID of the open record
Set(
 FirstUseCode,
 First(UseCode).tID
);
//Update the last known open record based on tID
//If the UserID is blank where tID = FirstUseCode then update it with the info provided by the user
If(
 IsBlank(
 LookUp(
 CodeLists,
 tID = FirstUseCode
 ).UserID
 ),
 UpdateIf(
 CodeLists,
 tID = FirstUseCode,
 {
 UserID: User().Email,
 CreatedDate: Now(),
 ProdDescription: tiItemDesc.Text,
 Facility: tiBrillPlant.Text
 }
 );
	
	
 ClearCollect(
 MakeCode,
 Last(
 Sort(
 CodeLists,
 tID,
 Ascending
 )
 )
 );
 If(
 First(MakeCode).Facility <> "Facility",
 Set(
 NewCodeNumber,
 If(
 Last(MakeCode).CodeNumber = 999999,
 1,
 Last(MakeCode).CodeNumber + 1
 )
 );
 Set(
 NewSecondLetter,
 If(
 And(
 NewCodeNumber = 1,
 Last(MakeCode).SecondLetter = 90
 ),
 65,
 If(
 NewCodeNumber = 1,
 Last(MakeCode).SecondLetter + 1,
 Last(MakeCode).SecondLetter
 )
 )
 );
 Set(
 NewFirstLetter,
 If(
 And(
 NewCodeNumber = 1,
 NewSecondLetter = 65
 ),
 Last(MakeCode).FirstLetter + 1,
 Last(MakeCode).FirstLetter
 )
 );
 If(
 NewFirstLetter > 90,
 Notify("There are no new codes available. The last code has been used."),
 If(
 IsEmpty(
 Errors(
 Collect(
 CodeLists,
 {
 Facility: "Facility",
 FirstLetter: NewFirstLetter,
 SecondLetter: NewSecondLetter,
 CodeNumber: NewCodeNumber
 }
 )
 )
 ),
 Set(
 NewCode,
 Concatenate(
 Char(Last(UseCode).FirstLetter),
 Char(Last(UseCode).SecondLetter),
 Concatenate(
 Left(
 "000000",
 6 - Len(Text(Last(UseCode).CodeNumber))
 ),
 Text(Last(UseCode).CodeNumber)
 )
 )
 );
 Notify(
 Concatenate(
 Text(NewCode),
 " is now in use."
 ),
 NotificationType.Success
 );
 If(
 chkSendEmail.Value,
 Office365Outlook.SendEmailV2(
 User().Email,
 tiBrillPlant.Text & " | " & tiItemDesc.Text & " | " & Text(NewCode),
 htEmail.HtmlText,
 {
 From: User().Email,
 Importance: "Normal",
 IsHtml: true
 }
 )
 ),
 Notify(
 Concatenate(
 "Unable to mark ",
 Text(NewCode),
 " as in use."
 ),
 NotificationType.Error
 )
 )
 )
 );
 //If(
 //IsEmpty(Errors(CodeLists)),
 //UpdateContext({resettext: !resettext})
 //);
 //If(
 //IsEmpty(Errors(CodeLists)),
 //UpdateContext({resettext: !resettext})
 //);
 ,
 Notify(
 Text(NewCode) & " has been saved by " & LookUp(
 CodeLists,
 tID = FirstUseCode
 ).UserID,
 NotificationType.Error
 )
)

 

Categories:
I have the same question (0)
  • Verified answer
    RandyHayes Profile Picture
    76,299 Super User 2024 Season 1 on at

    @iwonder 

    First, I would highly recommend that you simplify your formula and get rid of all of the variables and collections.  None of that is needed in the formula you have.

     

    Beyond that, you need to realize that PowerApps is not real-time.  Each app session gets a snapshot of data at the time the data is requested.  It will not change after that without a refresh (or after some time as recently discovered). 

    So the fact that one person changes a record at the same time as another and then you do a lookup is not relevant because the data to your app is still the same as it was.  PowerApps will not consistently refresh its data.

    It just wasn't built as a real time app.

     

    To compound things, you are creating collections and collections and variables which are all just more static snapshots of your information.  Those too will never change unless you constantly reevaluate them in your app.

     

    I hope this is helpful for you.

  • iwonder Profile Picture
    1,146 on at

    Hi @RandyHayes 

     

    That is VERY helpuful... as always.

     

    Thank you very much.

     

     

  • iwonder Profile Picture
    1,146 on at

    Hi @RandyHayes 

     

    I played with the code a bit and I'm able to stop creating two "empty" records in my table, and also only notify the user if they actually were successful in acquiring the new code.

     

    I tried to simplify it but I suspect you see a lot more opportunity 🙂

     

    Because PowerApps is NOT real time, is this something I should give up on, no matter what we try? If so, we'll turn in another direction.

     

    Thanks again for your replies and guidance.

     

    //Get open record
    ClearCollect(
     LastCode,
     First(
     Filter(
     CodeLists,
     Facility = "Facility"
     )
     )
    );
    //Clear Variable
    Set(
     NewCode,
     ""
    );
    //Set Variables
    Set(
     varFacility,
     Upper(tiBrillPlant.Text)
    );
    Set(
     varDesc,
     tiItemDesc.Text
    );
    //Get tID of new code
    If(
     IsBlank(
     LookUp(
     CodeLists,
     tID = First(LastCode).tID
     ).UserID
     ),
     //Update the 'empty' record with user details
     UpdateIf(
     CodeLists,
     tID = First(LastCode).tID,
     {
     UserID: User().Email,
     CreatedDate: Now(),
     ProdDescription: tiItemDesc.Text,
     Facility: tiBrillPlant.Text
     }
     );
     //determine if the record the user tried to get has their email address on it, showing the action was successful
     If(
     LookUp(
     CodeLists,
     tID = First(LastCode).tID
     ).UserID = User().Email,
     //Action successful, create a new code
     ClearCollect(
     MakeCode,
     Last(
     Sort(
     CodeLists,
     tID,
     Ascending
     )
     )
     );
     //Make sure the last record is not already an 'empty' record
     If(
     First(MakeCode).Facility <> "Facility",
     //Set the values of the new code number, second letter and first letter
     //displayed as SecondLetterFirstLetterNewCodeNumber
     //AA000001 all the way up to ZZ999999
     //A = Char(65), Z = Char(90)
     Set(
     NewCodeNumber,
     If(
     First(MakeCode).CodeNumber = 999999,
     1,
     First(MakeCode).CodeNumber + 1
     )
     );
     Set(
     NewSecondLetter,
     If(
     And(
     NewCodeNumber = 1,
     First(MakeCode).SecondLetter = 90
     ),
     65,
     If(
     NewCodeNumber = 1,
     First(MakeCode).SecondLetter + 1,
     First(MakeCode).SecondLetter
     )
     )
     );
     Set(
     NewFirstLetter,
     If(
     And(
     NewCodeNumber = 1,
     NewSecondLetter = 65
     ),
     First(MakeCode).FirstLetter + 1,
     First(MakeCode).FirstLetter
     )
     );
     If(
     NewFirstLetter > 90,
     Notify("There are no new codes available. The last code has been used."),
     //Create new 'empty' record
     If(
     IsEmpty(
     Errors(
     Collect(
     CodeLists,
     {
     Facility: "Facility",
     FirstLetter: NewFirstLetter,
     SecondLetter: NewSecondLetter,
     CodeNumber: NewCodeNumber
     }
     )
     )
     ),
     //Set the new code value so it can be shown on screen
     Set(
     NewCode,
     Concatenate(
     Char(First(LastCode).FirstLetter),
     Char(First(LastCode).SecondLetter),
     Concatenate(
     Left(
     "000000",
     6 - Len(Text(First(LastCode).CodeNumber))
     ),
     Text(First(LastCode).CodeNumber)
     )
     )
     );
     //Clear input fields ready for next code
     If(
     IsEmpty(Errors(CodeLists)),
     UpdateContext({resettext: !resettext})
     );
     If(
     IsEmpty(Errors(CodeLists)),
     UpdateContext({resettext: !resettext})
     );
     Notify(
     Concatenate(
     Text(NewCode),
     " is now in use."
     ),
     NotificationType.Success
     );
     //send email to user with info of new code they just aquired
     If(
     chkSendEmail.Value,
     Office365Outlook.SendEmailV2(
     User().Email,
     tiBrillPlant.Text & " | " & tiItemDesc.Text & " | " & Text(NewCode),
     htEmail.HtmlText,
     {
     From: User().Email,
     Importance: "Normal",
     IsHtml: true
     }
     )
     ),
     //The record the user tried to aquire does not have their email address so someone else got it before they did
     Notify(
     Concatenate(
     "Unable to mark ",
     Text(NewCode),
     " as in use."
     ),
     NotificationType.Error
     )
     )
     )
     ),
     //The record the user tried to aquire does not have their email address so someone else got it before they did
     Notify(
     "New code has been saved by another user, please try again.",
     NotificationType.Error
     )
     );
     ,
     //The record the user tried to aquire does not have their email address so someone else got it before they did
     Notify(
     Text(NewCode) & " has been saved by " & LookUp(
     CodeLists,
     tID = First(LastCode).tID
     ).UserID,
     NotificationType.Error
     );
     
    )

Under review

Thank you for your reply! To ensure a great experience for everyone, your content is awaiting approval by our Community Managers. Please check back later.

Helpful resources

Quick Links

Season of Sharing Community Challenge Winners!

Congratulations to our community stars!

Kudos to our 2025 Community Spotlight Honorees

Expanding mentorship, skilling, and AI innovation

Congratulations to the July Top 10 Community Leaders!

These are the community rock stars!

Leaderboard > Power Apps

#1
WarrenBelz Profile Picture

WarrenBelz 427 Most Valuable Professional

#2
11manish Profile Picture

11manish 201 Super User 2026 Season 2

#3
MS.Ragavendar Profile Picture

MS.Ragavendar 128 Super User 2026 Season 2

Last 30 days Overall leaderboard