FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Manual de HDBC RDD
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Manual de HDBC RDD
Posted: Thu Mar 12, 2026 11:17 PM

Manual de Referencia de HDBC RDD (Replaceable Database Driver)

El RDD de HDBC (RDDHDBC) es un motor que permite a los programadores de Harbour interactuar con cualquier base de datos SQL conectada mediante HDBC utilizando los comandos clásicos de xBase (USE, APPEND BLANK, REPLACE, SKIP, SEEK, SET FILTER, etc.).

Esta capa traduce en tiempo real las operaciones procedurales al dialecto SQL del motor configurado (SQLite, MySQL, PostgreSQL, etc.), lo que es ideal para portar aplicaciones "Legacy" o para desarrolladores que prefieran evitar el uso de objetos y sentencias SQL manuales.


---

1. Configuración Inicial e Inyección del RDD

Para comenzar, debe enlazar el núcleo de conexión THDbc global al sistema de RDDs de Harbour.

Code (harbour): Select all Collapse
#include "hdbc_conn.ch"
#include "hdbc.ch"
#include "rddsys.ch"

PROCEDURE Main()
   LOCAL oDbc := THDbc():new( HDBC_DRIVER_SQLITE )
   
   oDbc:connect( "database=test_rdd.db" )
   
   // 1. Registrar el driver en el subsistema RDD
   rddRegister( "RDDHDBC", RDT_FULL )
   
   // 2. Transmitir la conexión activa al ámbito RDD
   HDbcRdd_Init( oDbc )
   
   // 3. (Opcional) Hacerlo el RDD por defecto
   RddSetDefault( "RDDHDBC" )

[!TIP]
Al finalizar la aplicación, libere la memoria asociada llamando a HDbcRdd_End() antes de cerrar la conexión de THDbc.


---

2. Operaciones Básicas xBase (CRUD)

2.1 Creación de Tablas (dbCreate)

Puede crear tablas remotas usando diccionarios de arrays estándar de Harbour o el tipo especializado TIMESTAMP.

Code (harbour): Select all Collapse
LOCAL aStruct := { ;
   { "ID",      "N", 10, 0 }, ;
   { "NOMBRE",  "C", 50, 0 }, ;
   { "SALARIO", "N", 12, 2 }, ;
   { "FECHA",   "D",  8, 0 }, ;
   { "ACTIVO",  "L",  1, 0 }  ;
} 

dbCreate( "empleados", aStruct, "RDDHDBC" )

2.2 Apertura (USE)

Code (harbour): Select all Collapse
USE empleados ALIAS EMP VIA "RDDHDBC" NEW

IF NetErr()
   ? "Error abriendo tabla remota"
ENDIF

2.3 Altas (APPEND BLANK y REPLACE)

Code (harbour): Select all Collapse
SELECT EMP
APPEND BLANK
REPLACE FIELD->ID      WITH 1, ;
        FIELD->NOMBRE  WITH "Juan Pérez", ;
        FIELD->SALARIO WITH 2500.50, ;
        FIELD->ACTIVO  WITH .T.

2.4 Navegación (dbSkip, EOF, BOF)

Code (harbour): Select all Collapse
EMP->( dbGoTop() )
DO WHILE ! EMP->( Eof() )
   ? "ID:", EMP->ID, "Nombre:", EMP->NOMBRE
   EMP->( dbSkip() )
ENDDO

2.5 Bajas Lógicas y Físicas

Si su motor detecta una columna interna para eliminaciones lógicas (SoftDeletes), el comando DELETE realizará un UPDATE subyacente. Para borrados físicos convencionales (si no hay tabla soft-delete configurada), emitirá DELETE FROM.

Code (harbour): Select all Collapse
GOTO 2
DELETE
? "Registro 2 marcado como borrado. Deleted():", Deleted()

---

3. Funciones Avanzadas del RDD

3.1 Índices y Búsquedas (INDEX ON y dbSeek)

El RDD permite indexación dinámica local en memoria / servidor permitiendo búsquedas rápidas.

