Two independent, reproducible defects in the CDX seek/collation path when using OpenADS as a drop-in ace64.dll for a Harbour contrib/rddads app (local server, DBFCDX, AdsSetCharType(ADS_OEM), OEM_CHAR_SET=NTXPL852 in adslocal.cfg). Same program/data works against SAP ace64.dll 11.10.
Environment: OpenADS main @ a5ad6e5 (MSVC x64, Release). Harbour 3.2dev, rddads, RDD ADSCDX. AdsSetServerType(ADS_LOCAL_SERVER), AdsSetCharType(ADS_OEM,.T.), AdsSetFileType(2). Exports remapped to SAP ordinals via custom .def (consumer imports by ordinal); all 140 needed ordinals resolve, app loads.
Defect 1 — numeric-key dbSeek returns not-found
Build a normal DBFCDX table {COD N(6,0), NAME C(20,0)}, INDEX ON COD TAG codtag, then open VIA ADSCDX and dbSeek(<num>):
| dbSeek |
SAP ADS 11.10 |
OpenADS |
| dbSeek(300) |
found=T recno=3 |
found=F (EOF) |
| dbSeek(250) |
found=T recno=7 |
found=F |
| dbSeek(100) |
found=T recno=2 |
found=F |
Index ordering is correct on both (100 150 ... 500). Fails even on a DBFCDX-built index (before any ADS reindex), so it is a numeric seek-probe mismatch, not an index-build issue. Character-key dbSeek works.
Defect 2 — OEM national collation NTXPL852 not honored
Real 13,926-row table, tag on Upper(<charfield>), OEM_CHAR_SET=NTXPL852:
| Operation |
SAP ADS 11.10 |
OpenADS |
| walk index order |
LAC... |
LAC... (identical, reads existing order fine) |
| soft dbSeek("L") |
LAC... |
LAC... ok |
| soft dbSeek(Chr(157) "Ł") |
ŁAB... |
ŁAB... ok |
| soft dbSeek("M") |
MAD... |
ŁAB... WRONG |
| soft dbSeek("Z") |
ZBY... |
ŁAB... WRONG |
Genuine NTXPL852 (not binary): on SAP a soft seek of byte 141/189 → EOF while soft seek of Ł (157) finds Ł... — impossible under binary order, so positioning is by collation weight (Ł sorts between L and M). OpenADS mis-positions dbSeek("M")/dbSeek("Z") onto the Ł region → "search by name" lands on wrong record. Also, reindexing with OpenADS reorders by raw byte (Ł after Z) instead of the Polish collation.
Expected
- Numeric
dbSeek(<num>) locates the record (parity with SAP / DBFCDX).
- With
OEM_CHAR_SET=NTXPL852, both index build and collation-aware dbSeek use NTXPL852 (Clipper Polish 852), matching SAP ADS.
This blocks Central/Eastern-European Clipper/Harbour apps relying on an OEM national collation (NTX*852, Mazovia, ...) and on numeric-key seeks. Full repro program, real-index reader, run logs and the ordinal .def procedure available on request.
Two independent, reproducible defects in the CDX seek/collation path when using OpenADS as a drop-in
ace64.dllfor a Harbourcontrib/rddadsapp (local server, DBFCDX,AdsSetCharType(ADS_OEM),OEM_CHAR_SET=NTXPL852inadslocal.cfg). Same program/data works against SAPace64.dll11.10.Environment: OpenADS
main@ a5ad6e5 (MSVC x64, Release). Harbour 3.2dev, rddads, RDD ADSCDX.AdsSetServerType(ADS_LOCAL_SERVER),AdsSetCharType(ADS_OEM,.T.),AdsSetFileType(2). Exports remapped to SAP ordinals via custom.def(consumer imports by ordinal); all 140 needed ordinals resolve, app loads.Defect 1 — numeric-key dbSeek returns not-found
Build a normal DBFCDX table
{COD N(6,0), NAME C(20,0)},INDEX ON COD TAG codtag, then open VIA ADSCDX anddbSeek(<num>):Index ordering is correct on both (
100 150 ... 500). Fails even on a DBFCDX-built index (before any ADS reindex), so it is a numeric seek-probe mismatch, not an index-build issue. Character-key dbSeek works.Defect 2 — OEM national collation NTXPL852 not honored
Real 13,926-row table, tag on
Upper(<charfield>),OEM_CHAR_SET=NTXPL852:LAC...LAC...(identical, reads existing order fine)LAC...LAC...okŁAB...ŁAB...okMAD...ŁAB...WRONGZBY...ŁAB...WRONGGenuine NTXPL852 (not binary): on SAP a soft seek of byte 141/189 → EOF while soft seek of
Ł(157) findsŁ...— impossible under binary order, so positioning is by collation weight (Ł sorts between L and M). OpenADS mis-positionsdbSeek("M")/dbSeek("Z")onto the Ł region → "search by name" lands on wrong record. Also, reindexing with OpenADS reorders by raw byte (ŁafterZ) instead of the Polish collation.Expected
dbSeek(<num>)locates the record (parity with SAP / DBFCDX).OEM_CHAR_SET=NTXPL852, both index build and collation-awaredbSeekuse NTXPL852 (Clipper Polish 852), matching SAP ADS.This blocks Central/Eastern-European Clipper/Harbour apps relying on an OEM national collation (NTX*852, Mazovia, ...) and on numeric-key seeks. Full repro program, real-index reader, run logs and the ordinal
.defprocedure available on request.