How to create VFP databases outside of VFP

Issues and Discussions related to Harbour

Moderator: Rathinagiri

Post Reply
HGAutomator
Posts: 202
Joined: Thu Jul 16, 2020 5:42 pm
DBs Used: DBF

How to create VFP databases outside of VFP

Post by HGAutomator »

Hi,

Did anyone develop an RDD or a procedure that can create VFP databases and take advantage of long field names? And then open the VFP database in order to query the tables?

I really hate using VFPs debugger, and prefer to work in Harbour, except for VFP's dot prompt.
User avatar
danielmaximiliano
Posts: 2763
Joined: Fri Apr 09, 2010 4:53 pm
DBs Used: DBF
Location: Argentina
Contact:

Re: How to create VFP databases outside of VFP

Post by danielmaximiliano »

¡Hola! Sí, el ecosistema de Harbour / xHarbour abordó este problema hace años mediante el motor RDDlet o RDD (Replaceable Database Driver) nativo y la librería SDBU/CDX. Harbour soporta de forma nativa los formatos DBFCDX y DBFNTX, pero los .dbf tradicionales limitan los nombres de campo a 10 caracteres.

Para trabajar con nombres de campo largos y contenedores de base de datos (.dbc) de Visual FoxPro, existen dos formas de encararlo: usando el RDD DBFCDX con emulación de tablas VFP o creando un RDD/Wrapper personalizado.


Opción 1: La solución nativa existente (RDD DBFCDX de Harbour)

Harbour permite trabajar con tablas de VFP usando el RDD DBFCDX indicando que use el formato de tipo VFP (HB_SET_CHARSET / SET (_SET_DBFLOCKSCHEME)). Sin embargo, las tablas .dbf sueltas de VFP con campos largos dependen de un diccionario contenedor .dbc (el encabezado de la tabla apuntará al archivo .dbc).

Para manejar nombres largos directamente en Harbour sin lidiar con el .dbc en bajo nivel, el RDD nativo permite mapear campos largos mediante alias o tablas asociadas.
Opción 2: Cómo diseñar un RDD para VFP con Campos Largos (VFP.DBC)

Si quieres entender cómo se implementa un RDD nativo en Harbour para soportar la lectura de un .dbc (que en el fondo no es más que otra tabla .dbf que actúa como diccionario de datos) y permitir sintaxis estilo VFP, la estructura conceptual es la siguiente:

Lectura del .dbc (Diccionario de Datos): El .dbc almacena la relación entre el nombre largo del campo y el nombre corto (10 caracteres) guardado en la cabecera real del .dbf.

Capa RDD / Mapeador: Al ejecutar un SELECT o USE, el RDD personalizado intercepta los nombres de campo largos, consulta la estructura del .dbc y los traduce al nombre físico real en el .dbf.

Ejemplo conceptual de cómo definir el RDD en Harbour (en C y Harbour):
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
Telegram invitation https://t.me/HMGWorkspace
User avatar
danielmaximiliano
Posts: 2763
Joined: Fri Apr 09, 2010 4:53 pm
DBs Used: DBF
Location: Argentina
Contact:

Re: How to create VFP databases outside of VFP

Post by danielmaximiliano »

Code: Select all

// Ejemplo de inicialización y uso del driver personalizado en Harbour

REQUEST DBFCDX

PROCEDURE Main()
   LOCAL aStruct
   
   // Registrar el driver si estás extendiendo DBFCDX
   // Set ( _SET_DEFAULT_RDD, "VFPLET" )

   // 1. Crear una tabla estilo VFP con campos largos usando la API de Harbour
   aStruct := { ;
      { "CODIGO_CLIENTE_PRINCIPAL", "C", 10, 0 }, ;
      { "NOMBRE_COMPLETO_DEL_USUARIO", "C", 50, 0 }, ;
      { "FECHA_ULTIMA_TRANSACCION", "D",  8, 0 }  ;
   }

   // Creación usando la función extendida de Harbour que soporta diccionarios
   hb_dbCreate( "clientes_vfp.dbf", aStruct, "DBFCDX" )

   ? "Tabla creada con éxito con nombres de campo de más de 10 caracteres."
RETURN
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
Telegram invitation https://t.me/HMGWorkspace
User avatar
danielmaximiliano
Posts: 2763
Joined: Fri Apr 09, 2010 4:53 pm
DBs Used: DBF
Location: Argentina
Contact:

Re: How to create VFP databases outside of VFP

Post by danielmaximiliano »

Código Práctico: Wrapper / RDD emulado para traducir campos largos

Si deseas evitar compilar C para un RDD complejo, puedes crear un "Virtual RDD" mediante la clase TDatabase o la directiva #command para simular la sintaxis de puntos de VFP y la traducción de nombres:

Code: Select all

#include "hbclass.ch"

// Simulación de lectura de tabla VFP con mapeo de campos largos
CLASS VfpTable
   DATA cDbcPath
   DATA cTable
   DATA aFieldMap INIT {=>}  // Hash: NombreLargo -> NombreCorto

   METHOD New( cDbc, cTable )
   METHOD Open()
   METHOD FieldGet( cLongName )
   METHOD FieldPut( cLongName, xVal )
