I had a need to sort a string array and I found some code on Real Gagnon’s website that sorted numbers by creating a DataStore/DataWindow on the fly and used that to sort. Someone added a comment that for strings you need to define the column as char to avoid errors. I improved the code by adding a loop to determine the longest string in the array and using that when defining the DataWindow source.
public function boolean of_sortarray (ref string as_array[], string as_order);// —————————————————————————–
// SCRIPT: of_SortArray
//
// PURPOSE: This function sorts the passed array using a DataStore created
// on-the-fly.
//
// This is based on code from Real Gagnon:
// http://www.rgagnon.com/pbdetails/pb-0114.html
//
// ARGUMENTS: as_array – Array of values to sort
// as_order – The sort order:
//
// Order value Resulting sort order
// ———————— —————————
// a, asc, ascending, ai, i Case-insensitive ascending
// d, desc, descending, di Case-insensitive descending
// as, s Case-sensitive ascending
// ds Case-sensitive descending
//
// DATE PROG/ID DESCRIPTION OF CHANGE / REASON
// ———- ——– —————————————————–
// 09/27/2016 RolandS Initial Coding
// —————————————————————————–
DataStore lds_sort
String ls_source, ls_error
Long ll_idx, ll_max, ll_len, ll_maxlen
Integer li_rc
// determine maximum length of values
ll_max = UpperBound(as_array)
For ll_idx = 1 To ll_max
ll_len = Len(as_array[ll_idx])
If ll_len > ll_maxlen Then
ll_maxlen = ll_len
End If
Next
// build DataWindow source code
ls_source = “release 6; datawindow( processing=0 ) ” + &
“table(column=(type=char(” + String(ll_maxlen) + &
“) name=array dbname=~”array~” ) )”
// create DataStore
lds_sort = Create DataStore
li_rc = lds_sort.Create(ls_source, ls_error)
If li_rc = 1 Then
// put data into DataStore
lds_sort.Object.array.Current = as_array
// sort the data
lds_sort.SetSort(“array ” + as_order)
lds_sort.Sort()
// set array to sorted data
as_array = lds_sort.Object.array.Current
Else
Return False
End If
// destroy DataStore
Destroy lds_sort
Return True
end function
Comments (2)