Hola Alvaro.El siguiente ejemplo es muy sencillo. Se trata de obtener el nombre o razón social de un cliente según el código del mismo:
En la capa de negocio en VFP se encuentra la siguiente rutina:
PROCEDURE SolicitaNombreClienteSegunCodigo
PARAMETERS cCodigoEnviado
This.oDatos=This.RetornaNombreClienteSegunCodigo(cCodigoEnviado)
RETURN This.oDatos
ENDPROC
PROCEDURE .RetornaNombreClienteSegunCodigo
PARAMETERS cCodigoCliente
RETURN This.oDb..RetornaNombreClienteSegunCodigo(cCodigoCliente)
ENDPROC
En la capa de datos está el siguiente código:
PROCEDURE RetornaNombreClienteSegunCodigo
PARAMETERS cCodigo
cNombreCliente=''
TEXT TO linea_cmd NOSHOW PRETEXT 15
SELECT retornanombrecliente(?cCodigo)
ENDTEXT
a1=comunica(linea_cmd,'qNombreCliente')
cNombreCliente=qNombreCliente. retornanombrecliente
USE IN SELECT('qNombreCliente')
RETURN cNombreCliente
ENDPROC
Y en el Postgres tengo una función bajo el siguiente código PGSQL
CREATE OR REPLACE FUNCTION comp01.retornanombrecliente(
IN ccodigo character,
OUT cnombre character)
RETURNS character AS
$BODY$
BEGIN
SELECT into cnombre clientes.rsocial_cliente FROM clientes WHERE codigo_cliente=ccodigo;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION comp01.retornanombrecliente(character)
OWNER TO postgres;
Entonces, desde cualquier parte del sistema en VFP, cuando necesites el nombre de un cliente simplemente haces el llamado:
thisform.txtText1.value=oApp.oClientes.SolicitaNombreClienteSegunCodigo(Thisform.txtObjetoCodigoCliente.Value)
Hay varios puntos que explicar partiendo desde como instanciar un objeto como el caso de oApp.oClientes
oApp es un objeto que tiene a su vez varios objetos hijos en este caso oClientes que esta instanciado a un prg donde se instancia la capa de negocios como por ejemplo: clientes_bus.prg y el prg de la capa de datos clientes_db.prg
Eso está muy, pero muy bien explicado en un material de apoyo de Fernando Bozzo. Allí se explica como programar en capas con VFP:
Pero lo que quiero acotar en este ejemplo es que hay que dejar de programar ciertas rutinas sobre todo las complejas en VFP y programarlas dentro del servidor de base de datos. En mi caso Postgresql. Todos manejan este tipo de procedimientos. Entonces desde VFP lo que haces son peticiones entre capas.
Mira el siguiente ejemplo:
Necesito saber cuantas sucursales tiene un cliente porque sino tiene ninguna tengo que crear aunque sea una sucursal única. Con VFP haría una petición de un query y luego veo cuantos registros tiene el cursor generado. Pero con un código simple en Postgres obtengo esa información:
Capa de datos VFP:
Parameters cCodigoCliente
TEXT TO linea_cmd NOSHOW PRETEXT 15
SELECT dime_cuantas_sucursales(?cCodigoCliente);
ENDTEXT
a1=comunica(linea_cmd,'nResp','')
nSucursales=nResp.dime_cuantas_sucursales
IF nSucursales<1
<codigo.....>
ELSE
<codigo.....>
ENDIF
Funcion en Postgres:
CREATE OR REPLACE FUNCTION comp01.dime_cuantas_sucursales(
IN ccodigo character,
OUT numero_registros numeric)
RETURNS numeric AS
$BODY$
BEGIN
SELECT INTO numero_registros COUNT(*) FROM comp01.sucursales WHERE codigo_cliente=ccodigo;
END;
$BODY$
LANGUAGE plpgsql
Tengo muchos mas ejemplos ya que estoy desarrollando un sistema de gestión administrativa para el ramo de producción avícola con VFP + Postgresql en capas.
Espero haberte ayudado con esto.
Quiero hacer pruebas es con un aplicacion en VFP pero que se comunique a una IP remota donde se encuentre el servidor Postgres. He investigado y por medida de seguridad los proveedores de hosting no dan el IP, pero me han hablado de VPN o IP disfrazas.
Otra única forma es programando con lenguajes para browser; PHP, Python, JAVA, ASP junto con servidores de bases de datos: ORACLE, MySQL, Postgresql, mariadb, etc