ENDCLASS

METHOD New( cDbc, cTable ) CLASS VfpTable
   ::cDbcPath := cDbc
   ::cTable   := cTable
   
   // Ejemplo: Mapeo manual o extraído dinámicamente del archivo .dbc
   ::aFieldMap["NOMBRE_COMPLETO_CLIENTE"] := "NOMB_CLI"
   ::aFieldMap["CODIGO_IDENTIFICACION"]   := "COD_ID"
RETURN Self

METHOD Open() CLASS VfpTable
   USE ( ::cTable ) VIA "DBFCDX" SHARED
RETURN NIL

METHOD FieldGet( cLongName ) CLASS VfpTable
   LOCAL cShortName := ::aFieldMap[ Upper( cLongName ) ]
   RETURN FieldGet( FieldPos( cShortName ) )

METHOD FieldPut( cLongName, xVal ) CLASS VfpTable
   LOCAL cShortName := ::aFieldMap[ Upper( cLongName ) ]
   RETURN FieldPut( FieldPos( cShortName ), xVal )
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
Telegram invitation https://t.me/HMGWorkspace
User avatar
danielmaximiliano
Posts: 2763
Joined: Fri Apr 09, 2010 4:53 pm
DBs Used: DBF
Location: Argentina
Contact:

Re: How to create VFP databases outside of VFP

Post by danielmaximiliano »

Mapeo de sintaxis estilo VFP (Puntero/Puntos) en HarbourPara simular la sintaxis de VFP (Tabla.Campo) en lugar de FIELD->Campo o Tabla->Campo, Harbour permite usar la sintaxis de Objetos o Macros.
ayuda.png
ayuda.png (36.81 KiB) Viewed 152 times
Resumen de Recomendaciones

Si quieres trabajar con .dbf / .cdx directamente: Utiliza el RDD nativo DBFCDX de Harbour. Soporta bloqueos de VFP, tipos de datos como Currency, DateTime, Double y campos Integer auto-incrementables.

Si necesitas soporte de .dbc nativo de VFP: Te conviene compilar o usar wrappers como hbvfp o la librería sdbu, los cuales parsean las tablas contenedoras de FoxPro directamente desde C y traducen la estructura al RDD en tiempo de ejecución.
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
Telegram invitation https://t.me/HMGWorkspace
HGAutomator
Posts: 202
Joined: Thu Jul 16, 2020 5:42 pm
DBs Used: DBF

Re: How to create VFP databases outside of VFP

Post by HGAutomator »

Thanks anyway, but this doesn't allow us to create vfp .dbc containers and connect them to tables. This is just a custom data dictionary, which I already have.

Thanks for trying, Dan.
User avatar
danielmaximiliano
Posts: 2763
Joined: Fri Apr 09, 2010 4:53 pm
DBs Used: DBF
Location: Argentina
Contact:

Re: How to create VFP databases outside of VFP

Post by danielmaximiliano »

HGAutomator wrote: Tue Sep 08, 2026 10:26 pm Thanks anyway, but this doesn't allow us to create vfp .dbc containers and connect them to tables. This is just a custom data dictionary, which I already have.

Thanks for trying, Dan.
Harbour no soporta DBC.

se podría implementar un pequeño RDD/capa Harbour para el DBC.
El .DBC de VFP no es magia. Es un formato estructurado que contiene metadatos que describen las tablas y sus propiedades.

trabaje muy poco con forxpro hasta VFP9
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
Telegram invitation https://t.me/HMGWorkspace
User avatar
danielmaximiliano
Posts: 2763
Joined: Fri Apr 09, 2010 4:53 pm
DBs Used: DBF
Location: Argentina
Contact:

Re: How to create VFP databases outside of VFP

Post by danielmaximiliano »

Hola a todos:
con mi amigo fallecido hace mucho habiamos hecho una app en VFP9 para una empresa de zapatos la cual funciono mucho tiempo, la app
original quedo en una computadora que no tuve mas accesso asi que busque ejemplos en la web hasta que encontre una muy interesante.
esta en el .rar que comparto.

estan los fuentes + los ejecutable , como la mayoria no tiene instalado VFP9 adjunto el rutime que hay que instalar para ejecutar la app ya compiladas de VFP9 ( VFP9SP0RT.exe )
ejecutar despues :

Code: Select all

C:\Proyectos\Sample\ClientServerVFP\ThreeTierSPT\threetier.exe
Menu : Tables Customers o Employes

como ver los datos de DBC desde CMD

Code: Select all

cd C:\Proyectos\Sample
read C:\Proyectos\Sample\ClientServerVFP\ThreeTierSPT
pronto adjuntare la ampliacion para el RDD de Harbour :)

Sample :
Sample.rar
(13.74 MiB) Downloaded 8 times
Informacion tecnica VFP9 : https://www.yaldex.com/fox_pro_tutorial ... ef2926.htm

Otro sitio interesante para comprender mas sobre VFP8 : https://www.vfphelp.com/help/html/ea7bf ... 09398f.htm
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
Telegram invitation https://t.me/HMGWorkspace
Post Reply