Página 1 de 1

Consulta ficou lenta - to quase desistido do clipper!!!

Enviado: 09 Abr 2008 21:32
por marbio
Boa Noite,


Tenho um sistema para POSTO DE SAUDE no meu municipio, funciona desta forma tem um servidor, e mais oito estabelecimento pindurado numa rede WIRELLES, ja ate troquei AP 2100/108MBPS e placas wirelles tbm 108MBS, por hora deu certo, mas esta ficando lento outra vez sao 8 PSF o meu o sistema contrala desde consulta etc.. bla bla. o bando de dados esta ficando muito grande. para fazer consulta, como faço para fazer uma consulta melho. eu uso indexar, criar indece.

Eu tava vendo o SET SCOP sera que vai me ajudar nisso, ja tentei fazer a rotina mas nao consegui. de nenhuma forma. as explicação que tem no forum na entendi.


fico no aguardo...

t+

Marbio

Enviado: 09 Abr 2008 23:33
por alaminojunior
Você não deu informações sobre o sistema como rdd utilizado, entre outras.
Caso este sistema seja compilado com Clipper 5.2, voce pode fazer uso da RDD SIX, que vai lhe dar muitas alegrias, haja vista os post´s já colocados.
Agora se você usa Clipper 5.3, daí tem que ser a RDD CDX, que vai permitir que você use o tal Set Scope, mas mesmo assim depende de politicas de como se trabalha com os dados.
Agora...
se nada disso te encorajou ou não deu certo, a saída pode estar no xHarbour com outras RDD´s para uso com bases de dados como mysql e cia., uma vez que vc trabalha com acesso remoto (pelo menos foi isso que entendi).
Se for o caso, faça uma busca pelo fórum e poste as dúvidas na seção xHarbour.

Enviado: 09 Abr 2008 23:58
por Dudu_XBase
Marbio Boa Noite.
Se vc utiliza indices CDX.
Pode usar o Set Scope

1. Opção

Código: Selecionar todos

  REQUEST DBFCDX
  RDDSETDEFAULT( 'DBFCDX' )
  
  use seubanco
  // criando indice para o campo do filtro
  // caso ja tiver o indice basta usar o set index to
  index on CAMPO  to seubanco   

  // Inicio do Filtro
  set scope top "00001"  
  // Fim do Filtro
  set scope bottom "00002"   
  gotop() 
    
  // Vai mostrar os dados filtrados
  browse()

  return nil 
  
2. Opção
Usando Indices temporários crie ele na estação local de preferencia

Código: Selecionar todos

  USE SEU BANCO

  INDEX ON CAMPO TO SEUBANCO FOR CODIGO="00001" .OR. CODIGO="00002"

  DBGOTOP()
  BROWSE() 
  RETURN NIL
  
3. Opção Usando Set Filter
USANDO SET FILTER

Código: Selecionar todos

  USE SEUBANCO
  INDEX ON CAMPO TO SEUBANCO   

  SET FILTER TO CAMPO="00001" .or. CAMPO="00002"  

  dbgotop()
  browse() 
  Return Nil
  
Se eu tiver errado nos exemplos citados favor alguém me corrija...normalmente eu uso Set Scope...eu citei as demais por elas existirem e que tb podem ser uma solução pro seu problema...

Enviado: 10 Abr 2008 07:46
por toya
marbio, se puderes me adicone no vosso MSN para conversarmos sobre o assunto "Sistema de Saude - lento com Clipper"...: toyasis@yahoo.com.br

Enviado: 10 Abr 2008 10:19
por marbio
Bom dia,

O sistema é em clipper 5.3, estou usando NTX, e multi usuario. alem dos 8 PSF, deve ter mais 10 computador conectado na rede. estou ficando meio pertubado com isso.

desde ja agradeco sua atenção.

Marbio.

Enviado: 11 Abr 2008 18:19
por sygecom
Marbio, já que usa clipper 5.3 pode migrar facilmente para DBFCDX, vc só a ganhar, e não vai ser nescessario muita alteração. De uma procurada no forum que tem inumeros post de como usar DBFCDX.

