Documentos de Académico
Documentos de Profesional
Documentos de Cultura
** Ejemplo-VFP-accesando-SQLite.prg
** Jun-2013
** jhernancanom-at-hotmail-dot-com
-1-
D:\Utiles\Motores\SQLite\PRUEBAS\ejemplo-vfp-accesando-sqlite.prg Martes, 02 de Julio del 2013 02:45 a.m.
*
* Pero claro antes de ello será optimizar y socializar la info que este ejemplo nos
* permita descubrir sobre SQLite y VFP.
*
* Nos vemos en el foro!!!
*
************************************************************************************************
****************** PROCEDURE MAIN **************************************************************
************************************************************************************************
if .not.Registrar()
= MessageBox ( "No se pudo registrar NewObjectsPack1.dll " +chr(13)+chr(13);
+ "No puedo continuar" )
return
endif
CLEAR
-2-
D:\Utiles\Motores\SQLite\PRUEBAS\ejemplo-vfp-accesando-sqlite.prg Martes, 02 de Julio del 2013 02:45 a.m.
** Cuarta parte: Pedimos la estructura de uno de loa rchivos de datos (una de la tablas)
** ============================================================================================
** De forma didáctica veamos cómo capturamos la estructura de una de las tablas
**
local M.cSQL
M.cSQL = "PRAGMA table_info('Orders');"
case oObj.Count<1
= MessageBox ( "No hay datos luego de Execute: " +chr(13)+ db.LastError +chr(13)+ M.cSQL;
+chr(13)+ M.cDB )
** es decir que no hay registros
** la cuestión es que el recordset --aparte hablo de ésto-- no puede mostrar ni siquiera
** su estructura cuando no hay registros (o sea si no hay registros, tampoco hay campos)
otherwise
** Creemos un cursor temporal para recibir los datos que capturemos de SQLite3 (símil VFP)
create cursor '_Orders_' ( ;
FIELD_NUMBER C( 3),;
FIELD_NAME C(50),;
FIELD_TYPE C(20),;
FIELD_LEN C( 7),;
FIELD_NULL C( 5),;
FIELD_DEFA C(50),;
FIELD_AUTOINC C(10),;
PRIMARY_KEY C( 5),;
TABLE_NAME C(50),;
TABLE_RULE M( 4) )
cCad = ''
for K=1 to oObj.Count
-3-
D:\Utiles\Motores\SQLite\PRUEBAS\ejemplo-vfp-accesando-sqlite.prg Martes, 02 de Julio del 2013 02:45 a.m.
-4-
D:\Utiles\Motores\SQLite\PRUEBAS\ejemplo-vfp-accesando-sqlite.prg Martes, 02 de Julio del 2013 02:45 a.m.
if !empty(cCad)
= MessageBox ( cCad,0,'CAMPOS DE '+alias() )
endif
cCad = ''
if .f.
browse nomo
else
** una forma más elegante de hacer un BROWSE
** (lástima que dependa de la vble lBrowseSetup)
private oBrowse, lBrowseSetup
lBrowseSetup=.F.
wait window [Visualizando datos...] nowait
BROWSE NAME oBrowse WHEN BrowseSetup() &&NOWAIT
oBrowse = .null.
wait clear
endif
endcase
** =============================================================================================
do case
case !empty(db.LastError) or isnull(oR)
*' Perform some error handling
*' An error has occured - deal with it
= MessageBox ( "Error occured on Execute: " +chr(13)+ db.LastError +chr(13)+ M.cSQL;
+chr(13)+ M.cDB )
case oR.Count<1
= MessageBox ( "No hay datos luego de Execute: " +chr(13)+ db.LastError +chr(13)+ M.cSQL;
-5-
D:\Utiles\Motores\SQLite\PRUEBAS\ejemplo-vfp-accesando-sqlite.prg Martes, 02 de Julio del 2013 02:45 a.m.
+chr(13)+ M.cDB )
** es decir que no hay registros
otherwise
-6-
D:\Utiles\Motores\SQLite\PRUEBAS\ejemplo-vfp-accesando-sqlite.prg Martes, 02 de Julio del 2013 02:45 a.m.
** Tenemos dos formas de pedir el dato de un campo (el valor, lo que se alamcena)
** 1. Utilizando oR.Item(I).Item("OrderID")
** donde OrderID es el nombre del campo que necesite
** 2. Utilizando oR.Item(I).Item(14)
** donde 14 es el número del campo que necesite
** Como estamos viendo los datos en MessageBoxes, paremos en 30 por si nos aburrimos...
if I>30
exit
endif
** si deseas ver los datos en un Browse y/o guardarlos en un cursor o en un DBF, puedes
** hacer append blnk/replace o insert por aquí...
** ¿alguien nos apoya con algo como un ToDBF o ToCursor o FromRS2DBF, o similar, más o
** menos genérico?
Next
endcase
-7-
D:\Utiles\Motores\SQLite\PRUEBAS\ejemplo-vfp-accesando-sqlite.prg Martes, 02 de Julio del 2013 02:45 a.m.
** Séptima parte: Limpiamos el sistema operativo, des-registrando las DLL que registramos
** nosotros mismos
** De acuerdo a las ayudas --imagen 5-- necesitamos registrar sólo dos DLLs: NewObjectsPack1.dll
** y SQLITE3COMUTF8.dll para activar el motor embabido de SQLite en nustras app
** (así nos evitamos tener que hacer una instalación adicional --la del motor--)
** Para ello utilizamos la DLL genérica para registrar que es Vb6stkit.DLL
** Veamos...
function Registrar(M.pDes)
if pcount()=0
declare integer DLLSelfRegister in [Vb6stkit.DLL] string lpDllName
local M.lOk
M.lOk = .t.
M.lOk = M.lOk and ( DLLSelfRegister([NewObjectsPack1.dll]) = 0 )
M.lOk = M.lOk and ( DLLSelfRegister([SQLITE3COMUTF8.dll] ) = 0 )
return ( M.lOk )
endif
-8-
D:\Utiles\Motores\SQLite\PRUEBAS\ejemplo-vfp-accesando-sqlite.prg Martes, 02 de Julio del 2013 02:45 a.m.
FUNCTION UnregisterControl
*-- Author: Paul Vlad Tatavu
*-- This function unregisters an OCX/ActiveX control
* or set of OCX/ActiveX controls based on the name of file.
*-- Note: It works for OLE servers too.
*-- Parameters:
* tcFileName = the name of the file that contains
* the control(s), including the path.
*-- Returns:
* Logical TRUE if successful, FALSE otherwise.
* Also returns FALSE if the file doesn't exist.
*-- Call sample:
* llUnregistered = UnregisterControl("c:\windows\system\comctl32.ocx")
LPARAMETERS tcFileName
LOCAL llSuccess
IF FILE(tcFileName)
DECLARE INTEGER DllUnregisterServer IN (tcFileName) AS __DllUnregisterServer__
*-- This function returns 0 if successful
llSuccess = ( __DllUnregisterServer__() = 0 )
local lnError
lnError = 0
if !llSuccess
DECLARE INTEGER GETLASTERROR IN WIN32API
lnError = GetLastError()
endif
ELSE
llSuccess = .F.
*MessageBox ( "No existe"+chr(13)+"UnregisterControl("+tcFileName+")" )
ENDIF
RETURN llSuccess
ENDFUNC
** Escribí esta función para mostrar en "letras" el tipo de campo, ya que SQLite3COM sólo me
** entrega un número cuando utilizo oR.Item(1).Info(FieldN), pero recordemos que con PRAGMA
** obtenemos mejor info
function GetType(M.pType)
M.cRet = ""
do case
case pcount()=0 or empty(M.pType)
M.cRet = "ERROR"
case M.pType = 1
M.cRet = "NULL - vbNull"
case M.pType = 3
-9-
D:\Utiles\Motores\SQLite\PRUEBAS\ejemplo-vfp-accesando-sqlite.prg Martes, 02 de Julio del 2013 02:45 a.m.
*----------------------------------------
** Una idea interesante para visualizar datos, encontrada en Internet
proc Browse_Trick_v2
** Browse_Trick_v2.PRG
=MessageBox([No me gusta, pues cae a la ventana de comandos]+chr(13);
+[Uno tiene que dar click dentro del browse para volverlo activo]+chr(13);
+[],0,[--],4000)
RELEASE oBr
private oBr
use AUXILIAR shared noupdate
wait window [Visualizando datos...] nowait
with oBr
.ReadOnly = .T.
.Columns(1).Header1.Caption = "User Name"
.Columns(3).Header1.Caption = "File ID"
.Columns(5).Header1.Caption = "File Name"
.Columns(6).Header1.Caption = "Server File Name"
.ZOrder (0)
.AutoFit()
*wait wind 'no funcionaba .SetFocus() cuando hice pruebas'
.SetFocus()
endwith
*----------------------------------------
*----------------------------------------
** Es una idea interesante para visualizar datos y no me aguanté presentárselas
** obtenida de Internet, pero no recuerdo la fuente (la buscaré)
PROCEDURE BrowseSetup
IF NOT lBrowseSetup
WITH oBrowse AS GRID
.LEFT = 50
.TOP = 50
-10-
D:\Utiles\Motores\SQLite\PRUEBAS\ejemplo-vfp-accesando-sqlite.prg Martes, 02 de Julio del 2013 02:45 a.m.
.AUTOFIT()
.HIGHLIGHTSTYLE= 2
.ALLOWCELLSELECTION = .F.
.HIGHLIGHTBACKCOLOR = RGB(255,128,64)
.HIGHLIGHTFORECOLOR = RGB(0,0,0)
.Refresh
ENDWITH
lBrowseSetup = .T.
ENDIF
*----------------------------------------
return
ENDPROC
**
-11-