Pick list sort order (2nd)

Tagged: ,

Viewing 22 reply threads
  • Author
    Posts
  • August 16, 2015 at 4:02 PM #14457

    Mathieu Masseboeuf
    Participant

    Hi,

    Not sure why – I couldn’t comment on the previous topic on that matter :

    Pick List sort order

    To sup um :
    – I have a long pick list, with ordered items according to their value/importance
    – That order doesn’t match alphabetical ordering
    – I’d like to have that order used for sorting in the list view

    Anyway, the proposed solution is … not a solution – I have a very long list of sorted items (about 60 items) – putting numbers in front of them is not an option.
    That feature would really be appreciated (I just migrated from Bento, where I was using it)

    Thanks !

    August 18, 2015 at 9:51 PM #14462

    Brendan
    Keymaster

    Hi Mathieu,

    I’ve been trying to figure out how Bento sorts their records by the order of the values in the pick list, but I cannot see how to do that. You can sort ascending or descending alphabetically. That’s all I can find.

    Thanks,

    Brendan

    August 19, 2015 at 1:29 AM #14473

    Mathieu Masseboeuf
    Participant

    Hi,

    I suppose they are using the internal key from the key/value pair used to index/sort the display of the items from the list (no sure how this works internally though) – or a key/value pair from an external list to build the menu (and then use the key for sorting)

    I did a quick search, maybe this helps : http://stackoverflow.com/questions/2405965/uipickerview-with-nsdictionary
    (if not, tell me I’ll ask my developers how they would do it)

    Thanks,
    Mathieu

    August 19, 2015 at 12:32 PM #14475

    Brendan
    Keymaster

    But how do I tell Bento to sort records using the order of the values in the Pick List instead of alphabetically? I just don’t see an option for that.

    August 20, 2015 at 5:53 AM #14477

    Mathieu Masseboeuf
    Participant

    Well, you don’t tell him to sort that way instead of alphabetically : it only uses the pick list order for sorting.
    Which would be OK with Tap Forms, as unlike in Bento, you have a button to sort items upward and downard inside the pick list (if you want to do so).

    March 3, 2016 at 12:28 PM #16040

    Ron
    Participant

    Is this still the case that field values cannot be sorted based on pick list order if the list is not alphabetized?

    March 4, 2016 at 1:04 AM #16042

    Brendan
    Keymaster

    Hi Ron,

    That’s right. Tap Forms sorts records based on the First Sort Field values, not based on the order of values inside a Pick List.

    Thanks,

    Brendan

    March 4, 2016 at 8:48 AM #16044

    Ron
    Participant

    Brendan,

    But if that First Sort Field is a Pick List field that is not in alpha order how would the field be sorted?

    Sort Field is ‘Status’ = In Process; Not Started; Completed.

    I would want all records that are ‘In Process’ listed ahead of the other Status’ and when ‘Completed’ that record would move to the bottom of the listing. I guess the only solution would be to preface each status with a number.

    Ron

    March 4, 2016 at 5:48 PM #16046

    Brendan
    Keymaster

    Hi Ron,

    That’s correct, prefixing the values with a number would work. Tap Forms just uses the database engine sorting routines which just sorting things in ascending and descending order either alphabetically, numerically, or chronologically (which is really just numerically).

    Thanks,

    Brendan

    February 7, 2022 at 4:37 PM #46637

    Mathieu Masseboeuf
    Participant

    Just in case, bumping that question here :)
    There could be an option in the List of choice configuration.

    Sort order : Alphabetically / Manual (and in that case you either sort alphabetically or using the sort key used to display them in the proper order)

    February 7, 2022 at 11:49 PM #46644

    Brendan
    Keymaster

    Well there is a button to sort the values right now on the pick list edit screen.

    February 8, 2022 at 1:34 AM #46647

    Mathieu Masseboeuf
    Participant

    That button lets you sort items in the sort list.
    What I’m looking for is to sort that list manually, and then use that sort order when sorting ascending or desceding (instead of the alphabetical one)

    February 8, 2022 at 1:39 AM #46648

    Brendan
    Keymaster

    You can’t have sorting manual and ascending or descending at the same time. Just drag the values into the order you want them to appear in.

    February 8, 2022 at 6:15 AM #46655

    Mathieu Masseboeuf
    Participant

    I’m not sure I was clear in what I wanted.
    I’ll post a screenshot :D

    I have a list of values, which is sorted the way I want : the opened menu on the left. It’s used in the field “Dénomination”.
    When sorting by “Dénomination” in my form, I’d like it to follow that order I chose, instead of an alphabetic order. Just as it is in the menu, or in the list configuration.

    Hope it’s clearer that way.

    Attachments:
    You must be logged in to view attached files.
    February 8, 2022 at 8:28 PM #46660

    Sam Moffatt
    Participant

    This is a bit of a hack but you can use a script field to do the ordering. Create a new script field and then you’ll need to put in something that looks like this:

    var keyfield_id = 'fld-id';
    var picklist_name = 'Picklist name';
    
    function PicklistID() {
    	let key = record.getFieldValue(keyfield_id);
    	let picklist = document.getPickListNamed(picklist_name).values;
    	for(let offset in picklist) {
    		if (picklist[offset].value == key) {
    			return offset;
    		}
    	}
    }
    
    PicklistID();

    In the script above, edit the first two lines and change the field ID (the fld-id text) and the pick list name (the Picklist name) to be the ID of your Dénomination field and the name of the pick list it uses.

    Here is an example I used where I put in the field ID and the pick list was called “Marketplace”:

    var keyfield_id = 'fld-fa37906add2942c88bce3b500561c42d';
    var picklist_name = 'Marketplace';
    
    function PicklistID() {
    	let key = record.getFieldValue(keyfield_id);
    	let picklist = document.getPickListNamed(picklist_name).values;
    	for(let offset in picklist) {
    		if (picklist[offset].value == key) {
    			return offset;
    		}
    	}
    }
    
    PicklistID();
    

    That will give you an ID starting from zero I believe in order of the pick list that you can then use as a sort field. It’s not as elegant as having the ability for the text field to use the pick list ordering but it’s something you can do right now.

    February 8, 2022 at 11:34 PM #46662

    Brendan
    Keymaster

    Oh, you want your records to be sorted by the manually ordered list of values you put in to a Pick List. Sorry for my misunderstanding.

    When databases perform sort operations, they can only sort based upon the values in a column in the database. Either ascending or descending by whatever the value type is. If it’s a date value, then it’s chronologically. If it’s a number value then it’s numerically and if it’s text, then it’s alphabetically sorted.

    Sam’s solution is great because it allows the database to sort in an orderly fashion, in this case, numerically.

    I guess a built-in solution would probably work the same way that Sam’s does based on some configuration of the Sort Settings.

    February 10, 2022 at 5:53 AM #46672

    Mathieu Masseboeuf
    Participant

    I don’t know how the internals work, but I suppose you already have an order key stored with those lists in order to have that list displayed in the desired order (and that would “just” mean an additional join – well, the “just” is not that easy I suppose it’s not stored the same way …).

    That’s why I thought you had the information internally – even more now that you can link pick lists to another table (but now that I think about it, in that second case the order can be manual, or sorted according to the form sorting rules… well… )

    As I said in my initial post, putting numbers in front of those field is not an option – it wouldn’ t be readeable at all.

    Hum, but you gave me an idea, maybe I can play with invisible space characters :D -> https://stackoverflow.com/questions/17978720/invisible-characters-ascii

    I’ll try that out and post the result here :)

    Thanks,
    Mathieu

    February 10, 2022 at 10:51 PM #46678

    Brendan
    Keymaster

    Did you try Sam’s solution yet? I’d give it a try.

    February 11, 2022 at 6:00 AM #46683

    Mathieu Masseboeuf
    Participant

    Oh, indeed I didn’t noticed that answer !
    (just tried with the ascii stuff, but I would have to refill everything, or script a replacement)

    Indeed, last time I checked TF didn’t had scripting, never used it … will have to check that out :P

    February 11, 2022 at 6:21 AM #46684

    Mathieu Masseboeuf
    Participant

    Well, that’s a perfect solution, thanks a lot @Sam Moffatt … & Brendan :D \o/

    February 11, 2022 at 12:55 PM #46690

    Sam Moffatt
    Participant

    I added this to my Script Manager so that if you want to set this up for a new script field it can look like this (once Script Manager is installed and update run):

    document.getFormNamed("Script Manager").runScriptNamed("PicklistID");
    
    PicklistID('fld-fa37906add2942c88bce3b500561c42d', 'Marketplace');

    One minor change was to fix an issue where the pick list was returned at the end if nothing was found and that now is returning a null that should show up as an empty value for the field (it was showing up was something like [TFPicklist object] I think).

    February 18, 2022 at 6:06 AM #46787

    Mathieu Masseboeuf
    Participant

    Thanks again Sam ! :)

    December 1, 2022 at 12:16 PM #48378

    Lane Robinson
    Participant

    Just thought I’d provide some feedback on my finding this useful to sort records by month. A saved search shows me everything in a year. Being able to use the pick list I use to enter the month on the record is nice, and I’m sure I’ll use this other places too.

    I modified the script from the Script Manager a little bit. I wrap the offset with Number() to convert it to a number. It’s text apparently. (I’ll learn this javascript yet.)

    Thanks for the useful resource Sam.

    (I’m not sure how to preserve the tabs in the code. I thought the code tag would do that.)

    // NAME: PicklistID
    // VERSION: 1.0
    
    /**
     * PicklistID returns the offset index of a value from a pick list.
     *
     * This is useful for creating a surrogate field for sorting a field
     * that uses a single value pick list by the ordering of the pick list.
     *
     * Reference:
     * https://www.tapforms.com/forums/topic/pick-list-sort-order-2nd/#post-46660
     *
     * @param {string} keyfield_id - The internals Tap Forms field ID for the source field.
     * @param {string} picklist_name - The name of the pick list to use for ordering.
     *
     * @return {(number|null)}  The offset matching the value from the field or null if not matched.
     */
    function PicklistID(keyfield_id, picklist_name) {
    	let key = record.getFieldValue(keyfield_id);
    	let picklist = document.getPickListNamed(picklist_name).values;
    	for(let offset in picklist) {
    		if (picklist[offset].value == key) {
    			// just because when I see it I want to see 1 for january
    			return Number(offset) + 1;
    		}
    	}
    	return null;
    }
    
    var month_id = 'fld-370f51968e3146dca058b82ef34b1592';
    var list_from_picklists = 'Months';
    
    PicklistID(month_id,list_from_picklists);
Viewing 22 reply threads

You must be logged in to reply to this topic.