Apenas mais uma dica: sempre use Fields no for each (veja abaixo o exemplo)
FOR EACH scb-op-it FIELDS(num-op /* INDICAR campos de que você usará na seqüência do programa*/)
WHERE scb-op-it.num-op = INPUT FRAME fr-op fl-num-op
AND scb-op-it.dt-op = vd-dt-op
NO-LOCK:
:::
Outra coisa, sempre que possível use o USE-INDEX, indicando o melhor índice para a combinação da cláusula de where.
Isto impacta em performance, que para mim, depois da funcionalidade, é o critério mais importante da programação para banco de dados relacionais.
Agora, aidna quanto à funcionalidade, adotamos o critério de que rotinas que atualizam banco de dados, SEMPRE usar o DO TRANSACTION, e mais: em cada FOR EACH dentro deste DO TRANSACTION use o "ON ERROR UNDO, RETURN...".
Isto é fundamental para você evitar transações "quebradas" ou "sujas", aliás, este é o pior erro que pode ocorrer em programação, gerando os erros de cálculos e atualizações mais difíceis de se encontrar.
Veja baixo um exemplo de programa usando este critério:
Gravar: DO TRANSACTION
ON ERROR UNDO Gravar, RETURN ERROR
ON QUIT UNDO Gravar, RETURN ERROR
ON ENDKEY UNDO Gravar, RETURN ERROR
ON STOP UNDO Gravar, RETURN ERROR:
Estoq: FOR EACH tt_estoq ON ERROR UNDO Gravar, RETURN ERROR:
IF tt_estoq.lfechado THEN DO:
MESSAGE "Estoque já fechado. Programa:" PROGRAM-NAME(1).
UNDO Gravar, RETURN ERROR.
END.
ASSIGN tt_estoq.lfechado = YES.
END
END. /* Gravar */
---------------
Batista
Analista de Sistemas - Depto.Informática
Cooperativa Agrária Agroindustrial
Fone: (42) 3625-8108
bat...@agraria.com.br
Visite:
www.agraria.com.br
>>>
pie...@blitzkow.com 13/02/2009 08:40:48 >>>