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

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