OrdScope perde o filtro

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

OrdScope perde o filtro

Mensagem por rubens »

Olá...

Estou tendo um problema com cdx e ordscope. Tenho um relatorio no sistema que filtra as vendas por grupo e por periodo como na figura abaixo:
RelVendaporGrupo.png
Observem que o grupo 001 - Equipamentos de Informatica o valor está correto... filtrou belezinha... a Partir do grupo 002 ele já perde a filtragem de data e passa filtrar somete o grupo e todas a datas. Tenho outros filtros parecidos e tá dando erro somente nesse.

Este é um resumo do codigo da filtragem. Quando executo o browse(), consigo ver que foi filtrado correto o grupo 001 dentro do período 01/10/2014 e 31/10/2014. A partir do grupo 002 - já não mostra afiltragem de data só o grupo. Tô fazendo de forma errada ou é um bug mesmo ?

Código: Selecionar todos

SET DATE BRIT 
SET EPOC TO 1930
SET CENT ON 
FERASE('IVENDAS.CDX')
USE IVENDAS ALIAS IVEN EXCL
INDEX ON CODGRU_+DTOS(DATA_) TAG IVENDAS7 TO IVENDAS.CDX
SET INDEX TO IVENDAS
cCODGRU1 := '001'
cCODGRU2 := '090'
D1 := CTOD('01/10/2014')
D2 := CTOD('31/10/2014')
DBGOTOP()
ORDSCOPE(0,cCODGRU1+DTOS(D1))
ORDSCOPE(1,cCODGRU2+DTOS(D2))
DBGOTOP()
BROWSE()
Acho que estou apanhando do ordscope...
Se faço o filtro criando indice temporário funciona perfeitamente...

Código: Selecionar todos

	FERASE('IVENTMP.CDX')
   DBSelectArea('IVEN')
   DBSetIndex()
   INDEX ON CODGRU_ TAG CODGRU TO IVENTMP.CDX FOR IVEN->DATA_>dDTINI .AND. IVEN->DATA_<= dDTFIM
   SET INDEX TO IVENTMP.CDX
	DBGOTOP()   
Segue tb o código completo do relatório e o arquivo dos itens de vendas. Se alguém puder dar uma olhada... agradeço..

Código: Selecionar todos

********************************************************************************
FUNCTION RELVEN7()	// VENDA POR GRUPO
LOCAL GetList	:= {}
LOCAL nTam		:= 80
LOCAL cTela		:= SAVESCREEN(00,00,24,79)
LOCAL cTIPO_PRN := "I"
LOCAL cCor		:= SETCOLOR()
LOCAL nCursor	:= SETCURSOR()
nPag				:= 0
FIRST				:= .T.

IF !ABREARQ(,{"PRO","GRU","IVEN"})
   BEEP()
   MENSAGEMR("N„o consegui abrir os arquivos, abortando !")
   RETURN NIL
ENDIF