Code (harbour): Select all Collapse
USE clientes ALIAS CLI NEW VIA "RDDHDBC"
INDEX ON FIELD->nombre TAG por_nombre

SEEK "Maria García"
IF Found()
   ? "ENCONTRADA! ID:", CLI->id, "Ciudad:", CLI->ciudad
ENDIF

3.2 Filtrado y Contención (SET FILTER y SCOPES)

Mientras que el filtro evalúa registro a registro, HDBC también soporta los SCOPES (Acotaciones de Índice), los cuales son extremadamente más rápidos porque limitan la consulta nativa en su pre-generación inyectando sentencias lógicas.

Uso de SET FILTER:

Code (harbour): Select all Collapse
SET FILTER TO CLI->ciudad == "Madrid"
GO TOP
DO WHILE ! Eof()
   ? "Encontrado en Madrid:", CLI->nombre
   SKIP
ENDDO
SET FILTER TO // Limpiar Filtro

Uso de SCOPES (Filtro Inteligente Indexado):

Code (harbour): Select all Collapse
// Asumiendo un tag 'idx_ciudad' creado...
ORDSETFOCUS( "idx_ciudad" )
// Acota tanto por arriba (0) como por abajo (1)
ORDSCOPE( 0, "Madrid" )
ORDSCOPE( 1, "Madrid" )

GO TOP
// El bucle ahora sólo navega clientes de Madrid de modo relámpago
ORDSCOPE( 0, NIL ) // Limpiar scope

3.3 Relaciones Entidad-Referencia (SET RELATION)

Vincule cursores mediante apuntadores síncronos xBase para avanzar múltiples WorkAreas en paralelo:

Code (harbour): Select all Collapse
USE facturas ALIAS FAC NEW VIA "RDDHDBC"

SELECT CLI
INDEX ON FIELD->id TAG id_cli

SELECT FAC
SET RELATION TO FAC->cliente_id INTO CLI

GO TOP
DO WHILE ! Eof()
   // Por debajo, el driver localizará concurrentemente en el puntero de CLI
   ? "Factura:", FAC->id, "-> Cliente:", CLI->nombre
   SKIP
ENDDO

3.4 Inyección de Vistas SQL Complejas ("SQL-as-Table")

Este es uno de los recursos más potentes del RDDHDBC. Puede inyectar cualquier string puramente DML (SELECT ... JOIN ... GROUP BY) y montarlo como un WorkArea que puede ser escaneado unidireccionalmente.

Code (harbour): Select all Collapse
USE "SELECT c.nombre, COALESCE(SUM(f.total), 0) as total FROM clientes c LEFT JOIN facturas f ON c.id = f.cliente_id GROUP BY c.id, c.nombre" ALIAS RESUMEN NEW VIA "RDDHDBC"

IF Used()
   DO WHILE ! Eof()
      ? "Resumen:", RESUMEN->nombre, "Total:", RESUMEN->total
      SKIP
   ENDDO
   CLOSE RESUMEN
ENDIF

---

4. Transacciones y Bloqueos

El RDD soporta mecanismos híbridos valiéndose en el control de su objeto padre oDbc.

Transacciones

Emplee directamente el nivel oDbc para encapsular y revertir de acuerdo a las capacidades ACID del servidor:

Code (harbour): Select all Collapse
oDbc:beginTrans()

REPLACE SEC->saldo WITH SEC->saldo + 500

IF lTodoCorrecto
   oDbc:commit() 
ELSE
   oDbc:rollback()
ENDIF

---

5. Mantenimiento Físico (PACK y ZAP)

El RDDHDBC integra utilidades físicas nativas para el mantenimiento del modelo de datos tradicional xBase.

ZAP (Vaciado Completo)

Al invocar ZAP, el motor del RDD ignorará cualquier cláusula SQL DELETE FROM tradicional, e intentará ejecutar el comando nativo TRUNCATE TABLE en el servidor, reseteando la tabla sin castigar el log de transacciones (mucho más rápido).

Code (harbour): Select all Collapse
USE auditorias ALIAS AUD VIA "RDDHDBC" EXCLUSIVE
ZAP
? "Tabla de auditoría truncada radicalmente."

