Limite de un Scope

Limite de un Scope

Postby JoseLuis » Mon Jun 18, 2018 9:50 am

Buenas

Sabeis si existe algun límite al confeccionar la variable que nos indique Topscope o Bottomscope ?

Me explico:

Tengo una dbf llamada albaran con su indice CDX indexado por : index on _field->Conductor+dtos(_field->fecha)+STR(_field->Tipo) tag "Conductor" .

El campo conductor el Caracter, y el campo Tipo es Numérico.

Ahora bien, cuando voy a utilizar ORDSCOPE, hago lo siguiente:

(Publicas:Conductor el el codigo del conductor y Publicas:cini es una fecha de inicio)
Primero creo la variable con el limite superior: scopeini:=Publicas:Conductor+dtos(Publicas:cIni)
El limite inferior igual: scopefin:=Publicas:Conductor+dtos(Publicas:cFin)

Ahora hago: Ordscope(0,(scopeini))
Ordscope(0,(scopefin))

Y esto Funciona correctamente, me hace un browse con los límites indicados

Hasta ahora sólo he utilizado como limites, el número de conductor y el límite de fecha, pero cuando quiero añadir un tercer parámetro, que está en el índice y que es el tipo de albaran, ya no hace ningún filtro, me sigue haciendo sólamente el filtro por las dos primeras condiciones.

Si cambio las condiciones, y en lugar de la fecha pongo conductor+ '2' (que es el tipo), también funciona, osea que me filtra por conductor mas el tipo.

Code: Select all  Expand view
     

  dbUseArea(.T.,,Publicas:cUnidad+Publicas:cSubd+"\Conduc",aAlias[26],.T.)
  (aAlias[26])->(OrdSetFocus("Codigo"))

  dbUseArea(.T.,,Publicas:cUnidad+Publicas:cSubd+"\ALBARAN",aAlias[24],.T.)
  (aAlias[24])->(OrdSetFocus("Conductor"))

        Publicas:nConduc:=(aAlias[26])->codigo
        scopeini:=Publicas:nConduc+dtos(Publicas:cIni)
        scopefin:=Publicas:nConduc+dtos(Publicas:cFin)
       (aAlias[24])->(Ordscope(0,(scopeini)))
       (aAlias[24])->(Ordscope(1,(scopefin)))
       (aAlias[24])->(Dbgotop())

       do while !(aAlias[24])->(Eof())
         ncobro1+= (aAlias[24])->baseimpo
         nbultos1+= iif ((aAlias[24])->kkilos = 0,(aAlias[24])->kilos,(aAlias[24])->kkilos)
         cuentaal1+=1
         (aAlias[24])->(dbskip())
       enddo
         (aAlias[24])->(Ordscope(0,Nil))
         (aAlias[24])->(Ordscope(1,Nil))
         (aAlias[24])->(Dbgotop())

*********************************************************************
** HASTA AQUI TODO CORRECTO
********************************************************************
         scopeini:=Publicas:nConduc+dtos(Publicas:cIni)+'2'
         scopefin:=Publicas:nConduc+dtos(Publicas:cFin)+'2'
         (aAlias[24])->(Ordscope(0,(scopeini)))
         (aAlias[24])->(Ordscope(1,(scopefin)))
         (aAlias[24])->(Dbgotop())

       do while !(aAlias[24])->(Eof())
         ncobro2+= (aAlias[24])->baseimpo
         nbultos2+= iif ((aAlias[24])->kkilos = 0,(aAlias[24])->kilos,(aAlias[24])->kkilos)
         cuentaal2+=1
         (aAlias[24])->(dbskip())
       enddo

*************************************************************
* ESTE ULTIMO SCOPE NO HACE NADA, ME TOMA LA BASE DE DATOS ENTERA
*******************************************************************

 


Esto me ha llevado a pensar si hay un limite al confeccionar la variable, o es que estoy haciendo algo mal.

Un saludo
--------------------------
Saludos

Jose Luis
JoseLuis
 
Posts: 426
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Re: Limite de un Scope

Postby karinha » Mon Jun 18, 2018 2:12 pm

