FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Comenzando con TDatabase
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Comenzando con TDatabase
Posted: Thu Jul 02, 2009 04:41 PM

Buenas tardes,

Debo comenzar una pequeña aplicación para trabajar en red (uso DBF's) y, como hace un tiempo un amigo del foro me recomendó usar la clase TDatabase, los consulto por este motivo.

Mi aplicación abrirá varios dialogs nowait que usarán la misma DBF y la consulta es si, debido al uso de estos nowait puedo usar alias para abrir las DBF con la clase tDatabase y, si no fuera así, ¿como debería hacerlo?.

Aclaro que revisé los samples pero en ellos no se usan dialogs nowait así que no encontré ejemplos.

Gracias.

Rolando :D

Posts: 601
Joined: Wed Jul 04, 2007 03:51 PM
Re: Comenzando con TDatabase
Posted: Thu Jul 02, 2009 05:40 PM
Amigo...
Puedes usar alias perfectamente

Code (fw): Select all Collapse
USE TABLA ALIAS TuAlias NEW
DATABASE oDbf
...
...
...


Saludos,
Ojeda Esteban Eduardo.

Buenos Aires - Argentina.

FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport

Skype: jreduojeda
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Comenzando con TDatabase
Posted: Thu Jul 02, 2009 10:30 PM
Hola,

Sigo tratando de "Iniciarme" con la clase TDatabase.

Tengo un problema y es que no logro cerrar los alias abiertos cuando cierro el/los dialogs. Como habitualmente hago con los dialogs NOWAIT, intenté cerrar el alias en el valid, pero no resulta y dá un error.

Adjunto el código del PRG de prueba que es una reforma al PRG de los Salmples:

Code (fw): Select all Collapse
#include "FiveWin.ch"

static oWnd

//----------------------------------------------------------------------------//

function Main()

     set resources to 'dbfpla.dll'

     DEFINE WINDOW oWnd FROM 2, 2 TO 20, 70 ;
      TITLE "Testing DataBase Objects" ;
      MENU BuildMenu()

   SET MESSAGE OF oWnd ;
      TO "FiveWin - Object Oriented DataBase Management" CENTERED

   ACTIVATE WINDOW oWnd MAXIMIZED ;
      VALID MsgYesNo( "Do you really want to end ?" )

return nil

//----------------------------------------------------------------------------//

function BuildMenu()

   local oMenu

   MENU oMenu
      MENUITEM "&Clients"
      MENU
                 MENUITEM "&Hojear..." ACTION ClientsBrowse() ;
            MESSAGE "Clients browse management dialog"

         SEPARATOR

         MENUITEM "&Exit Test..."  ACTION oWnd:End() ;
            MESSAGE "End doing this tutorial"
      ENDMENU
   ENDMENU

return oMenu

//----------------------------------------------------------------------------//

 Function ClientsBrowse()

   local oBrw , oLbx , lSalir:=.f. , oDbf
     local cClientes:=cGetNewAlias('clientes')
     static oDlg

     use CLIENTES shared new alias (cClientes)
     DATABASE oDbf

     define dialog oDlg resource "XBROWSETEST"

   REDEFINE LISTBOX oLbx ;
      FIELDS oDbf:NOMBRE ,;
                   oDbf:DIRECCION ;
      HEADERS "Nombre",   "Dirección" ;
      SIZES   250, 300 ;
      ID 101 OF oDlg

            oLbx:bSkip = { | nRecs | oDbf:Skipper( nRecs ) }

   ACTIVATE DIALOG oDlg CENTERED nowait valid ( oDbf:close() , .t.)


return nil

//----------------------------------------------------------------------------//

//----------------------------------------------------------------------------//

procedure AppSys   // XBase++ requirement

return

//----------------------------------------------------------------------------//


Funciona bién pero al cerrar el dialog me dá este error:

Code (fw): Select all Collapse
Application
===========
   Path and name: D:\VERCE\BIN\Dbf03.Exe (32 bits)
   Size: 1,596,416 bytes
   Time from start: 0 hours 0 mins 8 secs 
   Error occurred at: 07/02/09, 19:24:06
   Error description: Error BASE/1004  Message not found: TDATABASE:NOMBRE

Stack Calls
===========
   Called from: HARBOUR.PRG => _CLSSETERROR(0)
   Called from: DATABASE.PRG => TDATABASE:NOMBRE(410)
   Called from: dbf03.prg => (b)CLIENTSBROWSE(64)
   Called from: WBROWSE.PRG => TWBROWSE:DRAWSELECT(0)
   Called from: WBROWSE.PRG => (b)TWBROWSE:TWBROWSE(0)
   Called from:  => TWBROWSE:LOSTFOCUS(0)
   Called from: CONTROL.PRG => TWBROWSE:KILLFOCUS(0)
   Called from: CONTROL.PRG => TWBROWSE:HANDLEEVENT(0)
   Called from: WINDOW.PRG => _FWH(0)
   Called from:  => DESTROYWINDOW(0)
   Called from: DIALOG.PRG => TDIALOG:CLOSE(0)
   Called from:  => TWINDOW:HANDLEEVENT(0)
   Called from: DIALOG.PRG => TDIALOG:HANDLEEVENT(0)
   Called from: WINDOW.PRG => _FWH(0)
   Called from:  => SYSREFRESH(0)
   Called from: DIALOG.PRG => TDIALOG:END(0)
   Called from: WINDOW.PRG => TWINDOW:SYSCOMMAND(0)
   Called from: DIALOG.PRG => TDIALOG:SYSCOMMAND(0)
   Called from:  => TWINDOW:HANDLEEVENT(0)
   Called from: DIALOG.PRG => TDIALOG:HANDLEEVENT(0)
   Called from: WINDOW.PRG => _FWH(0)
   Called from:  => WINRUN(0)
   Called from: WINDOW.PRG => TWINDOW:ACTIVATE(0)
   Called from: dbf03.prg => MAIN(21)


Quedo a la espera de una ayuda. Gracias.

Rolando :-)
Posts: 205
Joined: Fri Oct 07, 2005 05:07 PM
Re: Comenzando con TDatabase
Posted: Thu Jul 02, 2009 11:18 PM
Hola
Creo que una de las cosas que te debes olvidar cuando utilizas objetos relacionas con Banco de Datos, en este caso Database, es olvidarte del alias.
Si revisas la clase te daras cuenta que ella sola asigna el alias (esto dependiendo de que version fw usas)

