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

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