WHILE( .T. )

   SETCURSOR(1)
   RESTSCREEN( ,,,, CTELA )
   JANELA( 6,10,18,70," PARAMETROS PARA EMISSAO DO RELATORIO VENDAS POR GRUPO ")

   dDTINI   	:= DATASIS-30
   dDTFIM   	:= DATASIS
   cCODGRU1		:= '001'
   cCODGRU2		:= '   '
   cPRECO		:= 'N'   // N-NOTA - C-CUSTO  

   COR("GETS")
   @ 08,12 SAY "DATA INICIAL.:" GET dDTINI 	VALID !EMPTY(dDTINI)
   @ 10,12 SAY "DATA FINAL...:" GET dDTFIM 	VALID dDTFIM >= dDTINI
   @ 12,12 SAY 'GRUPO INICIAL:' GET cCODGRU1 PICT '999' VALID PESQGRU( @cCODGRU1,12,32,.T.,.F.) .AND. !EMPTY(cCODGRU1)
   @ 14,12 SAY 'GRUPO FINAL..:' GET cCODGRU2 PICT '999' VALID PESQGRU( @cCODGRU2,14,32,.T.,.F.) .AND. !EMPTY(cCODGRU2)
   @ 16,12 SAY 'PRECO (N)CUSTO DANOTA (C)PRECO COM IMPOSTOS:' GET cPRECO 	PICT '!'   VALID cPRECO$'NC'
   READ

   IF PERGUNTA("CONFIRMA A EMISSAO DO RELATORIO ?")=="N" .OR. ESC()
      EXIT
   ENDIF

   IF ESC()
      EXIT
   ENDIF

   GRUPO		:= {}
   NOMGRU  	:= {}
   CUSTO   	:= {}
   VENDA   	:= {}
   DIFE    	:= {}

   nTOTCUSTO := 0.00
	nTOTVENDA := 0.00
	nTOTDIFE	 := 0.00

   XINI      := 0

   DBSelectArea('IVEN')
   DBSetOrder(7)
   DBGOTOP()
   ORDSCOPE(0,cCODGRU1+DTOS(dDTINI))
	ORDSCOPE(1,cCODGRU2+DTOS(dDTFIM))
	DBGOTOP()

   WHILE !EOF()
   
   	cCODGRU 		:= IVEN->CODGRU_
      cNOMGRU 		:= NOMGRU( cCODGRU)
      
   	MOSTRA('SOMANDO VENDAS DO GRUPO -> '+GRU->CODGRU_ + '-' + GRU->NOMGRU_ )
      
      nCUSTOGRU 	:= 0.00
      nVENDAGRU 	:= 0.00
      lACHOUVENDA	:= .F.
      
      WHILE IVEN->CODGRU_ = cCODGRU
      
      	lACHOUVENDA := .T. 

         // ACHA PRECO DE CUSTO
         cCODPRO 		:= IVEN->CODPRO_
         nCUSTOPRO 	:= 0.00
         
         DBSelectArea('PRO')
         DBSetOrder(1)
         DBGOTOP()
         IF DBSEEK( cCODPRO )
         	IF cPRECO = 'N'
         		nCUSTOPRO := PRO->CUSTONT_
        		ELSE
        			nCUSTOPRO := PRO->PRCUSTO_
				ENDIF
         ELSE
         	nCUSTOPRO := IVEN->VALOR_ 
        	ENDIF
        	
      	nCUSTOGRU += (nCUSTOPRO    * IVEN->QTDE_)
      	nVENDAGRU += (IVEN->VALOR_ * IVEN->QTDE_)
      	
         DBSelectArea('IVEN')
         DBSKIP()

      ENDDO

		IF lACHOUVENDA
	      AADD(GRUPO    , cCODGRU )
	      AADD(NOMGRU   , cNOMGRU )
	      AADD(CUSTO    , nCUSTOGRU )
	      AADD(VENDA    , nVENDAGRU )
	      AADD(DIFE     , nVENDAGRU-nCUSTOGRU )
		   nTOTCUSTO += nCUSTOGRU
			nTOTVENDA += nVENDAGRU 
			nTOTDIFE	 += nVENDAGRU-nCUSTOGRU
  		ENDIF
  		
   ENDDO
   
   MENSAGEM("Tecle <ESC> para retornar",(1/10))
   COR("MENU")

   IF !MENU_PRN(@cTIPO_PRN)
      EXIT
   ENDIF

	IF cTIPO_PRN="I"
	   SET PRINTER TO &cPRINT2
	ELSE
	   COMPRNOFF()
	ENDIF
	SET DEVICE TO PRINT

   PAG	:= 0
   FIRST	:= .T.
   XINI 	:= XFIM := 0
   XFIM 	:= LEN( GRUPO )

   FOR Y = 1 TO LEN( GRUPO )

      XINI := Y
      IMPRIME(XINI,XFIM,"IMPRIMINDO VENDAS POR GRUPOS")

      IF FIRST
         FIRST := .F.
         CABECALHO("VENDA RESUMIDA POR GRUPO DE "+DTOC( dDTINI ) + " ATE "+DTOC(dDTFIM ) )

         @ PROW()+1,00 SAY "COD-GRUPO"
         @ PROW()  ,30 SAY "    CUSTO           VENDA   (%)    VENDA-CUSTO (%)"
         //                 99.999,99  9999.999,99-99.99% 99.999,99-999.99
         //                 34567890123456789012345678901234567890123456789
         //               33      40         50        60        70
         @ PROW()+1,00 SAY REPLICATE("=",80)

      ENDIF

      @ PROW()+1,00 SAY GRUPO[Y]+'-'+LEFT(NOMGRU[Y],28)
      @ PROW()  ,33 SAY TRAN( CUSTO[Y],"@KE 999,999.99"  )
      @ PROW()  ,44 SAY TRAN( VENDA[Y],"@KE 9999,999.99" ) + '/' + TRAN( VENDA[Y]/(nTOTVENDA/100), '99.99%' )
      @ PROW()  ,62 SAY TRAN( DIFE[Y], "@KE 999,999.99"  ) + '/' + TRAN( DIFE[Y]/(VENDA[Y]/100), '999.99%' )

   NEXT

   @ PROW()+1,00 SAY REPLI("=",80)
   @ PROW()+1,00 SAY 'TOTAIS ->'
   @ PROW()  ,32 SAY TRAN( nTOTCUSTO , "@KE 9999,999.99" )
   @ PROW()  ,44 SAY TRAN( nTOTVENDA , "@KE 9999,999.99" )
   @ PROW()  ,62 SAY TRAN( nTOTDIFE  , "@KE 999,999.99"  ) + '/' + TRAN( nTOTDIFE/(nTOTVENDA/100), '999.99%' )
   
   @ PROW()+1,00 SAY REPLI("=",80)
   RODAPE()
   EXIT