Para tu ejemplo:
-definiria varios 'oDbf's como publico (pudiendo ser um arreglo de objetos), es decir para que se "vea" en toda la aplicacion.
Code (fw): Select all Collapse
Public oDbf 
// o
Public aDbf = Array( 10 )

-abriria la database al inicio de la aplicacion tantas veces como sea necesario y asignandole el objeto respectivo.
Code (fw): Select all Collapse
use CLIENTES shared new
DATABASE oDbf
//o
use CLIENTES shared new
DATABSE aDbf[ 1 ]

use CLIENTES shared new
DATABSE aDbf[ 2 ]
........

-cerraria los obj al final de la aplicacion.
Code (fw): Select all Collapse
 oDbf:Close()
// o 
AEval( aDbf, { |o| If( o != Nil, o:Close(), ) } )
Saludos/regards

RenOmaS



skype: americo.balboa
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Comenzando con TDatabase
Posted: Fri Jul 03, 2009 12:59 AM

Gracias por contestar.

Lo que Propones no se adapta a lo que necesito.

Tu propones abrir la DBF una cantidad de veces predefinida pero en mi caso estos dialogs se abrirán muchísimas veces durante la ejecución del programa y además nunca será la misma cantidad de veces.

Por esto necesito ir cerrando los alias u objetos DBF abiertos.

¿Alguna otra idea?.

Gracias.

Rolando :D

Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Comenzando con TDatabase
Posted: Fri Jul 03, 2009 02:37 AM
Hola,

Logré solucionarlo con un mínimo cambio en el activate.

En lugar de:

Code (fw): Select all Collapse
ACTIVATE DIALOG oDlg CENTERED nowait valid ( oDbf:close() , .t.)


Puse:

Code (fw): Select all Collapse
ACTIVATE DIALOG oDlg CENTERED nowait valid oLbx:lCloseArea()


Y eso es todo. Funciona tal cual pretendía.

Saludos.

Rolando :-)

Continue the discussion