Tech Articles


Sorting a string array


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)
Wednesday, Jun 12 2019

ls_source = “release 6; datawindow( processing=0 ) ” + &

Instead of hardcodidng release number, you can create a function uf_get_pb_version() with this code:

/**********************************************************************************************************************
Dscr: returns the major version number of PowerBuilder, for example: "9" (not "9.0"!)
***********************************************************************************************************************
Ret: PB version as string
**********************************************************************************************************************/
int li_rc
string ls_pb_version
environment lenv

li_rc = GetEnvironment(ref lenv)
if li_rc 1 then
MessageBox(this.ClassName() + ".uf_get_pb_version", "GetEnvironment() failed.", StopSign!)
return ""
end if

ls_pb_version = String(lenv.pbmajorrevision)

return ls_pb_version

Comment was last edited 6 years ago by Michael Zuskin
0

Wednesday, Jun 12 2019

The release version of a DataWindow object does not have to match the version of PowerBuilder you are using, it only has to be lower. You could make it match with GetEnvironment but it is not necessary.

0

Find Articles by Tag

TLS/SSL Source Code Configuration Icon Array DataWindow JSON Web API PDF SnapDevelop PowerServer Mobile CrypterObject PowerServer Web PostgreSQL Debug Installation ODBC RibbonBar SqlModelMapper DevOps Debugging Authorization ActiveX Import iOS API Service Stored Procedure Messagging Export Export JSON PowerScript (PS) 64-bit Web Service Proxy OrcaScript DataWindow CI/CD TreeView Database Profile Variable .NET Std Framework Branch & Merge OAuth 2.0 Deployment Source Control Authentication Filter Expression PDFlib SOAP Transaction MessageBox RESTClient PBNI Encryption Repository Event Linux OS .NET DataStore JSON SnapObjects PowerBuilder Compiler PBVM COM GhostScript Jenkins WinAPI Error OLE Automated Testing SQL UI Modernization WebBrowser Android Database Object Database Table Performance Data Database UI PFC Encoding Syntax Text Database Painter Menu C# PostgreSQL ODBC driver File Trial External Functions SQL Server Model Windows 10 Icons Script SVN .NET Assembly Bug Oracle Charts Design PowerBuilder DLL REST Platform Sort License Debugger Interface UI Themes Class Testing Windows OS Import JSON Window TortoiseGit Application Database Connection TFS NativePDF HTTPClient Resize BLOB SDK Database Table Schema RichTextEdit Control Open Source RibbonBar Builder DragDrop Graph SqlExecutor OAuth 32-bit Elevate Conference Git Event Handling Validation PBDOM JSONGenerator DataType PowerBuilder (Appeon) Excel JSONParser InfoMaker CoderObject Migration Outlook XML Visual Studio Mobile Database Table Data Azure IDE Event Handler