ENDDO

COMPRNON()
SET FILTER TO
SET PRINTER TO
SET DEVICE TO SCREEN
IF cTIPO_PRN == "A"
	SET PRINTER TO
	RUN NOTEPAD &cARQPRN
ELSEIF cTIPO_PRN == "T"
	SET PRINTER TO
	IMP_TELA(nTam)
ENDIF

DBSelectArea('IVEN')
ORDSCOPE(0,)
ORDSCOPE(1,)

SETCURSOR(0)
RESTSCREEN(,,,,cTela )
ABREARQ(,.F.)
RETURN NIL
Arquivo dos itens de venda
IVENDAS.rar
(456.91 KiB) Baixado 51 vezes
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

OrdScope perde o filtro

Mensagem por Itamar M. Lins Jr. »

Ola!

Código: Selecionar todos

dDTINI      := DATASIS-30
dDTFIM      := DATASIS
cCODGRU1      := '001'
cCODGRU2      := '   '
cPRECO      := 'N'   // N-NOTA - C-CUSTO  

use:
dDtini := hb_bom()
cCodGru2 := "9999"
Se ficar cCodGru2 := space(x) irá ficar na frente.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

OrdScope perde o filtro

Mensagem por rubens »

Itamar não entendi muito bem...

use:
dDtini := hb_bom() // Esse hb_bom() é uma função ?
cCodGru2 := "9999" // Esse cCodGru2 vai receber o grupo final e não pode ficar vazio.
Se ficar cCodGru2 := space(x) irá ficar na frente.
Então sempre vai ter cCodgru1 - '001' cCodgru2 - '999' // valores hipoteticos.. pode ser outro grupo mas vai estar preenchido...

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

OrdScope perde o filtro

Mensagem por Itamar M. Lins Jr. »

Não tem relação com o problema isso que postei.
Agora use alias() ao invés de dbselectarea()

Código: Selecionar todos

	  // DBSelectArea('IVEN')
	   iven->(OrdSetFocus(7)) //DBSetOrder(7)
	   //DBGOTOP() //não precisa 
	   iven->(ORDSCOPE(0,cCODGRU1+DTOS(dDTINI)))
	   iven->(ORDSCOPE(1,cCODGRU2+DTOS(dDTFIM)))
	   iven->(DBGOTOP())
           do while iven->(!eof())
           iven->(DbSkip())
Parece que quando vc muda dbselectarea perde o filtro.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

OrdScope perde o filtro

Mensagem por Itamar M. Lins Jr. »

Aqui, pode enxugar também

Código: Selecionar todos

	        // DBSelectArea('PRO') não precisa
	        pro->(OrdSetFocus(1)) //DBSetOrder(1)
	        // DBGOTOP() não precisa
	         IF pro->(DBSEEK( cCODPRO ))
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

OrdScope perde o filtro

Mensagem por rubens »

Bom dia Itamar...

Então... as alterações que você sugeriu são bem vindas... mas o problema não está nessa parte de varredura do arquivo ou perdendo o filtro na varredura do arquivo e sim na filtragem com o ordscope().

Olha essa rotina que foi feita a parte:

Código: Selecionar todos

