Página 1 de 1

recall e deteted() !!!!!! E esta hein?

Enviado: 16 Fev 2010 20:18
por lapinhazzz
Amigos do Forum Boa Noite.

Alguém me sabe dar uma resposta quando todos os registos do ficheiro abaixo indicado estão deletados e só mudam em recall para não apagados. Mas.....
Só faz recall ao registo número 2
e o resto hein??

Gostaria que alguém me desse um exemplo de uma pequena rotina que faça o serviço.

Está aqui o código mais a estrutura da base de dados.


Código: Selecionar todos


procedure main()
   sele 1
   use vendas alia a1
   set deleted off
   go top
   inde on str(venda)+proc to i for deleted() temporary
   go top
   do whil !eof()
      sele 1
      IF ff="1"
         recall
         replace ff with " "
      ENDIF
      skip
   endd
return

//ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
// Database File: C:\TEMP\VENDAS.DBF
//   Last Update: 02/16/10
//     # Records: 3
//      # Fields: 20  Bytes/Record: 121
//ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
// Field  FieldName  Type  Width  Decimals
//ÄÄÄÄÄÄ  ÄÄÄÄÄÄÄÄÄ  ÄÄÄÄ  ÄÄÄÄÄ  ÄÄÄÄÄÄÄÄ
//   1    VENDA       N    005     000
//   4    PROC        C    006     000
//  20    FF          C    001     000
//ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

muito obrigado a todos
e BOM CARNAVAL

lapinhazzz


:))

Re: recall e deteted() !!!!!! E esta hein?

Enviado: 16 Fev 2010 20:33
por alaminojunior
À princípio, o código parece correto. Mas note que você avalia uma condição antes de desmarcar para deleção.
Não sería este o problema ?

Código: Selecionar todos

   do whil !eof()
      sele 1
      IF ff="1" // se ff for igual a "1" ele desmarca
         recall
         replace ff with " "
      ENDIF
      skip
   endd
E outra coisa: você abriu o índice com deleted(). Verifique se o pepino não está aí também, pois após desmarcar, o registro não estará mais visível.

Re: recall e deteted() !!!!!! E esta hein?

Enviado: 17 Fev 2010 09:17
por rochinha
Amiguinho,

Geralmente após um comando DELETE eu costumo usar SKIP -1, já que não temos uma espécie de comando REFRESH.

Se for o caso após o SKIP de um GO TOP pois ao que parece o ponteiro esta indo para no ultimo registro ou sendo posicionado no final da listagem.

Por isto não continua.

Re: recall e deteted() !!!!!! E esta hein?

Enviado: 17 Fev 2010 09:45
por lapinhazzz
Seria este o código caros amigos?

Código: Selecionar todos

do whil !eof()
      sele 1
      IF ff="1" // se ff for igual a "1" ele desmarca e torna o registo não deletado
         replace ff with " "
         recall
         skip -1    
       else
         skip      
      ENDIF
endd

obrigado

lapinhazzz

Re: recall e deteted() !!!!!! E esta hein?

Enviado: 17 Fev 2010 11:46
por Toledo
Acho que para resolver o problema, neste seu último exemplo, basta tirar a linha "sele 1" e no lugar de "skip -1" coloque GO TOP.

O problema todo é como o alaminojunior e o Rochinha observaram, está no arquivo de índice.
alaminojunior escreveu:E outra coisa: você abriu o índice com deleted(). Verifique se o pepino não está aí também, pois após desmarcar, o registro não estará mais visível.
rochinha escreveu:Se for o caso após o SKIP de um GO TOP pois ao que parece o ponteiro esta indo para no ultimo registro ou sendo posicionado no final da listagem.
Abraços,

Re: recall e deteted() !!!!!! E esta hein?

Enviado: 17 Fev 2010 14:35
por gvc

Código: Selecionar todos

procedure main()

use vendas alia a1

// set deleted off // O padrão é deleted off

index on str(venda, 5) + proc to i temporary
dbgotop()
while !eof()
   if deleted() .and. a1->ff = "1"
      dbrecall()
      a1->ff := " "
   end
   dbskip()
end
return(Nil)

Re: recall e deteted() !!!!!! E esta hein?

Enviado: 25 Fev 2010 19:12
por lapinhazzz
Amigos do Forum.

Venho dizer-lhes como resolvi o meu problema.
A minha intenção é ter o controlo de fotocópias tiradas.
Se quiserem o ficheiro exe com as respectivos dbfs eu mando
Ora bem parte do código é este:

Código: Selecionar todos

variáveis:
quantc= quantidade de fotocopias a cores
quantp= quantidade de fotocopias a preto
plafp= plafond de fotocópias a preto
plafc= plafond de fotocópia a cores
área 1 = ficheiro de venda de fotocópias
àrea 5 = ficheiro de alunos


