Você está na página 1de 6

E:\Utiles\Motores\PRUEBAS-FireBird\Ejemplo-VFP-accesando-FireBird.

prg

martes, 19 de julio de 2016 01:53 p.m.

** Ejemplo-VFP-accesando-FireBird.prg
** Sep-2013
** jhernancanom-at-hotmail-dot-com
**-- Author: Jess Hernn Cano Martnez
**-- Este es un ejemplo de acceso a una base de datos FireBird, en este caso utilizando
FireBird portable.
**
**-- Parmetros: Este ejemplo no usa parmetros
**
**-- Ejemplo de llamada: desde la ventana de comandos de VFP (o IDE compatible),
**
o desde un .EXE ya compilado, ejecuta lo sgte:
**
do "Ejemplo-VFP-accesando-FireBird.prg"
**
(puede cambiar el nombre a este ejemplo si gusta)
**
**-- Requirimientos:
**
Este ejemplo consta de varios archivos, todos incluidos en el .zip que usted descarg.
**
Esos archivos son:
**
1. Ejemplo-VFP-accesando-FireBird.prg
**
2. registry.vcx + registry.vct + registry.h
** 3. fbclient.dll
**
ib_util.dll
**
icudt30.dll
**
icuin30.dll
**
icuuc30.dll
**
odbcfb.dll
**
odbcfb.lib
**
odbcfb.pdb
**
4. En el dir INTL:
**
fbintl.conf
**
fbintl.dll
**
5. En el dir UDF :
**
fbudf.dll
**
fbudf.sql
**
fbudf.txt
**--********************************************************************************************
**-- Recomendacin:
**
Con el fin de probar adecuadamente este procedimiento, y cualq otro que quieras escribir,
**
te recomiendo que abras la base de datos con un administrador de bases de datos.
**
En mi caso tengo estos:
**
** FireBird Studio: muy bien!!! seleccionado y recomendado de mi parte a ustedes
**
(pero puedes usar el que uses, si te acostumbraste a otro)
**
**
**
**
**
Nos vemos en el foro!!!
**
**--********************************************************************************************

-1-

E:\Utiles\Motores\PRUEBAS-FireBird\Ejemplo-VFP-accesando-FireBird.prg

martes, 19 de julio de 2016 01:53 p.m.

************************************************************************************************
****************** PROCEDURE MAIN **************************************************************
************************************************************************************************
** Primera parte: Registrando el ODBC de FireBird
if Registrar()
= MessageBox ( "Registrado ODBCFB.dll !!!!!!" +chr(13)+chr(13)+ "--Ok--" )
else
= MessageBox ( "No se pudo registrar ODBCFB.dll " +chr(13)+chr(13)+ "No puedo continuar" )
return
endif
CLEAR
close databases
** Segunda parte: Inicializando una conexin con FireBird ODBC
**
y a la vez nos conectamos a la base de datos
** Indicamos cul es la base de datos que queremos abrir
local M.cDB
M.cDB = '"'+addbs(curdir())+'DEMO.FDB"'
local lnHandle as Integer, laError(1)
*-- Usando SQL pass-through, sin DSN
*lnHandle = SQLSTRINGCONNECT ( [DRIVER=FireBird3 ODBCDriver;Database=northwind.FireBird;] )
*lnHandle = SQLSTRINGCONNECT ( [DRIVER=FireBird3 ODBC Driver;Database=]+M.cDB+[;] )
Local lcODBCDriver, lcCadenaConexion, lnHandle
**("SYSDBA", "masterkey", "", "DEMO.FDB")
lcODBCDriver
= 'Firebird/InterBase(r) driver'
lcCadenaConexion = "DRIVER={" + lcODBCDriver + "};" ;
+ "USER=SYSDBA;" ;
+ "PASSWORD=masterkey;" ;
+ "ROLE=;" ;
+ "DATABASE=" + M.cDB + ";" ;
+ "OPTIONS=131329;"
lnHandle = SQLStringConnect(lcCadenaConexion)
IF lnHandle > 0
local M.cSQL
** no hay funcin para detectar la versin de FireBird
*
*!* if SQLEXEC(lnHandle, M.cSQL, 'MiCursor') > 0
*!* MessageBox( 'FireBird_Version: '+tran(FireBird_version), 0, '--', 5000 )
*!* BROWSE nomodify title 'Visualizando la version de FireBird'
*!* endif

