CREATE PROCEDURE ze_ProdutoBaixaEstoque( nIdProduto INT(11), nQtde DECIMAL(16,5), cDeposito CHAR(1) )
BEGIN
IF cDeposito = '1' THEN
UPDATE JPITEM
SET IEQTD1 = IEQTD1 + nQtde
WHERE IDPRODUTO = nIdProduto;
END IF;
IF cDeposito = '2' THEN
UPDATE JPITEM
SET IEQTD2 = IEQTD2 + nQtde
WHERE IDPRODUTO = nIdProduto;
END IF;
IF cDeposito = '3' THEN
UPDATE JPITEM
SET IEQTD3 = IEQTD3 + nQtde
WHERE IDPRODUTO = nIdProduto;
END IF;
IF cDeposito = '4' THEN
UPDATE JPITEM
SET IEQTD4 = IEQTD4 + nQtde
WHERE IDPRODUTO = nIdProduto;
END IF;
IF cDeposito = '5' THEN
UPDATE JPITEM
SET IEQTD5 = IEQTD5 + nQtde
WHERE IDPRODUTO = nIdProduto;
END IF;
IF cDeposito = '6' THEN
UPDATE JPITEM
SET IEQTD6 = IEQTD6 + nQtde
WHERE IDPRODUTO = nIdProduto;
END IF;
IF cDeposito = '7' THEN
UPDATE JPITEM
SET IEQTD7 = IEQTD7 + nQtde
WHERE IDPRODUTO = nIdProduto;
END IF;
IF cDeposito = '8' THEN
UPDATE JPITEM
SET IEQTD8 = IEQTD8 + nQtde
WHERE IDPRODUTO = nIdProduto;
END IF;
IF cDeposito = '9' THEN
UPDATE JPITEM
SET IEQTD9 = IEQTD9 + nQtde
WHERE IDPRODUTO = nIdProduto;
END IF;
END
É grande mas.... tudo bem.
Agora esta rotina aqui:
STATIC FUNCTION UpdateJPESTOQUE( nIdEstoque, nSomaTira )
LOCAL cnSQL := ADOClass():New( AppConexao() )
WITH OBJECT cnSQL
:cSQL := "UPDATE JPITEM" + ;
" LEFT JOIN" + ;
" ( SELECT ESPRODUTO, ESNUMDEP, ESQTDE * IF( ESTIPLAN = '1', -1, 1 ) * " + NumberSQL( nSomaTira ) + " AS SOMA" + ;
" FROM JPESTOQUE WHERE IDESTOQUE = " + NumberSQL( nIdEstoque ) + " ) AS A" + ;
" ON A.ESPRODUTO = JPITEM.IDPRODUTO" + ;
" SET" + ;
" JPITEM.IEQTD1 = IEQTD1 + IF( A.ESNUMDEP BETWEEN '2' AND '9', 0, A.SOMA )," + ;
" JPITEM.IEQTD2 = IEQTD2 + IF( A.ESNUMDEP = '2', A.SOMA, 0 )," + ;
" JPITEM.IEQTD3 = IEQTD3 + IF( A.ESNUMDEP = '3', A.SOMA, 0 )," + ;
" JPITEM.IEQTD4 = IEQTD4 + IF( A.ESNUMDEP = '4', A.SOMA, 0 )," + ;
" JPITEM.IEQTD5 = IEQTD5 + IF( A.ESNUMDEP = '5', A.SOMA, 0 )," + ;
" JPITEM.IEQTD6 = IEQTD6 + IF( A.ESNUMDEP = '6', A.SOMA, 0 )," + ;
" JPITEM.IEQTD7 = IEQTD7 + IF( A.ESNUMDEP = '7', A.SOMA, 0 )," + ;
" JPITEM.IEQTD8 = IEQTD8 + IF( A.ESNUMDEP = '8', A.SOMA, 0 )," + ;
" JPITEM.IEQTD9 = IEQTD9 + IF( A.ESNUMDEP = '9', A.SOMA, 0 )" + ;
" WHERE JPITEM.IDPRODUTO = A.ESPRODUTO"
:ExecuteCmd()
ENDWITH
RETURN NIL
Basta usar a função do SQL no lugar dela.
Ou uma stored procedure que chama a outra função, a partir do lançamento do estoque, de qualquer jeito vai ficar menor.
Nota: o que futuramente poderia ser uma "trigger", de acionamento automático.