How to use dt.select / filter datatable

Hello,
how can i use the following expression in UiPath?

dt_new = dtOld.select{([Column1] is not empty or ‘0’) and ([Column2] is not empty or ‘0’) and ([Column3] is not empty or ‘0’)}.Copy

This is not working with the filter data table activity, because of the connection of the expressions.

Thanks in advance!

@Krissey
Welcome to the forum

Give a try to following
Assign activity
leftSide: dt_new
right side:


(From d in dtOld.AsEnumerable
Let check = {"Column1","Column2","Column3"}.Any(Function (x) String.IsNullOrEmpty(d(x).toString.Trim) OrElse d(x).toString.Trim.Equals("0"))
Where check = false
Select r=d).CopyToDataTable
1 Like

That seems to work. Thank you very much!!

Another question:
How can i get the complete opposite of your expression?

@Krissey
With the interpretation that complete opposite means following:
filter rows where Any Col1,2,3 is Empty or 0

we can do:

(From d in dtOld.AsEnumerable
Let check = {"Column1","Column2","Column3"}.Any(Function (x) String.IsNullOrEmpty(d(x).toString.Trim) OrElse d(x).toString.Trim.Equals("0"))
Where check = true
Select r=d).CopyToDataTable

Kindly note: CopyToDataTable is throwing by default an exception in case of empty filter result. We do handle this defensive with following pattern:

Hey Peter,

thank you very much, but the second expression did not work. There was no filtering.
Here is an example, for your understandig:
The first expression should give me the first result and the second expression should give me the second result. Is that possible?

Edit:

Please ignore that in this example column 3 is now named column 5 :slight_smile:

so does mean it is working after renaming:

Let check = {“Column1”,“Column2”,“Column5”}.Any(Function (x) String.IsNullOrEmpty(d(x).toString.Trim) OrElse d(x).toString.Trim.Equals(“0”))

May we ask you for a quick feedback? Thanks

No, that does not depend on the names. In my workflow i changed them to the right column names. But the second expression doesnt give me the second result, which i need. (See Picture as an example)

I think you are from munich. Do you speak german? If not, please ignore the following sentences:

Deine erste Abfrage liefert mir das richtige Ergebnis. (Wie auf dem Bild zu sehen ist)
Die zweite Abfrage jedoch leider nicht.
Habe dir als Beispiel mal ein Bild hochgeladen, was mir die beiden Abfragen als Ergebnis liefern sollen und wie die Ursprungstabelle aussieht. Die Spaltennamen habe ich übrigens richtig angepasst, daran kann es nicht liegen.
Danke schonmal :slight_smile:

Zum verständnis:
2. ergebnis soll alle zeilen liefern, wenn spalte 5 leer oder 0 ist. richtig?

Jaein :smiley:

Erstes Ergebnis:
dt_neu1 = dt_alt wenn [(Spalte 1 nicht leer oder nicht 0 ist) und (Spalte 2 nicht leer oder nicht 0 ist) und (Spalte 3 nicht leer oder nicht 0 ist)] - Das passte ja soweit mit deiner Abfrage

Das zweite Ergebnis soll quasi die Schnittmenge aus dt_alt und dt_neu sein. Schwierig in Worte zu fassen, also quasi dt_neu2 = dt_alt - dt_neu1

  • und das liefert die zweite Abfrage aktuell nicht.

Vielleicht gibt es da auch eine andere Lösung?!
Vielen dank nochmal für deine Mühe

lass mich nach denken aber ich denke wir müssen feiner differenzieren

Eine Methode könnte funktionieren

dtOld.AsEnumerable.Except(dt_neu1.AsEnumerable, DataRowComparer.Default).CopyToDatatable

Kann Probleme bei Duplikaten haben.

Wenn wir sagen: dt_Neu sind Zeilen bei denen
1 oder mehr Spalten von Col1,2,5 leer oder 0 sind, dann könnte u.g. LINQ Statement passen

(From d in dtOld.AsEnumerable
Let check = {"Column1","Column2","Column3"}.Any(Function (x) String.IsNullOrEmpty(d(x).toString.Trim) OrElse d(x).toString.Trim.Equals("0"))
Where check = true
Select r=d).CopyToDataTable

Check mit reduziertem DataSet:
grafik

Starter help:
GetRows_3Col_AnyHasBlankOr0_PlusGetExcept.xaml (8.0 KB)

Hi,

also nach meinem Testen funktioniert:
Expression1:
(From d in dtOld.AsEnumerable
Let check = {“Column1”,“Column2”,“Column3”}.Any(Function (x) String.IsNullOrEmpty(d(x).toString.Trim) OrElse d(x).toString.Trim.Equals(“0”))
Where check = false
Select r=d).CopyToDataTable
+
Expression2:
dtOld.AsEnumerable.Except(dt_neu1.AsEnumerable, DataRowComparer.Default).CopyToDatatable

Mit den beiden zusammen habe ich die beiden gewünschten data tables. Was meinst du jetzt genau mit Duplikaten? Kann ich nicht einfach Duplikate entfernen nutzen?

Perfekt, dann haben wir das Ziel erreicht. Ja?

Habe Except anhand von Listen simuliert.
grafik

Except ist ähnlich dem Minus (get the opposite) aber verschluckt Duplikate (siehe Beispiel 1, kommt ursprünglich mehrmals vor, nachdem Except aber nur noch einmal). Das sollte man beim Einsatz von Except immer im Hinterkopf behalten. aber mit den LINQ statements sind wir gut aufgestellt.

Gut, dann habe ich es verstanden.

Wie sieht das mit dem Except denn in einer Datatable aus? Werden da komplette Rows als Duplikate entfernt oder anhand eines Kriteriums?

Ansonsten nochmal vielen Dank für deine Mühe!! :slight_smile:

verhalten ist gleich wie bei der Liste (s.o. denke an den DataRowComparer)
das Ergebnis ist nicht eine gelöschte Liste, DataTable. Except gibt uns einfach das ermittelte Ergebnis zurück (als Except Default Rückgabedatentyp oder modifiziert mit z.B toList, ToArray…)
Die Duplikate (1 vom Listenbeispiel) werden auch verschluckt.

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.