-2-

&& muestra 3

E:\Utiles\Motores\PRUEBAS-FireBird\Ejemplo-VFP-accesando-FireBird.prg

martes, 19 de julio de 2016 01:53 p.m.

** Tercera parte: Ejecutamos una operacin (un comando SQL) sobre la base de datos FireBird3
*************
** vamos a visualizar los datos de una de las tablas
M.cSQL = "SELECT " ;
+ "
D.DEP_IDENTI, " ;
+ "
D.DEP_CODIGO, " ;
+ "
D.DEP_NOMBRE " ;
+ "FROM " ;
+ "
DEPARTAMENTOS D"
WAIT WIND '1'
if SQLEXEC(lnHandle, M.cSQL, 'MiCursor') > 0
WAIT WIND '2'
if .t.
BROWSE nomodify title 'Visualizando los datos de DEPARTAMENTOS'
else
** una forma ms elegante de hacer un BROWSE
** (lstima que dependa de la vble lBrowseSetup)
private oBrowse, lBrowseSetup
lBrowseSetup=.F.
wait window [Visualizando datos...] nowait
BROWSE NAME oBrowse WHEN BrowseSetup() title 'Visualizando los datos de Customers'
oBrowse = .null.
wait clear
endif
ELSE
if aerror(laError)>0
MessageBox("Error al conectarse"+CHR(13)+laError(2))
endif
endif
WAIT WIND '3'
**
** Aqu realizamos operaciones sobre el cursor y/o sobre la bdatos remota
** segn la necesidad, utilizando el lenguaje SQL
** Quiero profundizar sobre lenguaje SQL de manera que pueda detectar qu instrucciones
** son standard y cules no, es decir detectar lo bsico del SQL92 (as se llama?).
** As se podra generar una clase adecuadamente standard para cualq motor.
** Pero so sera en otro momento. Completemos lo bsico......
**
ELSE
= AERROR(laError)
* Deal with the error further
= MESSAGEBOX('No nos pudimos conectar a: ' +chr(13)+M.cDB+ chr(13)+lcCadenaConexion+chr(13);
+'Motivo: ' +laError(2), 48, 'Aviso')
return .f.
ENDIF

** Buenos ya tenemos nuestros datos en VFP----------------------------** Terminamos?


** =========================================================================================
** De forma didctica veamos cmo capturamos la estructura de una de las tablas
-3-

E:\Utiles\Motores\PRUEBAS-FireBird\Ejemplo-VFP-accesando-FireBird.prg

**
**
**
**

martes, 19 de julio de 2016 01:53 p.m.

**
Con AFIELDS sobre el cursor de VFP obtenemos la estructura
o tambin con COPY STRUCTURE EXTENDED
y qu ms?
voy a hacerlo con 'copy structure extended'...

** Cuarta parte: Veamos la estructura de uno de los archivos de datos (una de la tablas)
select MiCursor
if file('_MiCursor_.dbf')
erase _MiCursor_.*
endif
copy structure extended to _MiCursor_
use _MiCursor_ in 0 exclusive
select _MiCursor_
if .f.
browse nomodify title "Estructura segun 'copy structure extended' - DEPARTAMENTOS"
else
** una forma ms elegante de hacer un BROWSE
** (lstima que dependa de la vble lBrowseSetup)
private oBrowse, lBrowseSetup
lBrowseSetup=.F.
*wait window [Visualizando datos...] nowait
BROWSE NAME oBrowse WHEN BrowseSetup() title "Estructura segun ;
'copy structure extended' - Employees" &&NOWAIT
oBrowse = .null.
wait clear
endif
use in _MiCursor_
erase _MiCursor_.*
** ==========================================================================================
** Quinta parte: Desconexin
* Finish everything
if SQLDISCONNECT(lnHandle)>0
** desconectado---Ok!!
else
=MessageBox('Error al cerrar conexin',0,'--',5000)
endif
** Sexta parte: Limpiamos el sistema operativo, des-registrando las DLL que registramos al
**
inicio nosotros mismos
wait window 'Desregistrando...' timeout 2&&nowait noclear &&
if !Registrar('U')
= MessageBox ( "No se pudo des-registrar ODBCFB.dll " +chr(13)+chr(13) +;
"Pero podemos continuar..." )
endif
wait clear
************************************************************************************************
****************** ENDPROC MAIN ****************************************************************
-4-

