Página 1 de 1

dbedit mais rápido

Enviado: 29 Dez 2009 09:06
por lapinhazzz
Bom Dia Amigos do Forum.

Eu faço um filtro com o dbedit e o código é o seguinte

Código: Selecionar todos


function mv_n
   public cvara,varia,sai,novo,rplafc,rplafc,rdata,rprecov,quanto,vcodigo,corc,corp,rcodigo,RTOTALP,RTOTALC,RQUANTP,RQUANTC
   priv l,vapaga,x,resto,tplafond
   priv vprod,vprecov,vitem,vvenda,rvtotal,vquant
   saida=.f.
   RQUANTC=0
   RQUANTP=0
   RTOTALP=0
   RTOTALC=0
   tit("Vendas em Serie")
   rot="INCLUI_ITEM"
   *sai=0
   wait "ola"
   cor(3)
   rvtotal=0
   tplafond=0
   @04,00 say "Venda  DataACTUAL   Proc  Utente               Esc Curso  Ano   Turma     Total"
   cor(5)
   sele 1
   go bott
   @05,00 say strzero(a1->venda+1,5,0)
   cor(2)
   cor(51)
   @05,07 say date()
   datactual=date()
   cor(2)
   do whil .T.
      IF lastkey()=27
         exit
      ENDIF
      sele 5
      use pessoal
      inde on proc to pessoal1
      rproc="      "
      @05,19 get rproc valid dproc()
      read
      if lastkey()=27
         exit
      endi
      rplafp=plafp
      rplafc=plafc
      @05,19 SAY PROC
      @05,26 say utente
      @05,58 say ano
      @05,64 say turma
      rcodigocur=codigocur
      rescalao=cescalao
      sele 6
      use escaloes
      inde on cescalao to escalao1
      seek rescalao
      IF found() .AND. cescalao="  "
         save scree to ola
         men(2,4,0,907,0,0,0,0)
         restore scree from ola
      else
         letrat=letraesc
         cor(2)
         @05,47 say letraesc
      endif
      sele 7
      use cursos
      inde on codigocur to ccur
      seek rcodigocur
      IF found() .AND. rcodigocur="  "
         save scree to ola
         men(2,4,0,908,0,0,0,0)
         restore scree from ola
      else
         rcoridocur=codigocur
         rcurso=cursoabv
      endif
      @05,51 say cursoabv
      l=lastkey()
      IF l=27
         SELE 1
         ROT="MV"
         RETURN
      ENDIF
      cor(2)
      var()
      sele 2
      set orde to 1

      * CRIA ARQ TEMP***************************
      copy stru to temp
      sele 21
      use temp alia b21
      appe blan
      set filt to recno()>1
      * inde on descend(item) to temp1
      inde on item to temp1
      inde on item to temp2
      inde on val(codigoprod) to iquant
      set inde to temp1,temp2,iquant
      set orde to 2
      sele 2
      seek strzero(a1->venda,5,0)
      *FIM*******************************************
      sele 3
      use produtos
      inde on prod to iprod
      inde on val(codigoprod) to icodigo
      rcor=" "
      copias=0
      flag=.f.
      rcodigo="    "
      do whil .t.
         vcodigo="     "
         vquant=0
         sele 21
         publ v1c[1],v2c[1],v3c[1],v4c
         v1c[1]="strzero(item,3,0)+'   '+codigoprod+' '+prod+' '+str(quant)+'   '+cor+'      '+tran(precov,'@E 9,999.99')+'  '+tran(quant*precov,'@E 999,999.99')"
         v3c[1]="Item Codigo  Produto                        Quant  COR        Pvenda       Total"
         v2c[1]="@"
         v4c=""
         pfs("[F5ExcluiLinha,F10Grava")
         cor(2)
         keyb chr(26)
         set delete on
         KEYB CHR(26)
         cor(13)
         @ 21,10 say spac(30)
         @ 21,62 say spac(6)
         @ 21,70 say spac(8)
         @ 21,00 say spac(47)
         @ 21,72 say spac(8)
         cor(2)

         dbedit(07,00,19,79,v1c,"fc",v2c,v3c,v4c)

         l=lastkey()
         IF l=27
            exit
         endif
Como altero o programa para que o scope faça o browse mais rápido com muitos registos.

Obrigado a todos
Lapinhazzz

Re: dbedit mais rápido

Enviado: 29 Dez 2009 09:51
por Itamar M. Lins Jr.
Ola!
Esse seu código está muito mal estruturado.
É assim mesmo ? Voce deve criar os indices uma vez só "antes" não toda vez que entrar nessa função.
Por exemplo aqui:

Código: Selecionar todos

 sele 5
      use pessoal
      inde on proc to pessoal1
...
e aqui.
    sele 6
      use escaloes
      inde on cescalao to escalao1
    sele 6
      use escaloes
      inde on cescalao to escalao1
...
e aqui
 sele 7
      use cursos
      inde on codigocur to ccur
Se esses arquivos forem grandes já existirá uma demora.
Depois vem esse set filter que não serve para nada.