PACK (Purga de Bajas Lógicas SoftDeletes)

En las tablas tradicionales DBF PACK compactaba el archivo físico. En HDBC, si su tabla emplea "Bajas Lógicas" (una columna deleted_at), el comando genérico DELETE sólo hace Soft-Deletes rellenando la fecha, dejando las filas en base de datos.
Ejecutar el comando PACK mandará la instrucción SQL definitiva que extermina físicamente de la base de datos aquellos registros previamente marcados con la baja lógica, replicando el comportamiento xBase exacto.

Code (harbour): Select all Collapse
USE clientes ALIAS CLI VIA "RDDHDBC" EXCLUSIVE
PACK 
? "Base de datos saneada permanentemente de tuplas borradas."

Bloqueos de Registros Optimistas

Puede emitir instrucciones RLock() para reservar temporalmente los estados del cursor mientras se mutan datos atómicamente si el driver del RDMS lo permite.

Code (harbour): Select all Collapse
GO TOP
IF RLock()
   REPLACE SEC->saldo WITH 2000
   UNLOCK
ELSE
   ? "Alguien más tiene bloqueada esta fila."
ENDIF

Y esto funciona con:
MySQL, MariaDb, SQLite y clónicos, Postgres, Oracle, SQLServer, Interbase, Firebird y ODBC

Ya es una realidad escribir un PRG para cualquier base de datos!!!

______________________________________________________________________________

Sevilla - Andalucía
Posts: 56
Joined: Mon Apr 11, 2011 06:22 PM
Re: Manual de HDBC RDD
Posted: Fri Mar 13, 2026 09:05 AM

Impresionante trabajo. Enhorabuena !

Graciosa la frase : 'Base de datos saneada permanentemente de tuplas borradas'

Hasta ahora creia que una DBF quedaba 'compactada' no 'saneada' :)

Nada, un poco de humor que no desmerece para nada tu magnífico trabajo !

Posts: 1283
Joined: Fri Feb 10, 2006 02:34 PM
Re: Manual de HDBC RDD
Posted: Fri Mar 13, 2026 12:29 PM

Manu,

Un gran trabajo, sin duda la mejor opción para trabajar con bases de datos ! :D

C.

Salutacions, saludos, regards

"...programar es fácil, hacer programas es difícil..."

UT Page -> https://carles9000.github.io/
Forum UT -> https://discord.gg/bq8a9yGMWh
HIX -> https://github.com/carles9000/hix
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Manual de HDBC RDD
Posted: Fri Mar 13, 2026 07:52 PM

Página web donde poder comprarlo ya !!! :idea: :D

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 670
Joined: Wed Oct 19, 2005 06:41 PM
Re: Manual de HDBC RDD
Posted: Sat Mar 14, 2026 02:33 AM

Que felicidad ya veo mas cerca mi migracion gracias Manu, precios por favor para ir al ahorro gracias Wilson

Wilson 'W' Gamboa A
Wilson.josenet@gmail.com
Posts: 410
Joined: Sun Jan 31, 2010 03:30 PM
Re: Manual de HDBC RDD
Posted: Sat Mar 14, 2026 12:21 PM

Buen dia...

  1. Es aplicable a xharbour.org ?
  2. Rendimiento frente a : Eagle1, mariaDb(fw), dolphin , SQLRDD ... ?
  3. Comados xbase que no aplican ?
  4. Soporte : Tiempos de respuesta, FORO ... ?

JONSSON RUSSI

Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Manual de HDBC RDD
Posted: Sat Mar 14, 2026 01:54 PM

Hola Wilson, seguro que el precio de HDBC no va a ser el problema 😄😄😄

Hola Jonsson...

¿Es aplicable a xHarbour?

Todavía no he hecho pruebas, pero partiendo de que la API C y el sistema extendido de Harbour y xHarbour difieren en algunos puntos, y que HDBC está escrito al 100% en C++, hay bastantes posibilidades de que no sean compatibles de entrada.

