O objetivo dessa etapa é criar um grid em bootstrap e colocar os dados da tabela
no grid

Confesso que fiquei um pouco decepcionado. Eu imaginava um grid no estilo PHP/ASP,
do tipo que fica o código HTML e o da linguagem "convivendo" sem ter que ficar "printando"
comandos HTML com o código PHP ou ASP, mas como as minhas expectativas foram frustradas na etapa 3
(exemplo do if/endif) a unica solução (até que não ficou ruim) foi criar uma função FData() para retornar 
os dados e evitar ao máximo ficar "printando" códigos htmls. Mas é o que tem para hoje.
Dá pra fazer muita coisa com o mod_harbour. É se adaptar e ir criando as soluções com o que está disponível.

Para quem não entendeu o que eu quis dizer, veja um exemplo em PHP :

[code]
 <body> 
      <table border="1"> 
        <tr> 
          <td>Código</td> 
          <td>Nome</td> 
          <td>E-mail</td> 
          <td>Data de Cadastro</td> 
          <td>Ação</td> 
        </tr> 
        <?php while($dado = $con->fetch_array()) { ?> 
        <tr> 
          <td><?php echo $dado['usu_codigo']; ?></td>
          <td><?php echo $dado['usu_nome']; ?></td> 
          <td><?php echo $dado['usu_email']; ?></td> 
          <td><?php echo date('d/m/Y', strtotime($dado['usu_datadecadastro'])); ?></td> 
          <td> 
            <a href="usu_editar.php?codigo=<?php echo $dado['usu_codigo']; ?>">Editar</a> 
            <a href="usu_excluir.php?codigo=<?php echo $dado['usu_codigo']; ?>">Excluir</a> 
          </td> 
        </tr> 
        <?php } ?> 
      </table> 
[/code]

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"

   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
		? "<script>alert('Failed open table EMP')</script>"
		Return
	Endif

TEMPLATE PARAMS oRs

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="description" content="">
    <meta name="author" content="Vlademiro">
    <title>Sistema </title>

    <!-- Bootstrap core CSS -->
	<link href="css/bootstrap.min.css" rel="stylesheet">

  </head>
  <body>

<main role="main" class="container">

  
  <h1>Tutorial de Mod-Harbour + Grid</h1>
  <p class="lead">Grid versão inicial</p>
    <div class="row">
      <table id="registros" class="table table-striped">
              <thead><tr><th>EMPNO</th><th>ENAME</th></tr></thead>
              <!-- Dados -->
              <tbody>
              <!-- Dados -->
              <?prg
              return FData( oRs )
              ?>
              </tbody>
                      
      </table>
      </div>
  
  

</main><!-- /.container -->
</body>
</html>

 
ENDTEXT  

return nil

FUNCTION FData( oRs )

    LOCAL cData := ""

    if oRs:recordcount > 0
        oRs:Movefirst()
        do while !oRs:eof()
            cData += "<tr>"
            
            cData += "<td>" + hb_ntos( oRs:fields("empno"):value ) + "</td>"
            cData += "<td>" + oRs:fields("ename"):value + "</td>"
            
            cData += "</tr>"
            oRs:movenext()
        enddo
        oRs:Movefirst() // Opcional, retorna para o primeiro registro
    endif

    RETURN cData
    
[/code]

Nada mal.