SET DATE BRIT 
SET EPOC TO 1930
SET CENT ON 
FERASE('IVENDAS.CDX')
USE IVENDAS ALIAS IVEN EXCL
INDEX ON CODGRU_+DTOS(DATA_) TAG IVENDAS7 TO IVENDAS.CDX
SET INDEX TO IVENDAS
cCODGRU1 := '001'
cCODGRU2 := '090'
D1 := CTOD('01/10/2014')
D2 := CTOD('31/10/2014')
DBGOTOP()
ORDSCOPE(0,cCODGRU1+DTOS(D1))
ORDSCOPE(1,cCODGRU2+DTOS(D2))
DBGOTOP()
BROWSE()
Ela abre o arquivo ivendas.dbf (o mesmo que anexei aqui) cria o indice ivendas.cdx com o campo codgru_+dtos(data_).
cria os campos para filtrar do grupo '001' até o grupo '090' no período de 01/10/2014 até o período 31/10/2014.
Na figura abaixo, pelo browse() pode ver que enquanto era grupo='001' ele filtrou as datas corretamente, quando mudou para o grupo='002' ele perde a filtragem de data, retornando a primeira data do grupo='002' que é 23/01/2010 e o correto seria a primeira data 01/10/2014.
Então na hora da filtragem quando muda o grupo o ordscopus() tá perdendo o filtro...

Se trocar por index resolve, mas perde velocidade...

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

OrdScope perde o filtro

Mensagem por Itamar M. Lins Jr. »

Pois é.
Cadê esse índice aqui ?
DBSetOrder(7)
A sintaxe de como ele é criado ?
Em todo caso, use index com o flag temporary caso complique muito.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

OrdScope perde o filtro

Mensagem por Kapiaba »

Código: Selecionar todos

// #include "FiveWin.ch" // somente para teste nao uso modo console.

ANNOUNCE RDDSYS
REQUEST DBFCDX, DBFFPT

FUNCTION IVENDAS()

   SET DATE BRIT
   SET EPOC TO 1930
   SET CENT ON

   RDDSETDEFAULT("DBFCDX")

   FERASE('IVENDAS.CDX')

   USE IVENDAS ALIAS IVEN EXCLUSIVE NEW

   // FUNCIONOU COM XHARBOUR
   //INDEX ON CODGRU_+DTOS(DATA_) TAG IVENDAS7 TO IVENDAS

   INDEX ON DTOS(DATA_) + CODGRU_ TAG IVENDAS7 TO IVENDAS

   SET INDEX TO IVENDAS

   cCODGRU1 := '001'
   cCODGRU2 := '090'

   D1 := CTOD('01/10/2014')
   D2 := CTOD('31/10/2014')


   /* // FUNCIONOU COM XHARBOUR
   // xHarbour 1.2.3 Intl. (SimpLex) (Build 20140725)
   ORDSCOPE(0,cCODGRU1+DTOS(D1))
   ORDSCOPE(1,cCODGRU2+DTOS(D2))
   DBGOTOP()
   */

   // FUNCIONOU POR DATA + GRUPO
   ORDSCOPE( 0, DTOS(D1) + cCODGRU1 )
   ORDSCOPE( 1, DTOS(D2) + cCODGRU2 )
   DBGOTOP()

   BROWSE()

RETURN NIL
abs
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

OrdScope perde o filtro

Mensagem por rubens »

Itamar - no prg do relatório completo que você viu o dbsetorder(7), esse índice foi criado na sétima ordem mesmo... Eu uso uma matriz para criar os indices:

Código: Selecionar todos

AADD( aArq, { {"IVENDAS" 	,"Arquivo de Itens de Vendas" }, {"IVENDAS" } ,{"CODPRO_","NUMERO_","DATA_","CODCLI_","NUMERO_+CODPRO_",'CODGRU_','CODGRU_+DTOS(DATA_)'}	,"IVEN" })
Mas isso no prg completo do relatório.

criei essa rotina

Código: Selecionar todos

