FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Erro un poco extraño TDataBase
Posts: 205
Joined: Fri Oct 07, 2005 05:07 PM
Erro un poco extraño TDataBase
Posted: Sun Mar 20, 2016 04:14 PM
Buenas,

A alguien le sucede esto:


#include "FiveWin.ch"
function Main()

? TDataBase():cdriver //Resultado: 'DBFNTX'

REQUEST DBFCDX
rddsetdefault( "DBFCDX" )

? RddSetDefault(), TDataBase():cdriver // Resultado: "DBFCDX", 'DBFNTX', este ultimo debería ser 'DBFCDX'

return nil


Ahora si hacemos esto

#include "FiveWin.ch"
function Main()

REQUEST DBFCDX
rddsetdefault( "DBFCDX" )

? RddSetDefault(), TDataBase():cdriver // Resultado: "DBFCDX", 'DBFCDX', resultado correcto.

return nil
Saludos/regards

RenOmaS



skype: americo.balboa
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Erro un poco extraño TDataBase
Posted: Sun Mar 20, 2016 05:43 PM
Americo,

A mi me parece correcto lo que sucede:

Hasta que no se define el RDD por defecto usando RddSetDefault(), se usa el DBFNTX

Code (fw): Select all Collapse
? TDataBase():cdriver //Resultado: 'DBFNTX   

REQUEST DBFCDX
rddsetdefault( "DBFCDX" )
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 205
Joined: Fri Oct 07, 2005 05:07 PM
Re: Erro un poco extraño TDataBase
Posted: Sun Mar 20, 2016 08:42 PM
Antonio

Si solo hacemos esto el resultado es correcto
Code (fw): Select all Collapse
REQUEST DBFCDX
rddsetdefault( "DBFCDX" )
//y hacemos 
tdatabase():cDriver // resultado 'DBFCDX -> resultado correcto


Pero, si hacemos esto

Code (fw): Select all Collapse
//hacemos esto primero
? tdatabase():cDriver  //Resultado 'DBFNTX'

//definimos el RDD
REQUEST DBFCDX
rddsetdefault( "DBFCDX" )

//y hacemos nuevamente 
? tdatabase():cDriver // resultado 'DBFNTX' , cuando deberia ser DBFCDX

Cuando hacemos 'tdatabase():cdriver' por segunda vez no trae el RDD por defecto.
Saludos/regards

RenOmaS



skype: americo.balboa
Posts: 817
Joined: Sun Jun 15, 2008 07:47 PM
Re: Erro un poco extraño TDataBase
Posted: Mon Mar 21, 2016 01:11 AM
Parece que trate esa data como una classdata y solamente se inicializara con la primera llamada a la funcion de clase.
Para evitar eso tal vez se debería cambiar la definicion de la data:
Code (fw): Select all Collapse
DATA   cDriver                AS CHARACTER INIT RddSetDefault()

por:
Code (fw): Select all Collapse
// En la definicion:
DATA FcDriver PROTECTED
METHOD cDriver SETGET

// y en implementacion algo así:

METHOD cDriver( cRDD ) CLASS TDataBase
     if ValType( cRDD ) == "C"
         ::FcDriver := Upper( cRDD )
     else
        if ValType(  ::FcDriver ) != "C"
            ::FcDriver := RddSetDefault()
        endif        
    endif
return( ::FcDriver )
______________________________________________________________________________

Sevilla - Andalucía
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Erro un poco extraño TDataBase
Posted: Mon Mar 21, 2016 08:22 AM

Américo,

Pruéba asi:

? tdatabase():New( ,, "DBFNTX" ):cDriver

REQUEST DBFCDX
rddsetdefault( "DBFCDX" )

? tdatabase():New( ,, "DBFCDX" ):cDriver

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 205
Joined: Fri Oct 07, 2005 05:07 PM
Re: Erro un poco extraño TDataBase
Posted: Mon Mar 21, 2016 10:43 AM

Manuel:
Si, lo extraño es que en la clase no esta definido como classdata.
Tu solución que se podría implementa en la TDataBase.

Antonio:
De esa forma, funciona para o ejemplo postado.
Hemos hecho ese pequeño ejemplo, para mostrar ese comportamento "extraño".

Para superar esto en nuestras aplicaciones hemos tenido que cambiar la lógica.

Saludos/regards

RenOmaS



skype: americo.balboa
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Erro un poco extraño TDataBase
Posted: Mon Mar 21, 2016 10:51 AM

El problema viene de esta línea:

DATA cDriver AS CHARACTER INIT RddSetDefault()

Por lo que se ve, esa cláusula INIT no se actualiza

Podria considerarse un bug de Harbour creo

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 205
Joined: Fri Oct 07, 2005 05:07 PM
Re: Erro un poco extraño TDataBase
Posted: Mon Mar 21, 2016 10:57 AM
Antonio,
Debe ser un comportamiento erroneo del motor de objects de harbour?, por ejemplo

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