function mvreca()
   rot="RECA"
   sele 1
   set deleted off
   use vendas inde i,i2,vendas1,vendas2 alia a1
   sele 5
   use pessoal inde pessoal1
   sele 1
   cor(11)
   go top
   do whil .T.
      sele 1
      IF ff="1"
         rproc=proc
         sele 5
         seek rproc
         rplafc=plafc-a1->quantc
         Rplafp=plafp-a1->quantp
         REPL PLAFP WITH RPLAFP
         REPL PLAFC WITH RPLAFC
         rgastop=gastop+a1->quantp
         rgastoc=gastoc+a1->quantc
         repl gastop with rgastop
         repl gastoc with rgastoc
      ENDIF
      sele 1
      SKIP
      IF eof()
         exit
      ENDIF
   endd
   recall for ff="1"
   * set deleted on
   rot="RVD"
return
Cumprimentos a todos
Consegui resolver o problema.
Muito obrigado

lapinhazzz

Re: recall e deteted() !!!!!! E esta hein?

Enviado: 26 Fev 2010 14:01
por gvc
Tente isto:

Código: Selecionar todos

function mvreca()
set deleted off
rot := "RECA"
select 5
use pessoal index pessoal1
select 1
use vendas index i, i2, vendas1, vendas2 alia a1
cor(11)
a1->(dbgotop())
while !a1->(eof())
   if a1->ff = "1"
      pessoal->(dbseek(a1->proc))
      pessoal->plafp -= a1->quantp
      pessoal->plafc -= a1->quantc
      pessoal->gastop += a1->quantp
      pessoal->gastoc += a1->quantc
   end
   a1->(dbskip())
end
recall for ff="1"
* set deleted on
rot := "RVD"
return(Nil)

Re: recall e deteted() !!!!!! E esta hein?

Enviado: 27 Fev 2010 18:48
por lapinhazzz
Boa Noite a todos.

Vou tentar gvc.

Muito obrigado

lapinhazzz

Re: recall e deteted() !!!!!! E esta hein?

Enviado: 27 Fev 2010 21:49
por lapinhazzz
Amigos acho que tenho um grande problema que não consigo resolver.

Com a rotina do gvc mais organizada e explicita não funciona

dbedit para todos os registos deletados é feito em com inde on str(venda)+proc to i for deleted()
por exemplo isto é o que o dbedit faz, todos os registos estão deletados

venda utente copias total status
0001 luis 1 1,00 euros Del
0002 carlos 2 2,00 euros Del
0003 Isabel 3 3,00 euros Del
0004 pedro 1 1,00 euros Del
Agora eu tenho um campo no ficheiro que se chama ff e que fica marcado com o valor "1" quando carrego em espaço e fica com o valor " " quando desmarco
quando carrego na tecla de espaço através do dbedit o programa marca os registos que serão feito o recall

venda utente copias total
0001 luis 1 1,00 euros ■
0002 carlos 2 2,00 euros
0003 Isabel 3 3,00 euros ■
0004 pedro 1 1,00 euros
Mas só que o programa faz recall à venda nº1 e a venda nº 3 não faz.

O que queria era que selecionando a venda 1 e 3 fosse feito o recall nestes dois registos e eles desaparecessem ficando só o registo a venda nº2 e a venda nº 4.

Peço ajuda aos amigos do forum.

Obrigado.

lapihazzz

Re: recall e deteted() !!!!!! E esta hein?

Enviado: 28 Fev 2010 03:52
por gvc
Vamos tentar novamente:

Código: Selecionar todos

function mvreca()
set deleted off
rot := "RECA"
select 5
use pessoal index pessoal1
select 1
use vendas index i, i2, vendas1, vendas2 alia a1 // (*01)
cor(11)
a1->(dbsetorder(0), dbgotop())
while !a1->(eof())
   if a1->ff = "1"
      pessoal->(dbseek(a1->proc))
      pessoal->plafp -= a1->quantp
      pessoal->plafc -= a1->quantc
      pessoal->gastop += a1->quantp
      pessoal->gastoc += a1->quantc
      a1->(dbrecall()) // (*02)
   end
   a1->(dbskip())
end
// recall for ff="1" // (*02)
set deleted on
a1->(dbsetorder(1), dbgotop())
rot := "RVD"
return(Nil)

/*
 *01 - Se o arquivo de indice (i) usa o (for deleted()), realmente não funcionaria como eu postei.
 *02 - Veja que agora eu estou ignorando os arquivos de indice e recuperando todos os registros marcados com o campo FF dentro do loop. Assim não é necessário recupera-los depois.
*/

Re: recall e deteted() !!!!!! E esta hein?

Enviado: 28 Fev 2010 17:23
por lapinhazzz
Boa Noite a todos

Parece que desta é que foi.

Apenas retirei o set deleted on no fim.
E...
Funcionou

Muito obrigado gvc e a todos do forum.

lapinhazzz

:{ :{ :{ :{ :{ :{ :{ :{