Is it possible to make a view with a top 10 only?
Let say I have client and purchase. If I wish to make a view with the 10 biggest purchase for exemple, how should I do it? To sort the result, should I use the built in filter or do it in formula? and how do I specify the number of rows to be displayed?
Thanks!
18 replies
-
WOW.. Never really paid attention that when ordering a select.. it only orders ascending... and the documentation does not list any other option to order descending.. Hmm.. Given that limitaiton.. I am not really happy with this solution . but it works.
Following is a dashboard with a view of the top N purchases. Each Purchase row has a "Rank" number.
Here is the code for "Rank" button
Here is the code for the view..
-
@Mconneen, an option for reversing the order would be to assign the group to an array and use rsort()
-
@Sean.. I thought of that.. but arrays are not multidemisional .. so all I would be sorting is the amounts.. not the records... Or am I missing something?
-
@Mconneen, You are correct about arrays not being multidimensional and I was mainly pointing out the option of using rsort() as a general possibility. Specific to applying rank values based on a field's descending order, you would still need to use the loop as you did and you would have to use 2 parallel arrays; one for Rank and one for Amount. So, it might be more trouble than it's worth.
-
@Sean... Thanks for confirming.. and I recall a similar post about "rank".. though a slightly different use case. As I often say.. I like to walk around the block to go next door.. :)
Another design approach could be to create a table that holds the top N values.. and then have a function / trigger on create to see if the purchased value falls within the min / max of that table and insert accordingly ... Seems like a lot of work when a simple order descending with a counter would do the trick.. :)
-
Thanks! working fine. I would like to add a selection field and use this selection to filter... It s a composite table where I have my view and the selection, but it seem to not working... in the (select ) it wont take care of my selection...
what could be the problem?
thanks
-
Hi, It s working but the only problem is that I need to have a new Rank column for each condition. So if my search criteria changes, I need to add a Rank column to the table...
I m trying to use a kind of array function to remove some entry according to the 'Top N' field but it s hard to make something works...
wath do you suggest?
-
@plafontaine44, Can I safely assume your post about idxRemove() is regarding your most recent post in this thread? If so, I think that array function is the wrong tool for the job. You need code to update the rank field and the array function isn't going to do that.
-
ok! because I'm able to get an array with the good value, but I don t know how to fill the view table with it! Your method with the rank value works fine but like I said, if I have a table with some purchased and each item purchased is type_A or Type_B and it could be done at location_A and Location_B and location_C then I would need to have a rank for each condition or so... and it s a lot! (type_A & location_A, type_A & location_B, type_A & location_C, type_B & location_A....)
it s a lot just to extract a pre defined number of row in a view...
do you have any idea to do it simple?
-
With my array I can insert an item() in the criteria but I need to tell the criteria != to all value in my array...that s where the issue came out...
-
Well, you've mentioned a couple of issues not just one. 1) You want to copy array values to your table rank field. 2) You want to sort by a combination of your rank fields. Correct?
-
I want to make a view table that show only a top 5 value or so. But to show only a number of value, I need to filter after filtering.
let say: let A := sort((select Achats).total_vente);
let B := null;
let j := number_show_1 - 1;
let x := cnt(A) - 1;
for i in range(x, j) do
let B := B + item(A, i);
B
endthis way I get the good value but in an array...I need to make a new filter but I don t know how to use it in filter...
(select Achats)[total_vente = B]
The 'rank' field is only to be able to filter but like I said if I change any of the filter option, I need a new 'rank' with the new filter...
thanks!
-
For what it's worth, I'm pretty sure item(A, i) is returning a string so what you are doing is concatenating items from the array to B which is a string.
It seems to me all you need to do is resequence your Rank field occasionally using the code for the button @Mconneen already gave you.
-
yes that wath I m trying to do for now! I create a main table composite to all other... then I create my view table on the main form with 2 selection field. Here my code inside the selection field 'on update' formula... seems to have an issue with it! I come close but there s something...
let sort := null;
let type_atel := text('Type atelier'); ------> 'selection field 1'
let sort := if text(Type_produit) = "Accessoire" then ----> variable with sorting value...
"total_accessoires"
else
if text(Type_produit) = "Epice" then
"total_aliments"
else
"total_vente"
end
end;
let r := cnt(select Achats);
let a := cnt((select Achats)[text(Atelier.'Type d''Atelier') = text(type_atel)]);
for p in select Achats do
p.(Rank := null)----> set all rank to null before to set it...
end and for p in (select Achats)[text(Atelier.'Type d''Atelier') = text(type_atel)] order by text(sort) do
p.(Rank := a);
a := a - 1
endcan you help me with this? Thanks a lot!
-
seems to be the 'sort' that I m trying to use a variable to order values... should have a way to do it...
-
Umm, I've never seen code where 2 for-loops were combined with "and". Also, you can't sort by proxy and I'm pretty sure you can't filter by proxy either. Meaning, you can't use a variable like "text(sort)" in the "order by" of a select statement.
You will have to test for each condition and then use the literal version of the correct select statement.
-
I trust the lack of DESC in an oversight?
-
Hi Plafontain,
may be these functions can help you:
sort(array)
- sorts an array in ascending orderrsort(array)
- sorts an array in descending orderBest, Jörg
Content aside
- 5 yrs agoLast active
- 18Replies
- 4867Views