Código: Selecionar todos

use temp alia b21
      appe blan
      set filt to recno()>1
      * inde on descend(item) to temp1
      inde on item to temp1
      inde on item to temp2
      inde on val(codigoprod) to iquant
      set inde to temp1,temp2,iquant
E depois voce indexa o arquivo eu não entendi isso.

E novamente voce indexa outro arquivo.

Código: Selecionar todos

   use produtos
      inde on prod to iprod
      inde on val(codigoprod) to icodigo
Se forem arquivos grandes, esses dbfs deverão ser indexados préviamente, uma unica vez e só deverão ser reindexados se o BD estiver corrompido ou outra necessidade.
Dessa forma como está seu programa é mono usuário e já ficará lento mesmo usando set scope.
Essa função: mv_n precisa ser refeita., alias quando pedidir ajuda coloque o código mais exugado(menor) possível. Para "adivinhar" onde está o problema nesse ai está difícil.

Saudações,
Itamar M. Lins Jr.

Re: dbedit mais rápido

Enviado: 29 Dez 2009 12:20
por lapinhazzz
Bom dia a todos.

Itamar você tem razão esta mal estruturado.

Estou a aprender com o tempo e com os amigos do forum.

Código: Selecionar todos

procedure main()
use temp alia b21
      appe blan
      set filt to recno()>1
      inde on codigo to temp1
      do whil .t.
         vcodigo="     "
         vquant=0
         sele 21
         publ v1c[1],v2c[1],v3c[1],v4c
         v1c[1]="strzero(item,3,0)+'   '+codigoprod+' '+prod+' '+str(quant)+'   '+cor+'      '+tran(precov,'@E 9,999.99')+'  '+tran(quant*precov,'@E 999,999.99')"
         v3c[1]="Item Codigo  Produto                        Quant  COR        Pvenda       Total"
         v2c[1]="@"
         v4c=""
         pfs("[F5ExcluiLinha,F10Grava")    && Mensagem para excluir linha no dbedit ou gravar o que está no arquivo temporário o que é feito na função de usuário do dbedit
         cor(2)
           dbedit(07,00,19,79,v1c,"fc",v2c,v3c,v4c)
......
sele 21
            appe blan
            repl cor with C->COR
            repl datactual with date()
            repl cescalao with f->cescalao
            repl letraesc with letrat
            repl codigocur with rcodigocur
            repl cursoabv with g->cursoabv
            repl proc with rproc
            repl codigoprod with vcodigo
            repl prod  with C->prod
            repl quant with vquant
            repl precov  with c->precov
            repl venda with vvenda
            repl item  with vitem
            repl total with vquant*c->precov
            dbcommit()
.....
endd
 rele v1c,v2c,v3c,v4c
   wait "apagamento ficheiro"
   sele 21
   use
   l=sdd+"\temp.dbf"
   erase &l
   l=sdd+"\temp1.ntx"
   erase &l

Este código é para criar um ficheiro temporário que guardará as informações do ficheiro detalhe de vendas (dvendas).
eu crio o ficheiro temporário, depois ponho um registo em branco no ficheiro temp
quando faço o set filt to recno()>1 e depois quando faço o dbedit este apresenta os dados do temp no ecra.
Por isso tem este set filter.
Mas você me poderia postar a maneira que fazem com o scope para por o browse do dbedit mais rápido em vez de set filter o que é que eu punha?

Re: dbedit mais rápido

Enviado: 29 Dez 2009 22:31
por Itamar M. Lins Jr.

Código: Selecionar todos

set filt to recno()>1
A pergunta é:
Em um dbf qual recno() é menor que 1?

Saudações,
Itamar M. Lins Jr.

Re: dbedit mais rápido

Enviado: 30 Dez 2009 14:28
por lapinhazzz
Bom Dia

o recno()>1 é feito no ficheiro temp que é o ficheiro temporário que é copiado a estrutura do ficheiro dvendas ou seja o ficheiro detalhe de vendas.

quando faço dbedit do ficheiro temp
aparece o browse a zero para que assim pudesse inicializar o temp e mostrar na tela.

Obrigado Itamar

Lapinhazzz

Re: dbedit mais rápido

Enviado: 02 Jan 2010 23:32
por clodoaldomonteiro
Você já tentou usar o Browse?
Ele é naturalmente mais rápido. O meu aqui voa.

Re: dbedit mais rápido

Enviado: 04 Jan 2010 13:18
por Itamar M. Lins Jr.
No caso, é melhor voce não usar arquivo temporário, mas seguindo seu código.

Código: Selecionar todos

use temp alia b21
        appe blan
//      set filt to recno()>1
      inde on codigo to temp1 for !empty(codigo)
E de boa praxe escrever a palavra toda. Antigamente no tempo do XT isso economizava memória agora não é mais preciso, SID 501...

Código: Selecionar todos

append blank
index on
set filter to
Como dito pelo colega a função Dbedit() é obsoleto, melhor usar ou aprender usar a classe tbrowse é muito mais poderosa.

Saudações,
Itamar M. Lins Jr.