O objetivo dessa etapa é criar uma conexão via ADO/ODBC com um banco de dados MSAccess

Caso você esteja usando um windows 7 e não tiver instalado o cliente para MsAccess (64bits), 
o exemplo não vai funcionar.

Isso porque esse harbour, distribuido junto com a mod-harbour é um harbour 
compilado para arquiteturas 64 bits e o seu ODBC também será o de 64bits.

A Microsoft disponibiliza dois ODBCs, um para cada arquitetura. 

No meu caso, o meu windows é o 7 (64bits)

O ODBC 64 bits está em painel de controle, etc. 
%systemdrive%\Windows\System32\odbcad32

O ODBC 32 está em  %systemdrive%\Windows\SysWoW64\odbcad32 <-- Usado pelo harbour 32 bits (não é esse o caso)

É estranho. Deveria ser odbcad32 e odbcad64, mas não é.

Caso não tenha o cliente ODBC instalado vc deve baixar ele de :
https://www.microsoft.com/en-us/download/confirmation.aspx?id=54920

Se não tiver os exemplos não vão funcionar.

**

Essa versão do mod-harbour compilada pode acessar DBF, ADO (todos os bancos, via ODBC) e SQLite. 
As demais versões de acesso nativo aos bancos não estão inclusas.
Para vc ter isso (PostgreSQL nativo, MySQL nativo, Firebird nativo, Oracle nativo) você precisa compilar o seu
próprio mod_harbour com um harbour que tenha esses acessos devidamente configurados.

**
[code]
#define adOpenForwardOnly 0
#define adOpenKeyset 1
#define adOpenDynamic 2
#define adOpenStatic 3
#define adLockReadOnly 1
#define adLockPessimistic 2
#define adLockOptimistic 3
#define adLockBatchOptimistic 4
#define adUseNone 1
#define adUseServer 2
#define adUseClient 3
#define adStateClose 		0

function main

   LOCAL oRs , oCn, cSql
   LOCAL cString := "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + PathBase() + "/scott.mdb"
   LOCAL i


   for i = 0 to 25
      ?? hb_Version( i )
   endfor

   oCn := win_oleCreateObject( "ADODB.Connection" ) 
   oCn:ConnectionString := cString
   oCn:Open()
   

	oRs := win_oleCreateObject( "ADODB.Recordset" ) 
	oRs:CursorLocation = adUseClient
	oRs:Open( "SELECT * FROM emp", oCn , adOpenDynamic, adLockOptimistic )
	if oCn:State = adStateClose
		? ('Failed open table EMP')
		Return
	Endif
	if oRs:recordcount > 0
		oRs:Movefirst()
		do while !oRs:eof()
			? oRs:fields("ename"):value
			oRs:movenext()
		enddo
		oRs:Movefirst() // Opcional, retorna para o primeiro registro
	endif

return nil
[/code]






