| ♥ 0 | Ao aceder ao extrato de artigo surge o seguinte erro: Erro ao executar a operação. Invalid object name STRING_SPLIT Marked as spam |
| Private answer Atenção!!!! Existe a necessidade de adaptar o script ás configurações de moeda da empresa. No caso de empresas com moedas diferentes de Euro. Exemplo Romênia com LEI LEI EUR - moeda de trabalho, base e alternativa
Marked as spam | |
| Private answer Fica aqui a SP corrigida sem erros, Ficheiro txt zipado Marked as spam | |
| Private answer Bom dia,
Tenho um cliente com a versão :
Microsoft SQL Server 2014 (SP3) (KB4022619) - 12.0.6024.0 (X64) Sep 7 2018 01:37:51 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
Coloco a compatibilidade para SQL Server 2014 (120) mas o erro matem-se Como respolver? Marked as spam Comments Bom dia, A anomalia 64379 tem como contorno a SP INV_ExtractoArtigoMovimentos. A mesma já foi colocada aqui no fórum pelo gildosantos-2. A SP indicada esta a dar erros a correr. | |
| Private answer
EXEC STD_DropProcedure [INV_ExtractoArtigoMovimentos] GO CREATE PROCEDURE [INV_ExtractoArtigoMovimentos] ( @pSQLSelectCampos NVARCHAR(MAX) = '*' , @pDataInicial DATETIME = null , @pDataFinal DATETIME = null , @pArtigo NVARCHAR (MAX) = '' , @pArmazem NVARCHAR (MAX) = '' , @pUnidade NVARCHAR (50) = '' , @pFilial NVARCHAR (MAX) = '' , @pSQLWhereDocumentos NVARCHAR (MAX) = '' , @pLote NVARCHAR (MAX) = '' , @pNumeroSerie NVARCHAR (MAX) = '' , @pLocalizacoes NVARCHAR (MAX) = '' , @pTiposArtigos NVARCHAR (MAX) = '' , @pFamilias NVARCHAR (MAX) = '' , @pSubFamilias NVARCHAR (MAX) = '' , @pMarcas NVARCHAR (MAX) = '' , @pProjecto NVARCHAR (MAX) = '' , @pPostoSessao NVARCHAR (250) = '00' , @pMoedaTrabalho VARCHAR(3) = 'EUR' , @pMoedaBase VARCHAR(3) = 'EUR' , @pMoedaAlternativa VARCHAR(3) = 'EUR' , @pMTrabDecArredonda SMALLINT = 2 , @pSentidoCambios BIT = 0 -- Possibilidade de definir a tabela temporária a utilizar , @pTmpTabela VARCHAR(100) = NULL , @pTipoDeAnalise NVARCHAR(2) = '0' , @pVisualizaEstadosPrevistos BIT = 0 , @pVisualizaEstadosReservados BIT = 0 , @pCaseTipoMovimento NVARCHAR(300) = '' , @pDescSaldoInicial nvarchar(50) = 'Saldo Inicial' ) AS BEGIN SET NOCOUNT ON SET ANSI_WARNINGS OFF /************************************************************************************************** VARIÁVEIS **************************************************************************************************/ DECLARE @vSQLNVARCHAR(MAX) , @vSQLSelectNVARCHAR(MAX) , @vSQLFromNVARCHAR(MAX) , @vSQLCambioMBaseNVARCHAR(255) , @vSQLCambioMAltNVARCHAR(255) , @CamposUtilNVARCHAR(500) DECLARE @vTmpDocumentosVARCHAR(100) , @vPCMPorArmazemBIT , @vDecArredondaMBaseSMALLINT , @vDecArredondaMAltSMALLINT , @RemoveTMPBIT DECLARE @strCDUMovVARCHAR(MAX) SET @vTmpDocumentos = '#tmpDocumentos' DECLARE @strMoedaBaseVARCHAR(3) , @strMoedaAltVARCHAR(3) , @strMoedaRefVARCHAR(3) , @intSentidoCambioSMALLINT , @intCambioHistoricoBIT DECLARE @tmpCOP_ObrasVARCHAR(100) , @tmpINV_OrigensTiposDocumentosVARCHAR(100) , @tmpINV_TiposOrigemVARCHAR(100) , @tmpArtigoVARCHAR(100) , @tmpArmazensVARCHAR(100) , @tmpArmazemLocalizacoesVARCHAR(100) DECLARE @tmpArtigoFiltroNVARCHAR (MAX) IF LEN(ISNULL(@pArtigo, '')) > 0 SET @tmpArtigoFiltro = 'AND ' + REPLACE(@pArtigo, 'mov.', '') /************************************************************************************************** CÂMBIOS E MOEDAS **************************************************************************************************/ EXEC ADM_DaMoedasEmpresa @strMoedaBase OUTPUT, @strMoedaAlt OUTPUT, @strMoedaRef OUTPUT, @intSentidoCambio OUTPUT, @intCambioHistorico OUTPUT SELECT @vSQLCambioMBase = SQLCambio, @vDecArredondaMBase = DecArredonda FROM dbo.[INV_SQLCambioOrig](@strMoedaBase) SELECT @vSQLCambioMAlt = SQLCambio, @vDecArredondaMAlt = DecArredonda FROM dbo.[INV_SQLCambioOrig](@strMoedaAlt) /************************************************************************************************** TABELAS TEMPORÁRIAS **************************************************************************************************/ -- Movimentos IF LEN(ISNULL(@pTmpTabela, '')) = 0 BEGIN SET @pTmpTabela = '##tmpMovimentos' + CAST(@@SPID as varchar) SET @RemoveTMP = 1 END ELSE set @RemoveTMP = 0 SET @vSQL = 'EXEC STD_DropTempTable [' + @pTmpTabela + ']' EXEC sp_executesql @vSQL /******************************** COP_Obras ********************************/ SET @tmpCOP_Obras = '##tmpCOP_Obras'+ CAST(@@SPID as varchar) SET @vSQL = 'EXEC STD_DropTempTable [' + @tmpCOP_Obras + ']' EXEC sp_executesql @vSQL SET @vSQL = 'select distinct ID, Codigo INTO ' + @tmpCOP_Obras + ' FROM COP_Obras WITH (NOLOCK) WHERE 1 = 1 @OBRAS@ ' ------ Filtro projeto IF LEN(ISNULL(@pProjecto, '')) > 0 BEGIN SET @vSQL = REPLACE(@vSQL, '@OBRAS@', ' AND ' +@pProjecto) END ELSE BEGIN SET @vSQL = REPLACE(@vSQL, '@OBRAS@', '') END EXEC sp_executesql @vSQL /******************************** INV_OrigensTiposDocumentos ********************************/ SET @tmpINV_OrigensTiposDocumentos = '##tmpINV_OrigensTiposDocumentos'+ CAST(@@SPID as varchar) SET @vSQL = 'EXEC STD_DropTempTable [' + @tmpINV_OrigensTiposDocumentos + ']' EXEC sp_executesql @vSQL SET @vSQL = 'SELECTCASE WHEN IdTipoOrigemExploracoes IS NULL THEN IdTipoOrigem ELSE IdTipoOrigemExploracoes END IdTipoOrigemExp, IdTipoOrigem, TipoDocumento INTO ' + @tmpINV_OrigensTiposDocumentos + ' FROM INV_OrigensTiposDocumentos WITH (NOLOCK)' EXEC sp_executesql @vSQL /******************************** INV_TiposOrigem ********************************/ SET @tmpINV_TiposOrigem = '##tmpINV_TiposOrigem'+ CAST(@@SPID as varchar) SET @vSQL = 'EXEC STD_DropTempTable [' + @tmpINV_TiposOrigem + ']' EXEC sp_executesql @vSQL SET @vSQL = 'select distinct ID, Modulo INTO ' + @tmpINV_TiposOrigem + ' FROM INV_TiposOrigem WITH (NOLOCK)' EXEC sp_executesql @vSQL /******************************** Artigo ********************************/ SET @tmpArtigo = '##tmpArtigo'+ CAST(@@SPID as varchar) SET @vSQL = 'EXEC STD_DropTempTable [' + @tmpArtigo + ']' EXEC sp_executesql @vSQL SET @vSQL = ' CREATE TABLE ' + @tmpArtigo + ' ( [Artigo] [nvarchar](48) NOT NULL PRIMARY KEY CLUSTERED, [Familia] [nvarchar](10) NULL, [SubFamilia] [nvarchar](10) NULL, [TipoArtigo] [nvarchar](3) NOT NULL, [Marca] [nvarchar](10) NULL, [Modelo] [nvarchar](20) NULL, [TratamentoLotes] [bit] NOT NULL, [Descricao] [nvarchar](250) NULL, [TratamentoDim] [bit] NOT NULL, [ArtigoPai] [nvarchar](48) NULL )' EXEC sp_executesql @vSQL SET @vSQL = 'INSERT INTO ' + @tmpArtigo + ' SELECT Distinct Artigo, Familia, SubFamilia, TipoArtigo, Marca, Modelo, TratamentoLotes, Descricao, TratamentoDim, ArtigoPai FROMArtigo MOV(NOLOCK) WHERE 1 = 1 @Artigo@ UNION -- ARTIGOS FILHOS SELECT DISTINCT A.Artigo, Familia, SubFamilia, TipoArtigo, Marca, Modelo, TratamentoLotes, Descricao, TratamentoDim, ArtigoPai FROM Artigo mov INNER JOIN (SELECT Artigo = ISNULL(artFilhos.Artigo,mov.Artigo) FROM Artigo mov LEFT JOIN (SELECT Artigo, ArtigoPai FROM Artigo mov WHERE TratamentoDim = 2 AND mov.MovStock = ''S'' @FiltroArtigosPai@) artFilhos ON artFilhos.ArtigoPai = mov.Artigo WHERE mov.MovStock = ''S'' AND TratamentoDim = 1 @Artigo@ ) A ON A.Artigo = mov.Artigo ' -- Filtro dos Artigos IF LEN(ISNULL(@pArtigo , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@Artigo@' , ' AND ' + @pArtigo) ELSE SET @vSQL = REPLACE(@vSQL, '@Artigo@', '') IF LEN(ISNULL(@pArtigo, '')) > 0 SET @vSQL = REPLACE(@vSQL, '@FiltroArtigosPai@', ' AND ' + REPLACE(@pArtigo,'mov.Artigo','mov.ArtigoPai')) ELSE SET @vSQL = REPLACE(@vSQL, '@FiltroArtigosPai@', '') EXEC sp_executesql @vSQL /******************************** Armazens ********************************/ SET @tmpArmazens = '##tmpArmazens'+ CAST(@@SPID as varchar) SET @vSQL = 'EXEC STD_DropTempTable [' + @tmpArmazens + ']' EXEC sp_executesql @vSQL SET @vSQL = 'select distinct Armazem, Descricao, GrupoCustos INTO ' + @tmpArmazens + ' FROMArmazens MOV (NOLOCK) WHERE 1 = 1 @Armazem@ ' -- Filtro dos Armazéns IF LEN(ISNULL(@pArmazem , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@Armazem@' , ' AND ' + @pArmazem) ELSE SET @vSQL = REPLACE(@vSQL, '@Armazem@', '') EXEC sp_executesql @vSQL /******************************** ArmazemLocalizacoes ********************************/ SET @tmpArmazemLocalizacoes = '##tmpArmazemLocalizacoes'+ CAST(@@SPID as varchar) SET @vSQL = 'EXEC STD_DropTempTable [' + @tmpArmazemLocalizacoes + ']' EXEC sp_executesql @vSQL SET @vSQL = 'select Distinct Armazem, Localizacao, Descricao INTO ' + @tmpArmazemLocalizacoes + ' FROMArmazemLocalizacoes(NOLOCK) WHERE 1 = 1 @Localizacoes@' -- Filtro das localizaçoes IF LEN(ISNULL(@pLocalizacoes , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@Localizacoes@' , ' AND ' + @pLocalizacoes) ELSE SET @vSQL = REPLACE(@vSQL, '@Localizacoes@', '') SET @vSQL = REPLACE(@vSQL, 'MOV.' , '') EXEC sp_executesql @vSQL /************************************************************************************************** MOVIMENTOS **************************************************************************************************/ SET @strCDUMov = CAST(( SELECT(CASE WHEN t.name NOT IN ('TEXT', 'NTEXT') THEN 'MOV.' + c.name + ', ' ELSE 'CAST(MOV.' + c.name + ' AS VARCHAR(MAX)), ' END) FROMsys.columns c INNER JOINsys.typest ON c.user_type_id = t.user_type_id WHEREc.name LIKE 'CDU_%' AND object_id = object_id('INV_Movimentos') FOR XML PATH('')) AS NVARCHAR(MAX) ) -- remover última vírgula SET @strCDUMov = SUBSTRING(@strCDUMov, 0, LEN(@strCDUMov)) SET @vSQL = ' SELECT ART.TipoArtigo, FatorConversao = cast(ORIG.FactorConv as float), ART.Familia, ART.Marca, ART.TratamentoLotes, Armazem = ISNULL(MOV.Armazem,''''), Localizacao = ISNULL(MOV.Localizacao,''''), Lote = ISNULL(MOV.lote ,'''') , EstadoStock= MOV.EstadoStock, Artigo = ART.artigo, Descricao = @ArtigoDescricao@, Documento = ORIG.Documento, TipoDoc = origtdocs.TIPODOCUMENTO , Data = MOV.Data , Hora = CONVERT(NVARCHAR(20), MOV.Data,108) , Ano = YEAR(MOV.Data) , Modelo = ART.Modelo , ART.SubFamilia , DescTipoArtigo = tar.Descricao , DescArmazem = ISNULL(ARM.Descricao ,'''') , DescLocalizacao = ISNULL(ARMLOC.Descricao ,'''') , DescFamilia = FAM.Descricao , DescSubFamilia = SUBFAM.Descricao , DescMarca = MARCAS.Descricao , DescModelo = MODELOS.Descricao , DescLote = ISNULL(ARTL.Descricao ,MOV.lote) , ID= MOV.Id , MOV.IdOrigem , MOV.TipoMovimento , DescTipoMovimento = CAST(@pCaseTipoMovimento@ AS NVARCHAR(100)) , ORIG.IdChave1 , ORIG.IdChave2 , ORIG.IdChave3 , ORIG.IdChave4 , ORIG.IdTipoOrigem , NumDocInt = ORIG.NumChave1 , Serie = ORIG.NumChave2 , Modulo = RTRIM(TOrig.Modulo) , Filial = ORIG.Filial , Unidade = ORIG.unidade , QuantidadeDoc = CAST(ORIG.Quantidade as float) , QuantidadeMov = CAST(MOV.Quantidade as float ) , StockActual = @TipoDeAnalise@ --cast (case when MOV.Lote <> ''<L01>'' then MOV.StockLocLot_Actual else MOV.StockLoc_Actual end as float) /* Existencias (Qtd.) */ ,ExistenciasQtd= @TipoDeAnalise@ ,ExistenciasAnteriorQtd= @TipoDeAnaliseAnterior@ /* CustoUnitarioMBase * QuantidadeUnidade */ , ValorContabilisticoMBase = 0 , ValorContabilisticoMAlt = 0 /* Custo com variaçao associado ao movimento (E-Valor da entrada que vem da INV_VariacoesCusteio; S-Valorizaçao + Variaçoes que vem da INV_Valorizacoes + INV_Variacoes) */ , CustoRealMBase = 0 , CustoRealMAlt = 0 /* CustoRealMBase * QuantidadeUnidade */ , ValorRealMBase =0 , ValorRealMAlt = 0 , Projeto =COP_Obras.Codigo , MOV.IDReserva , MOV.NumRegisto , COALESCE(CD.TipoEntidade, CC.TipoEntidade, CI.TipoEntidade) AS TipoEntidade , COALESCE(CD.Entidade, CC.Entidade, CI.Entidade) AS Entidade , COALESCE(CD.Nome, CC.Nome, CI.Nome) AS Nome ' + CASE WHEN LEN(ISNULL(@strCDUMov, '')) > 0 THEN ', ' + @strCDUMov ELSE '' END + ' @CAMPOSUTIL@ INTO @TmpTabela@ FROM INV_Movimentos MOV WITH (NOLOCK) INNER JOIN INV_Estados EST WITH (NOLOCK) ON EST.Estado = MOV.EstadoStock LEFT JOIN INV_Origens ORIG WITH (NOLOCK) ON MOV.IdOrigem = ORIG.Id LEFT JOIN ' + @tmpCOP_Obras + ' COP_Obras WITH (NOLOCK) ON ORIG.IDProjecto = COP_Obras.ID LEFT JOIN ' + @tmpINV_OrigensTiposDocumentos+ ' origtdocs WITH (NOLOCK) ON origtdocs.IdTipoOrigem = ORIG.IdTipoOrigem AND ORIG.Chave1 = origtdocs.TipoDocumento LEFT JOIN ' + @tmpINV_TiposOrigem + ' TOrig WITH (NOLOCK) ON origtdocs.IdTipoOrigemExp= TOrig.ID LEFT JOIN INV_Valorizacoes VAL WITH (NOLOCK) ON MOV.id= val.IdMovimentoStock LEFT JOIN INV_NumerosSerieMovimentoNSE (NOLOCK) ON MOV.Id = NSE.IdMovimentoStock LEFT JOIN (SELECTIdValorizacao, ValorMBase = SUM(ValorMBase), ValorMAlt = SUM(ValorMAlt) FROMINV_Variacoes(NOLOCK) GROUP BYIdValorizacao) varval ON VAL.Id = varval.IdValorizacao INNER JOIN ' + @tmpArtigo + ' ART WITH (NOLOCK) ON MOV.Artigo = ART.Artigo LEFT JOIN ArtigoLote ARTL WITH (NOLOCK) ON ARTL.Artigo = ART.Artigo AND ARTL.Lote = MOV.lote LEFT JOIN TiposArtigo TAR WITH (NOLOCK) ON ART.TipoArtigo = tar.TipoArtigo LEFT JOIN ' + @tmpArmazens + ' ARM WITH (NOLOCK) ON ARM.Armazem = MOV.Armazem LEFT JOIN Familias FAM WITH (NOLOCK) ON FAM.Familia = ART.Familia LEFT JOIN SubFamilias SUBFAM WITH (NOLOCK) ON SUBFAM.Familia = ART.Familia AND SUBFAM.SubFamilia = ART.SubFamilia LEFT JOIN Marcas MARCAS WITH (NOLOCK) ON MARCAS.Marca = ART.Marca LEFT JOIN Modelos MODELOS WITH (NOLOCK) ON MODELOS.Marca = ART.Marca AND MODELOS.Modelo = ART.Modelo LEFT JOIN ' + @tmpArmazemLocalizacoes + ' ARMLOC WITH (NOLOCK) ON MOV.Armazem = ARMLOC.Armazem AND mov.Localizacao = ARMLOC.Localizacao LEFT JOIN CabecDocCD (NOLOCK) ON CD.Id = ORIG.IdChave1 AND TOrig.Modulo = ''V'' LEFT JOIN CabecComprasCC (NOLOCK) ON CC.Id = ORIG.IdChave1 AND TOrig.Modulo = ''C'' LEFT JOIN CabecInternos CI (NOLOCK) ON CI.Id = ORIG.IdChave1 AND TOrig.Modulo = ''N'' @JOIN_ARTIGOSPAI@ WHERE MOV.sistema = 0 @Datas@ /* @Artigo@ */ @Armazem@ @Filial@ @FiltroDocumentos@ @OBRAS@ @Lote@ @NumeroSerie@ @Localizacoes@ @TiposArtigos@ @Familias@ @SubFamilias@ @Marcas@ @VisualizaEstadosPrevistos@ @VisualizaEstadosReservados@ ORDER BY MOV.artigo, MOV.Data, MOV.NumRegisto' SELECT @CamposUtil = [dbo].STD_DaCamposUtil('Inv_Origens', 'ORIG', 0) SET @vSQL = REPLACE(@vSQL, '@CAMPOSUTIL@', ISNULL(',' + @CamposUtil,'')) -- Visualiza Estados Previstos IF LEN(ISNULL(@pVisualizaEstadosPrevistos , 1)) > 0 AND @pVisualizaEstadosPrevistos = 0 SET @vSQL = REPLACE(@vSQL, '@VisualizaEstadosPrevistos@' , ' AND EST.Previsto <> 1 ') ELSE SET @vSQL = REPLACE(@vSQL, '@VisualizaEstadosPrevistos@', '') -- Visualiza Estados Reservados IF LEN(ISNULL(@pVisualizaEstadosReservados , 1)) > 0 AND @pVisualizaEstadosReservados = 0 SET @vSQL = REPLACE(@vSQL, '@VisualizaEstadosReservados@' , ' AND EST.EstadoReserva <> 1 AND MOV.IdReserva IS NULL ') ELSE SET @vSQL = REPLACE(@vSQL, '@VisualizaEstadosReservados@', '') --STOCK ATUAL IF (@pTipoDeAnalise IS NOT NULL) BEGIN IF @pTipoDeAnalise = '0' /* Artigo */ BEGIN SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (mov.Existencias_Actual as float)' ) SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (mov.Existencias_Anterior as float)' ) END IF @pTipoDeAnalise = '1' /* Armazem */ BEGIN SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (mov.ExistenciasArm_Actual as float)' ) SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (mov.ExistenciasArm_Anterior as float)' ) END IF @pTipoDeAnalise = '2' /* Armazém / Localizaçao */ BEGIN SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (mov.ExistenciasLoc_Actual as float)' ) SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (mov.ExistenciasLoc_Anterior as float)' ) END IF @pTipoDeAnalise = '3' /* Armazém / Localizaçao / Lote */ BEGIN SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (case when MOV.Lote <> ''<L01>'' then mov.ExistenciasLocLot_Actual else mov.ExistenciasLoc_Actual end as float)' ) SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (case when MOV.Lote <> ''<L01>'' then mov.ExistenciasLocLot_Anterior else mov.ExistenciasLoc_Anterior end as float)' ) END IF @pTipoDeAnalise = '4' /* Armazém / Lote */ BEGIN SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (case when MOV.Lote <> ''<L01>'' then mov.ExistenciasArmLot_Actual else mov.ExistenciasArm_Actual end as float)' ) SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (case when MOV.Lote <> ''<L01>'' then mov.ExistenciasArmLot_Anterior else mov.ExistenciasArm_Anterior end as float)' ) END IF @pTipoDeAnalise = '5' /* Lote */ BEGIN SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (case when MOV.Lote <> ''<L01>'' then mov.ExistenciasLot_Actual else mov.Existencias_Actual end as float)' ) SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (case when MOV.Lote <> ''<L01>'' then mov.ExistenciasLot_Anterior else mov.Existencias_Anterior end as float)' ) END END --PERÍODO IF (@pDataInicial IS NOT NULL) AND (@pDataFinal IS NOT NULL) BEGIN SET @vSQL = REPLACE(@vSQL, '@Datas@', 'AND MOV.Data BETWEEN ''@DataInicial@'' AND ''@DataFinal@''' ) SET @vSQL = REPLACE(@vSQL, '@DataInicial@', CONVERT(VARCHAR, @pDataInicial, 101) + ' 00:00:00') SET @vSQL = REPLACE(@vSQL, '@DataFinal@', CONVERT(VARCHAR, @pDataFinal, 101) + ' 23:59:59') END ELSE BEGIN SET @vSQL = REPLACE(@vSQL, '@Datas@', '') END -- Tabelas temporárias SET @vSQL = REPLACE(@vSQL, '@TmpTabela@', @pTmpTabela) --Descriçao Artigo SET @vSQL = REPLACE(@vSQL, '@ArtigoDescricao@', 'CASE WHEN ART.TratamentoDim = 2 THEN artPai.Descricao ELSE ART.Descricao END') SET @vSQL = REPLACE(@vSQL, '@JOIN_ARTIGOSPAI@', 'LEFT JOIN ' + @tmpArtigo + ' artPai WITH (NOLOCK) ON ART.ArtigoPai = artPai.Artigo') -- Câmbios SET @vSQL = REPLACE(@vSQL, '@SQLCambioMBase@', @vSQLCambioMBase) SET @vSQL = REPLACE(@vSQL, '@SQLCambioMAlt@', @vSQLCambioMAlt) SET @vSQL = REPLACE(@vSQL, '@DecArredondaMBase@', @vDecArredondaMBase) SET @vSQL = REPLACE(@vSQL, '@DecArredondaMAlt@', @vDecArredondaMAlt) -- Filial IF LEN(ISNULL(@pFilial, '')) > 0 SET @vSQL = REPLACE(@vSQL, '@Filial@', 'AND ORIG.Filial = ''' + @pFilial + '''') ELSE SET @vSQL = REPLACE(@vSQL, '@Filial@', '') -- Filtro dos documentos (ligaçao aos documentos originais) IF LEN(ISNULL(@pSQLWhereDocumentos, '')) > 0 SET @vSQL = REPLACE(@vSQL, '@FiltroDocumentos@',' AND ' + @pSQLWhereDocumentos) ELSE SET @vSQL = REPLACE(@vSQL, '@FiltroDocumentos@', '') -- Filtro dos Artigos IF LEN(ISNULL(@pArtigo , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@Artigo@' , ' AND ' + @pArtigo) ELSE SET @vSQL = REPLACE(@vSQL, '@Artigo@', '') -- Filtro dos Armazéns IF LEN(ISNULL(@pArmazem , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@Armazem@' , ' AND ' + @pArmazem) ELSE SET @vSQL = REPLACE(@vSQL, '@Armazem@', '') -- Filtro dos Lotes IF LEN(ISNULL(@pLote , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@Lote@' , ' AND ' + @pLote) ELSE SET @vSQL = REPLACE(@vSQL, '@Lote@', '') -- Filtro dos numero de serie IF LEN(ISNULL( @pNumeroSerie, '')) > 0 SET @vSQL = REPLACE(@vSQL, '@NumeroSerie@' , ' AND ' + @pNumeroSerie) ELSE SET @vSQL = REPLACE(@vSQL, '@NumeroSerie@', '') -- Filtro das localizaçoes IF LEN(ISNULL(@pLocalizacoes , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@Localizacoes@' , ' AND ' + @pLocalizacoes) ELSE SET @vSQL = REPLACE(@vSQL, '@Localizacoes@', '') -- Filtro das tipos de artigos, @pTiposArtigos IF LEN(ISNULL(@pTiposArtigos , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@TiposArtigos@' , ' AND ' + @pTiposArtigos) ELSE SET @vSQL = REPLACE(@vSQL, '@TiposArtigos@', '') -- Filtro das familias,, @pFamilias IF LEN(ISNULL(@pFamilias , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@Familias@' , ' AND ' + @pFamilias) ELSE SET @vSQL = REPLACE(@vSQL, '@Familias@', '') -- Filtro das subfamilias,, @pSubFamilias IF LEN(ISNULL(@pSubFamilias , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@SubFamilias@' , ' AND ' + @pSubFamilias) ELSE SET @vSQL = REPLACE(@vSQL, '@SubFamilias@', '') -- Filtro das MARCAS, @pMarcas IF LEN(ISNULL(@pMarcas , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@Marcas@' , ' AND ' + @pMarcas) ELSE SET @vSQL = REPLACE(@vSQL, '@Marcas@', '') ------ Filtro projeto IF LEN(ISNULL(@pProjecto, '')) > 0 SET @vSQL = REPLACE(@vSQL, '@OBRAS@', ' AND ' +@pProjecto) ELSE SET @vSQL = REPLACE(@vSQL, '@OBRAS@', '') IF LEN(@pCaseTipoMovimento) = 0 SET @vSQL = REPLACE(@vSQL, '@pCaseTipoMovimento@', '''''') ELSE SET @vSQL = REPLACE(@vSQL, '@pCaseTipoMovimento@', @pCaseTipoMovimento) -- Execuçao EXEC sp_executesql @vSQL -- Tabela temporária SET @vSQL = REPLACE(@vSQL, '@TmpTabela@', @pTmpTabela) /************************************************************************************************** SALDO INICIAL **************************************************************************************************/ if not (@pDataInicial is null and @pDataFinal is null) AND NOT YEAR(@pDataFinal)>(YEAR(getdate())+20) BEGIN SET @vSQL = ' INSERT INTO @TmpTabela@ SELECT TOP 1 WITH TIES '''' as TipoArtigo, null as FatorConversao, null as Familia, null as Marca, 0 as TratamentoLotes, ISNULL(MOV.Armazem,''''), ISNULL(MOV.Localizacao,''''), MOV.Lote , '''' as EstadoStock, MOV.Artigo , @ArtigoDescricao@ , null as Documento, null as TipoDoc , DATEADD(millisecond, -10 ,''@DataInicial@'') as Data , null as Hora, null as Ano, null as Modelo, null as SubFamilia, null as DescTipoArtigo , DescArmazem = ISNULL(ARM.Descricao ,'''') , DescLocalizacao = ISNULL(ARMLOC.Descricao ,'''') , null as DescFamilia, null as DescSubFamilia, null as DescMarca, null as DescModelo , DescLote = ISNULL(ARTL.Descricao ,MOV.lote) , newid() as ID, newid() as IDOrigem, ''A'' as TipoMovimento, ''@DescSaldoInicial@'' DescTipoMovimento, null as idChave1, null as idChave2, null as idChave3, null as idChave4, null as idTipoOrigem, null as NumDocInt, null as Serie, null as Modulo, null as Filial, null as Unidade, null as QuantidadeDoc, null as QuantidadeMov , 0 as StockActual ,@TipoDeAnalise@ as ExistenciasQtd , 0 as ExistenciasAnteriorQtd, 0 as ValorContabilisticoMBase, 0 as ValorContabilisticoMAlt, 0 as CustoRealMBase, 0 as CustoRealMAlt, 0 as ValorRealMBase, 0 as ValorRealMAlt, null as Projeto, null as IDReserva, 0 as NumRegisto, NULL, NULL, NULL ' + CASE WHEN LEN(ISNULL(@strCDUMov, '')) > 0 THEN ', ' + @strCDUMov ELSE '' END + ' @CAMPOSUTIL@ FROM INV_Movimentos MOV WITH (NOLOCK) INNER JOIN INV_Estados EST on MOV.EstadoStock = EST.Estado AND EST.Existencias=1 INNER JOIN ' + @tmpArtigo + ' ART WITH (NOLOCK) ON MOV.Artigo = ART.Artigo LEFT JOIN ArtigoLote ARTL WITH (NOLOCK) ON ARTL.Artigo = ART.Artigo AND ARTL.Lote = MOV.lote LEFT JOIN ' + @tmpArmazens + ' ARM WITH (NOLOCK) ON ARM.Armazem = MOV.Armazem LEFT JOIN ' + @tmpArmazemLocalizacoes + ' ARMLOC WITH (NOLOCK) ON MOV.Armazem = ARMLOC.Armazem AND mov.Localizacao = ARMLOC.Localizacao ' + CASE WHEN LEN(ISNULL(@pProjecto, '')) > 0 THEN 'INNER JOIN (SELECT DISTINCT Origens.Id FROM INV_Origens Origens WITH (NOLOCK) INNER JOIN ' + @tmpCOP_Obras + ' COP_Obras WITH (NOLOCK) ON Origens.IDProjecto = COP_Obras.ID @OBRAS@) ORIG ON MOV.IdOrigem = ORIG.Id ' ELSE '' END + ' @JOIN_ARTIGOSPAI@ WHERE MOV.sistema = 0 @Datas@ /* @Artigo@ */ @Armazem@ @Lote@ @Localizacoes@ @TiposArtigos@ @Familias@ @SubFamilias@ @Marcas@ ORDER BY ROW_NUMBER() OVER(PARTITION BY @GroupBy@ ORDER BY MOV.Artigo, Data DESC, NumRegisto DESC ); ' SELECT @CamposUtil = [dbo].STD_DaCamposUtil('Inv_Origens', NULL, 1) SET @vSQL = REPLACE(@vSQL, '@CAMPOSUTIL@', ISNULL(',' + @CamposUtil,'')) SET @vSQL = REPLACE(@vSQL, '@TmpTabela@', @pTmpTabela) --SET @vSQL = REPLACE(@vSQL, '@Datas@', 'AND Data BETWEEN ''@DataInicial@'' AND ''@DataFinal@''' ) SET @vSQL = REPLACE(@vSQL, '@Datas@', 'AND Data < ''@DataInicial@''' ) -- Filtro dos Artigos IF LEN(ISNULL(@pArtigo , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@Artigo@' , ' AND ' + @pArtigo) ELSE SET @vSQL = REPLACE(@vSQL, '@Artigo@', '') -- Filtro dos Armazéns IF LEN(ISNULL(@pArmazem , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@Armazem@' , ' AND ' + @pArmazem) ELSE SET @vSQL = REPLACE(@vSQL, '@Armazem@', '') -- Filtro dos Lotes IF LEN(ISNULL(@pLote , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@Lote@' , ' AND ' + @pLote) ELSE SET @vSQL = REPLACE(@vSQL, '@Lote@', '') -- Filtro das localizaçoes IF LEN(ISNULL(@pLocalizacoes , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@Localizacoes@' , ' AND ' + @pLocalizacoes) ELSE SET @vSQL = REPLACE(@vSQL, '@Localizacoes@', '') -- Filtro das tipos de artigos, @pTiposArtigos IF LEN(ISNULL(@pTiposArtigos , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@TiposArtigos@' , ' AND ' + @pTiposArtigos) ELSE SET @vSQL = REPLACE(@vSQL, '@TiposArtigos@', '') -- Filtro das familias,, @pFamilias IF LEN(ISNULL(@pFamilias , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@Familias@' , ' AND ' + @pFamilias) ELSE SET @vSQL = REPLACE(@vSQL, '@Familias@', '') -- Filtro das subfamilias,, @pSubFamilias IF LEN(ISNULL(@pSubFamilias , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@SubFamilias@' , ' AND ' + @pSubFamilias) ELSE SET @vSQL = REPLACE(@vSQL, '@SubFamilias@', '') -- Filtro das MARCAS, @pMarcas IF LEN(ISNULL(@pMarcas , '')) > 0 SET @vSQL = REPLACE(@vSQL, '@Marcas@' , ' AND ' + @pMarcas) ELSE SET @vSQL = REPLACE(@vSQL, '@Marcas@', '') ------ Filtro projeto IF LEN(ISNULL(@pProjecto, '')) > 0 SET @vSQL = REPLACE(@vSQL, '@OBRAS@', ' AND ' +@pProjecto) ELSE SET @vSQL = REPLACE(@vSQL, '@OBRAS@', '') SET @vSQL = REPLACE(@vSQL, '@DataInicial@', CONVERT(VARCHAR, @pDataInicial, 101) + ' 00:00:00') SET @vSQL = REPLACE(@vSQL, '@DataFinal@', CONVERT(VARCHAR, @pDataFinal, 101) + ' 23:59:59') SET @vSQL = REPLACE(@vSQL, '@DescSaldoInicial@', @pDescSaldoInicial) SET @vSQL = REPLACE(@vSQL, '@ArtigoDescricao@', 'CASE WHEN ART.TratamentoDim = 2 THEN artPai.Descricao ELSE ART.Descricao END') IF (@pTipoDeAnalise IS NOT NULL) BEGIN IF @pTipoDeAnalise = '0' /* Artigo */ BEGIN SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (mov.Existencias_Actual as float)' ) SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (mov.Existencias_Anterior as float)' ) END IF @pTipoDeAnalise = '1' /* Armazem */ BEGIN SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (mov.ExistenciasArm_Actual as float)' ) SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (mov.ExistenciasArm_Anterior as float)' ) END IF @pTipoDeAnalise = '2' /* Armazém / Localizaçao */ BEGIN SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (mov.ExistenciasLoc_Actual as float)' ) SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (mov.ExistenciasLoc_Anterior as float)' ) END IF @pTipoDeAnalise = '3' /* Armazém / Localizaçao / Lote */ BEGIN SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (case when MOV.Lote <> ''<L01>'' then mov.ExistenciasLocLot_Actual else mov.ExistenciasLoc_Actual end as float)' ) SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (case when MOV.Lote <> ''<L01>'' then mov.ExistenciasLocLot_Anterior else mov.ExistenciasLoc_Anterior end as float)' ) END IF @pTipoDeAnalise = '4' /* Armazém / Lote */ BEGIN SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (case when MOV.Lote <> ''<L01>'' then mov.ExistenciasArmLot_Actual else mov.ExistenciasArm_Actual end as float)' ) SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (case when MOV.Lote <> ''<L01>'' then mov.ExistenciasArmLot_Anterior else mov.ExistenciasArm_Anterior end as float)' ) END IF @pTipoDeAnalise = '5' /* Lote */ BEGIN SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (case when MOV.Lote <> ''<L01>'' then mov.ExistenciasLot_Actual else mov.Existencias_Actual end as float)' ) SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (case when MOV.Lote <> ''<L01>'' then mov.ExistenciasLot_Anterior else mov.Existencias_Anterior end as float)' ) END END SET @vSQL = REPLACE(@vSQL, '@JOIN_ARTIGOSPAI@', 'LEFT JOIN ' + @tmpArtigo + ' artPai WITH (NOLOCK) ON ART.ArtigoPai = artPai.Artigo') IF LEN(@pCaseTipoMovimento) = 0 SET @vSQL = REPLACE(@vSQL, '@pCaseTipoMovimento@', '''''') ELSE SET @vSQL = REPLACE(@vSQL, '@pCaseTipoMovimento@', @pCaseTipoMovimento) IF (@pTipoDeAnalise IS NOT NULL) BEGIN IF @pTipoDeAnalise = '0' /* Artigo */ BEGIN SET @vSQL = REPLACE(@vSQL, '@GroupBy@', ' MOV.Artigo ' ) END IF @pTipoDeAnalise = '1' /* Armazem */ BEGIN SET @vSQL = REPLACE(@vSQL, '@GroupBy@', ' MOV.Artigo, MOV.Armazem ' ) END IF @pTipoDeAnalise = '2' /* Armazém / Localizaçao */ BEGIN SET @vSQL = REPLACE(@vSQL, '@GroupBy@', ' MOV.Artigo, MOV.Armazem, MOV.Localizacao ' ) END IF @pTipoDeAnalise = '3' /* Armazém / Localizaçao / Lote */ BEGIN SET @vSQL = REPLACE(@vSQL, '@GroupBy@', ' MOV.Artigo, MOV.Armazem, MOV.Localizacao, MOV.Lote ' ) END IF @pTipoDeAnalise = '4' /* Armazém / Lote */ BEGIN SET @vSQL = REPLACE(@vSQL, '@GroupBy@', ' MOV.Artigo, MOV.Armazem, MOV.Lote ' ) END IF @pTipoDeAnalise = '5' /* Lote */ BEGIN SET @vSQL = REPLACE(@vSQL, '@GroupBy@', ' MOV.Artigo, MOV.Lote ' ) END END --PRINT @vSQL EXEC sp_executesql @vSQL END /************************************************************************************************** RESULTADO **************************************************************************************************/ IF LEN(ISNULL(@pSQLSelectCampos, '')) = 0 SET @pSQLSelectCampos = '*' SET @vSQL = ' SELECT DISTINCT @CamposGrelha@ FROM @TmpTabela@ ORDER BY Artigo, Data, NumRegisto ' SET @vSQL = REPLACE(@vSQL, '@CamposGrelha@', @pSQLSelectCampos) SET @vSQL = REPLACE(@vSQL, '@TmpTabela@', @pTmpTabela) -- Agrupamentos automáticos --IF LEN(ISNULL(@pCamposGroupBy,'')) > 0 -- SET @vSQL = REPLACE(@vSQL, '@GroupByOrderBy@', 'GROUP BY ' + @pCamposGroupBy + ' ORDER BY ' + @pCamposGroupBy) --ELSE --SET @vSQL = REPLACE(@vSQL, '@GroupByOrderBy@', '') EXEC sp_executesql @vSQL /************************************************************************************************** TABELAS TEMPORÁRIAS - DROP **************************************************************************************************/ SET @vSQL = 'EXEC STD_DropTempTable [' + @vTmpDocumentos + ']' EXEC sp_executesql @vSQL IF @RemoveTMP = 1 BEGIN SET @vSQL = 'EXEC STD_DropTempTable [' + @pTmpTabela + ']' EXEC sp_executesql @vSQL END END GO Marked as spam | |
| Private answer Foi registada a anomalia 64379. A publicação da build com a correção será disponibilizada até ao dia 06/01/2023. Como contornar a situação: Alterar a compatibilidade para uma versão posterior ou usar a SP descrita na anomalia. Marked as spam | |
| Private answer Esta questão encontra-se em análise, no entanto de forma a contornar de imediato será necessário alterar o compatibility level da base de dados no SQL Management Studio (img).
Marked as spam Comments @carlamartins Estou a ter o mesmo problema, mas no meu caso o combo box na imagem não apresenta valores. A saber também que o cliente tem SQL 2017 e não 2019. Nesse caso deve colocar o compatibility level da bd no "SQL 2017" Boa tarde, esta solução não resolveu o problema. Boa tarde a Solução passará no momento por executar a query abaixo: EXEC STD_DropProcedure [INV_ExtractoArtigoMovimentos]
GO CREATE PROCEDURE [INV_ExtractoArtigoMovimentos]
(
@pSQLSelectCampos NVARCHAR(MAX) = '*'
, @pDataInicial DATETIME = null
, @pDataFinal DATETIME = null
, @pArtigo NVARCHAR (MAX) = ''
, @pArmazem NVARCHAR (MAX) = ''
, @pUnidade NVARCHAR (50) = ''
, @pFilial NVARCHAR (MAX) = ''
, @pSQLWhereDocumentos NVARCHAR (MAX) = ''
, @pLote NVARCHAR (MAX) = ''
, @pNumeroSerie NVARCHAR (MAX) = ''
, @pLocalizacoes NVARCHAR (MAX) = ''
, @pTiposArtigos NVARCHAR (MAX) = ''
, @pFamilias NVARCHAR (MAX) = ''
, @pSubFamilias NVARCHAR (MAX) = ''
, @pMarcas NVARCHAR (MAX) = ''
, @pProjecto NVARCHAR (MAX) = ''
, @pPostoSessao NVARCHAR (250) = '00'
, @pMoedaTrabalho VARCHAR(3) = 'EUR'
, @pMoedaBase VARCHAR(3) = 'EUR'
, @pMoedaAlternativa VARCHAR(3) = 'EUR'
, @pMTrabDecArredonda SMALLINT = 2
, @pSentidoCambios BIT = 0
-- Possibilidade de definir a tabela temporária a utilizar
, @pTmpTabela VARCHAR(100) = NULL
, @pTipoDeAnalise NVARCHAR(2) = '0'
, @pVisualizaEstadosPrevistos BIT = 0
, @pVisualizaEstadosReservados BIT = 0
, @pCaseTipoMovimento NVARCHAR(300) = ''
, @pDescSaldoInicial nvarchar(50) = 'Saldo Inicial' )
AS
BEGIN
SET NOCOUNT ON
SET ANSI_WARNINGS OFF
/**************************************************************************************************
VARIÁVEIS
**************************************************************************************************/
DECLARE @vSQL NVARCHAR(MAX)
, @vSQLSelect NVARCHAR(MAX)
, @vSQLFrom NVARCHAR(MAX)
, @vSQLCambioMBase NVARCHAR(255)
, @vSQLCambioMAlt NVARCHAR(255)
, @CamposUtil NVARCHAR(500) DECLARE @vTmpDocumentos VARCHAR(100)
, @vPCMPorArmazem BIT
, @vDecArredondaMBase SMALLINT
, @vDecArredondaMAlt SMALLINT
, @RemoveTMP BIT DECLARE @strCDUMov VARCHAR(MAX) SET @vTmpDocumentos = '#tmpDocumentos'
DECLARE @strMoedaBase VARCHAR(3)
, @strMoedaAlt VARCHAR(3)
, @strMoedaRef VARCHAR(3)
, @intSentidoCambio SMALLINT
, @intCambioHistorico BIT DECLARE @tmpCOP_Obras VARCHAR(100)
, @tmpINV_OrigensTiposDocumentos VARCHAR(100)
, @tmpINV_TiposOrigem VARCHAR(100)
, @tmpArtigo VARCHAR(100)
, @tmpArmazens VARCHAR(100)
, @tmpArmazemLocalizacoes VARCHAR(100) DECLARE @tmpArtigoFiltro NVARCHAR (MAX) IF LEN(ISNULL(@pArtigo, '')) > 0
SET @tmpArtigoFiltro = 'AND ' + REPLACE(@pArtigo, 'mov.', '')
/**************************************************************************************************
CÂMBIOS E MOEDAS
**************************************************************************************************/
EXEC ADM_DaMoedasEmpresa @strMoedaBase OUTPUT, @strMoedaAlt OUTPUT, @strMoedaRef OUTPUT, @intSentidoCambio OUTPUT, @intCambioHistorico OUTPUT
SELECT @vSQLCambioMBase = SQLCambio, @vDecArredondaMBase = DecArredonda
FROM dbo.[INV_SQLCambioOrig](@strMoedaBase)
SELECT @vSQLCambioMAlt = SQLCambio, @vDecArredondaMAlt = DecArredonda
FROM dbo.[INV_SQLCambioOrig](@strMoedaAlt)
/**************************************************************************************************
TABELAS TEMPORÁRIAS
**************************************************************************************************/
-- Movimentos
IF LEN(ISNULL(@pTmpTabela, '')) = 0
BEGIN
SET @pTmpTabela = '##tmpMovimentos' + CAST(@@SPID as varchar)
SET @RemoveTMP = 1
END
ELSE
set @RemoveTMP = 0
SET @vSQL = 'EXEC STD_DropTempTable [' + @pTmpTabela + ']'
EXEC sp_executesql @vSQL /********************************
COP_Obras
********************************/
SET @tmpCOP_Obras = '##tmpCOP_Obras'+ CAST(@@SPID as varchar) SET @vSQL = 'EXEC STD_DropTempTable [' + @tmpCOP_Obras + ']'
EXEC sp_executesql @vSQL SET @vSQL = 'select distinct ID, Codigo
INTO ' + @tmpCOP_Obras + '
FROM COP_Obras WITH (NOLOCK)
WHERE 1 = 1
@OBRAS@
'
------ Filtro projeto
IF LEN(ISNULL(@pProjecto, '')) > 0
BEGIN
SET @vSQL = REPLACE(@vSQL, '@OBRAS@', ' AND ' +@pProjecto)
END
ELSE
BEGIN
SET @vSQL = REPLACE(@vSQL, '@OBRAS@', '')
END
EXEC sp_executesql @vSQL /********************************
INV_OrigensTiposDocumentos
********************************/
SET @tmpINV_OrigensTiposDocumentos = '##tmpINV_OrigensTiposDocumentos'+ CAST(@@SPID as varchar) SET @vSQL = 'EXEC STD_DropTempTable [' + @tmpINV_OrigensTiposDocumentos + ']'
EXEC sp_executesql @vSQL SET @vSQL = 'SELECT CASE WHEN IdTipoOrigemExploracoes IS NULL THEN IdTipoOrigem ELSE IdTipoOrigemExploracoes END IdTipoOrigemExp, IdTipoOrigem, TipoDocumento
INTO ' + @tmpINV_OrigensTiposDocumentos + '
FROM INV_OrigensTiposDocumentos WITH (NOLOCK)'
EXEC sp_executesql @vSQL /********************************
INV_TiposOrigem
********************************/
SET @tmpINV_TiposOrigem = '##tmpINV_TiposOrigem'+ CAST(@@SPID as varchar) SET @vSQL = 'EXEC STD_DropTempTable [' + @tmpINV_TiposOrigem + ']'
EXEC sp_executesql @vSQL SET @vSQL = 'select distinct ID, Modulo
INTO ' + @tmpINV_TiposOrigem + '
FROM INV_TiposOrigem WITH (NOLOCK)'
EXEC sp_executesql @vSQL /********************************
Artigo
********************************/
SET @tmpArtigo = '##tmpArtigo'+ CAST(@@SPID as varchar) SET @vSQL = 'EXEC STD_DropTempTable [' + @tmpArtigo + ']'
EXEC sp_executesql @vSQL SET @vSQL = ' CREATE TABLE ' + @tmpArtigo + ' (
[Artigo] [nvarchar](48) NOT NULL PRIMARY KEY CLUSTERED,
[Familia] [nvarchar](10) NULL,
[SubFamilia] [nvarchar](10) NULL,
[TipoArtigo] [nvarchar](3) NOT NULL,
[Marca] [nvarchar](10) NULL,
[Modelo] [nvarchar](20) NULL,
[TratamentoLotes] [bit] NOT NULL,
[Descricao] [nvarchar](250) NULL,
[TratamentoDim] [bit] NOT NULL,
[ArtigoPai] [nvarchar](48) NULL
)'
EXEC sp_executesql @vSQL SET @vSQL = 'INSERT INTO ' + @tmpArtigo + '
SELECT Distinct Artigo, Familia, SubFamilia, TipoArtigo, Marca, Modelo, TratamentoLotes, Descricao, TratamentoDim, ArtigoPai
FROM Artigo MOV (NOLOCK)
WHERE 1 = 1
@Artigo@
UNION -- ARTIGOS FILHOS SELECT DISTINCT A.Artigo, Familia, SubFamilia, TipoArtigo, Marca, Modelo, TratamentoLotes, Descricao, TratamentoDim, ArtigoPai
FROM Artigo mov
INNER JOIN
(SELECT Artigo = ISNULL(artFilhos.Artigo,mov.Artigo)
FROM Artigo mov
LEFT JOIN (SELECT Artigo, ArtigoPai FROM Artigo mov WHERE TratamentoDim = 2 AND mov.MovStock = ''S'' @FiltroArtigosPai@) artFilhos ON artFilhos.ArtigoPai = mov.Artigo
WHERE mov.MovStock = ''S'' AND TratamentoDim = 1 @Artigo@
) A ON A.Artigo = mov.Artigo
' -- Filtro dos Artigos
IF LEN(ISNULL(@pArtigo , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@Artigo@' , ' AND ' + @pArtigo)
ELSE
SET @vSQL = REPLACE(@vSQL, '@Artigo@', '') IF LEN(ISNULL(@pArtigo, '')) > 0
SET @vSQL = REPLACE(@vSQL, '@FiltroArtigosPai@', ' AND ' + REPLACE(@pArtigo,'mov.Artigo','mov.ArtigoPai'))
ELSE
SET @vSQL = REPLACE(@vSQL, '@FiltroArtigosPai@', '') EXEC sp_executesql @vSQL /********************************
Armazens
********************************/
SET @tmpArmazens = '##tmpArmazens'+ CAST(@@SPID as varchar) SET @vSQL = 'EXEC STD_DropTempTable [' + @tmpArmazens + ']'
EXEC sp_executesql @vSQL SET @vSQL = 'select distinct Armazem, Descricao, GrupoCustos
INTO ' + @tmpArmazens + '
FROM Armazens MOV (NOLOCK)
WHERE 1 = 1
@Armazem@
' -- Filtro dos Armazéns
IF LEN(ISNULL(@pArmazem , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@Armazem@' , ' AND ' + @pArmazem)
ELSE
SET @vSQL = REPLACE(@vSQL, '@Armazem@', '') EXEC sp_executesql @vSQL /********************************
ArmazemLocalizacoes
********************************/
SET @tmpArmazemLocalizacoes = '##tmpArmazemLocalizacoes'+ CAST(@@SPID as varchar) SET @vSQL = 'EXEC STD_DropTempTable [' + @tmpArmazemLocalizacoes + ']'
EXEC sp_executesql @vSQL SET @vSQL = 'select Distinct Armazem, Localizacao, Descricao
INTO ' + @tmpArmazemLocalizacoes + '
FROM ArmazemLocalizacoes (NOLOCK)
WHERE 1 = 1
@Localizacoes@' -- Filtro das localizaçoes
IF LEN(ISNULL(@pLocalizacoes , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@Localizacoes@' , ' AND ' + @pLocalizacoes)
ELSE
SET @vSQL = REPLACE(@vSQL, '@Localizacoes@', '') SET @vSQL = REPLACE(@vSQL, 'MOV.' , '')
EXEC sp_executesql @vSQL
/**************************************************************************************************
MOVIMENTOS
**************************************************************************************************/ SET @strCDUMov = CAST ((
SELECT (CASE WHEN t.name NOT IN ('TEXT', 'NTEXT') THEN 'MOV.' + c.name + ', ' ELSE 'CAST(MOV.' + c.name + ' AS VARCHAR(MAX)), ' END)
FROM sys.columns c
INNER JOIN sys.types t ON c.user_type_id = t.user_type_id
WHERE c.name LIKE 'CDU_%'
AND object_id = object_id('INV_Movimentos')
FOR XML PATH('')) AS NVARCHAR(MAX)
) -- remover última vírgula
SET @strCDUMov = SUBSTRING(@strCDUMov, 0, LEN(@strCDUMov)) SET @vSQL =
'
SELECT ART.TipoArtigo, FatorConversao = cast(ORIG.FactorConv as float), ART.Familia, ART.Marca, ART.TratamentoLotes, Armazem = ISNULL(MOV.Armazem,''''), Localizacao = ISNULL(MOV.Localizacao,''''), Lote = ISNULL(MOV.lote ,'''')
, EstadoStock= MOV.EstadoStock, Artigo = ART.artigo, Descricao = @ArtigoDescricao@, Documento = ORIG.Documento, TipoDoc = origtdocs.TIPODOCUMENTO
, Data = MOV.Data
, Hora = CONVERT(NVARCHAR(20), MOV.Data,108)
, Ano = YEAR(MOV.Data)
, Modelo = ART.Modelo
, ART.SubFamilia
, DescTipoArtigo = tar.Descricao
, DescArmazem = ISNULL(ARM.Descricao ,'''')
, DescLocalizacao = ISNULL(ARMLOC.Descricao ,'''')
, DescFamilia = FAM.Descricao
, DescSubFamilia = SUBFAM.Descricao
, DescMarca = MARCAS.Descricao
, DescModelo = MODELOS.Descricao
, DescLote = ISNULL(ARTL.Descricao ,MOV.lote)
, ID= MOV.Id
, MOV.IdOrigem
, MOV.TipoMovimento
, DescTipoMovimento = CAST(@pCaseTipoMovimento@ AS NVARCHAR(100))
, ORIG.IdChave1
, ORIG.IdChave2
, ORIG.IdChave3
, ORIG.IdChave4
, ORIG.IdTipoOrigem
, NumDocInt = ORIG.NumChave1
, Serie = ORIG.NumChave2
, Modulo = RTRIM(TOrig.Modulo)
, Filial = ORIG.Filial
, Unidade = ORIG.unidade
, QuantidadeDoc = CAST(ORIG.Quantidade as float)
, QuantidadeMov = CAST(MOV.Quantidade as float )
, StockActual = @TipoDeAnalise@ --cast (case when MOV.Lote '''' then MOV.StockLocLot_Actual else MOV.StockLoc_Actual end as float)
/* Existencias (Qtd.) */
, ExistenciasQtd = @TipoDeAnalise@
, ExistenciasAnteriorQtd = @TipoDeAnaliseAnterior@ /* CustoUnitarioMBase * QuantidadeUnidade */
, ValorContabilisticoMBase = 0
, ValorContabilisticoMAlt = 0 /* Custo com variaçao associado ao movimento (E-Valor da entrada que vem da INV_VariacoesCusteio; S-Valorizaçao + Variaçoes que vem da INV_Valorizacoes + INV_Variacoes) */
, CustoRealMBase = 0
, CustoRealMAlt = 0
/* CustoRealMBase * QuantidadeUnidade */
, ValorRealMBase =0
, ValorRealMAlt = 0
, Projeto =COP_Obras.Codigo
, MOV.IDReserva
, MOV.NumRegisto
, COALESCE(CD.TipoEntidade, CC.TipoEntidade, CI.TipoEntidade) AS TipoEntidade
, COALESCE(CD.Entidade, CC.Entidade, CI.Entidade) AS Entidade
, COALESCE(CD.Nome, CC.Nome, CI.Nome) AS Nome
' + CASE WHEN LEN(ISNULL(@strCDUMov, '')) > 0 THEN ', ' + @strCDUMov ELSE '' END + '
@CAMPOSUTIL@
INTO @TmpTabela@
FROM INV_Movimentos MOV WITH (NOLOCK)
INNER JOIN INV_Estados EST WITH (NOLOCK) ON EST.Estado = MOV.EstadoStock
LEFT JOIN INV_Origens ORIG WITH (NOLOCK) ON MOV.IdOrigem = ORIG.Id
LEFT JOIN ' + @tmpCOP_Obras + ' COP_Obras WITH (NOLOCK) ON ORIG.IDProjecto = COP_Obras.ID
LEFT JOIN ' + @tmpINV_OrigensTiposDocumentos+ ' origtdocs WITH (NOLOCK) ON origtdocs.IdTipoOrigem = ORIG.IdTipoOrigem AND ORIG.Chave1 = origtdocs.TipoDocumento
LEFT JOIN ' + @tmpINV_TiposOrigem + ' TOrig WITH (NOLOCK) ON origtdocs.IdTipoOrigemExp= TOrig.ID LEFT JOIN INV_Valorizacoes VAL WITH (NOLOCK) ON MOV.id= val.IdMovimentoStock
LEFT JOIN INV_NumerosSerieMovimento NSE (NOLOCK) ON MOV.Id = NSE.IdMovimentoStock
LEFT JOIN ( SELECT IdValorizacao, ValorMBase = SUM(ValorMBase), ValorMAlt = SUM(ValorMAlt)
FROM INV_Variacoes (NOLOCK)
GROUP BY IdValorizacao) varval ON VAL.Id = varval.IdValorizacao
INNER JOIN ' + @tmpArtigo + ' ART WITH (NOLOCK) ON MOV.Artigo = ART.Artigo
LEFT JOIN ArtigoLote ARTL WITH (NOLOCK) ON ARTL.Artigo = ART.Artigo AND ARTL.Lote = MOV.lote
LEFT JOIN TiposArtigo TAR WITH (NOLOCK) ON ART.TipoArtigo = tar.TipoArtigo
LEFT JOIN ' + @tmpArmazens + ' ARM WITH (NOLOCK) ON ARM.Armazem = MOV.Armazem
LEFT JOIN Familias FAM WITH (NOLOCK) ON FAM.Familia = ART.Familia
LEFT JOIN SubFamilias SUBFAM WITH (NOLOCK) ON SUBFAM.Familia = ART.Familia AND SUBFAM.SubFamilia = ART.SubFamilia
LEFT JOIN Marcas MARCAS WITH (NOLOCK) ON MARCAS.Marca = ART.Marca
LEFT JOIN Modelos MODELOS WITH (NOLOCK) ON MODELOS.Marca = ART.Marca AND MODELOS.Modelo = ART.Modelo
LEFT JOIN ' + @tmpArmazemLocalizacoes + ' ARMLOC WITH (NOLOCK) ON MOV.Armazem = ARMLOC.Armazem AND mov.Localizacao = ARMLOC.Localizacao
LEFT JOIN CabecDoc CD (NOLOCK) ON CD.Id = ORIG.IdChave1 AND TOrig.Modulo = ''V''
LEFT JOIN CabecCompras CC (NOLOCK) ON CC.Id = ORIG.IdChave1 AND TOrig.Modulo = ''C''
LEFT JOIN CabecInternos CI (NOLOCK) ON CI.Id = ORIG.IdChave1 AND TOrig.Modulo = ''N''
@JOIN_ARTIGOSPAI@
WHERE MOV.sistema = 0
@Datas@
/*
@Artigo@
*/
@Armazem@
@Filial@
@FiltroDocumentos@
@OBRAS@
@Lote@
@NumeroSerie@
@Localizacoes@
@TiposArtigos@
@Familias@
@SubFamilias@
@Marcas@
@VisualizaEstadosPrevistos@
@VisualizaEstadosReservados@
ORDER BY MOV.artigo, MOV.Data, MOV.NumRegisto'
SELECT @CamposUtil = [dbo].STD_DaCamposUtil('Inv_Origens', 'ORIG', 0)
SET @vSQL = REPLACE(@vSQL, '@CAMPOSUTIL@', ISNULL(',' + @CamposUtil,'')) -- Visualiza Estados Previstos
IF LEN(ISNULL(@pVisualizaEstadosPrevistos , 1)) > 0 AND @pVisualizaEstadosPrevistos = 0
SET @vSQL = REPLACE(@vSQL, '@VisualizaEstadosPrevistos@' , ' AND EST.Previsto 1 ')
ELSE
SET @vSQL = REPLACE(@vSQL, '@VisualizaEstadosPrevistos@', '')
-- Visualiza Estados Reservados
IF LEN(ISNULL(@pVisualizaEstadosReservados , 1)) > 0 AND @pVisualizaEstadosReservados = 0
SET @vSQL = REPLACE(@vSQL, '@VisualizaEstadosReservados@' , ' AND EST.EstadoReserva 1 AND MOV.IdReserva IS NULL ')
ELSE
SET @vSQL = REPLACE(@vSQL, '@VisualizaEstadosReservados@', '') --STOCK ATUAL
IF (@pTipoDeAnalise IS NOT NULL)
BEGIN
IF @pTipoDeAnalise = '0' /* Artigo */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (mov.Existencias_Actual as float)' )
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (mov.Existencias_Anterior as float)' )
END
IF @pTipoDeAnalise = '1' /* Armazem */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (mov.ExistenciasArm_Actual as float)' )
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (mov.ExistenciasArm_Anterior as float)' )
END
IF @pTipoDeAnalise = '2' /* Armazém / Localizaçao */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (mov.ExistenciasLoc_Actual as float)' )
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (mov.ExistenciasLoc_Anterior as float)' )
END
IF @pTipoDeAnalise = '3' /* Armazém / Localizaçao / Lote */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (case when MOV.Lote '''' then mov.ExistenciasLocLot_Actual else mov.ExistenciasLoc_Actual end as float)' )
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (case when MOV.Lote '''' then mov.ExistenciasLocLot_Anterior else mov.ExistenciasLoc_Anterior end as float)' )
END
IF @pTipoDeAnalise = '4' /* Armazém / Lote */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (case when MOV.Lote '''' then mov.ExistenciasArmLot_Actual else mov.ExistenciasArm_Actual end as float)' )
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (case when MOV.Lote '''' then mov.ExistenciasArmLot_Anterior else mov.ExistenciasArm_Anterior end as float)' )
END
IF @pTipoDeAnalise = '5' /* Lote */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (case when MOV.Lote '''' then mov.ExistenciasLot_Actual else mov.Existencias_Actual end as float)' )
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (case when MOV.Lote '''' then mov.ExistenciasLot_Anterior else mov.Existencias_Anterior end as float)' )
END
END
--PERÍODO
IF (@pDataInicial IS NOT NULL) AND (@pDataFinal IS NOT NULL)
BEGIN SET @vSQL = REPLACE(@vSQL, '@Datas@', 'AND MOV.Data BETWEEN ''@DataInicial@'' AND ''@DataFinal@''' ) SET @vSQL = REPLACE(@vSQL, '@DataInicial@', CONVERT(VARCHAR, @pDataInicial, 101) + ' 00:00:00')
SET @vSQL = REPLACE(@vSQL, '@DataFinal@', CONVERT(VARCHAR, @pDataFinal, 101) + ' 23:59:59')
END
ELSE
BEGIN SET @vSQL = REPLACE(@vSQL, '@Datas@', '')
END
-- Tabelas temporárias
SET @vSQL = REPLACE(@vSQL, '@TmpTabela@', @pTmpTabela)
--Descriçao Artigo
SET @vSQL = REPLACE(@vSQL, '@ArtigoDescricao@', 'CASE WHEN ART.TratamentoDim = 2 THEN artPai.Descricao ELSE ART.Descricao END')
SET @vSQL = REPLACE(@vSQL, '@JOIN_ARTIGOSPAI@', 'LEFT JOIN ' + @tmpArtigo + ' artPai WITH (NOLOCK) ON ART.ArtigoPai = artPai.Artigo')
-- Câmbios
SET @vSQL = REPLACE(@vSQL, '@SQLCambioMBase@', @vSQLCambioMBase)
SET @vSQL = REPLACE(@vSQL, '@SQLCambioMAlt@', @vSQLCambioMAlt)
SET @vSQL = REPLACE(@vSQL, '@DecArredondaMBase@', @vDecArredondaMBase)
SET @vSQL = REPLACE(@vSQL, '@DecArredondaMAlt@', @vDecArredondaMAlt)
-- Filial
IF LEN(ISNULL(@pFilial, '')) > 0
SET @vSQL = REPLACE(@vSQL, '@Filial@', 'AND ORIG.Filial = ''' + @pFilial + '''')
ELSE
SET @vSQL = REPLACE(@vSQL, '@Filial@', '')
-- Filtro dos documentos (ligaçao aos documentos originais)
IF LEN(ISNULL(@pSQLWhereDocumentos, '')) > 0
SET @vSQL = REPLACE(@vSQL, '@FiltroDocumentos@',' AND ' + @pSQLWhereDocumentos)
ELSE
SET @vSQL = REPLACE(@vSQL, '@FiltroDocumentos@', '') -- Filtro dos Artigos
IF LEN(ISNULL(@pArtigo , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@Artigo@' , ' AND ' + @pArtigo)
ELSE
SET @vSQL = REPLACE(@vSQL, '@Artigo@', '')
-- Filtro dos Armazéns
IF LEN(ISNULL(@pArmazem , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@Armazem@' , ' AND ' + @pArmazem)
ELSE
SET @vSQL = REPLACE(@vSQL, '@Armazem@', '')
-- Filtro dos Lotes
IF LEN(ISNULL(@pLote , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@Lote@' , ' AND ' + @pLote)
ELSE
SET @vSQL = REPLACE(@vSQL, '@Lote@', '')
-- Filtro dos numero de serie
IF LEN(ISNULL( @pNumeroSerie, '')) > 0
SET @vSQL = REPLACE(@vSQL, '@NumeroSerie@' , ' AND ' + @pNumeroSerie)
ELSE
SET @vSQL = REPLACE(@vSQL, '@NumeroSerie@', '')
-- Filtro das localizaçoes
IF LEN(ISNULL(@pLocalizacoes , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@Localizacoes@' , ' AND ' + @pLocalizacoes)
ELSE
SET @vSQL = REPLACE(@vSQL, '@Localizacoes@', '')
-- Filtro das tipos de artigos, @pTiposArtigos
IF LEN(ISNULL(@pTiposArtigos , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@TiposArtigos@' , ' AND ' + @pTiposArtigos)
ELSE
SET @vSQL = REPLACE(@vSQL, '@TiposArtigos@', '') -- Filtro das familias,, @pFamilias
IF LEN(ISNULL(@pFamilias , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@Familias@' , ' AND ' + @pFamilias)
ELSE
SET @vSQL = REPLACE(@vSQL, '@Familias@', '') -- Filtro das subfamilias,, @pSubFamilias
IF LEN(ISNULL(@pSubFamilias , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@SubFamilias@' , ' AND ' + @pSubFamilias)
ELSE
SET @vSQL = REPLACE(@vSQL, '@SubFamilias@', '')
-- Filtro das MARCAS, @pMarcas
IF LEN(ISNULL(@pMarcas , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@Marcas@' , ' AND ' + @pMarcas)
ELSE
SET @vSQL = REPLACE(@vSQL, '@Marcas@', '') ------ Filtro projeto
IF LEN(ISNULL(@pProjecto, '')) > 0
SET @vSQL = REPLACE(@vSQL, '@OBRAS@', ' AND ' +@pProjecto)
ELSE
SET @vSQL = REPLACE(@vSQL, '@OBRAS@', '')
IF LEN(@pCaseTipoMovimento) = 0
SET @vSQL = REPLACE(@vSQL, '@pCaseTipoMovimento@', '''''')
ELSE
SET @vSQL = REPLACE(@vSQL, '@pCaseTipoMovimento@', @pCaseTipoMovimento) -- Execuçao
EXEC sp_executesql @vSQL
-- Tabela temporária
SET @vSQL = REPLACE(@vSQL, '@TmpTabela@', @pTmpTabela) /**************************************************************************************************
SALDO INICIAL
**************************************************************************************************/
if not (@pDataInicial is null and @pDataFinal is null) AND NOT YEAR(@pDataFinal)>(YEAR(getdate())+20)
BEGIN
SET @vSQL =
'
INSERT INTO
@TmpTabela@
SELECT TOP 1 WITH TIES
'''' as TipoArtigo, null as FatorConversao, null as Familia, null as Marca, 0 as TratamentoLotes, ISNULL(MOV.Armazem,''''), ISNULL(MOV.Localizacao,''''), MOV.Lote
, '''' as EstadoStock, MOV.Artigo
, @ArtigoDescricao@
, null as Documento, null as TipoDoc
, DATEADD(millisecond, -10 ,''@DataInicial@'') as Data
, null as Hora, null as Ano, null as Modelo, null as SubFamilia, null as DescTipoArtigo
, DescArmazem = ISNULL(ARM.Descricao ,'''')
, DescLocalizacao = ISNULL(ARMLOC.Descricao ,'''')
, null as DescFamilia, null as DescSubFamilia, null as DescMarca, null as DescModelo
, DescLote = ISNULL(ARTL.Descricao ,MOV.lote)
, newid() as ID, newid() as IDOrigem, ''A'' as TipoMovimento, ''@DescSaldoInicial@'' DescTipoMovimento, null as idChave1, null as idChave2, null as idChave3, null as idChave4, null as idTipoOrigem, null as NumDocInt, null as Serie, null as Modulo, null as Filial, null as Unidade, null as QuantidadeDoc, null as QuantidadeMov
, 0 as StockActual ,@TipoDeAnalise@ as ExistenciasQtd
, 0 as ExistenciasAnteriorQtd, 0 as ValorContabilisticoMBase, 0 as ValorContabilisticoMAlt, 0 as CustoRealMBase, 0 as CustoRealMAlt, 0 as ValorRealMBase, 0 as ValorRealMAlt, null as Projeto, null as IDReserva, 0 as NumRegisto, NULL, NULL, NULL
' + CASE WHEN LEN(ISNULL(@strCDUMov, '')) > 0 THEN ', ' + @strCDUMov ELSE '' END + '
@CAMPOSUTIL@
FROM INV_Movimentos MOV WITH (NOLOCK)
INNER JOIN INV_Estados EST on MOV.EstadoStock = EST.Estado AND EST.Existencias=1
INNER JOIN ' + @tmpArtigo + ' ART WITH (NOLOCK) ON MOV.Artigo = ART.Artigo
LEFT JOIN ArtigoLote ARTL WITH (NOLOCK) ON ARTL.Artigo = ART.Artigo AND ARTL.Lote = MOV.lote
LEFT JOIN ' + @tmpArmazens + ' ARM WITH (NOLOCK) ON ARM.Armazem = MOV.Armazem
LEFT JOIN ' + @tmpArmazemLocalizacoes + ' ARMLOC WITH (NOLOCK) ON MOV.Armazem = ARMLOC.Armazem AND mov.Localizacao = ARMLOC.Localizacao ' +
CASE WHEN LEN(ISNULL(@pProjecto, '')) > 0
THEN ' INNER JOIN (SELECT DISTINCT Origens.Id
FROM INV_Origens Origens WITH (NOLOCK)
INNER JOIN ' + @tmpCOP_Obras + ' COP_Obras WITH (NOLOCK) ON Origens.IDProjecto = COP_Obras.ID @OBRAS@) ORIG ON MOV.IdOrigem = ORIG.Id '
ELSE ''
END + '
@JOIN_ARTIGOSPAI@
WHERE MOV.sistema = 0
@Datas@
/*
@Artigo@
*/
@Armazem@
@Lote@
@Localizacoes@
@TiposArtigos@
@Familias@
@SubFamilias@
@Marcas@
ORDER BY
ROW_NUMBER() OVER(PARTITION BY @GroupBy@ ORDER BY MOV.Artigo, Data DESC, NumRegisto DESC );
' SELECT @CamposUtil = [dbo].STD_DaCamposUtil('Inv_Origens', NULL, 1)
SET @vSQL = REPLACE(@vSQL, '@CAMPOSUTIL@', ISNULL(',' + @CamposUtil,'')) SET @vSQL = REPLACE(@vSQL, '@TmpTabela@', @pTmpTabela)
--SET @vSQL = REPLACE(@vSQL, '@Datas@', 'AND Data BETWEEN ''@DataInicial@'' AND ''@DataFinal@''' )
SET @vSQL = REPLACE(@vSQL, '@Datas@', 'AND Data < ''@DataInicial@''' ) -- Filtro dos Artigos
IF LEN(ISNULL(@pArtigo , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@Artigo@' , ' AND ' + @pArtigo)
ELSE
SET @vSQL = REPLACE(@vSQL, '@Artigo@', '')
-- Filtro dos Armazéns
IF LEN(ISNULL(@pArmazem , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@Armazem@' , ' AND ' + @pArmazem)
ELSE
SET @vSQL = REPLACE(@vSQL, '@Armazem@', '') -- Filtro dos Lotes
IF LEN(ISNULL(@pLote , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@Lote@' , ' AND ' + @pLote)
ELSE
SET @vSQL = REPLACE(@vSQL, '@Lote@', '') -- Filtro das localizaçoes
IF LEN(ISNULL(@pLocalizacoes , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@Localizacoes@' , ' AND ' + @pLocalizacoes)
ELSE
SET @vSQL = REPLACE(@vSQL, '@Localizacoes@', '') -- Filtro das tipos de artigos, @pTiposArtigos
IF LEN(ISNULL(@pTiposArtigos , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@TiposArtigos@' , ' AND ' + @pTiposArtigos)
ELSE
SET @vSQL = REPLACE(@vSQL, '@TiposArtigos@', '') -- Filtro das familias,, @pFamilias
IF LEN(ISNULL(@pFamilias , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@Familias@' , ' AND ' + @pFamilias)
ELSE
SET @vSQL = REPLACE(@vSQL, '@Familias@', '') -- Filtro das subfamilias,, @pSubFamilias
IF LEN(ISNULL(@pSubFamilias , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@SubFamilias@' , ' AND ' + @pSubFamilias)
ELSE
SET @vSQL = REPLACE(@vSQL, '@SubFamilias@', '')
-- Filtro das MARCAS, @pMarcas
IF LEN(ISNULL(@pMarcas , '')) > 0
SET @vSQL = REPLACE(@vSQL, '@Marcas@' , ' AND ' + @pMarcas)
ELSE
SET @vSQL = REPLACE(@vSQL, '@Marcas@', '') ------ Filtro projeto
IF LEN(ISNULL(@pProjecto, '')) > 0
SET @vSQL = REPLACE(@vSQL, '@OBRAS@', ' AND ' +@pProjecto)
ELSE
SET @vSQL = REPLACE(@vSQL, '@OBRAS@', '') SET @vSQL = REPLACE(@vSQL, '@DataInicial@', CONVERT(VARCHAR, @pDataInicial, 101) + ' 00:00:00')
SET @vSQL = REPLACE(@vSQL, '@DataFinal@', CONVERT(VARCHAR, @pDataFinal, 101) + ' 23:59:59')
SET @vSQL = REPLACE(@vSQL, '@DescSaldoInicial@', @pDescSaldoInicial) SET @vSQL = REPLACE(@vSQL, '@ArtigoDescricao@', 'CASE WHEN ART.TratamentoDim = 2 THEN artPai.Descricao ELSE ART.Descricao END') IF (@pTipoDeAnalise IS NOT NULL)
BEGIN
IF @pTipoDeAnalise = '0' /* Artigo */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (mov.Existencias_Actual as float)' )
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (mov.Existencias_Anterior as float)' )
END
IF @pTipoDeAnalise = '1' /* Armazem */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (mov.ExistenciasArm_Actual as float)' )
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (mov.ExistenciasArm_Anterior as float)' )
END
IF @pTipoDeAnalise = '2' /* Armazém / Localizaçao */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (mov.ExistenciasLoc_Actual as float)' )
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (mov.ExistenciasLoc_Anterior as float)' )
END
IF @pTipoDeAnalise = '3' /* Armazém / Localizaçao / Lote */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (case when MOV.Lote '''' then mov.ExistenciasLocLot_Actual else mov.ExistenciasLoc_Actual end as float)' )
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (case when MOV.Lote '''' then mov.ExistenciasLocLot_Anterior else mov.ExistenciasLoc_Anterior end as float)' )
END
IF @pTipoDeAnalise = '4' /* Armazém / Lote */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (case when MOV.Lote '''' then mov.ExistenciasArmLot_Actual else mov.ExistenciasArm_Actual end as float)' )
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (case when MOV.Lote '''' then mov.ExistenciasArmLot_Anterior else mov.ExistenciasArm_Anterior end as float)' )
END
IF @pTipoDeAnalise = '5' /* Lote */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnalise@', 'cast (case when MOV.Lote '''' then mov.ExistenciasLot_Actual else mov.Existencias_Actual end as float)' )
SET @vSQL = REPLACE(@vSQL, '@TipoDeAnaliseAnterior@', 'cast (case when MOV.Lote '''' then mov.ExistenciasLot_Anterior else mov.Existencias_Anterior end as float)' )
END
END SET @vSQL = REPLACE(@vSQL, '@JOIN_ARTIGOSPAI@', 'LEFT JOIN ' + @tmpArtigo + ' artPai WITH (NOLOCK) ON ART.ArtigoPai = artPai.Artigo') IF LEN(@pCaseTipoMovimento) = 0
SET @vSQL = REPLACE(@vSQL, '@pCaseTipoMovimento@', '''''')
ELSE
SET @vSQL = REPLACE(@vSQL, '@pCaseTipoMovimento@', @pCaseTipoMovimento) IF (@pTipoDeAnalise IS NOT NULL)
BEGIN
IF @pTipoDeAnalise = '0' /* Artigo */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@GroupBy@', ' MOV.Artigo ' )
END IF @pTipoDeAnalise = '1' /* Armazem */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@GroupBy@', ' MOV.Artigo, MOV.Armazem ' )
END
IF @pTipoDeAnalise = '2' /* Armazém / Localizaçao */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@GroupBy@', ' MOV.Artigo, MOV.Armazem, MOV.Localizacao ' )
END IF @pTipoDeAnalise = '3' /* Armazém / Localizaçao / Lote */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@GroupBy@', ' MOV.Artigo, MOV.Armazem, MOV.Localizacao, MOV.Lote ' )
END IF @pTipoDeAnalise = '4' /* Armazém / Lote */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@GroupBy@', ' MOV.Artigo, MOV.Armazem, MOV.Lote ' )
END IF @pTipoDeAnalise = '5' /* Lote */
BEGIN
SET @vSQL = REPLACE(@vSQL, '@GroupBy@', ' MOV.Artigo, MOV.Lote ' )
END
END --PRINT @vSQL
EXEC sp_executesql @vSQL
END
/**************************************************************************************************
RESULTADO
**************************************************************************************************/
IF LEN(ISNULL(@pSQLSelectCampos, '')) = 0
SET @pSQLSelectCampos = '*' SET @vSQL =
'
SELECT DISTINCT @CamposGrelha@
FROM @TmpTabela@
ORDER BY Artigo, Data, NumRegisto
'
SET @vSQL = REPLACE(@vSQL, '@CamposGrelha@', @pSQLSelectCampos)
SET @vSQL = REPLACE(@vSQL, '@TmpTabela@', @pTmpTabela) -- Agrupamentos automáticos
--IF LEN(ISNULL(@pCamposGroupBy,'')) > 0
-- SET @vSQL = REPLACE(@vSQL, '@GroupByOrderBy@', 'GROUP BY ' + @pCamposGroupBy + ' ORDER BY ' + @pCamposGroupBy)
--ELSE
--SET @vSQL = REPLACE(@vSQL, '@GroupByOrderBy@', '')
EXEC sp_executesql @vSQL
/**************************************************************************************************
TABELAS TEMPORÁRIAS - DROP
**************************************************************************************************/
SET @vSQL = 'EXEC STD_DropTempTable [' + @vTmpDocumentos + ']'
EXEC sp_executesql @vSQL
IF @RemoveTMP = 1
BEGIN
SET @vSQL = 'EXEC STD_DropTempTable [' + @pTmpTabela + ']'
EXEC sp_executesql @vSQL
END
END
GO |