* Gerando o JSON dinâmicamente com mod-harbour

Essa parte já foi vista na primeira parte do nosso tutorial, é laço que lerá os dados. 

Apenas acrescento duas coisas :

(1) O laço terá seus dados armazenados em um array de hash para posterir conversão em JSON
(2) Use hb_JsonEncode para criar o json e exibir

* Obs: Não deve ter nada impresso antes da exibição do JSON, por isso usei ?? e não ?.


O nosso código ficou assim :
[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 hReg 
   LOCAL aReg := {}

   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
		Return "ERRO"
	Endif
   if oRs:recordcount > 0
        oRs:Movefirst()
        do while !oRs:eof()
            hReg := {=>}
            hReg[ "id" ] := oRs:fields("empno"):value 
            hReg[ "nome" ] := oRs:fields("ename"):value 
            AADD( aReg , hReg )
            oRs:movenext()
        enddo
        oRs:Movefirst() // Opcional, retorna para o primeiro registro
    endif    
    ?? hb_JsonEncode( aReg )

return nil

[/code]

No nosso cliente apenas informo que ele deve pegar de dados.prg e não mais de dados.json

[code]
url: "dados.prg",
[/code]

Aproveitei e coloquei um método a mais AJAX do JQuery, é o simples, é só para ele retornar
algo em caso de erro. Por exemplo, o seu servidor pode estar fora do ar. O usuário precisa
pelo menos saber disso, senão fica um grid estático sem nada. 

Isso é feito com :
[code]
error: function (xhr, ajaxOptions, thrownError) {
							alert(xhr.status);
							alert(thrownError);
						  }		
[/code]

Dentro da função $.ajax do JQuery. O mesmo princípio da função de usuário da DBEDIT também.

