Interesting stuff, especially how entitySelection.toCollection duplicates data. 
 I'm currently displaying collections in the listbox.  It's looking like it can 
all be done with entity selections, and be more efficient.


Keith - CDI

> On Apr 16, 2019, at 12:53 PM, Kirk Brooks via 4D_Tech <> 
> wrote:
> Keith,
> You know you can go about this from another point of view. I actually
> posted about this a bit ago. This won't accomplish exactly what you are
> asking for but it may be something you can use.
> First, remember that even when you have a very large collection or entity
> selection, as you seem to, you can make references to it WITHOUT
> duplicating it. This saves memory, obviously, but also means you can work
> with the list without having to worry about syncing it. It's even better
> when you are working with an entity collection. With 'lazy loading' the
> collection only contains references to the entities not a full copy of the
> data.
> Next, if it's the case the highlighted elements are being generated by some
> sort of filter or search perhaps you can accomplish your goal by only
> showing the records that match whatever criteria you have. I would think
> this is especially true with a list of 40K items. Personally I would really
> not want to have to scroll down to the second item highlighted when it's
> #37306.
> So, you have your 40k entity selection. The trick is not to put this in the
> listbox. Instead make a reference to it and display that. Remember neither
> of these entity selections consists of the data and the second one, the one
> in the listbox, is only a reference to the first. I learned from JPR that
> this is very memory efficient.
> Let's say you put the entity selection in a process var (I would most
> likely use Form for this) but to simplify the example let's call it
> 'entitySelection'. Next make a collection on Form called
> "displayCollection" (or whatever) as
> Form.displayCollection:=entitySelection
> Use Form.displayCollection in the listbox. By default the listbox shows all
> the elements of entitySelection.
> To show a selection of this list you could do:
> Form.displayCollection:=entitySelection.query("dateHired < :1";(Current
> date-90))  //borrowing a query example from the docs.
> Form.displayCollection:=Form.displayCollection  //  forces the listbox to
> update itself
> What are we doing? The query on the entity selection returns a collection.
> The contents of the collection are references to the respective elements in
> entitySelection. We're putting the query result into Form.displayCollection
> and since we have defined our listbox to use displayCollection the listbox
> now contains the query result.
> This is very fast. Like update while the user is typing fast. And since we
> are working with references changes you make to the something in the
> listbox populates back to the entity selection, entitySelection. Plus it's
> memory efficient.
> Another thing I learned at the WT - the entitySelection.toCollection
> command can be helpful BUT it does move the actual entity data to the
> collection. For something like a 40k element entity selection this might
> matter. So be sure to stick with your entity selection when it's large. And
> in this case the data would be in entitySelection but not in the references
> to it.
> On Tue, Apr 16, 2019 at 9:11 AM Keith Culotta via 4D_Tech <
>> wrote:
>> Douglas,
>> That seems promising.  Since the listbox is a collection/entity selection,
>> each row's color would be set by the rows presence in the "Selected items"
>> collection.  I imagine the performance would be OK as long as the search
>> only took place as the row becomes visible to the User.
>> Kirk's proposal alludes to a solution that 4D seems inches away from,
>> where a row's membership in the selected items collection automatically
>> grants it a highlight, similar to the boolean array of the array based
>> listbox, and the HighlightSet of the selection based listbox.
>> Thanks,
>> Keith - CDI
>>> On Apr 16, 2019, at 10:44 AM, Douglas von Roeder via 4D_Tech <
>>> wrote:
>>> Keith:
>>> How about this - rather than change the highlight, what about just
>> changing
>>> the color of the rows to mimic that they’re selected? You can still
>>> maintain array of record numbers/ID’s that represent the selection but
>> just
>>> update the UI so that it looks like the rows are selected.
>>> My thinking is that by using the list box code to select the rows, that’s
>>> causing 4D to reload the records. The thought "Why would you want to do
>>> that (if you don’t have to)?”, comes to mind. :-)
>>> --
>>> Douglas von Roeder
>>> 949-336-2902
>>> On Tue, Apr 16, 2019 at 7:22 AM Keith Culotta via 4D_Tech <
>>>> wrote:
>>>> Justin,
>>>> Thank you for the suggestion.
>>>> I switched the deselect-all code to
>>>>  LISTBOX SELECT ROW(*;"valsBox";1;lk replace selection)
>>>>  LISTBOX SELECT ROW(*;"valsBox";1;lk remove from selection)
>>>> and the selection did clear, however as soon as this add-to-selection
>> code
>>>> is executed
>>>>  LISTBOX SELECT ROW(*;"valsBox";0;lk replace selection)
>>>> 4D immediately crashes.
>>>> If all 40k rows get deselected, using either method, and selecting them
>>>> all again is done in a loop, the loop finishes in about two seconds.
>>>> At that point the macOS spinning wheel appears for three minutes. The
>>>> highlight then appears and control is returned to the app.
>>>> The fewer the records being highlighted, the shorter the macOS wheel
>> spins.
>>>> Regards,
>>>> Keith - CDI
>>>>> On Apr 15, 2019, at 7:50 PM, Justin Carr via 4D_Tech <
>>>>> wrote:
>>>>> On 16 Apr 2019, at 5:04 am, Keith Culotta via 4D_Tech <
>>>>> wrote:
>>>>>> Hello,
>>>>>> I'm looking for a fast way to highlight a selection of rows in an
>>>> entity selection listbox.  The way I am aware of works OK unless the
>>>> listbox gets a large number of rows.
>>>>>> Adding records to the Selected Items name in the Property list does
>> not
>>>> highlight the listbox contents.  The equivalent of adding records to the
>>>> "UserSet" is not available with entity selection listboxes.
>>>>>> Highlighting all with LISTBOX SELECT ROW(*;"listBox";0;lk add to
>>>> selection) crashes 4D if the listbox contains enough records.
>>>>>> LISTBOX SELECT ROW(*;"listBox";$position;lk add to selection) crashes
>>>> if put in a fast FOR loop.  If the loop is executed more slowly there is
>>>> success.  The slowness comes from looking for entitySelected[i] within
>> the
>>>> entity selection and highlighting its position in the listbox.
>>>>>> Is there a better way to get there?
>>>>> Hey Keith
>>>>> Are you clearing the listbox selection first (with LISTBOX SELECT
>>>> ROW(*;"listBox";0;lk remove from selection)? If so, that is probably the
>>>> cause of the crashing you are seeing. You can workaround it by
>> highlighting
>>>> and unhighlighting the first row instead, i.e.
>>>>> LISTBOX SELECT ROW(*;"listBox";1;lk replace selection)
>>>>> LISTBOX SELECT ROW(*;"listBox";1;lk remove from selection)
>>>>> cheers
>>>>> Justin

4D Internet Users Group (4D iNUG)

Reply via email to