Is there an option in Powerapps to split a search text into individual strings and to display on a gallery only items that include "all" strings? - full-text-search

my case is similar to this case: Click here!
I have a gallery which displays items from a Collection. I already added a Textinput.Text to give customers the opportunity to search for items.
But, what I am struggling with is to implement a "full-text" search.
The solution #carlosfigueira offered in the above-mentioned question works perfectly to split the search text but I would like to have display items on the gallery only that includes all individual strings.
This is my code for items on the gallery
Filter(
CustomListIssues;
Sum(
ForAll(
Filter(
Split(
InpSearchString.Text;
" "
);
Len(Trim(Result)) > 0
);
If(
Result in 'Title EN';
1;
0
) && "Unresolved" = Status && If(
!IsEmpty(lbSearchDepartment.SelectedItems.Result);
lbSearchDepartment.Selected.Value = Departement;
"" in Departement
)
);
Value
) > 0
)
CustomListIssues: A collection where I store all list items
InpSearchString.Text: Search TextInput.Text
'Title EN': The column I would like to search in based on the given search string
Overview App:
Image below to give you an overview of how it looks/works at the moment
Given search string
Trim(InpSearchString.Text)
The gallery which displays items from a Collection
Expected result:
I would like to have display items on the gallery only that includes all individual strings
Thanks in advance
Sascha Dornig

If you want to have all strings instead of one of them, you can slightly change the logic of the expression. Before it would sum 1 if a word is in the title, and check that the result is more than 0 (so if any is present, then the item would be returned). In this modified expression below, we're adding 1 if each word is not in the title, and at the end we compare the sum with 0 - if it's not zero, then at least one word was not found, and we don't return the record.
Filter(
CustomListIssues;
Sum(
ForAll(
Filter(
Split(
InpSearchString.Text;
" "
);
Len(Trim(Result)) > 0
);
If(
Result in 'Title EN';
0;
1
) && "Unresolved" = Status && If(
!IsEmpty(lbSearchDepartment.SelectedItems.Result);
lbSearchDepartment.Selected.Value = Departement;
"" in Departement
)
);
Value
) = 0
)

Related

How can I sort gallery based on multiple columns in power automate?

I tried below query but it is working only for first condition.
SortByColumns(
Filter(
[#Questions],
'Discussion Type'.Value = "Question" Or 'Discussion Type'.Value = "Conversation",
StartsWith(
Title,
TextSearchBox1.Text
)
),
"Title",If(
SortTitle,
Descending,
Ascending
),
"Created",If(
SortDate,
Descending,
Ascending
)
)
I have created a container with 2 items 'Sort alphabetically' or'Sort by CreatedDate' but the query is not working.
Visible property of Item 1: UpdateContext({SortDate: !SortDate})
Visible property of Item 2: UpdateContext({SortTitle: !SortTitle})

Power BI: COUNTA across multiple columns with multiple filter criteria

I am fairly new to Power BI and DAX and I am struggling with getting the below measure to work (I have provided to different version of what I have tried). I am trying to COUNTA the # of items that met certain criteria in two separate columns. Each column that the measure looks at has at least 3 filter criteria and in column two I need to use wildcards as the data there in has entries that share the first two values but the 3rd value could change over time. Any assistance would be amazing as I have tried dozens of different ways and I still cannot figure it out.
GA = CALCULATE(COUNTA(Table,[Item]),filter(Table,Table[Column 1]in{"GA","SP"}) , Filter(Table,Table[Column2]in{"MT*","GA*","SP*","OP*"}))
GA = CALCULATE(COUNTA(Table[Item]),Table[Column1]= "GA" || Table[Column1]= "SP" && Table[Column2]="GA*" || Table[Column2]= "OP*" || Table[Column2]]= "SP*" || Table[Column2]= "MT*")
Unfortunately I cannot provide an example of the data.
Thank you in advance
As #Alexis Olson mentions in his reply to this post, there does not appear to be a shorthand way to use the IN operator with wildcards.
Hence:
GA =
CALCULATE(
COUNTROWS( 'Table' ),
FILTER(
'Table',
'Table'[Column1]
IN { "GA", "SP" }
&& (
CONTAINSSTRING( 'Table'[Column2], "MT" )
|| CONTAINSSTRING( 'Table'[Column2], "GA" )
|| CONTAINSSTRING( 'Table'[Column2], "SP" )
|| CONTAINSSTRING( 'Table'[Column2], "OP" )
)
)
)

Multiple data types in a Power BI matrix

