cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
Anonymous
Not applicable

Deleting multiple records using RemoveIf and ForAll

EDIT: the solution involved using Warren's suggestion with a strategically placed bit of TRIM. Please see comments below for more details.

 

-

 

This is baffling me.

 

The Scenario:

In this environment, physical items are placed on a truck regularly, and then taken off a truck regularly, as a truck moves through our environment. When items are placed on a truck, we want to know about it, and we want to be able to know at any given time "What is on the truck right now?" because, for example, once the truck comes back to the central nest, and all items are removed and logged, the truck contents **bleep** well better be empty. Item counts can be any number, from 1 to hundreds, all in a text window. The data is a result of bar code scans. Data is sent to the main process by collecting information in a couple windows, collecting the list of scan codes in a window (which eventually becomes the collection ScanDataCollection), and clicking [Accept Data].

 

What I thought was oh-so-clever:

I maintain a specific SharePoint list: SpiderDeets_OnTruck. This list is an ongoing report of items that are allegedly still on a truck.

I start each [Accept Data] process by looping through all the entries and if I find an entry in the SpiderDeets_OnTruck list, then I delete that record straight away. Then, a little later in the routine, if one of the settings indicates "these items were placed on a truck", then I add those items to the list SpiderDeets_OnTruck.

 

It seemed like an extremely clever way to have a "hot report" that was always tracking the truck-content status.

 

Where it fails:

A variety of things seem to remain still "on the truck." Any one item when processed operated appropriately, but I discovered that when I processed a bunch of items, only the last item would get its "I'm on the truck!" reference deleted. What the pickles is this vinegar?!

 

My code:

At the beginning of the function:

 

 

 

   ForAll(ScanDataCollection, // Clear the associated Lists
     // Before trying to modify the table, check to see if the data is even IN the table
        //If(CountRows(Filter(SpiderDeets_OnTruck, Result in Scan_Code)) > 0,
          // If it is in the table, remove it.
          //Notify("Result: " & Result);
          RemoveIf(SpiderDeets_OnTruck, Result in Scan_Code);
        //);
   ); // ForAll(ScanDataCollection,

 

 

 

You may notice the NOTIFY line. I used that to help troubleshoot, but it may not be the best tool.

 

When a group of items go on the truck:

 

 

         ForAll(ScanDataCollection,
           Collect(SpiderDeets_OnTruck, {
             Title: Text(Today()),
             Timestamp: TransactionTimestamp_Value,
             Scan_Code: TrimEnds(Result),
             Location: DD_Location.SelectedText.Value,
             Transaction_Type: TransactionType_Value,
             Agent_Name: User().FullName,
             Agent_Email: User().Email
           }); 
         ); // ForAll(ScanDataCollection

 

 

And that seems to work okay.

 

Anyway, I seem to be able to consistently repeat this glitch: I feed a list of items and only the last item on the list gets happily removed from the SharePoint list, but the others don't.

 

My begging self:

Can someone please guide me in how to do this in a way that works? I must be misunderstanding something about how ForAll interacts with RemoveIf or whatever. I'm at a loss.

 

Thank you kindly,

 

Edward

1 ACCEPTED SOLUTION

Accepted Solutions
WarrenBelz
Super User
Super User

Hi @Anonymous ,

Your logic seems sound however I have a couple of questions and an alternate syntax

