Subscribe for automatic updates: RSS icon RSS

Login icon Sign in for full access | Help icon Help
Advanced search

Pages: [1]
  Reply  |  Print  
Author Topic: Passing a dynamic array of record to a function.  (Read 10245 times)
Ben R.
Posts: 28

« on: April 10, 2014, 09:16:07 pm »

We have a number of programs that display tables including both database and formonly columns. With this in mind, sometimes it's necessary to have a program default to sorting by a formonly column. I wrote a single-use function for sorting on the particular column in one application, but wanted to convert it into something a bit more reusable. The problem I'm running into is that I'm not seeing a way to pass an array of record to a function without the function specifically declaring the record type.

Here's what I'm running into:

function sort_array(sortArray, sortColumn)
    sortArray dynamic array of record,
| A grammatical error has been found at ',' expecting: IDENT LIKE.
| See error number -6609.
    sortColumn string,
    sortFlag integer,
    sortRow integer

  let sortFlag = 1
  let arraySize = sortArray.getLength()

  while sortFlag = 1
    let sortFlag = 0

    for sortRow = 1 to arraySize + 1 step 1
      if sortArray[sortRow].sortColumn < sortArray[sortRow + 1].sortColumn then
        let sortFlag = 1
        let sortArray[arraySize + 1].* = sortArray[sortRow].*
        let sortArray[sortRow].* = sortArray[sortRow + 1].*
        let sortArray[sortRow + 1].* = sortArray[arraySize + 1].*
      end if
    end for
  end while

  call sortArray.deleteElement(arraySize + 1)
end function

Any thoughts on how to handle this, or what a better approach to the problem would be? The individual-use version I have works because it's calling on a global array of record that has been previously defined, but that's not a very portable approach.
Reuben B.
Four Js
Posts: 965

« Reply #1 on: April 11, 2014, 12:35:20 am »

Ask your support contact to add you to list of requestors for Bz3491
As the issue notes, the difficulty is handling the case if you sort whilst in a dialog.

For the sort problem, in the past I had a pre-processor directive

&define arraysort(p_arr,p_sort,p_temp,i1,i2) FOR i1 = 1 TO p_arr.getLength() \
        FOR i2 = (i1+1) TO p_arr.getLength() \
            IF p_arr[i1].p_sort > p_arr[i2].p_sort THEN \
                LET p_temp.* = p_arr[i2].* \
                LET p_arr[i2].* = p_arr[i1].* \
                LET p_arr[i1].* = p_temp.* \
            END IF \
        END FOR \

and then I could code ...

arraysort(array-variable,sort-column, temp-variable, idx1, idx2)

... only hassle I recall was having to have the temp-variable and two variables for indices defined.

From 2.50 on, I would investigate writing a function using the JSONObject and JSONArray methods.  A quick test suggests something similar to ...

FUNCTION json_array_sort(ja, sort_col)
DEFINE ja util.JSONArray
DEFINE jo1, jo2,t util.JsonObject

    FOR i = 1 TO ja.getLength()
        FOR j = (i+1) TO ja.getLength()
            LET jo1 = ja.get(i)
            LET jo2 = ja.get(j)
            IF jo1.get(sort_col) > jo2.get(sort_col) THEN
                LET t = jo2
                CALL ja.put(i,jo2)
                CALL ja.put(j,jo1)
            END IF
        END FOR

... could be called by ...

DEFINE ja util.JSONArray

    LET ja = util.JSONArray.fromFGL(array-variable)
    CALL json_array_sort(ja,sort-column)
    CALL ja.toFGL(array-variable)

... there is probably room for improvement but that is a starting point.

It builds on a technique I've used before where my copy entire array to clipboard function used base.Typeinfo so that the function took as input a DomDocument, not an array, and hence could be called by any array e.g.

CALL copy_entire_array_to_clipboard(base.TypeInfo(array-variable))

Hope that helps,


Product Consultant (Asia Pacific)
Developer Relations Manager (Worldwide)
Author of
Contributor to
Pages: [1]
  Reply  |  Print  
Jump to:  

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines