Page 1 of 1

database y setfilter

PostPosted: Tue Feb 12, 2013 9:42 pm
by surGom
Utilizando el código de database original para el caso de setfilter:

Code: Select all  Expand view
METHOD SetFilter( cFilter ) CLASS TDataBase
 
  (1)  ? cFilter                      //agregado para ver que envía
 
   ( ::nArea )->( DbSetFilter( Compile( cFilter ), cFilter ) )

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

static function Compile( cExp )

return &( "{||" + cExp + "}" )

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


 

Re: database y setfilter

PostPosted: Tue Feb 12, 2013 10:15 pm
by surGom
Perdón quise hacer un preview... siguiendo...
Cuando envío el filtro por ejemplo (oCtae:calias)->npro = 0

el mensaje que me envía es .f. ... ¿a que se debe? y da este error

Code: Select all  Expand view
Application
===========
   Path and name: k:\fivehme\Source\fivehme.exe (32 bits)
   Size: 4,324,352 bytes
   Compiler version: xHarbour build 1.2.1 Intl. (SimpLex) (Rev. 9656)
   FiveWin  Version: FWHX 12.02
   Windows version: 6.1, Build 7601 Service Pack 1

   Time from start: 0 hours 0 mins 15 secs
   Error occurred at: 11/02/2013, 22:31:50
   Error description: Error BASE/1081  Argument error: +
   Args:
     [   1] = C   {||
     [   2] = U  

Stack Calls
===========
   Called from: database.prg => COMPILE( 676 )
   Called from: database.prg => TDATABASE:SETFILTER( 804 )
   Called from: funcion.prg => BUSPRO( 494 )
   Called from: xbrwgen.prg => (b)XBRWGEN( 22 )


si en cambio el set filter lo reescribo


Code: Select all  Expand view
METHOD SetFilter(cFilter ) CLASS TDataBase
local cType
    ctype := valtype(cFilter)
      ? cFilter
    if cType == "B"
        ( ::nArea )->( DbSetFilter(cFilter ) )
    elseif cType == "C"
        ( ::nArea )->( DbSetFilter( Compile( cFilter ), cFilter ) )
    else
        ( ::nArea )->( DbClearFilter() )
    endif

return nil


ante la orden oCtae:setfilter({|| (oCtae:cAlias)->npro = nproa } )

funciona perfectamente....



Me podrían indicar la forma de usarlo con la database original






Luis

Re: database y setfilter

PostPosted: Wed Feb 13, 2013 3:18 am
by carlos vargas
Code: Select all  Expand view

 (oCtae:calias)->npro = 0
  ...
  oCtae:SetFilter( "NPRO=0" )
  ...
 

Re: database y setfilter

PostPosted: Wed Feb 13, 2013 3:21 pm
by surGom
Gracias Carlos lo voy a probar y te comento

Re: database y setfilter

PostPosted: Fri Feb 15, 2013 12:15 pm
by surGom
Carlos si envías los datos de esta forma

oPinterno:setfilter("vendedor = oApp:nlogin") no funciona

de esta forma tampoco

oPinterno:setfilter("vendedor = " + oApp:nlogin )

Lo voy a dejar con la modificación que hice que de todas forma no modifica el comportamiento de la clase para otras bases de datos


Luis

Re: database y setfilter

PostPosted: Thu Apr 23, 2015 10:16 pm
by surGom
Hola vuelvo con esto ya que no le encontré la solución salvo con al modificación antes comentada.
Alguien por casualidad usa el set filter en la clase database y si la usa me podría indicar como la utiliza, ya que ahora estoy tratando de resolverla sin usar la modificación que comente pero sigo tropezando con la misma piedra.


Gracias

Re: database y setfilter

PostPosted: Thu Apr 23, 2015 10:21 pm
by surGom
En la clase database original es

Code: Select all  Expand view


METHOD SetFilter( cFilter ) CLASS TDataBase

   ( ::nArea )->( DbSetFilter( Compile( cFilter ), cFilter ) )

return nil
 


Code: Select all  Expand view


static function Compile( cExp )

return &( "{||" + cExp + "}" )            (1)
 


llamando oCtae:SetFilter( "NPRO=0" )

El error lo da en (1)


Gracias

Re: database y setfilter

PostPosted: Thu Apr 23, 2015 10:57 pm
by xmanuel
Como te dice Carlos le tienes que mandar una cadena... por lo que esto:
oPinterno:setfilter("vendedor = " + oApp:nlogin )
deberías a cambiarlo a:
oPinterno:setfilter("vendedor = " + str( oApp:nlogin ) )

Entiendo que usas la notación húngara correctamente y por tanto oApp:nlogin es de tipo numérico...

Por otro lado esto
(oCtae:calias)->npro = 0
lo que hace es comparar (oCtae:calias)->npro con 0 por lo que si (oCtae:calias)->npro es diferente de 0 dará .f.
si lo que quieres es asignar un valor a una variable debería usar:
(oCtae:calias)->npro := 0 // fijate que se usa := en vez de =
pero si lo que quieres es comaparar deberías usar:
oCtae:setfilter("npro ==" +str( nproa ) )

También decirte que esto:
oCtae:setfilter({|| (oCtae:cAlias)->npro = nproa } )
funciona porque directamente le pasas un codeblock que es lo que la función dbFilter de harbour requiere.

Espero haber aclarado un poco tus dudas :-)

