Você está na página 1de 3

Diferenças SB2 x SB8 x SBF

Muitas vezes nos deparamos com o chamado “descompasso” entre “SB2, SB8 e SBF”. Para entender melhor o que isso
significa, elaborei um desenho que facilita a visualização do problema.

O Protheus trabalha com tabelas específicas e independentes para os movimentos de estoque (linha 1 no desenho),
movimentos por lote (linha 2 no desenho) e movimentos por endereço (linha 3 no desenho), sendo que os saldos atuais
entre eles, sempre tem que ser iguais.

Em caso de descompasso entre as tabelas, uma forma de análise é a comparação entre os seguintes arquivos:

Saldos Iniciais (Coluna A no desenho) (SB9XSBJXSBK)

Movimentações (Coluna B no desenho) (SD1+SD2+/-SD3XSD5X SDA+SDB)

Saldos Atuais (Coluna C no desenho) (SB2X SB8X SBF)

Os saldos iniciais (Coluna A no desenho) devem ser sempre iguais, para uma determinada data. Acontece que o SB9 sempre
trará apenas um saldo por data x almoxarifado, enquanto o SBJ poderá ter vários lotes na mesma data x almoxarifado e o
SBK poderá ter vários endereços para a mesma data x almoxarifado. Sendo assim, para efeito de comparação, será
necessário analisar o saldo do SB9 com a soma dos saldos do SBJ e soma dos saldos do SBK para a mesma data x
almoxarifado.

Segue exemplo de query desenvolvida para banco de dados Oracle.

SELECT COD, ARM, DIA, SUM(SB9), SUM(SBJ), SUM(SBK)

FROM

SELECT SB9.B9_COD COD, SB9.B9_LOCAL ARM, SB9.B9_DATA DIA, SB9.B9_QINI SB9, 0 SBJ, 0 SBK

FROM SB9010 SB9

WHERE SB9.D_E_L_E_T_ <> '*'

AND SB9.B9_COD = 'XXXXXXXX'

AND SB9.B9_FILIAL = 'XX'

AND SB9.B9_LOCAL = 'XX'


--AND SB9.B9_DATA = 'AAAAMMDD'

UNION

SELECT SBJ.BJ_COD COD, SBJ.BJ_LOCAL ARM, SBJ.BJ_DATA DIA, 0 SB9, SUM(SBJ.BJ_QINI) SBJ, 0 SBF

FROM SBJ010 SBJ

WHERE SBJ.D_E_L_E_T_ <> '*'

AND SBJ.BJ_COD = 'XXXXXXXX'

AND SBJ.BJ_FILIAL = 'XX'

AND SBJ.BJ_LOCAL = 'XX'

AND SBJ.BJ_QINI <> '0'

--AND SBJ.BJ_DATA = 'AAAAMMDD'

GROUP BY SBJ.BJ_COD, SBJ.BJ_LOCAL, SBJ.BJ_DATA

UNION

SELECT SBK.BK_COD COD, SBK.BK_LOCAL ARM, SBK.BK_DATA DIA, 0 SB9, 0 SBJ, SUM(SBK.BK_QINI) SBK

FROM SBK010 SBK

WHERE SBK.D_E_L_E_T_ <> '*'

AND SBK.BK_COD = 'XXXXXXXX'

AND SBK.BK_FILIAL = 'XX'

AND SBK.BK_LOCAL = 'XX'

AND SBK.BK_QINI <> '0'

--AND SBK.BK_DATA = 'AAAAMMDD'

GROUP BY SBK.BK_COD, SBK.BK_LOCAL, SBK.BK_DATA

GROUP BY COD,ARM, DIA

ORDER BY DIA

Analogamente os saldos atuais (Coluna C no desenho) devem ser sempre iguais, sendo que o SB2 trará um único saldo por
almoxarifado e o SB8 poderá ter de mais um saldo por lote por almoxarifado e o SBF poderá ter mais de um saldo por
endereço por almoxarifado.

Segue exemplo de query desenvolvida para banco de dados Oracle.

SELECT COD, ARM, SUM(SB2), SUM(SB8), SUM(SBF)

FROM

(
SELECT SB2.B2_COD COD, SB2.B2_LOCAL ARM, SB2.B2_QATU SB2, 0 SB8, 0 SBF

FROM SB2010 SB2

WHERE SB2.D_E_L_E_T_ <> '*'

AND SB2.B2_COD = 'XXXXXXXX'

AND SB2.B2_FILIAL = 'XX'

AND SB2.B2_LOCAL = 'XX'

UNION

SELECT SB8.B8_PRODUTO COD, SB8.B8_LOCAL ARM, 0 SB2, SUM(SB8.B8_SALDO) SB8, 0 SBF

FROM SB8010 SB8

WHERE SB8.D_E_L_E_T_ <> '*'

AND SB8.B8_PRODUTO = 'XXXXXXXX'

AND SB8.B8_FILIAL = 'XX'

AND SB8.B8_LOCAL = 'XX'

AND SB8.B8_SALDO <> '0'

GROUP BY SB8.B8_PRODUTO, SB8.B8_LOCAL

UNION

SELECT SBF.BF_PRODUTO COD, SBF.BF_LOCAL ARM, 0 SB2, 0 SB8, SUM(SBF.BF_QUANT) SBF

FROM SBF010 SBF

WHERE SBF.D_E_L_E_T_ <> '*'

AND SBF.BF_PRODUTO = 'XXXXXXXX'

AND SBF.BF_FILIAL = 'XX'

AND SBF.BF_LOCAL = 'XX'

AND SBF.BF_QUANT <> '0'

GROUP BY SBF.BF_PRODUTO, SBF.BF_LOCAL

GROUP BY COD,ARM

Finalmente, em caso de desbalanceamento, deve-se observar se as movimentações (Coluna B no desenho) estão


sincronizadas. Esta é a parte mais trabalhosa e complexa do processo de análise. Os movimentos entre SD1 + SD2 + / - SD3
devem estar compatíveis com os movimentos de SDA + SBD e refletidas no SD5 de um determinado período de tempo. Não
tenho exemplo de query para este caso (sugestões são bem vistas), devido à complexidade de tratamentos que incluem se
a TES movimenta ou não estoque, as transferências de endereço no mesmo armazém, etc.

Você também pode gostar