Rendimiento frente a Eagle1, MariaDB (FW), Dolphin, SQLRDD…?

¡Uf, mi querido Eagle1! Desarrollarlo fue una experiencia increíble, igual que lo está siendo HDBC. Lo que te puedo decir es que los tiempos usando HDBC Direct son espectaculares.

¿Qué comandos xBase no aplican?

La parte de HDBC RDD la he diseñado para que sea 100% compatible como cualquier RDD estándar. Aun así, será el grupo de beta testers quien me vaya reportando posibles mejoras.

Soporte: tiempos de respuesta, foro…?

Tengo una idea en mente que anunciaré cuando esté decidido. Pero quienes apuesten por el proyecto desde el principio serán unos "privilegiados" — para mí es muy importante la confianza que cada uno deposite en HDBC.

______________________________________________________________________________

Sevilla - Andalucía
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: Manual de HDBC RDD
Posted: Sat Mar 14, 2026 06:38 PM

Hola Manuel.

Dos preguntas, con sqlrdd existen dos problemillas que deseo saber si lo has solventado en HDBC: 1.- soporte de ordkeyno. 2.-soporte de bloqueo de registro, registros y tablas. En sqlrdd en postgree y mssql solo funciona el punto 2, en los restantes no. Por lo que le pregunta va a qué se soporta, y con que dbengine.

Salu2

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Manual de HDBC RDD
Posted: Mon Mar 16, 2026 10:01 AM

Hola Carlos, espero que estés bien!!!

1.- soporte de ordkeyno.
Las funciones ordxxxx() son wrapper de la funcion estandar de las RDD OrdInfo() y DbInfo().
Pero en HDBC no está hecho. No obstante las implementaré todas.

2.-soporte de bloqueo de registro, registros y tablas.
Sí están pero basadas en las propias de la base de datos.

Como siempre, muchas gracias por la recomendación que siempre son muy buenas!!!

______________________________________________________________________________

Sevilla - Andalucía
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: Manual de HDBC RDD
Posted: Mon Mar 16, 2026 01:22 PM

Buenos días, xManuel, ¿habrá una versión de prueba para quienes no puedan permitirse comprarla?

Gracis, tks.

Regards, saludos.

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Manual de HDBC RDD
Posted: Mon Mar 16, 2026 11:42 PM

Algo tendré que hacer y seguro que pondré una demo.

Saludos y gracias por tu interés!!!

______________________________________________________________________________

Sevilla - Andalucía
Posts: 82
Joined: Mon Jan 19, 2009 04:40 PM
Re: Manual de HDBC RDD
Posted: Wed Mar 18, 2026 02:54 PM

Estimado,

1.- Trabaja el linux ? 2.- El uso de parametros en un SQL Statement, por ejemplo :

oStmt := oConnection:prepare( "update table set field = ? where id = ?") do while ... .... oStmt:execute( { val1 , val2 } ) .... enddo

Saludos Osvaldo Ramirez

Posts: 652
Joined: Wed Oct 19, 2005 12:03 PM
Re: Manual de HDBC RDD
Posted: Wed Mar 18, 2026 04:13 PM

Disculpen mi ignorancia de dónde se puede ingresar a la página de Manuel

Luis

Posts: 182
Joined: Tue Oct 18, 2005 10:01 AM
Re: Manual de HDBC RDD
Posted: Sun Mar 22, 2026 07:01 PM

Un trabajo profesional como siempre Manu. Sinceramente, es el primer "RDDSQL" que me motivó. Felicidades.

Posts: 467
Joined: Fri Dec 09, 2005 12:41 AM
Re: Manual de HDBC RDD
Posted: Mon Mar 23, 2026 04:59 PM

Estimado Manu

Muy interesante el Manual felicitaciones, Aprovechare este medio para solicitarte recibir tu apoyo y/o soporte en nuestro tema pendiente de HDO y eagle1, del cual me encuentro estancado sin poder avanzar desde el año pasado no puedo aplicarlo, espero tu pronta respuesta para que esto valga la pena

Te lo agradecere Lubin Azahuanche

Continue the discussion