Code: Select all  Expand view


   dbUseArea(.T.,,Publicas:cUnidad+Publicas:cSubd+"\Conduc",aAlias[26],.T.)
   (aAlias[26])->(OrdSetFocus("Codigo"))

   dbUseArea(.T.,,Publicas:cUnidad+Publicas:cSubd+"\ALBARAN",aAlias[24],.T.)
   (aAlias[24])->(OrdSetFocus("Conductor"))

        Publicas:nConduc:=(aAlias[26])->codigo
        scopeini:=Publicas:nConduc+dtos(Publicas:cIni)
        scopefin:=Publicas:nConduc+dtos(Publicas:cFin)

       (aAlias[24])->(Ordscope(0,(scopeini)))
       (aAlias[24])->(Ordscope(1,(scopefin)))
       (aAlias[24])->(Dbgotop())

       do while !(aAlias[24])->(Eof())

         SYSREFERESH()

         ncobro1+= (aAlias[24])->baseimpo
         nbultos1+= iif ((aAlias[24])->kkilos = 0,(aAlias[24])->kilos,(aAlias[24])->kkilos)
         cuentaal1+=1
         (aAlias[24])->(dbskip())
       enddo
         (aAlias[24])->(Ordscope(0,Nil))
         (aAlias[24])->(Ordscope(1,Nil))
         (aAlias[24])->(Dbgotop())

*********************************************************************
** HASTA AQUI TODO CORRECTO
********************************************************************

         SET ORDER TO 0

         SELECT( DATOS ) // NUEVAMENTE
         SET ORDER TO... // EL INDICE CORRECTO?
         GO TOP

         BROWSE()

         GO TOP

         scopeini:=Publicas:nConduc+dtos(Publicas:cIni)+'2'
         scopefin:=Publicas:nConduc+dtos(Publicas:cFin)+'2'

         (aAlias[24])->(Ordscope(0,(scopeini)))
         (aAlias[24])->(Ordscope(1,(scopefin)))
         (aAlias[24])->(Dbgotop())

         BROWSE()

       do while !(aAlias[24])->(Eof())

         SYSREFERESH()

         ncobro2+= (aAlias[24])->baseimpo
         nbultos2+= iif ((aAlias[24])->kkilos = 0,(aAlias[24])->kilos,(aAlias[24])->kkilos)
         cuentaal2+=1
         (aAlias[24])->(dbskip())
       enddo

 
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7794
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Limite de un Scope

Postby JoseLuis » Mon Jun 18, 2018 3:22 pm

Karinha

Muchas gracias por tu interés, pero despues de hacer todas las pruebas, sigue igual.

en la expresion:

scopeini:=Publicas:nConduc+dtos(Publicas:cIni)+'2'
scopefin:=Publicas:nConduc+dtos(Publicas:cFin)+'2'
albaran->(Ordscope(0,(scopeini)))
albaran->(Ordscope(1,(scopefin)))

+'2' no lo tiene en cuenta, es decir que si escribo:
scopeini:=Publicas:nConduc+'2'
scopefin:=Publicas:nConduc+'2

funciona correctamente el filtro para Publicas:nconduc+'2'
si escribo:
scopeini:=Publicas:nConduc+dtos(Publicas:cIni)
scopefin:=Publicas:nConduc+dtos(Publicas:cFin)

funciona correctamente el filtro para Publicas:nconduc+dtos(Publicas:cIni)

pero si escribo
scopeini:=Publicas:nConduc+dtos(Publicas:cIni)+'2'
scopefin:=Publicas:nConduc+dtos(Publicas:cFin)+'2'

solamente me filtra las dos primeras condiciones, ignora el +'2'

he creado el indice con
index on _field->Conductor+dtos(_field->fecha)+STR(_field->Tipo,1) tag "Conductor"

tambien he probado a crear uno temporal con

INDEX ON albaran->conductor+dtos(albaran->fecha)+str(albaran->tipo,1) TAG xtemporal TO xmemoria MEMORY