E:\Utiles\Motores\PRUEBAS-FireBird\Ejemplo-VFP-accesando-FireBird.prg

martes, 19 de julio de 2016 01:53 p.m.

************************************************************************************************

** De acuerdo al ejemplo "SQL_EMBEDDED" --se adjunta-- necesitamos registrar slo una DLL:
** ODBCFB.dll para activar el ODBC de FireBird en nuestras app
** (as nos evitamos tener que hacer instalaciones adicionales)
** (con FireBird portable tambin nos evitamos hacer la instalacin adicional del motor --> es
portable!!!)
** Veamos...
function Registrar(M.pDes)
if pcount()=0
LOCAL oReg as registry OF 'registry'
oReg = NEWOBJECT('registry','registry')
local M.nRet
* This routine sets a registry key setting
M.nRet = oReg.SetRegKey('Driver','ODBCFB.dll',;
'Software\ODBC\ODBC.INI\portable_FireBird_ODBC',-2147483647,.t.)
if M.nRet<>0
=MessageBox('Error en SetRegKey'+chr(13)+transform(M.nRet),0,'Error en SetRegKey')
endif
clear class registry
clear classlib registry
return (M.nRet=0)
endif
if pcount()=1 and M.pDes=='U'
wait window 'Desregistrando' nowait noclear
LOCAL oReg as registry OF 'registry'
** la sgte instruccin se requiere, pues de lo contrario oReg.DeleteKey fallar
** pues no encuentra la funcin del API
DECLARE Integer RegDeleteKey IN Win32API Integer nHKey, String @cSubKey
oReg = NEWOBJECT('registry','registry')
local M.nRet
* This routine deletes a Registry Key
M.nRet = oReg.DeleteKey(-2147483647,'Software\ODBC\ODBC.INI\portable_FireBird_ODBC')
if M.nRet<>0
=MessageBox(M.nRet,0,'Error en DeleteKey')
endif
clear class registry
clear classlib registry
return (M.nRet=0)
** el "des-registro" se hace al finalizar la app; si no se puede
** des-registrar, realmente no hay problema... cierto?
endif
wait window 'Qu pas?' &&nowait noclear
** si lleg hasta aqu, s hay problema... slo se ejecuta sin parmetro (para registrar)
** o con el parmetro U (para des-registrar)...
return .f.

*----------------------------------------5-

E:\Utiles\Motores\PRUEBAS-FireBird\Ejemplo-VFP-accesando-FireBird.prg

martes, 19 de julio de 2016 01:53 p.m.

** Es una idea interesante para visualizar datos y no me aguant presentrselas


** obtenida de Internet, pero no recuerdo la fuente (la buscar)
PROCEDURE BrowseSetup
IF NOT lBrowseSetup
WITH oBrowse AS GRID
.LEFT = 50
.TOP = 50
**** Row coloring -----------------------------* Only works good with no index:
*.SETALL("DynamicBackColor","IIF(RECNO() % 2 = 0, 16777215, 16777088)","Column")
* This one works much better
.SETALL("DynamicBackColor","IIF(oBrowse.ActiveRow%2=0,16777215,16777088)","Column")
*** Fix the first column ----.LOCKCOLUMNS = 1
.Columns(1).DynamicBackColor= ""
.Columns(1).BackColor = RGB(255,255,168)
.AUTOFIT()
.HIGHLIGHTSTYLE= 2
.ALLOWCELLSELECTION = .F.
.HIGHLIGHTBACKCOLOR = RGB(255,128,64)
.HIGHLIGHTFORECOLOR = RGB(0,0,0)
.Refresh
ENDWITH
lBrowseSetup = .T.
ENDIF
*---------------------------------------return
ENDPROC
**

-6-

Você também pode gostar