QSORT statement
Purpose: QSORT sorts an array (or portion). The array can be integer, floating point or string. Note that string array comparisons are case insensitive, that is, 'A' is equal to 'a'.
Syntax 1: QSORT Array, Elements, [Order] Parameters:
|
Syntax 2: QSORT DYNAMIC Array, Elements, [Order] Parameters:
|
Examples:
QSORT Buffer$, 1000, DESCENDING QSORT MyNum!, 300, ASCENDING QSORT TestScores#, 50
BCX Console Sample Programs using QSORT function.
QSORTIDX statement
Purpose: QSORTIDX will sort, very quickly, a table of data arrays. Note well that the array on which the sort is done must be a string or char data type and can not be a numerical data type.
Syntax 1:
QSORTIDX IndexArray, NumRecs, ArrayToSort, KeyField
Parameters:
|
Example 1:
CONST
GivenName=
0
CONST
Surname=
1
CONST
Address=
2
CONST
City=
3
CONST
State=
0
CONST
Zip=
1
CONST
Income=
0
CONST
NumRecs=
3
CONST
LastRec=
NumRecs-
1
DIM
i%DIM
DYNAMIC
IdxAry[
NumRecs]
'GivenName, Surname , Address, City
DIM
DYNAMIC
ContactAry1$[
4
, NumRecs]
'4 fields(2048 chars each), 3 records
'State and Zip code
DIM
DYNAMIC
ContactAry2$[
2
, NumRecs,10
]
AS
CHAR
'2 fields(10 chars each), 3 records
'Annual income
DIM
DYNAMIC
ContactAry3#[
1
, NumRecs]
'1 field(double precision float), 3 records
ContactAry1$[
GivenName,0
]
=
"Katrina"
ContactAry1$[
Surname,0
]
=
"Van Tassel"
ContactAry1$[
Address,0
]
=
"18 North Broadway"
ContactAry1$[
City,0
]
=
"Sleepy Hollow"
ContactAry2$[
State,0
]
=
"N.Y."
ContactAry2$[
Zip,0
]
=
"10591-1806"
ContactAry3#[
Income,0
]
=
1500250.98
ContactAry1$[
GivenName,1
]
=
"Ichabod"
ContactAry1$[
Surname,1
]
=
"Crane"
ContactAry1$[
Address,1
]
=
"Route 9H"
ContactAry1$[
City,1
]
=
"Kinderhook"
ContactAry2$[
State,1
]
=
"NY"
ContactAry2$[
Zip,1
]
=
"12106"
ContactAry3#[
Income,1
]
=
40.96
ContactAry1$[
GivenName,2
]
=
"Abraham 'Brom Bones'"
ContactAry1$[
Surname,2
]
=
"Van Brunt"
ContactAry1$[
Address,2
]
=
"540 North Broadway"
ContactAry1$[
City,2
]
=
"North Tarrytown"
ContactAry2$[
State,2
]
=
"New York"
ContactAry2$[
Zip,2
]
=
"10591"
ContactAry3#[
Income,2
]
=
50025.98
' Sort by element in ContactAry1
CALL
SortAndPrint(
ContactAry1, Surname,"Surname"
)
' Sort by element in ContactAry2
CALL
SortAndPrint(
ContactAry2, Zip,"Zip"
)
END
SUB
SortAndPrint(
TheArrayAS
CHAR
PTR
PTR
PTR
, key, KeyNameNdx$)
QSORTIDX
IdxAry, NumRecs, TheArray, keyFOR
i%=
0
TO
LastRec"Record "
, i%," sorted by key "
, KeyNameNdx$[
GivenName, IdxAry[
i]
]
'GivenName
[
Surname, IdxAry[
i]
]
'Surname
[
Address, IdxAry[
i]
]
'Addressess
[
City, IdxAry[
i]
]
'City
[
State, IdxAry[
i]
]
'State
[
Zip, IdxAry[
i]
]
'Zip
USING$
(
"$#,###,###.##"
, _ ContactAry3#[
Income, IdxAry[
i]
]
)
'Income
" "
NEXT
i%END
SUB
KEYPRESS
Syntax 2:
QSORTIDX IndexArray, NumRecs, UDT.MemberToSort, 0
Parameters:
|
Example 2: This example uses user defined type records.
TYPE
MyRecord GivenName[
50
]
AS
CHAR
Surname[
50
]
AS
CHAR
AgeAS
INTEGER
Address[
100
]
AS
CHAR
City[
100
]
AS
CHAR
State[
30
]
AS
CHAR
Zip[
15
]
AS
CHAR
IncomeAS
INTEGER
END
TYPE
DIM
NumRecs%=
3
DIM
LastRec% LastRec%=
NumRecs-
1
GLOBAL
DYNAMIC
Addr[
NumRecs]
AS
MyRecordGLOBAL
DYNAMIC
Idx[
NumRecs]
Addr[
0
]
.GivenName$=
"Katrina"
Addr[
0
]
.Surname$=
"Van Tassel"
Addr[
0
]
.Age%=
16
Addr[
0
]
.Address$=
"18 North Broadway"
Addr[
0
]
.City$=
"Sleepy Hollow"
Addr[
0
]
.State$=
"N.Y."
Addr[
0
]
.Zip$=
"10591-1806"
Addr[
0
]
.Income%=
150
Addr[
1
]
.GivenName$=
"Ichabod"
Addr[
1
]
.Surname$=
"Crane"
Addr[
1
]
.Age%=
48
Addr[
1
]
.Address$=
"Route 9H"
Addr[
1
]
.City$=
"Kinderhook"
Addr[
1
]
.State$=
"NY"
Addr[
1
]
.Zip$=
"12106"
Addr[
1
]
.Income%=
40
Addr[
2
]
.GivenName$=
"Abraham 'Brom Bones'"
Addr[
2
]
.Surname$=
"Van Brunt"
Addr[
2
]
.Age%=
19
Addr[
2
]
.Address$=
"540 North Broadway"
Addr[
2
]
.City$=
"North Tarrytown"
Addr[
2
]
.State$=
"New York"
Addr[
2
]
.Zip$=
"10591"
Addr[
2
]
.Income%=
5
CALL
SortAndPrint(
0
)
CALL
SortAndPrint(
1
)
CALL
SortAndPrint(
2
)
CALL
SortAndPrint(
3
)
CALL
SortAndPrint(
4
)
CALL
SortAndPrint(
5
)
CALL
SortAndPrint(
6
)
CALL
SortAndPrint(
7
)
SUB
SortAndPrint(
field)
SELECT
CASE
fieldCASE
0
QSORTIDX
Idx,3
, Addr.GivenName,0
CASE
1
QSORTIDX
Idx,3
, Addr.Surname,0
CASE
2
QSORTIDX
Idx,3
, Addr.Age,0
CASE
3
QSORTIDX
Idx,3
, Addr.Address,0
CASE
4
QSORTIDX
Idx,3
, Addr.City,0
CASE
5
QSORTIDX
Idx,3
, Addr.State,0
CASE
6
QSORTIDX
Idx,3
, Addr.Zip,0
CASE
7
QSORTIDX
Idx,3
, Addr.Income,0
END
SELECT
FOR
INTEGER
i%=
0
TO
LastRec"Record "
, i%," sorted by key "
, field%[
Idx[
i]
]
.GivenName$'GivenName
[
Idx[
i]
]
.Surname$'Surname
[
Idx[
i]
]
.Age%'Surname
[
Idx[
i]
]
.Address$'Addressess
[
Idx[
i]
]
.City$'City
[
Idx[
i]
]
.State$'State
[
Idx[
i]
]
.Zip$'Zip
[
Idx[
i]
]
.Income%'Income
" "
NEXT
i%END
SUB
Syntax 3:
QSORTIDX 0, NumRecs, UDT.MemberToSort, 0
Parameters:
|
Example 3: This example uses user defined type records without an index array.
TYPE
MyRecord GivenName[
50
]
AS
CHAR
Surname[
50
]
AS
CHAR
AgeAS
INTEGER
Address[
100
]
AS
CHAR
City[
100
]
AS
CHAR
State[
30
]
AS
CHAR
Zip[
15
]
AS
CHAR
IncomeAS
INTEGER
END
TYPE
DIM
NumRecs%=
3
DIM
LastRec% LastRec%=
NumRecs-
1
GLOBAL
DYNAMIC
Addr[
NumRecs]
AS
MyRecord Addr[
0
]
.GivenName$=
"Katrina"
Addr[
0
]
.Surname$=
"Van Tassel"
Addr[
0
]
.Age%=
16
Addr[
0
]
.Address$=
"18 North Broadway"
Addr[
0
]
.City$=
"Sleepy Hollow"
Addr[
0
]
.State$=
"N.Y."
Addr[
0
]
.Zip$=
"10591-1806"
Addr[
0
]
.Income%=
150
Addr[
1
]
.GivenName$=
"Ichabod"
Addr[
1
]
.Surname$=
"Crane"
Addr[
1
]
.Age%=
48
Addr[
1
]
.Address$=
"Route 9H"
Addr[
1
]
.City$=
"Kinderhook"
Addr[
1
]
.State$=
"NY"
Addr[
1
]
.Zip$=
"12106"
Addr[
1
]
.Income%=
40
Addr[
2
]
.GivenName$=
"Abraham 'Brom Bones'"
Addr[
2
]
.Surname$=
"Van Brunt"
Addr[
2
]
.Age%=
19
Addr[
2
]
.Address$=
"540 North Broadway"
Addr[
2
]
.City$=
"North Tarrytown"
Addr[
2
]
.State$=
"New York"
Addr[
2
]
.Zip$=
"10591"
Addr[
2
]
.Income%=
5
CALL
SortAndPrint(
0
)
CALL
SortAndPrint(
1
)
CALL
SortAndPrint(
2
)
CALL
SortAndPrint(
3
)
CALL
SortAndPrint(
4
)
CALL
SortAndPrint(
5
)
CALL
SortAndPrint(
6
)
CALL
SortAndPrint(
7
)
SUB
SortAndPrint(
field)
SELECT
CASE
fieldCASE
0
QSORTIDX
0
,3
, Addr.GivenName,0
CASE
1
QSORTIDX
0
,3
, Addr.Surname,0
CASE
2
QSORTIDX
0
,3
, Addr.Age,0
CASE
3
QSORTIDX
0
,3
, Addr.Address,0
CASE
4
QSORTIDX
0
,3
, Addr.City,0
CASE
5
QSORTIDX
0
,3
, Addr.State,0
CASE
6
QSORTIDX
0
,3
, Addr.Zip,0
CASE
7
QSORTIDX
0
,3
, Addr.Income,0
END
SELECT
FOR
INTEGER
i%=
0
TO
LastRec"Record "
, i%," sorted by key "
, field%[
i]
.GivenName$'GivenName
[
i]
.Surname$'Surname
[
i]
.Age%'Surname
[
i]
.Address$'Addressess
[
i]
.City$'City
[
i]
.State$'State
[
i]
.Zip$'Zip
[
i]
.Income%'Income
" "
NEXT
i%END
SUB
Example 4: This example QSORTIDX syntax sorts the records in the range 5 thru 15.
QSORTIDX
0
,10
,&
UDT[
5
]
.MemberToSort,0