Enviado: 11 Abr 2008 20:30
por marbio
Boa Noite,

Me parece que agora a coisa ta indo.....

duvidas?

colquei

REQUEST DBFCDX
RDDSETDEFAULT( 'DBFCDX' )


Mas a onde que eu index nao mudei, para Tag vou deicar como ta posso?

para nao precisar alterar o sistema inteiro!

estou com duvida na pesquisa com set scope,

eu uso assim no ntx

index on codcl to (varusa) for(codcl=nvar .and. dtpaga>=xinicio .and. dtpaga<=xfinal)
set index to (varusa)

como procedor com scope.

fico no agurado...
t+

Enviado: 11 Abr 2008 22:32
por sygecom
Olá Marbio,
marbio escreveu: Mas a onde que eu index nao mudei, para Tag vou deicar como ta posso?
Não é o ideal mas pode, na minha opnião deveria usar um arquivo de indice com varias tag para cada dbf , ex:

Código: Selecionar todos

   index on CODIGO     TAG 1 to AGENDA
   index on NOME       TAG 2 to AGENDA
   index on TELEFONE1  TAG 3 to AGENDA
   index on TELEFONE2  TAG 4 to AGENDA
   index on CELULAR    TAG 5 to AGENDA
   index on CIDADE     TAG 6 to AGENDA
   index on TIPO       TAG 7 to AGENDA
   index on TIPO+NOME  TAG 8 to AGENDA
Veja a vantagem em ter um unico arquivo de indice. Você diminui a quantidade "files" aberto no MS-DOS, outra vantagem, vc pode usar "SET AUTOPEN ON" no inicio do seu sistema para abrir automaticamente os indices junto com os DBF(obs: o DBF e INDICE deve ter o mesmo nome).
estou com duvida na pesquisa com set scope,
eu uso assim no ntx

index on codcl to (varusa) for(codcl=nvar .and. dtpaga>=xinicio .and. dtpaga<=xfinal)
set index to (varusa)

como procedor com scope.
Bom vou citar dois exemplos de varios que vc pode vir a ter:

Código: Selecionar todos

....
// crie um indice fixo pelo campo "DTPAGA" e use assim:
// Index on DTPAGA  TAG 4 to nome_indice

....
....
Sele no_alias  // nome do alias ou dbf...
dbsetorder(4)  // ordem de indice DTPAGA
ORDScope(0, xinicio)   // inicio do filtro
ORDScope(1, xfinal)   // fim do filtro
DBGOTOP()   
set filter codcl=nvar
....
....
....
Segundo exemplo:

Código: Selecionar todos

....
// crie um indice fixo pelo campo "DTPAGA + CODCL" e use assim:
// Index on DTOS(DTPAGA)+STR(CODCL)  TAG 4 to nome_indice


....
....
Sele no_alias  // nome do alias ou dbf...
dbsetorder(4)  // ordem de indice DTPAGA
ORDScope(0, DTOS(xinicio) + STR(nvar))   // inicio do filtro
ORDScope(1, DTOS(xfinal) + STR(nvar))   // fim do filtro
DBGOTOP()   
....
....
....
O caminho é esse....boa sorte, e qualquer duvida prende o grito...

Abraços
Leonardo Machado

Enviado: 15 Abr 2008 21:41
por marbio
Boa Noite,,

Muito obrigado pela orientação,
estou fazendo as mudanças,

para teste. logo logo dou retorno

muito obrigado mesmo.

t+

erro

Enviado: 17 Abr 2008 20:03
por marbio
Boa Noite,

Me parece que ta dando certo, ta dando este erro.

ORDCREATE(0) INTERNAL ERROR 8002


Código: Selecionar todos

Request _DBFCDX
DbsetDriver("_DBFCDX")

clear
set century on
set epoch to 1960
set score off
set delete on
set date brit

