Alow Peter,
O que eu quis dizer foi que o resultado do CA (cursor) funciona exatamente como uma view, tanto que podemos usar o REQUERY(), TABLEUPDATE(), TABLEREVERT()...
Com relação a usar o CursorRefresh() dentro de uma transação, acho que a situação que aconteceu comigo foi a seguinte:
O meu cliente queria uma rotina para bloquear a venda, se o cliente atingir o limite de crédito. Se isso ocorresse, teria que abrir uma tela para que alguém com poderes para isso, digita-se uma senha liberando a venda.
Para fazer a conta, eu precisava varrer as duplicatas em aberto deste cliente e somar com as duplicatas da venda que está ocorrendo. Se este total fosse maior que o limite, a tal tela com senha seria exibida...
O problema é que, se o cliente possuir crédito de R$ 1500, possuir R$ 1400 em duplicatas em aberto e for na loja comprar R$ 300 (sendo R$ 100 para faturar, e R$ 200 em dinheiro), o programa deve deixar a venda ser realizada, já que o cliente está dentro do limite de crédito...
Para resolver este problema, o que eu fiz foi o seguinte:
BEGIN TRANSACTION
Insert Into ContasReceber ... bla bla bla
Select Clientes.Credito, Sum(ContasReceber.Valor) As TotalDP;
From ContasReceber Left Outer Join Clientes On ContasReceber.Cliente = Clientes.Codigo;
Where ContasReceber.Cliente="001" .and. Tipo="DP" Into Cursor LimiteCredito
If LimiteCredito.Credito < LimiteCredito.TotalDP
m.Erro = .T.
Else
m.Erro = .F.
EndIf
END TRANSACTION
PS: O código acima está incompleto, mas é só para passar uma das situações onde eu precisei fazer isso. Eu também poderia fazer o select antes do BEGIN TRANSACTION e somar as DPs do formulário, mas aí eu estaria com o registro destravado e uma venda simultânea para o mesmo cliente poderia dar erro no cálculo. Fazendo dentro da transação, eu garanto 100% de que a informação (no caso, do bloqueio de saldo) é correta... dessa maneira (dentro da transação) eu tenho um tempo extra de processamento, pois em caso de erro, eu disparo o ROLLBACK, e mesmo nao gravando nada na base, fiz o VFP gravar o registro e depois retirá-lo de lá...
Outra situação onde eu fiquei travado com isso, é no caso de estoque. Usando a mesma técnica acima, eu nunca vou ter problemas de 2 vendedores estarem vendendo o mesmo produto, já que eu faço o lançamento (e o VFP já travou o registro pra mim) e depois verifico se o saldo final é negativo...se for, é pq o produto não está disponível...
As vezes estou fazendo as coisas do jeito errado (quero dizer, essa lógica de validação) e por isso tenho precisado do REQUERY() dentro da transação ....
Alguma dica? Espero ter explicado bem o que "tento" fazer por aqui...
[]s
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Rodolfo Duarte