Jump to content
Fivewin Brasil

ordscope com mais de uma condição


roberio

Recommended Posts

  • 7 months later...

não estou conseguindo filtrar com o ordscope quando tenho mais de uma condição. tenho um arquivo indexado por controle+turma+estagio+nome e quero filtrar todos pelo controle+turma+estagio usando o ordscope. abaixo uma das tentativas que tb não funcionou.

 

SANOTA->(DBSETORDER(6)) // indexado por str(CONTROLE,3)+STR(TURMA,2)+ESTAGIO+NOME
SANOTA->(OrdScope(0,str(ccontr,3)+str(ctur,2)+cestagio))
SANOTA->(OrdScope(1,str(ccontr,3)+str(ctur,2)+cestagio))
SANOTA->(DBGOTOP())

 

 

Link to comment
Share on other sites

Caro Colega.

 

Não tenho muita experiência com OrdScope, talvez algum outro colega saiba a solução correta.

Eu utilizaria o Set filter:

SET FILTER TO cContr == Controle .AND. cTur == Turma .AND. cEstagio == Estagio.

 

o Set filter é bem lento, principalmente em rede. Mas fica aí uma solução temporaria até alguma alma caridosa com mais experiência responder.

Link to comment
Share on other sites

Olá,

Está correto como vc postou, deveria funcionar, eu não gosto muito de usar índices desse jeito com str, prefira usar o StrZero() ao invés do Str(), mas de qualquer maneira está correto.

Veja que ele irá filtrar primeiramente pelo cContr+cTurm+cEstagio

Só uma pergunta, essas variáveis são Numéricas né ? pergunto isso por vc ter colocado "c" na frente, indicando ser uma var Caracter ao invés de ser numéria como deveria ser para poder usar o STR()

 

Abraços

Vagner Wirts

Link to comment
Share on other sites

a minha primeira escolha foi o set filter to, mas na rede está muito lento. por isso, pedi ajuda em relação ao ordscope. estranhamente, as linhas do ordscope que postei no início que nunca funcionaram, agora estão funcionando. só a variavel cestagio é caracter, as demais são numericas. está funcionando corretamente. obrigado....

Link to comment
Share on other sites

funcionou assim:

 

sanota->(OrdScope(0,str(ccontr,3)+str(cturma,2)+cestagio))
sanota->(OrdScope(1,str(ccontr,3)+str(cturma,2)+cestagio))
sanota->(DBGOTOP())


agora tenho outro problema com ordscope. vejam:

sanota->(DBSETORDER(7)) // indexado por NOME + str(CONTROLE,3)+ DTOS(DT_SAIDA)
sanota->(OrdScope(0,cnome+str(ccontr,3)+EMPTY(DTOS(DT_SAIDA))))
sanota->(OrdScope(1,cnome+str(ccontr,3)+EMPTY(DTOS(DT_SAIDA))
sanota->(DBGOTOP())

ele dá erro informando que existe uma variavel lógica.
preciso fazer o ordscope com nome + controle+ (empty(dt_saida e outro com !empty(dt_saida)).

não estou conseguindo visualizar isso com o ordscope.

Link to comment
Share on other sites

Eu faria com INDICE TEMPORÃRIO NA MEMÓRIA, a velocidade é a mesma do OrdScope().

 

Você pode criar quantos INDICES temporários na Memóra quiser, desde que esteja usando .CDX.

 

abs,

 

 

Exemplo:
 
            INDEX ON STATUS+STR(NFECOD,6,0)    TAG 06 TO INFETEMP ;
                     FOR ( .NOT. EOF() )                .AND.     ;
                         CADNFE->NFECOD  >= NFE_INICIAL .AND.     ;
                         CADNFE->NFECOD  <= NFE_FINAL   .AND.     ;
                         CADNFE->STATUS   = "   "       .AND.     ;
                         CADNFE->STATUS  != "GER"       .AND.     ;
                         CADNFE->STATUS  != "APR"       .AND.     ;
                         CADNFE->STATUS  != "CAN"       .AND.     ;
                         CADNFE->STATUS  != "IMP"       .AND.     ;
                         CADNFE->STATUS  != "ENV"       .AND.     ;
                         CADNFE->STATUS  != "INU"       .AND.     ;
                         CADNFE->STATUS  != "DEN"       .AND.     ;
                         CADNFE->TPFAT_OP = [P] TEMPORARY
Link to comment
Share on other sites

Alguém arruma a hora desse servidor, aaaaaaaaaaaaa

 

 

sanota->(DBSETORDER(7)) // indexado por NOME + str(CONTROLE,3)+ DTOS(DT_SAIDA)
sanota->(OrdScope( 0 , cnome+str(ccontr,3)+ DTOS( CTOD('') ) ))
sanota->(OrdScope( 1 , cnome+str(ccontr,3)+ DTOS( CTOD('') ) ))
sanota->(DBGOTOP())

Olá, para arrumar a hora, você deve entrar no seu "PERFIL" e alterar o relogio para hora de Brasilia - GMT.  abs.

Link to comment
Share on other sites

Alguém arruma a hora desse servidor, aaaaaaaaaaaaa

 

 

sanota->(DBSETORDER(7)) // indexado por NOME + str(CONTROLE,3)+ DTOS(DT_SAIDA)
sanota->(OrdScope( 0 , cnome+str(ccontr,3)+ DTOS( CTOD('') ) ))
sanota->(OrdScope( 1 , cnome+str(ccontr,3)+ DTOS( CTOD('') ) ))
sanota->(DBGOTOP())

Olá, para arrumar a hora, você deve entrar no seu "PERFIL" e alterar o relogio para hora de Brasilia - GMT.  abs.

Vlw Kapiaba ^^

Link to comment
Share on other sites

Primeiro, vc. deve eliminar todos os SET FILTERS do seu sistema, e em todos os locais que precise de FILTRO, que não necessitem de INDICES FIXOS, voce usa INDICE TEMPORARIO, a indexação é igual a normal, só que em vez de fazer a INDEXAÇÃO no arquivo.CDX, vc. faz na memória em tempo real, o modo de fazer o INDICE é igual ao normal, só que voce acrescenta o comando TEMPORARY ao indexador.

Ao sair do indice temporário, para não quebrar o programa, já que voce perderá a TAG do indice normal, você carrega o indice original.

 

Dúvidas vá perguntando, para melhor entender, vá fazendo testes até "matar" a charada, veja exemplo acima.  abs.

Link to comment
Share on other sites

Parametros para .CDX
INDEX ON   ;
    TAG TO ;
    FOR    ;
    WHILE  ;
    NEXT | RECORD | REST | ALL ;
    UNIQUE ;
    ASCENDING | DESCENDING ;
    EVAL EVERY ;
    USECURRENT ;
    ADDITIVE ;
    CUSTOM ;
    NOOPTIMIZE;
    TEMPORARY

 

 

http://forums.fivetechsupport.com/viewtopic.php?f=3&t=25771&hilit=TEMPORARY

 

Abs,

Link to comment
Share on other sites

  • 1 month later...

Eu fiz o trabalho com o OrdScope foi perfeito mas estou tentando fazer com arquivo

temporário. De acordo com o exemplo que foi dado acima.

 

Vejam como fiz, e o problema acontece quanto tenta abrir o arquivo .CDX

 

Abraços

 

Oziel Lopes

 

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


   Select Cadastro
   
   INDEX ON IDADE+SEXO+GRAU+AREA+NOME TAG 05 TO CADTMP       ;
                    FOR ( .NOT. EOF() )                            .AND. ;
                    CADASTRO->IDADE   >= "cIdade1"     .AND. ;
                    CADASTRO->IDADE   <= "cIdade2"     .AND. ;
                    CADASTRO->SEXO      = "cSexo"        .AND. ;
                    CADASTRO->GRAU     = "cGrau"        .AND. ;
                    CADASTRO->AREA      = "cArea"  TEMPORARY

   Select Cadastro
   Set Index to CADTMP TEMPORARY  // -------- LInha 2602
   DBGotop()


//-- ERRO DO SISTEMA  -------------------------------------------------------
 
   Application
   ===========
   Path and name: C:\Proj_FWH\grh\GRH.EXE (32 bits)
   Size: 2,418,688 bytes
   Time from start: 0 hours 0 mins 20 secs
   Error occurred at: 10/05/13, 16:18:06
   Error description: (DOS Error 2) DBFCDX/1003  Open error: CADTMP.cdx

   Stack Calls
   ===========
   Called from:  => ORDLISTADD(0)
   Called from:  => PESQIDADE(2602)
   Called from: cadastro.000 => (b)CADASTRO(185)
   Called from: DBTNBMP.PRG => TDBTNBMP:CLICK(409)
   Called from: DBTNBMP.PRG => TDBTNBMP:LBUTTONUP(481)
 

Link to comment
Share on other sites

Carissimo, se é na memória, isto não existe: CADTMP.cdx

 

Retire isto:

 

Select Cadastro

 

Set Index to CADTMP TEMPORARY  // -------- LInha 2602

 

quando sair do indice temporário, ai sim você diz:

 

Set Index to

 

e abre os indices normais .cdx

 

abs,

Link to comment
Share on other sites

Indice temporário é uma mão na roda mesmo... Somente para acrescentar na dica, a respeito do que o Kapiaba disse sobre quebrar o programa e ter que restaurar o indice, para não se preocupar com isso voce pode abrir a tabela com um alias só para criar o indice temporário. Por exemplo, se vc tem a tabela CLIENTES  e em todo sistema voce abre a tabela com o alias CLI vc pode abrir nessa rotina especifica, que cria o indice temporario como, 'CLI_TRB'. Assim somente no alias CLI_TRB que voce terá o indice temporario vinculado e não desposiciona a CLI.

 

Estou alterando em todos os meus sistemas para esse conceito de abrir ALIAS separado em locais que uso filtro ou indices temporarios. Em todos os meus cadastros eu abro um xBrowse exibindo todos os registros da tabela, nesse xBrowse eu posso passar filtros, movimentar, etc... O grande problema era que com o filtro ativo, ao abrir a rotina de ALTERACAO (por exemplo) eu tinha que tirar o filtro, posicionar, executar a rotina, ao fechar a rotina voltar o filtro e posicoonar novamente. Agora eu faço o seguinte: Ao acionar a opcao do menu eu abro um ALIAS temporario e com nome UNICO para a rotina, exemplo CLI_0001, e no xBrowse eu posso filtrar, desposiconar e fazer qualquer coisa que o alias CLI, nao tem nenhuma alteracao e nao me preocupo em nada com filtros ativos e com desposicionamento. Pelos testes que fiz no xHarbour podemos abrir mais de 4000 alias em cada instancia do sistema.

 

Exemplo prático:

 

USE CLIENTES ALIAS CLI SHARED NEW

USE CLIENTES ALIAS CLI_0001 SHARED NEW

 

DbSelectArea('CLI_0001')

DbGoTo(5)

 

DbSelectArea('CLI')

DbGoTo(2)

 

? CLI_0001->(Recno())   // retorna 5

? CLI->(Recno())  // retorna 2

 

DbSelectArea('CLI_0001')

Set Filter To TIPO='1'

 

DbSelectArea('CLI')

Set Filter To TIPO='2'

 

? CLI_0001->(DbFilter())   // retorna TIPO='1'

? CLI->(DbFilter())   // retorna TIPO='2'

 

abraços

 

 

 

 

 

Primeiro, vc. deve eliminar todos os SET FILTERS do seu sistema, e em todos os locais que precise de FILTRO, que não necessitem de INDICES FIXOS, voce usa INDICE TEMPORARIO, a indexação é igual a normal, só que em vez de fazer a INDEXAÇÃO no arquivo.CDX, vc. faz na memória em tempo real, o modo de fazer o INDICE é igual ao normal, só que voce acrescenta o comando TEMPORARY ao indexador.

Ao sair do indice temporário, para não quebrar o programa, já que voce perderá a TAG do indice normal, você carrega o indice original.

 

Dúvidas vá perguntando, para melhor entender, vá fazendo testes até "matar" a charada, veja exemplo acima.  abs.

Link to comment
Share on other sites

se usar filtro temporário não existe motivo pra usar Set Filter To.... Realmente, pra gente está uma mão na roda, da mais liberdade pra trabalhar na tabela sem preocupação em desposicionar a tabela.

 

é a maneira ideal para se trabalhar com o sistema em MDI... É uma mudança de conceito mesmo..

 

 

vlw ae, abraços

 

EXCELENTE Emotta, mas um simples SET FILTER TO, fecha o indice temporário e não quebrará quando voce der um SELECT NomedoArquivo.

 

Mas a sua idéia é ótema. aumenta o código, mas é ótema.

 

obg, abs.

Link to comment
Share on other sites

kkkk ta perdoado parcero....

 

abraços e se começar a usar esse esquema de alias temporarios me avisa como foi .... sobre os indices temporários vou usar em alguns casos... apesar de conhecer isso estava esquecido a sua utilização pra mim....

 

 

ERREI emotta, eu quis dizer: SET INDEX TO... Desculpe nossa falha.... kkkkkkkkkkkkkk

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...