Request _DBFCDX
DbsetDriver("_DBFCDX")

xcod=0
xinicio=ctod("")
xfinal=ctod("")

use arqmorto excl new 
IF !neterr() 
   pack 
   delete file arq1.CDX 
   index on codcl+data to arq1
   set date BRIT 
   use 
ELSE 
   @ 16,13 say "ARQUIVO EM USO!" COLOR "R*/W" 
ENDIF 

@02,01 say 'Codigo ' get xcod pict '9999999999'
@03,01 say " data " get xinicio
@04,01 say " data " get xfinal 
read

horainicial=time()

use arqmorto index arq1

         dbsetorder(1)
         ordscope (0,xcod+xinicio)
         ordscope (1,xcod+xfinal)
         dbgotop()


horafinal=time()
@23,10 say 'Processo realizado em: ' +elaptime(horainicial,horafinal)

         aColunas:={'Data','Produto','Qtd','Unit','Venda','dtpaga'}
         dbedit(06,06,19,74,aColunas)

Enviado: 18 Abr 2008 01:02
por vagucs
Olha cara, o SETSCOPE vai ajudar muito, eu usei muito na SIX e hoje uso no xHARBOUR.

Mas para seu caso, como ta via wireless, unidade mapeada, acho mais seguro o amigo começar a pensar em xHarbour, em 1 dia ele pode resolver seus problemas por toda a vida.

Compila nele e coloca rodando num servidor de aplicação windows ou linux, vc nao vai se arrepender, para o usuario nao muda nada e o sistema decola, tivemos muitas experiencias na migração de sistema nos ultimos 4 anos, é tudo muito tranquilo e o resultado, pode ter certeza, é o melhor, muitos do forum usam e acredito que ninguem se arrependeu.

Enviado: 18 Abr 2008 06:34
por Itamar M. Lins Jr.
vagucs escreveu:Olha cara, o SETSCOPE vai ajudar muito, eu usei muito na SIX e hoje uso no xHARBOUR.

Mas para seu caso, como ta via wireless, unidade mapeada, acho mais seguro o amigo começar a pensar em xHarbour, em 1 dia ele pode resolver seus problemas por toda a vida.
Não fala assim, porque o Maligno tem um troço.

:-)

Saudações
Itamar M. Lins Jr.

Re: erro

Enviado: 18 Abr 2008 06:51
por sygecom
marbio escreveu:Boa Noite,

Me parece que ta dando certo, ta dando este erro.
ORDCREATE(0) INTERNAL ERROR 8002
Olá Marbio,
Primeiro eu vi que no seu exemplo vc postou duas vez as seguintes linhas:

Código: Selecionar todos

Request _DBFCDX
DbsetDriver("_DBFCDX")
Pode tirar as duas segundas linhas repetidas. Sobre o seu exemplo, eu faria da seguinte maneira:

Código: Selecionar todos

Request _DBFCDX
DbsetDriver("_DBFCDX")

clear
set century on
set epoch to 1960
set score off
set delete on
set date brit
set autopen off

xcod=0
xinicio=ctod("")
xfinal=ctod("")

use arqmorto excl new
IF !neterr()
   pack
   delete file arq1.CDX
   index on str(codcl)+dtos(data) to arq1
   set date BRIT
   set index to arq1
use
ELSE
   @ 16,13 say "ARQUIVO EM USO!" COLOR "R*/W"
ENDIF

@02,01 say 'Codigo ' get xcod pict '9999999999'
@03,01 say " data " get xinicio
@04,01 say " data " get xfinal
read

horainicial=time()

         dbsetorder(1)
         ordscope (0,str(xcod)+dtos(xinicio))
         ordscope (1,str(xcod)+dtos(xfinal))
         dbgotop()

horafinal=time()
@23,10 say 'Processo realizado em: ' +elaptime(horainicial,horafinal)

         aColunas:={'Data','Produto','Qtd','Unit','Venda','dtpaga'}
         dbedit(06,06,19,74,aColunas)