Static nContador

Function Main()
   nContador := 1
  ? TClase():nContador  //resultado 2
  ? TClase():nContador // Resultado 2
  ? TClase():nContador // Resultado 2
  ? TClase():nContador // Resultado 2

Return Nil

CLASS TClase
          DATA nContador    INIT ++nContador
ENDCLASS
Saludos/regards

RenOmaS



skype: americo.balboa
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Erro un poco extraño TDataBase
Posted: Mon Mar 21, 2016 11:00 AM

Si, a eso me refería

Parece un bug de Harbour

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Erro un poco extraño TDataBase
Posted: Mon Mar 21, 2016 11:03 AM
Lo acabo de reportar en la lista de desarrollo de Harbour:

https://groups.google.com/forum/#!topic/harbour-devel/owirwvF5KOE
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 205
Joined: Fri Oct 07, 2005 05:07 PM
Re: Erro un poco extraño TDataBase
Posted: Mon Mar 21, 2016 11:04 AM

Gracias

Saludos/regards

RenOmaS



skype: americo.balboa
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Erro un poco extraño TDataBase
Posted: Wed Mar 23, 2016 07:34 AM
The behavior is the same with both Harbour and xHarbour. So, instead of considering it as a bug, we better consider it as the expected behavior.

The value is assigned to the data at the time creation of the object, not at the time of every instantiation. Following example clarifies the behavior.

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

function Main()

   ? time(), test():ctime
   ? time(), test():ctime
   ? time(), test():new():ctime,test2():new():ctime,test3():new():ctime

return nil

class test

  data ctime init time()

endclass

class test2 from test
endclass

class test3 from test

  data ctime init time()

endclass


I confess that I did not know this earlier.

The lesson is that we should not use INIT to assign the result of a function, whose value may change during runtime.

We need to modify tdatabase class. These are the two changes made:

Old code:
Code (fw): Select all Collapse
   DATA   cDriver                AS CHARACTER INIT RddSetDefault()

New code:
Code (fw): Select all Collapse
   DATA   cDriver                // AS CHARACTER INIT RddSetDefault() // FWH16.03


Old code:
Code (fw): Select all Collapse
METHOD Use() CLASS TDataBase

   if Empty( ::cAlias )
      ::cAlias := cGetNewAlias( 'TDF' )
   endif
   if Select( ::cAlias ) > 0
      ::cAlias    := cGetNewAlias( Left( ::cAlias, 3 ) )
   endif

   dbUseArea( .t., ::cDriver, ::cFile, ::cAlias, ::lShared, ::lReadOnly )

   if Alias() == ::cAlias
      ::SetArea( Select() )
   endif

return ::Used()


New code:
Code (fw): Select all Collapse
METHOD Use() CLASS TDataBase

   if Empty( ::cAlias )
      ::cAlias := cGetNewAlias( 'TDF' )
   endif
   if Select( ::cAlias ) > 0
      ::cAlias    := cGetNewAlias( Left( ::cAlias, 3 ) )
   endif

   DEFAULT ::cDriver := RDDSETDEFAULT()  // Now inserted FWH 16.03

   dbUseArea( .t., ::cDriver, ::cFile, ::cAlias, ::lShared, ::lReadOnly )

   if Alias() == ::cAlias
      ::SetArea( Select() )
   endif

return ::Used()
Regards



G. N. Rao.

Hyderabad, India
Posts: 1283
Joined: Fri Feb 10, 2006 02:34 PM
Re: Erro un poco extraño TDataBase
Posted: Wed Mar 23, 2016 10:36 AM
Hi,

I think the best option is when you definied the object, the same concept as now but initialized data ::cDriver correctly

Code (fw): Select all Collapse
METHOD New( ncArea, cFile, cDriver, lShared, lReadOnly ) CLASS TDataBase

   if PCount() > 1
      if ValType( ncArea ) == 'C'
         ::cAlias    = ncArea
      endif
      if ValType( cFile ) == 'C'
         ::cFile     = cFile
      endif
      if ValType( cDriver ) == 'C'
         ::cDriver   = Upper( cDriver )
        else
         ::cDriver   = RDDSETDEFAULT()
      endif
...



Once the object is created, you should'nt change RDD
Salutacions, saludos, regards

"...programar es fácil, hacer programas es difícil..."

UT Page -> https://carles9000.github.io/
Forum UT -> https://discord.gg/bq8a9yGMWh
HIX -> https://github.com/carles9000/hix
Posts: 205
Joined: Fri Oct 07, 2005 05:07 PM
Re: Erro un poco extraño TDataBase
Posted: Fri Mar 25, 2016 06:55 PM

Nages and Charles

Thanks

Saludos/regards

RenOmaS



skype: americo.balboa

Continue the discussion