ForAll(
   ScanDataCollection,
   If(
      !IsBlank(
         LookUp(
            SpiderDeets_OnTruck, 
            Result = Scan_Code
         ).Result
      ),
      RemoveIf(
         SpiderDeets_OnTruck, 
         Result = Scan_Code
      )
   )
)

 

  • Do you have a field called Result in SpiderDeets_OnTruck? If so that is a bad name for a field as it is a Reserved Word (see the bottom of this blog of mine) in Power Apps and can cause Ambiguity.
  • Is the Result always equal to the scan code (in which cased you do not need the in filter.
  • How many items are in the List?

Please click Accept as solution if my post helped you solve your issue. This will help others find it more readily. It also closes the item. If the content was useful in other ways, please consider giving it Thumbs Up.

Visit my blog Practical Power Apps

View solution in original post

5 REPLIES 5
WarrenBelz
Super User
Super User

Hi @Anonymous ,

Your logic seems sound however I have a couple of questions and an alternate syntax

ForAll(
   ScanDataCollection,
   If(
      !IsBlank(
         LookUp(
            SpiderDeets_OnTruck, 
            Result = Scan_Code
         ).Result
      ),
      RemoveIf(
         SpiderDeets_OnTruck, 
         Result = Scan_Code
      )
   )
)

 

  • Do you have a field called Result in SpiderDeets_OnTruck? If so that is a bad name for a field as it is a Reserved Word (see the bottom of this blog of mine) in Power Apps and can cause Ambiguity.
  • Is the Result always equal to the scan code (in which cased you do not need the in filter.
  • How many items are in the List?

Please click Accept as solution if my post helped you solve your issue. This will help others find it more readily. It also closes the item. If the content was useful in other ways, please consider giving it Thumbs Up.

Visit my blog Practical Power Apps

Anonymous
Not applicable

Hi Warren, and thank you for responding.

 

Let's see...

 

"Do you have a field called Result in SpiderDeets_OnTruck?"

 

I do not. All fields in SpiderDeets_OnTruck are listed above under the Patch code segment.

 

"Result" is the output of the breakdown of the contents of the window which contains the scan results. I break that text box into a Collection way early in the program. Lemme dig up that code...

 

// Perform the initial data collection
   ClearCollect(ScanDataCollection,Split(ScanData.Text,Char(10))); // Split the data into ScanDataCollection collection

// Trim each entry because... ugh.
   ForAll(ScanDataCollection,
           Result=TrimEnds(Result);
         ); // ForAll(ScanDataCollection,

 

-

"Is the Result always equal to the scan code (in which cased you do not need the in filter."

 

Hm... I guess not. I've been mostly worried about errant spaces, but now that you mention it, I really should be more strict in case of Mischievous Substrings.

-

"How many items are in the List?"

 

At this exact moment, 144.

 

As this is supposed to be a running-total of physical boxes on a single truck, I've never been worried about it hitting the dum-dum limit.

Anonymous
Not applicable

Hi Warren!

 

Take 2...

 

I tried the code segment you offered, but it threw an error, choking on an instance of "Result."

 

So, I tried this:

ForAll(ScanDataCollection,
  RemoveIf(SpiderDeets_OnTruck, Result = Scan_Code);
  );

I tried it on a batch of data, but this time I paid attention to the tail end of each line. There was a SPACE at the end of many of them, but not all of them (which I learned because I manually put my list in order, so I was able to clip out spaces and note them by highlighting all content).

 

So, I fed it eight lines of data, two of which specifically had no space at the end. It correctly identified/deleted the last item (ugh), but it also identified the items that had no space at the end.

 

Promising!

 

So, my logic is working, but somehow that space is what's pouring maple syrup on my pocketwatch. Stupid bar code scanners -- I can't get them to behave.

 

So, I tried this:

ForAll(ScanDataCollection,
  RemoveIf(SpiderDeets_OnTruck, Trim(Result) = Scan_Code);
  );

That did it -- that's what I needed to do to fix this sucker -- use the TRIM command at the last possible second.

 

As this is the avenue of discussion that led me directly to the answer, I'm marking as answered.

 

Thank you kindly,

 

Edward

Hi @Anonymous ,

I would not have picked that one from your post - Result refers to the collection field and scan_code to the list field (the equals is normally reversed, but works either way)

Anonymous
Not applicable

Oh, I understand! Good thing EQUALS is commutative, I guess. However, out of respect for the poor codemonkey who must follow in my sluggish footsteps, I reversed the polarity on that one.

 

This knocked my Problem Children result down from 144 to 12. Whew!

Helpful resources

Announcements
Power Apps News & Annoucements carousel

Power Apps News & Announcements

Keep up to date with current events and community announcements in the Power Apps community.

Microsoft 365 Conference – December 6-8, 2022

Microsoft 365 Conference – December 6-8, 2022

Join us in Las Vegas to experience community, incredible learning opportunities, and connections that will help grow skills, know-how, and more.

Power Apps Community Blog Carousel

Power Apps Community Blog

Check out the latest Community Blog from the community!

Top Solution Authors
Top Kudoed Authors
Users online (4,218)