Forum
See question

Ao aceder ao extrato de artigo surge o seguinte erro   

91 views
1
0

Ao aceder ao extrato de artigo surge o seguinte erro:

Erro ao executar a operação.

Invalid object name STRING_SPLIT

Faça login para poder traduzir
Inventário
Primavera
Marked as spam
Criado há 3 anos e 3 meses carlamartins
c
carlamartins Responsiveness Member
6 answers
0
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

 

Faça login para poder traduzir
Marked as spam
Criado há 3 anos e 2 meses fernandomanuelgonalveslopes
f
fernandomanuelgonalveslopes Responsiveness Member
    0
    Private answer

    Fica aqui a SP corrigida sem erros, Ficheiro txt zipado

    Faça login para poder traduzir
    Marked as spam
    Criado há 3 anos e 3 meses brunomanuelfortunatonbrega
      0
      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?

      Faça login para poder traduzir
      Marked as spam
      Criado há 3 anos e 3 meses brunomanuelfortunatonbrega
        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.
        3 anos e 3 meses
        carlamartins
          A SP indicada esta a dar erros a correr.
          3 anos e 3 meses
          brunomanuelfortunatonbrega
            0
            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
            Faça login para poder traduzir
            Marked as spam
            Criado há 3 anos e 3 meses gildosantos-2
            g
            gildosantos-2 Iniciante
              0
              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.

              Faça login para poder traduzir
              Marked as spam
              Criado há 3 anos e 3 meses carlamartins
              c
              carlamartins Responsiveness Member
                1
                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).

                 

                Faça login para poder traduzir
                Attachments:
                Marked as spam
                Criado há 3 anos e 3 meses carlamartins
                c
                carlamartins Responsiveness Member
                  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.
                  3 anos e 3 meses
                  pedrocrespo
                    Nesse caso deve colocar o compatibility level da bd no "SQL 2017"
                    3 anos e 3 meses
                    carlamartins
                      Boa tarde, esta solução não resolveu o problema.
                      3 anos e 3 meses
                      brunogomes
                        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
                        3 anos e 3 meses
                        gildosantos-2