Re: database y setfilter

PostPosted: Sat Apr 25, 2015 1:03 pm
by surGom
Manuel seguí probando y encontré el problema parcialmente, ya que en algunos casos funcionaba y en otros no, por eso contesté que no había visto bien las soluciones que me había recomendado en su momento Carlos Vargas, que pasó? Que empezé probando con esta parte del programa que filtro por vendedores ( y parece que cuando consulte anteriormente(año 2013) hice lo mismo y ante la disparidad de resultados usaba la clase database modificada, pero en estos momento estoy tratando de usar la clase original de fivewin.

IF oApp:nloguin # 10
oPinterno:setfilter( "vendedor == oApp:nloguin" )
ENDIF

y

oNsto:setfilter( "peligro = 'S'" ) ó

Aquí, en estos dos casos, funciona muy bien y no me percaté que oApp es una variable publica desde el comienzo del sistema y en el segundo que enviaba un parámetro fijo.



Ahora veamos este ejemplo con variable

caso 1
Local nValor
nValor := aMae[2] //Nro de proveedor
oCom:setfilter( "npro = nvalor" )

No funciona y da el error que envié anteriormente

caso 2
Local nValor
nValor := aMae[2]
oCom:setfilter( "npro = 'nvalor'" )

Error description: Error BASE/1071 Error de argumento: =
Args:
[ 1] = N 809
[ 2] = C nvalor



caso 3
Public nValor
nValor := aMae[2]
oCom:setfilter( "npro = nvalor" )

Funciona como debe

No sé como hacer para no tener que pasar la variable como referencia, hice varias pruebas pero da error de argumento
Lo que no aclaré es que uso xHarbour y bcc582

Es posible evitar nombrar la variable como pública?

Luis

Re: database y setfilter

PostPosted: Sun Apr 26, 2015 6:47 pm
by xmanuel
A ver Luis, el problema no es que sea o no publica o privada sino que en el sitio donde se compile esa variable sea o no visible... y es logico que no lo es :-(
Para que funcione deberías compilar el valor de la variable local y no el nombre de la misma...

Ahora veamos este ejemplo con variable

caso 1
Le estás pasando la variable local nValor al objeto dataBase y cuando lo compila esa variable no es visible
Local nValor
nValor := aMae[2] //Nro de proveedor
oCom:setfilter( "npro = nvalor" ) ---> oCom:setfilter( "npro = " + str( nvalor ) )

No funciona y da el error que envié anteriormente

caso 2
Aquí lo empeoras ya que estás pasando la variable como un valor de tipo "C" y espera uno de de tipo "N"
Local nValor
nValor := aMae[2]
oCom:setfilter( "npro = 'nvalor'" ) ---> oCom:setfilter( "npro = " + str( nvalor ) )

Error description: Error BASE/1071 Error de argumento: =
Args:
[ 1] = N 809
[ 2] = C nvalor



caso 3
Aquí la variable es visible en todo tu programa por eso no da ningun error
Public nValor
nValor := aMae[2]
oCom:setfilter( "npro = nvalor" )

Funciona como debe

Re: database y setfilter

PostPosted: Sun Apr 26, 2015 6:50 pm
by xmanuel
Luis yo lo cambiaría a:
de esto
Local nValor
nValor := aMae[2] //Nro de proveedor
oCom:setfilter( "npro = nvalor" )

a esto

oCom:setfilter( "npro == " + str( aMae[2] ) ) // No hace falta usar variables :D

Re: database y setfilter

PostPosted: Fri May 01, 2015 1:50 pm
by surGom
Gracias Manuel ahora lo entendí y lo apliqué, pude dejar de usar la database modificada.


Luis

PD: sin comentarios de mi rapidez mental...

Re: database y setfilter

PostPosted: Sat May 02, 2015 1:42 am
by xmanuel
:lol: