database y setfilter

database y setfilter

Postby surGom » Tue Feb 12, 2013 9:42 pm

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 + "}" )

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


 
surGom
 
Posts: 639
Joined: Wed Oct 19, 2005 12:03 pm

Re: database y setfilter

Postby surGom » Tue Feb 12, 2013 10:15 pm

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
surGom
 
Posts: 639
Joined: Wed Oct 19, 2005 12:03 pm

Re: database y setfilter

Postby carlos vargas » Wed Feb 13, 2013 3:18 am

Code: Select all  Expand view

 (oCtae:calias)->npro = 0
  ...
  oCtae:SetFilter( "NPRO=0" )
  ...
 
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1683
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: database y setfilter

Postby surGom » Wed Feb 13, 2013 3:21 pm

Gracias Carlos lo voy a probar y te comento
surGom
 
Posts: 639
Joined: Wed Oct 19, 2005 12:03 pm

Re: database y setfilter

Postby surGom » Fri Feb 15, 2013 12:15 pm

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
surGom
 
Posts: 639
Joined: Wed Oct 19, 2005 12:03 pm

Re: database y setfilter

Postby surGom » Thu Apr 23, 2015 10:16 pm

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
surGom
 
Posts: 639
Joined: Wed Oct 19, 2005 12:03 pm

Re: database y setfilter

Postby surGom » Thu Apr 23, 2015 10:21 pm

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
surGom
 
Posts: 639
Joined: Wed Oct 19, 2005 12:03 pm

Re: database y setfilter

Postby xmanuel » Thu Apr 23, 2015 10:57 pm

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 :-)
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 756
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: database y setfilter

Postby surGom » Sat Apr 25, 2015 1:03 pm

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
surGom
 
Posts: 639
Joined: Wed Oct 19, 2005 12:03 pm

Re: database y setfilter

Postby xmanuel » Sun Apr 26, 2015 6:47 pm

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
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 756
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: database y setfilter

Postby xmanuel » Sun Apr 26, 2015 6:50 pm

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
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 756
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: database y setfilter

Postby surGom » Fri May 01, 2015 1:50 pm

Gracias Manuel ahora lo entendí y lo apliqué, pude dejar de usar la database modificada.


Luis

PD: sin comentarios de mi rapidez mental...
surGom
 
Posts: 639
Joined: Wed Oct 19, 2005 12:03 pm

Re: database y setfilter

Postby xmanuel » Sat May 02, 2015 1:42 am

:lol:
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 756
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 84 guests