SET DATE BRIT 
SET EPOC TO 1930
SET CENT ON 
FERASE('IVENDAS.CDX')
USE IVENDAS ALIAS IVEN EXCL
INDEX ON CODGRU_+DTOS(DATA_) TAG IVENDAS7 TO IVENDAS.CDX
SET INDEX TO IVENDAS
cCODGRU1 := '001'
cCODGRU2 := '090'
D1 := CTOD('01/10/2014')
D2 := CTOD('31/10/2014')
DBGOTOP()
ORDSCOPE(0,cCODGRU1+DTOS(D1))
ORDSCOPE(1,cCODGRU2+DTOS(D2))
DBGOTOP()
BROWSE()
Só para tirar a prova e saber onde estava o erro... Se o browse() dessa rotina aqui mostrasse os dados corretamente o erro estaria no meu relatório mas como dá para ver através da figura abaixo o erro está na filtragem... veja que quando ele mostra o ultimo registro do grupo_ = '001' e entra no primeiro registro do grupo_ = '002' ele não pega o primeiro dia do filtro que seria 01/10/2014 e sim o dia 30/06/2010. Vamos esquecer o relatorio completo... Só este último prg aqui... Quando ele chama o browse(), tem que retornar os dados filtrados por grupo e por data, dentro dos filtros estipulados... Então mostraria grupo 001 e todas as datas do grupo 001 filtradas entre 01-10-2014 e 31-10-2014. Daí iria para o grupo 002 - e todas as datas entre 01-10-2014 e 31-10-2014. Só que quando ele mostra o grupo 001 (correto), quando pula para o grupo 002-deveria vir 01-10-2014.. e não ele está mostrando todas as datas... ele perde o filtro da data.
Browse_erro_ordscope.png
Kapiaba - Do jeito que voce falou eu testei mas aí não dá para listar o relatório do jeito que preciso... porque ele filtrará por data e depois por grupo não tem como eu somar as vendas do grupo... porque ele não está na sequencia... a sequencia tem quer ser grupo e data. Com o index tá perfeito só que lento comparado ao ordscope().

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

OrdScope perde o filtro

Mensagem por Kapiaba »

Tente assim... Apenas uma sugestão. Crie o Indice TEMPORÁRIO à gosto, é melhor.
É como se você fizesse um SET FILTER, mas em alta velocidade, mais rápido que o OrdScope()

Código: Selecionar todos

ANNOUNCE RDDSYS
REQUEST DBFCDX, DBFFPT

FUNCTION IVENDAS()

   LOCAL cAlias

   SET DATE BRIT
   SET EPOC TO 1930
   SET CENT ON

   RDDSETDEFAULT("DBFCDX")

   USE IVENDAS EXCLUSIVE NEW

   cCODGRU1 := '001'
   cCODGRU2 := '090'

   D1 := CTOD('01/10/2014')
   D2 := CTOD('31/10/2014')

   INDEX ON  IVENDAS->CODGRU_   TAG 07 TO IVENTEMP ;
         FOR ( .NOT. EOF() )                .AND.  ;
               IVENDAS->CODGRU_ >= cCODGRU1 .AND.  ;
               IVENDAS->CODGRU_ <= cCODGRU2 .AND.  ;
               IVENDAS->DATA_   >= D1       .AND.  ;
               IVENDAS->DATA_   <= D2      TEMPORARY

   BROWSE()

RETURN NIL
Abs.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

OrdScope perde o filtro

Mensagem por Itamar M. Lins Jr. »

Ok, ok !!! cara pálida!
Para funcionar da sua forma, tem que a variavel do cCodGru1/2 mudar p/ aCodGrupo:={} ser array ou como mostrado ai em baixo.
Array se for trabalhar com letras nos codgrupo

Código: Selecionar todos

 DBSelectArea('IVEN')
 DBSetOrder(7)
lUltimoGrupo := .F.
WHILE !EOF()
 
  cCODGRU   := IVEN->CODGRU_
  cNOMGRU   := NOMGRU( cCODGRU)

  ORDSCOPE(0,cCodGru+DTOS(dDTINI))
  ORDSCOPE(1,cCodGru+DTOS(dDTFIM))
  DBGOTOP()
   
  MOSTRA('SOMANDO VENDAS DO GRUPO -> '+GRU->CODGRU_ + '-' + GRU->NOMGRU_ )
   
   nCUSTOGRU  := 0.00
   nVENDAGRU  := 0.00
   lACHOUVENDA := .F.
   
   WHILE IVEN->CODGRU_ = cCODGRU
   
    lACHOUVENDA := .T. 

    // ACHA PRECO DE CUSTO
    cCODPRO   := IVEN->CODPRO_
    nCUSTOPRO  := 0.00
    
    DBSelectArea('PRO')
    DBSetOrder(1)
    DBGOTOP()
    IF DBSEEK( cCODPRO )
     IF cPRECO = 'N'
      nCUSTOPRO := PRO->CUSTONT_
      ELSE
       nCUSTOPRO := PRO->PRCUSTO_
    ENDIF
    ELSE
     nCUSTOPRO := IVEN->VALOR_ 
     ENDIF
     
    nCUSTOGRU += (nCUSTOPRO  * IVEN->QTDE_)
    nVENDAGRU += (IVEN->VALOR_ * IVEN->QTDE_)
    
    DBSelectArea('IVEN')
    DBSKIP()
    
   ENDDO 

   IF lUltimoGrupo 
      exit
   ENDIF

   IF inv->codGru_ == cCodGru2
      lUltimoGrupo := .T. 
   ENDIF

