Page 1 of 1

ADS NTX AND CDX

Posted: Sat Jun 18, 2011 3:49 am
by Janko
Roger,

is it possible to handle FOXCDX and DBFNTX systems VIA ADSDBE at the same time in same application? I have plenty of programs using both sorts of tables, but only prevailing one is running VIA ADS. Is there a solution?

Regards
Janko

Re: ADS NTX AND CDX

Posted: Sat Jun 18, 2011 7:20 am
by rdonnay
This looks like a limitation of ADSDBE, but I am not entirely sure about this.

I'm going to write a test program to see if I can find a workaround.

Re: ADS NTX AND CDX

Posted: Sat Jun 18, 2011 7:52 am
by rdonnay
Here is the solution. You simply need to call AdsNtx() before opening NTX databases and AdsCdx() before opening CDX databases.

Code: Select all

#INCLUDE "dcdialog.CH"
#INCLUDE "adsdbe.CH"

#Pragma Library("dclipx.lib")
#Pragma Library("dclip1.lib")

FIELD test1, test2

FUNCTION Main()

LOCAL cSession, oSession, cError, cDrive, aStru, i

IF ! DbeLoad( "ADSDBE" )
  DC_WinAlert( "Unable to load ADSDBE", "ADS Server",, ;
                      XBPMB_WARNING + XBPMB_APPMODAL )
  QUIT
ENDIF

cDrive := CurDrive() + ':'

cSession := "DBE=ADSDBE;SERVER=" + cDrive
oSession := DacSession():new(cSession)
IF !oSession:isConnected()
  cError := "Error Code: " + Alltrim(Str(oSession:getLastError())) + Chr(13) + oSession:getLastMessage()
  DC_WinAlert( "Unable to establish connection to ADS Server" + Chr(13) + cError )
  QUIT
ENDIF

aStru := {{ 'TEST1','C',10,0 }, ;
          { 'TEST2','C',10,0 }}

AdsNtx()

DbCreate( 'TESTNTX.DBF', aStru, 'ADSDBE' )
USE TESTNTX EXCLUSIVE NEW
INDEX ON TEST1 TAG 'TEST1' TO TESTNTX1
INDEX ON TEST2 TAG 'TEST2' TO TESTNTX2
SET INDEX TO TESTNTX1, TESTNTX2
FOR i := 1 TO 9
  TESTNTX->(dbAppend())
  REPLACE TESTNTX->test1 WITH 'TEST1_' + Alltrim(Str(i))
  REPLACE TESTNTX->test2 WITH 'TEST2_' + Alltrim(Str(i))
NEXT
TESTNTX->(dbGoTop())

AdsCdx()

DbCreate( 'TESTCDX.DBF', aStru, 'ADSDBE' )
USE TESTCDX EXCLUSIVE NEW
INDEX ON TEST1 TAG 'TEST1' TO TESTCDX
INDEX ON TEST2 TAG 'TEST2' TO TESTCDX
FOR i := 1 TO 9
  TESTCDX->(dbAppend())
  REPLACE TESTCDX->test1 WITH 'TEST1_' + Alltrim(Str(i))
  REPLACE TESTCDX->test2 WITH 'TEST2_' + Alltrim(Str(i))
NEXT
TESTCDX->(dbGoTop())

DC_Dot()

RETURN nil

* -------------

PROC appsys ; RETURN

* -------------

FUNCTION AdsNtx()

dbeSetDefault('ADSDBE')
DbeInfo( COMPONENT_DATA, ADSDBE_TBL_MODE, ADSDBE_NTX )
DbeInfo( COMPONENT_ORDER, ADSDBE_TBL_MODE, ADSDBE_NTX )

RETURN nil

* ---------

FUNCTION AdsCdx()

dbeSetDefault('ADSDBE')
DbeInfo( COMPONENT_DATA, ADSDBE_TBL_MODE, ADSDBE_CDX )
DbeInfo( COMPONENT_ORDER, ADSDBE_TBL_MODE, ADSDBE_CDX )

RETURN nil