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.
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
//ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
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
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.
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)
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:
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
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)
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.
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.
*/