Pular para o conteúdo principal

SB9 Protheus x Fechamentos incorretos (Sem endereço ou lote)

Uebá!!! Montei essa query um tempo atrás para localizar fechamento incorreto no protheus, o fechamento acontece na SB9, que é feito todo mês. Let's Share! https://centraldeatendimento.totvs.com/hc/pt-br/articles/360006558492-MP-SIGAEST-Roteiro-para-a-realiza%C3%A7%C3%A3o-da-virada-de-saldos-no-estoque-MATA280




SELECT * FROM ( 
		SELECT B9_FILIAL,B9_COD,B9_LOCAL,B9_DATA,B9_QINI,
			--ULTIMO FECHAMENTO ANTES DO MES ATUAL
			(
			SELECT ISNULL(B9_QINI,0)
			FROM SB9050 SB9X
			WHERE SB9X.B9_COD =SB9.B9_COD
			AND SB9X.B9_LOCAL  = SB9.B9_LOCAL
			AND SB9X.D_E_L_E_T_ = ' '
			AND MONTH(SB9X.B9_DATA) = MONTH(DATEADD(month,-1,convert(datetime,SB9.B9_DATA,103)))
			AND YEAR(SB9X.B9_DATA) = YEAR(DATEADD(month,-1,convert(datetime,SB9.B9_DATA,103)))
			--SELECT * FROM SF4050 WHERE F4_CODIGO = '618'
			
			)-(
			--MOVIMENTACAO DO ESTOQUE
			SELECT
			ISNULL(SUM(CASE
			 WHEN LEFT(SD3.D3_CF,1)='R' THEN SD3.D3_QUANT
			 ELSE SD3.D3_QUANT * -1
			 END),0) 
			 FROM SD3050 SD3
			WHERE SD3.D_E_L_E_T_ = ' '
			AND SD3.D3_EMISSAO BETWEEN SUBSTRING(SB9.B9_DATA,1,6)+'01' AND SB9.B9_DATA
			AND SD3.D3_FILIAL = B9_FILIAL
			AND SD3.D3_COD = B9_COD
			AND SD3.D3_LOCAL = B9_LOCAL
			AND SD3.D3_ESTORNO = ' '
			)+(
			-- NOTAS FISCAIS DE ENTRADA
			SELECT ISNULL(SUM(D1_QUANT),0)
			FROM SD1050 SD1
			INNER JOIN SF4050 SF4
			ON SF4.D_E_L_E_T_ = ' '
			AND SF4.F4_CODIGO = SD1.D1_TES
			AND SF4.F4_ESTOQUE = 'S'
			WHERE SD1.D_E_L_E_T_ = ' '
			AND SD1.D1_DTDIGIT BETWEEN SUBSTRING(SB9.B9_DATA,1,6)+'01' AND SB9.B9_DATA
			AND SD1.D1_COD = SB9.B9_COD
			AND SD1.D1_LOCAL = SB9.B9_LOCAL
			AND SD1.D1_FILIAL = B9_FILIAL
			)-(
			-- NOTAS FISCAIS DE SAIDA
			SELECT ISNULL(SUM(D2_QUANT),0)
			FROM SD2050 SD2
			INNER JOIN SF4050 SF4
			ON SF4.D_E_L_E_T_ = ' '
			AND SF4.F4_CODIGO = SD2.D2_TES
			AND SF4.F4_ESTOQUE = 'S'
			WHERE SD2.D_E_L_E_T_ = ' '
			AND SD2.D2_EMISSAO BETWEEN SUBSTRING(SB9.B9_DATA,1,6)+'01' AND SB9.B9_DATA
			AND SD2.D2_COD = SB9.B9_COD
			AND SD2.D2_LOCAL = SB9.B9_LOCAL
			AND SD2.D2_FILIAL = B9_FILIAL
			) QUANTIDADE
		,B2_QATU,B9_VINI1,B9_CM1,
		--MOVIMENTACAO ATUAL DA SD3
		(SELECT
			ISNULL(SUM(CASE
			 WHEN LEFT(SD3.D3_CF,1)='R' THEN SD3.D3_QUANT
			 ELSE SD3.D3_QUANT * -1
			 END),0) 
			 FROM SD3050 SD3
			WHERE SD3.D_E_L_E_T_ = ' '
			AND SD3.D3_EMISSAO BETWEEN SUBSTRING(SB9.B9_DATA,1,6)+'01' AND SB9.B9_DATA
			AND SD3.D3_FILIAL = B9_FILIAL
			AND SD3.D3_COD = B9_COD
			AND SD3.D3_LOCAL = B9_LOCAL
			AND SD3.D3_ESTORNO = ' ') SD3ATU
		FROM SB9050 SB9
		INNER JOIN SB2050 SB2
		ON SB2.D_E_L_E_T_ = ' '
		AND SB2.B2_FILIAL  = SB9.B9_FILIAL 
		AND SB2.B2_COD = SB9.B9_COD 
		AND SB2.B2_LOCAL = SB9.B9_LOCAL
		WHERE B9_LOCAL  = '01'
		--AND B9_COD = '30300506T' 
		AND SB9.D_E_L_E_T_ = ' '
		AND SB9.B9_DATA BETWEEN '20200101' AND '20200831'
		GROUP BY  B9_FILIAL,B9_COD,B9_LOCAL,B9_DATA,B9_QINI,B9_VINI1,B9_CM1,B2_QATU
		--SELECT convert(datetime,'20171231',103)
		--SELECT DATEADD(month,1,convert(datetime,'20171231',103))
		--DATEADD(month, 1, '2006-08-30')
) XX WHERE round(XX.B9_QINI,2) <> round(XX.QUANTIDADE,2)
ORDER BY B9_FILIAL,B9_COD,B9_LOCAL,B9_DATA

Postagens mais visitadas deste blog

REST Protheus Converter charset CP1252 para UTF8 com Header Accept UTF-8

O Protheus possui um tag que pode ser utilizada para conversão para UTF8 de forma transparente, basta enviar no header da requisição a TAG ACCEPT com charset=UTF-8, também pode-se adicionar o appllication/json. Accept : application/json; charset=UTF-8 ou Accept : charset=UTF-8 Isso ajuda pois não precisa mais utilizar as funções DecodeUTF8 e EncodeUT8 pois o próprio rest já vai fazer isso.

Recursividade Minha Linda! Estrutura Produtos Protheus SG1

Fato! Depois que você conhece recursividade em sua vida tudo fica mais leve (rss... ) a recursividade pode ser infinita (pode não ta!) se for infinita vai dar problema, não pode. Mas a recursividade nos ajuda a deixar nosso sistema mais flexível e dinâmico para montar uma série de regras de negócio. Hoje vou falar exatamente da SG1, tabela TOTVS Microsiga Protheus que é utilizada para montar a estrutura de um produto dentro PCP (Planejamento e Controle de Produção). Isso séria algo que a recursividade iria ajudar. Na SG1 temos o campos G1_COD (Pai) e G1_COMP (Filho). G1_COD->G1_COMP->G1_COD->G1_COMP->G1_COD->G1_COMP Seria assim o fluxo da informação. Sem mais delongas, abaixo vou deixar o script para MSSQL para apresentar esses dados. Inté! WITH ESTRUT( CODIGO, COD_PAI, COD_COMP, QTD, PERDA, DT_INI, DT_FIM ,TRT ,RECNO, NIVEL ) AS ( SELECT G1_COD PAI, G1_COD, G1_COMP, G1_QUANT, G1_PERDA, G1_INI, G1_FIM,G1_TRT,SG1.R_E_C_N_O_, 1 AS NIVEL FR

Cadastro de funções ADVPL

FWDirRemove( cDir, nType, lComplete, lKillFiles ) Função para remover diretórios, com a vantagem de remover somente o ultimo nível ou todo o caminho. cDir                   Diretório a ser removido lComplete          Remove todo o caminho (.T.) ou apenas o ultimo nível (.F.) lKillFiles             Remove os arquivos antes de tentar remover o diretório FWMakeDir( cDir, lShowMsg ) Função para criar diretório com seus subdiretórios, com a vantagem de criar todo o caminho. cDir                    Diretório a ser criado lShowMsg          Exibe ou não mensagem caso não consiga criar o diretório FwNoAccent( cString ) Retira acentos de uma string cString                 String a ser retirado os acentos Exemplo: cString := 'O avião não pôde aterrissar de manhã' cString := FwNoAccent( cString ) // Retorna : 'O aviao nao pode aterrissar de manha' FWGetSX5( cTable, cKey ) Função de retorno dos campos de uma tabela no SX5 cTable                  Tabela para pesquisa no SX5. Par