I've got about 20 different metrics across 10 locations and want to make a matrix with metrics as rows and the locations as the different columns. The issue I'm running into is that the metrics are different data types, some are whole numbers, some are %s and some are $s.
Is there any way to custom format each row as a different data type like there is in excel?
Edit: Sorry I wasn't clear. I don't want the same value showing up multiple times.
See below screenshots.
Test Data Screenshot:
What I want, but I want it in Power BI, not Excel:
What I don't want when I use measures that are formatted as different data types:
The formatting is not controlled by the rows or columns but rather each measure can be assigned its own data type using the Modeling tab.
Edit: I see a few options here.
Option 1: Write a text measure that switches formats like this:
FormatMetric =
VAR Val = SUM ( TestData[Value] )
RETURN
SWITCH (
SELECTEDVALUE ( TestData[Metric] ),
"# quantity", FORMAT ( Val, "0" ),
"$ Sales", FORMAT ( Val, "$0.00" ),
"% to plan", FORMAT ( Val, "0%" )
)
You'll get a table that looks like this:
Be aware that this measure returns text values and won't work in a chart.
Option 2: Create three separate measures and format each separately:
# quantity = CALCULATE ( SUM ( TestData[Value] ), TestData[Metric] = "# quantity" )
$ Sales = CALCULATE ( SUM ( TestData[Value] ), TestData[Metric] = "$ Sales" )
% to plan = CALCULATE ( SUM ( TestData[Value] ), TestData[Metric] = "% to plan" )
If you make sure you have Format > Values > Show on rows turned on and put these three measures in the Values box:
These measures can be used in charts.
Option 3: Pivot your data table on the Metric column in the query editor so you don't have mixed data types in a single column. Your data table should look like this now:
From here, you can write three simple measures format as in the previous option:
# quantity = SUM ( Pivot[# quantity] )
$ Sales = SUM ( Pivot[$ Sales] )
% to plan = SUM ( Pivot[% to plan] )

Lotus Notes - multiple IF formula statements

I'm new in Lotus Notes programming and I need your advices and your help.
My main form contains a table with 8 rows and 2 columns. ( there are 16 cells ) Every each cell has a numeric field. My fields name are :
txt_n1 and txt_i1 ( for 1st row )
txt_n2 and txt_i2 ( for 2nd row )
....
txt_n8 and txt_i8 ( for 8th row )
What I want to do is:
I have a view called vwMarketing with just one column. I want this view to display only those docs. in which there is at least one or more rows which its cells contains equal values.
So, if let say txt_n4 = txt_i4 => OK
row(k) (where k=1..8) : if cell 1 value is 5 and cell 2 value is 5 => OK.
There could be more than one row with this property, important is to exist at least one, and the values not to be null.
I hoped i was pretty clear, thanks !
PS: Actually, the formula statement i want to be in the column, so if it is OK => "A" and if not => "" ( in the view property, I checked : Don't show empty categories )
if you have small amount of documents in the view, then as u were suggested use Selection Formula to exclude documents with wrong condition.
you can add computed item/flag into your documents, field will compute if the document should be displayed in the view or not. then you will not have performance issue. i.e.
but code you need should look like that (that will check if documents is fine to be displayed in view or not), if you use it in view - just put after all Select _res = 1 otherwise if you decide to use flag into document (to increase performance) then Select youritem = 1
_res := 0;
#For(i:=1;i<=8;i:=i+1;
_post := #Text(i);
_txt_n := #GetField("txt_n"+_post);
_txt_i := #Text(#GetField("txt_i"+_post));
#If( (_txt_n=_txt_i) & (_txt_n!="");
#Do( _res := 1; i:=9);
0
)
);
_res
I would solve it slightly different:
Create a hidden text field on your form called 'DisplayInView' (or similar).
Modify the view selection: SELECT DisplayInView="Yes"
Add the code below to the PostSave event of your form:
Dim thisdoc As NotesDocument
Dim isSame As Boolean
isSame = False
Set thisdoc = source.Document
'*** Loop through all fields in document and compare the field pairs
Forall i In thisdoc.Items
If Left(i.Name,5) = "txt_n" Then
If i.Text = thisdoc.GetItemValue( Replace(i.Name,"txt_n","txt_i") )(0) Then
isSame = True
Exit Forall
End If
End If
End Forall
If isSame Then
Call doc.ReplaceItemValue("DisplayInView","Yes")
Call doc.Save(True,False)
End If
I haven't tested it, but I believe it should work.

XQuery : in need of a filtering tip

