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 7 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

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