ENDDO

O filtro está correto, a falha é da sua lógica.
00120140101
00220100101 //veja que para vc está errado mas para o filtro está correto, 002 é maior do que 001 ano de 2010 não era p/ sair mais sai porque é 002!!!!
Então:
002 2010 10 01 será menor que
002 2014 10 01
E o ordscope diz, filtrar (001 2014 10 01 até 002 2014 10 01) está correto sair 002 2010 10 01!
Aplique por codigo do grupo, como mostrado ai em cima.


Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

OrdScope perde o filtro

Mensagem por rubens »

Bom dia

Kabiaba - Estou fazendo com indice temporario... Só não sabia dessa forma com opção de temporary.. Vou testar.

Itamar - Com o set date brit que foi informado não deveria ter colocado a data no padrão dd/mm/aaaa? Então o filtro ficaria
grp data
00101102014
00202102014
00203102014
00204102014
...
00101102014

00201102014
00202102014
00203102014
00204102014
...
00201102014
Independente do relatório quando eu filtrasse com ordscope e usasse o browse() deveria me mostrar a listagem acima, só que quando mostra o grupo 001, mostra certo, quando pula para o grupo 002 perde o filtro da data mostrando a o grupo 002 e a data 10062010 que está fora do scopo . Sem entrar no relatório só a visualização do browse(). Então o problema não está no relatório... porque ele vai mostrar o que foi filtrado. Com o index foi aplicado o mesmo escopo do ordscope() e funcionou redondinho.

Como os grupos são poucos, imagine que dê 50 grupo, acho que funcionaria filtrando somente as datas com o ordscope() e varrer o arquivo de grupos pegando o código e voltando no arquivo de vendas (que já está filtrado pela data) e fazer um setfilter do grupo que foi pego no arquivo de grupos, se a filtragem não resultar em nenhum registro ignora o grupo e pega o próximo grupo no arquivo de grupos até o final. Mas aí acho que ficaria mais lento do que índice temporário.
Só é ruim porque é uma falha grave do ordscope().
Continuo afirmando que a falha é no ordscope() senão o grupo 001 também viria com todas as datas como os demais grupos e não filtraria somente o mê 10/2014.

Obrigado

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

OrdScope perde o filtro

Mensagem por Itamar M. Lins Jr. »

Ola!
Só é ruim porque é uma falha grave do ordscope().
Moço! repito, não tem falha nenhuma no ordscope! reveja seu código, releia o que escrevi.

set date brit, não ordena! set date brit apenas mostra.
se vc indexa com codgru_ + DTOS(data_) a data independente (dd/mm/aa) sempre fica (AAAA MM DD)
VC usa ordscope( "001" + DTOS(dINICIO) ) fica novamente (AAAA MM DD)
Veja seu indice está ordenando assim:

001 + AAAA MM DD , não importa a data que venha depois quando ele atinge o grupo 002 sempre irá pegar a menor data porque tudo que venha depois ainda assim é maior que 001 XXXX MM DD
Pense ai mais um pouquinho.
inicio do filtro -> 001 2014 10 01 = dtos(dInicio)
001 2014 10 01
002 2010 09 01 -> ano de 2010 mes 9
002 2010 10 01 -> ano de 2010 mes 10
Final do filtro -> 002 2014 10 31 = dtos(dFim)
O filtro está correto!!!!!!!!!

Use o OrdScope a cada grupo que irá funcionar, aqui funcionou certinho.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

OrdScope perde o filtro

Mensagem por Itamar M. Lins Jr. »

Mesmo que fosse pelo seu raciocínio ainda assim o ordscope estaria correto.
001 01 10 2014 -> inicio do ordscope correto ? //ordscope ( "001" + dtos ( dInicio ) )
002 01 01 2010 -> aqui vc acha que esta errado não deveria sair. Só que vc esquece que 002 01 01 2010 é maior que 001 01 10 2014 e menor que o final do seu filtro que seria um grupo por exemplo 003 31 10 2014 entendeu ?

Essa confusão muita gente faz! ate eu mesmo já quebrei a cabeça com isso.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

OrdScope perde o filtro

Mensagem por Itamar M. Lins Jr. »

Para confirmar o que eu escrevo é só vc começar seu filtro com o grupo 002
Veja que esse "002" irá sair correto e quando pular para 003 vai ficar errado(para você). Da sua forma de raciocinar só irá sair certo no primeiro grupo.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Responder