Erro un poco extraño TDataBase

Post Reply
User avatar
RenOmaS
Posts: 205
Joined: Fri Oct 07, 2005 5:07 pm

Erro un poco extraño TDataBase

Post by RenOmaS »

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
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Erro un poco extraño TDataBase

Post by Antonio Linares »

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: Select all

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

REQUEST DBFCDX
rddsetdefault( "DBFCDX" )
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
RenOmaS
Posts: 205
Joined: Fri Oct 07, 2005 5:07 pm

Re: Erro un poco extraño TDataBase

Post by RenOmaS »

Antonio

Si solo hacemos esto el resultado es correcto

Code: Select all

REQUEST DBFCDX
rddsetdefault( "DBFCDX" )
//y hacemos 
tdatabase():cDriver // resultado 'DBFCDX -> resultado correcto
 
Pero, si hacemos esto

Code: Select all

//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
xmanuel
Posts: 613
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla
Contact:

Re: Erro un poco extraño TDataBase

Post by xmanuel »

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: Select all

DATA   cDriver                AS CHARACTER INIT RddSetDefault()
 
por:

Code: Select all

// 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
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Erro un poco extraño TDataBase

Post by Antonio Linares »

Américo,

Pruéba asi:

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

REQUEST DBFCDX
rddsetdefault( "DBFCDX" )

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

Antonio Linares
www.fivetechsoft.com
User avatar
RenOmaS
Posts: 205
Joined: Fri Oct 07, 2005 5:07 pm

Re: Erro un poco extraño TDataBase

Post by RenOmaS »

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
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Erro un poco extraño TDataBase

Post by Antonio Linares »

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
User avatar
RenOmaS
Posts: 205
Joined: Fri Oct 07, 2005 5:07 pm

Re: Erro un poco extraño TDataBase

Post by RenOmaS »

Antonio,
Debe ser un comportamiento erroneo del motor de objects de harbour?, por ejemplo

Code: Select all

#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
 
Last edited by RenOmaS on Mon Mar 21, 2016 11:04 am, edited 1 time in total.
Saludos/regards
RenOmaS

skype: americo.balboa
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Erro un poco extraño TDataBase

Post by Antonio Linares »

Si, a eso me refería

Parece un bug de Harbour
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Erro un poco extraño TDataBase

Post by Antonio Linares »

Lo acabo de reportar en la lista de desarrollo de Harbour:

https://groups.google.com/forum/#!topic ... wirwvF5KOE
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
RenOmaS
Posts: 205
Joined: Fri Oct 07, 2005 5:07 pm

Re: Erro un poco extraño TDataBase

Post by RenOmaS »

Gracias
Saludos/regards
RenOmaS

skype: americo.balboa
User avatar
nageswaragunupudi
Posts: 8017
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Re: Erro un poco extraño TDataBase

Post by nageswaragunupudi »

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: Select all

#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: Select all

   DATA   cDriver                AS CHARACTER INIT RddSetDefault()
 
New code:

Code: Select all

   DATA   cDriver                // AS CHARACTER INIT RddSetDefault() // FWH16.03
 
Old code:

Code: Select all

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: Select all

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
User avatar
Carles
Posts: 937
Joined: Fri Feb 10, 2006 2:34 pm
Location: Barcelona
Contact:

Re: Erro un poco extraño TDataBase

Post by Carles »

Hi,

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

Code: Select all

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..."

https://modharbour.app
https://modharbour.app/compass
https://forum.modharbour.app
User avatar
RenOmaS
Posts: 205
Joined: Fri Oct 07, 2005 5:07 pm

Re: Erro un poco extraño TDataBase

Post by RenOmaS »

Nages and Charles

Thanks
Saludos/regards
RenOmaS

skype: americo.balboa
Post Reply