Given XML file-record like this
<ADR-NSBG>
<timeline timestamp="2011-06-09T00:15:00">
<datum datum="SGC_at_bsNo-14___SignalingNetworkConnection_at_netId-4___Sip_at_networkRole-2">
<sbgSipTotalIncSipRequests>4314320</sbgSipTotalIncSipRequests>
<sbgSipTotalIncSipResponses>9040481</sbgSipTotalIncSipResponses>
<sbgSipTotalIncFailureResponses>2321242</sbgSipTotalIncFailureResponses>
<sbgSipTotalOutSipRequests>9136608</sbgSipTotalOutSipRequests>
<sbgSipTotalOutSipResponses>4643002</sbgSipTotalOutSipResponses>
<sbgSipTotalOutFailureResponses>1027420</sbgSipTotalOutFailureResponses>
<sbgSipIncommingProvisionalResponses>3433875</sbgSipIncommingProvisionalResponses>
<sbgSipOutgoingProvisionalResponses>1845750</sbgSipOutgoingProvisionalResponses>
</datum>
<datum datum="SGC_at_bsNo-13___SignalingNetworkConnection_at_netId-4___Sip_at_networkRole-2">
<sbgSipTotalIncSipRequests>4799739</sbgSipTotalIncSipRequests>
<sbgSipTotalIncSipResponses>9335965</sbgSipTotalIncSipResponses>
<sbgSipTotalIncFailureResponses>2415690</sbgSipTotalIncFailureResponses>
<sbgSipTotalOutSipRequests>9474295</sbgSipTotalOutSipRequests>
<sbgSipTotalOutSipResponses>5291708</sbgSipTotalOutSipResponses>
<sbgSipTotalOutFailureResponses>1149950</sbgSipTotalOutFailureResponses>
<sbgSipIncommingProvisionalResponses>3516298</sbgSipIncommingProvisionalResponses>
<sbgSipOutgoingProvisionalResponses>2190601</sbgSipOutgoingProvisionalResponses>
</datum>
</timeline>
</ADR-NSBG>
What I would like to do is to get the values of the children of the datum element.
so, I have written the following query:
for $i in collection("/db/_DEMO/ADR-NSBG/sipTransactTM/2011/06/09")
let $TIME_FROM := "2011-06-09T00:15:00"
let $TIME_TO := "2011-06-09T00:45:00"
let $DATUM := "SGC_at_bsNo-13___SignalingNetworkConnection_at_netId-4___Sip_at_networkRole-2"
where ( $i/ADR-NSBG/timeline/#timestamp/string(.) >= $TIME_FROM and
$i/ADR-NSBG/timeline/#timestamp/string(.) <= $TIME_TO) and
( $i/ADR-NSBG/timeline/datum/#datum/string(.) = $DATUM )
order by $i/ADR-NSBG/timeline/#timestamp/string(.)
return $i/ADR-NSBG/timeline/datum
But, the problem is that I cannot choose between the two "datum" nodes.
the result of the query is:
<datum datum="SGC_at_bsNo-14___SignalingNetworkConnection_at_netId-4___Sip_at_networkRole-2">
<sbgSipTotalIncSipRequests>4314320</sbgSipTotalIncSipRequests>
<sbgSipTotalIncSipResponses>9040481</sbgSipTotalIncSipResponses>
<sbgSipTotalIncFailureResponses>2321242</sbgSipTotalIncFailureResponses>
<sbgSipTotalOutSipRequests>9136608</sbgSipTotalOutSipRequests>
<sbgSipTotalOutSipResponses>4643002</sbgSipTotalOutSipResponses>
<sbgSipTotalOutFailureResponses>1027420</sbgSipTotalOutFailureResponses>
<sbgSipIncommingProvisionalResponses>3433875</sbgSipIncommingProvisionalResponses>
<sbgSipOutgoingProvisionalResponses>1845750</sbgSipOutgoingProvisionalResponses>
</datum>
<datum datum="SGC_at_bsNo-13___SignalingNetworkConnection_at_netId-4___Sip_at_networkRole-2">
<sbgSipTotalIncSipRequests>4799739</sbgSipTotalIncSipRequests>
<sbgSipTotalIncSipResponses>9335965</sbgSipTotalIncSipResponses>
<sbgSipTotalIncFailureResponses>2415690</sbgSipTotalIncFailureResponses>
<sbgSipTotalOutSipRequests>9474295</sbgSipTotalOutSipRequests>
<sbgSipTotalOutSipResponses>5291708</sbgSipTotalOutSipResponses>
<sbgSipTotalOutFailureResponses>1149950</sbgSipTotalOutFailureResponses>
<sbgSipIncommingProvisionalResponses>3516298</sbgSipIncommingProvisionalResponses>
<sbgSipOutgoingProvisionalResponses>2190601</sbgSipOutgoingProvisionalResponses>
</datum>
What I would like to ask you is : Why the statement ( $i/ADR-NSBG/timeline/datum/#datum/string(.) = $DATUM ) does not work ?
Whithin the where clause you are filtering the $i elements of the for clause by using the datum element. You are not filtering the datum elements.
This expression:
( $i/ADR-NSBG/timeline/datum/#datum/string(.) = $DATUM )
is resolved to:
(
"SGC_at_bsNo-14___SignalingNetworkConnection_at_netId-4___Sip_at_networkRole-2",
"SGC_at_bsNo-13___SignalingNetworkConnection_at_netId-4___Sip_at_networkRole-2"
) =
"SGC_at_bsNo-13___SignalingNetworkConnection_at_netId-4___Sip_at_networkRole-2"
which is true. Therefore, the $i element is selected. After that, the expression in the return clause selects both child elements of the contained timeline element:
$i/ADR-NSBG/timeline/datum
How to filter the datum elements
If you want to select only the datum with a specific string, you need to filter in the return clause:
$i/ADR-NSBG/timeline/datum[#datum eq $DATUM]

Resources