pero sigue igual, haga lo que haga solamente me filtra por las dos primeras condiciones que ponga en el scope, si pongo tres, ignora ésta ultima


Saludos
--------------------------
Saludos

Jose Luis
JoseLuis
 
Posts: 426
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo

Re: Limite de un Scope

Postby karinha » Mon Jun 18, 2018 3:45 pm

teste con este ejemplo:

Code: Select all  Expand view

#include "fivewin.ch"
#include "autoget.ch"
#include "xbrowse.ch"
//--------------------------------------------------------------------------------------

FUNCTION main()

LOCAL oDlg, oGet1, oGet2,oSay1, oOk, lOk := .F.
LOCAL cName := space(20)
LOCAL cFunc := space(20)

LOCAL cAl1,cAl2 := ""

   REQUEST DBFCDX
   rddsetdefault( "dbfcdx" )
   REQUEST DBFFPT

   USE CUSTOMER SHARED NEW
   index on  field->FIRST TAG I_TEMP  TO TEMP  TEMPORARY
   cAl1 := alias()
   dbgotop()

   XBROWSE()
   
   USE EJEMPLO1 SHARED NEW
   index on  field->FUNCION TAG I_TEMP  TO TEMP  TEMPORARY
   cAl2 := alias()

   XBROWSE()

   dbgotop()
   

   DEFINE DIALOG oDlg TITLE "Test Autoget from DBF "

   @ 1.2,1.2 SAY oSay1 PROMPT "Name (dbf 1)" oF oDlg

   @ 2.1,1.2 SAY oSay1 PROMPT "Function (dbf 2)" OF oDlg

   @ 1.4,6.1 AUTOGET oGet1 VAR cName OF oDlg SIZE 110,12  // CASE CPROPER ALIAS cAl1 INDEX 1 ADD ITEM

   * Custom Function to Add a New Record
   oGet1:bAddNewItem := {||AddNewItem(oGet1)}

   
   @ 2.4,6.1 AUTOGET oGet2 VAR cFunc OF oDlg SIZE 110,12 // CASE CUPPER ALIAS cAl2 INDEX 1
   

   @ 3.0,19  BUTTON oOk PROMPT "&Finish" SIZE 35,12 OF oDlg ACTION (lOk := .T., oDlg:End())

   ACTIVATE DIALOG oDlg CENTERED

   
RETURN lOk

**********

FUNCTION AddNewItem(oGet)

local cValue

if alltrim(oGet:oGet:Buffer) = nil
   return nil
endif

select(oGet:calias)
dbgotop()
DbSeek(alltrim(oGet:oGet:Buffer),.t.)

if .not. found()
   DbAppend()
   if .not. NetErr()
      if rlock()
         do case
            case oGet:nCase = 1
                 cValue :=  UPPER(alltrim(oGet:oGet:Buffer))
            case oGet:nCase = 2
                 cValue :=  LOWER(alltrim(oGet:oGet:Buffer))
            case oGet:nCase = 3
                 // cValue :=  PROPER(alltrim(oGet:oGet:Buffer))
         endcase      
         replace first with cValue
         dbcommit()
         dbunLock()
         XBROWSER oGet:cAlias // Only for testing
      endif
   endif
endif

RETURN nil

**********
 
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7794
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Limite de un Scope

Postby JoseLuis » Tue Jun 19, 2018 3:03 pm

Buenas

Ya he localizado donde está el fallo, aunque todavía no he podido corregirlo, estoy en ello.

Me he dado cuenta que cuando añado una condición al scope detrás de un campo fecha es cuando surge el error.

El tema está desde la forma de creacion del indice, si le he puesto antes la opcion set century on y set date to british o no, y después cuando creo el scope, tengo que tener en cuenta éste tema.

Saludos.

P.D. Aunque no sé, ya que estoy haciendo multitud de pruebas y no consigo dar con ello, seguimos que si añado un condición tras una fecha, nada de nada, no toma en cuenta esa condicion.
--------------------------
Saludos

Jose Luis
JoseLuis
 
Posts: 426
Joined: Thu Oct 19, 2006 12:28 pm
Location: Toledo


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 70 guests