Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
CursorAdapter
Message
 
À
16/05/2003 13:03:46
Peter Wagner
Point Informática Ltda.
Limeira, Brésil
Information générale
Forum:
Visual FoxPro
Catégorie:
Autre
Titre:
Divers
Thread ID:
00789086
Message ID:
00789336
Vues:
21
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
   * Gravo todos os lançamentos financeiros da venda:
   Insert Into ContasReceber ... bla bla bla
   * Verifico total em aberto das duplicatas:
   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
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform