GARANTIR DESCONTO

Fórum Cálculo de Saldo em uma Trigger ow SP. #51836

28/07/2005

0

Boa tarde,

meu problema é o seguinte tenho uma tabela de movimento de produtos com os campos: codigo, produto, tipo, qtd, sld.
e gostaria que a cada nova inclusão, alteração ow exclusão o saldo fosse atualizado.
o saldo de cada registro é calculado de acordo como o movimento dos registros anteriores a ele. e conforme o campo tipo que pode ser de entrada ow saida eu sei se devo somar ow diminuir a quantidade do saldo. já tentei fazer isto via trigger mas naum deu certo se alguem puder dar uma luz ficarei muito grato.

t+


Tronbr

Tronbr

Responder

Posts

31/07/2005

Eduardo Pereira

A utilização de trigger me parece a solução mais indicada para o seu problema, como você pensou.

A utilização do campo ´saldo´ na tabela movimento é que talvez não seja muito apropriada. O saldo poderia estar na tabela de produtos, por exemplo.

Divulgue o código dos triggers para vermos o que há de errado.

[]´s
Eduardo Pereira


Responder

Gostei + 0

31/07/2005

Vinicius2k

Colega,

Acho que vc não deve manter este ´saldo´ gravado na tabela.
Se o que vc quer é uma espécie de ´extrato´, minha sugestão é que vc utilize um Stored Procedure selecionável.

Existem alguns exemplos aqui no fórum e segue abaixo um que não é exatamente o que vc precisa, mas a idéia é, basicamente, a mesma:
CREATE PROCEDURE SP_EXTRATOCONTACAIXA (
    IDEMPRESA SMALLINT,
    DATAINICIAL DATE,
    DATAFINAL DATE)
RETURNS (
    DATA DATE,
    DOCUMENTO INTEGER,
    HISTORICO VARCHAR (50) CHARACTER SET WIN1252,
    VALOR NUMERIC (11, 2),
    VALORDC CHAR (1) CHARACTER SET WIN1252,
    SALDO NUMERIC (11, 2),
    SALDODC CHAR (1) CHARACTER SET WIN1252)
AS
DECLARE VARIABLE CREDITOS NUMERIC(11,2);
DECLARE VARIABLE DEBITOS NUMERIC(11,2);
DECLARE VARIABLE SALDOANT NUMERIC(11,2);
BEGIN
  DATA = :DATAINICIAL;
  HISTORICO = ´SALDO ANTERIOR´;
  SELECT SUM(M.VALORMOVIMENTO)
    FROM MOVIMENTOCAIXA M
    WHERE M.IDEMOVIMENTO = :IDEMPRESA AND M.TIPOMOVIMENTO = ´C´ AND M.DATAMOVIMENTO < :DATAINICIAL
    INTO :CREDITOS;
  IF (CREDITOS IS NULL) THEN CREDITOS = 0;
  SELECT SUM(M.VALORMOVIMENTO)
    FROM MOVIMENTOCAIXA M
    WHERE M.IDEMOVIMENTO = :IDEMPRESA AND M.TIPOMOVIMENTO = ´D´ AND M.DATAMOVIMENTO < :DATAINICIAL
    INTO :DEBITOS;
  IF (DEBITOS IS NULL) THEN DEBITOS = 0;
  SALDO = CREDITOS - DEBITOS;
  IF (SALDO < 0) THEN
  BEGIN
    SALDO = SALDO * (-1);
    SALDODC = ´D´;
  END
  ELSE SALDODC = ´C´;
  SUSPEND;
  DATA = NULL;
  DOCUMENTO = NULL;
  HISTORICO = NULL;
  VALOR = NULL;
  VALORDC = NULL;
  SALDO = NULL;
  SALDODC = NULL;
  /****/
  SALDOANT = 0;
  FOR SELECT M.DATAMOVIMENTO, M.IDMOVIMENTO, M.HISTORICOMOVIMENTO, M.VALORMOVIMENTO, M.TIPOMOVIMENTO
    FROM MOVIMENTOCAIXA M
    WHERE M.IDEMOVIMENTO = :IDEMPRESA AND (M.DATAMOVIMENTO BETWEEN :DATAINICIAL AND :DATAFINAL)
    INTO :DATA, :DOCUMENTO, :HISTORICO, :VALOR, :VALORDC DO
  BEGIN
    IF (NOT VALORDC IS NULL) THEN
    BEGIN
      IF (VALORDC = ´C´) THEN
        SALDO = SALDOANT + VALOR;
      ELSE
        IF (VALORDC = ´D´) THEN
          SALDO = SALDOANT - VALOR;
      SALDOANT = SALDO;
      IF (SALDO < 0) THEN
      BEGIN
        SALDO = SALDO * (-1);
        SALDODC = ´D´;
      END
      ELSE SALDODC = ´C´;
      SUSPEND;
      DATA = NULL;
      DOCUMENTO = NULL;
      HISTORICO = NULL;
      VALOR = NULL;
      VALORDC = NULL;
      SALDO = NULL;
      SALDODC = NULL;
    END
  END
  /****/
  DATA = DATAFINAL;
  HISTORICO = ´SALDO´;
  SALDO = SALDOANT;
  IF (SALDO < 0) THEN
  BEGIN
    SALDO = SALDO * (-1);
    SALDODC = ´D´;
  END
  ELSE SALDODC = ´C´;
  SUSPEND;
END


T+


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar