none
Diferença entre 2 procedures (Stored Procedure IGUAIS) RRS feed

  • Pergunta

  • Bom Dia a todos

    Tenho essas 2 procedures que estão em banco de dados com collation diferentes.

    Essa stored tras para mim apenas os itens que estão pendentes de baixa de estoque. Por exemplo o usuario retira 2 camisas quando ele for dar baixa deverá ser exibido apenas o item que corresponde a camisa que ele pegou, se ele devolver 1 camisa a baixa sera realizada, mas continuara disponivel para outra baixa pois foram 2 itens retirados, caso ele devolta tudo e tente visualizar o que esta pendente a consulta abaixo nao exibe nenhum item, pois na RETIRADA foi realizado um registro NEGATIVO e quando devolvido POSITIVO chegando a ZERO a soma dos itens registrados para um mesmo usuário. O Problema que tenho é que na segunda stored procedure ele não me traz o mesmo resultado da primeira. Acredito que seja por razão da collation ser diferente.

    A Primeira Base está com o seguinte collation: Latin1_General_CI_AS

    set ANSI_NULLS ON
    
    set QUOTED_IDENTIFIER ON
    
    GO
    
    ALTER PROCEDURE [dbo].[SelectDevolucao]
    
    (
    
    	@Registro varchar(50)
    
    )
    
    AS
    
    	SET NOCOUNT ON;
    
    SELECT f.Item, CONVERT(varchar, f.DtRecebimento, 103) AS Expr1, i.Descricao
    
    FROM   Itens AS i INNER JOIN
    
           Ficha AS f ON i.ID = f.Item
    
    WHERE  (f.Registro = @Registro)
    
    group by f.Item, f.DtRecebimento, i.Descricao
    
    HAVING SUM(f.Quantidade)<> 0
    
    
    
    

     Essa está com collation: SQL_Latin1_General_CP1_CI_AI

    set ANSI_NULLS ON
    
    set QUOTED_IDENTIFIER ON
    
    GO
    
    ALTER PROCEDURE [dbo].[SelectDevolucao]
    
    (
    
    	@CAND int
    
    )
    
    AS
    
    	SET NOCOUNT ON;
    
    select f.Item, CONVERT(varchar, f.DtRecebimento, 103) as Expr1, i.Descricao
    
    from			ItensEPI AS i INNER JOIN
    
    					FichaEPI AS f ON i.ID = f.Item
    
    where (f.Candidato = @CAND)
    
    group by f.Item, f.DtRecebimento, i.Descricao
    
    HAVING SUM(f.Quantidade)<> 0
    
    

     Ambas tem a mesma estrutura, diferenciando apenas pela collation. O problema que a segunda na traz o mesmo resultado da primeira. Pois o HAVING SUM(f.Quantidade) <> 0 não funciona, exibindo todos os itens registrados (entradas e saidas). A primeira stored respeita a condição do HAVING SUM() exibindo apenas os registros cujas somas sejam diferentes de 0.

    Não tenho certeza se realmente o problema é a diferença do COLLATION. Gostaria de uma dica para solução.

    Aguardo
    Desde já agradeço

    • Editado Allen Castro quarta-feira, 27 de outubro de 2010 14:59 titulo
    quarta-feira, 27 de outubro de 2010 13:11

Respostas

  • Se tiver 4 registros (2 do mesmo item) >

    O Primeiro retorna apenas 1 linha de cada item, sem repetições. (2 linhas)
    O Segundo retorna tudo repetindo item. (todos os registros)

    Acho que uma alternativa é usar um CASE. Mas gostaria de entender o que está acontecendo ;/

    Fiz várias tentativas e percebi que quando coloco no select o f.DtRecebimento ele repete tudo, só tirar ele pára de repetir as linhas que não quero. Mas preciso exibir a DATA na consulta


    SOLUÇÃO ------------------------------------------------------------------

    Fiz a conferência dos registros de ENTRADA E SAIDA e constatei que na entrada estava sendo registrada a DATA e HORA em DtRecebimento e no momento da SAIDA deveria registrar a mesma DATA e HORA na DtRecebimento, mas estava inserindo apenas a DATA havendo então diferenças entre elas. Mesmo com o código do usuário IGUAL e Código do ITEM as condições não eram respeitadas, por isso que não filtrava quando pedia para exibir as DtRecebimento.

    • Editado Allen Castro quarta-feira, 27 de outubro de 2010 19:40 solução
    • Sugerido como Resposta Marco Antônio Pinheiro quarta-feira, 27 de outubro de 2010 19:48
    • Marcado como Resposta Eder Costa quarta-feira, 15 de dezembro de 2010 14:39
    quarta-feira, 27 de outubro de 2010 17:34

Todas as Respostas

  • Allen,

    Não sei se o collation seria o problema. Pois a primeira SP tem um collation onde o acento é sensitive e como vc faz comparação com campos varchar essa é que deveria não estar trazendo os registros (pelo menos na teoria). Ao contrário da segunda SP que o acento é insensitive, mas indenpendente disso a comparação é com inteiros, então não faria diferença (pelo menos na teoria).

    A única diferença que vejo são nas variaveis. A primeira é um varchar e a segunda é um inteiro. Talvez no relacionamento feito com estes "caras" os registros sejam diferentes e realmente, no caso da segunda SP, não deveria trazer nada.

    Rode tb apenas a parte dos select's das SP's trocando as variaveis por uma informação real. Talvez isso dê uma luz.

    Att.,


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 - http://marcoantoniopinheiro.blogspot.com [Se o post foi útil, não esqueça de marcá-lo. Obrigado!!!]
    quarta-feira, 27 de outubro de 2010 14:15
  • As imagens das tabelas

    SP 1



    SP 2



    Realmente analisando dessa forma o campo REGISTRO da primeira SP é varchar(50) e o campo Candidato da segunda SP é INT

    Na primeira SP quando tenho 2 registros na tabela FICHA onde o item é o mesmo e o candidato também.

    Quantidade = 1
    Quantidade = -1

    A 1ª SP não retorna nada pois respeita o HAVING SUM()

    Já a segunda SP deveria ter o mesmo resultado, mas retorna os 2 registros.

     

    • Editado Allen Castro quarta-feira, 27 de outubro de 2010 14:57 coerência
    quarta-feira, 27 de outubro de 2010 14:53
  • Allen,

     

    Se vc rodar os seguintes comandos sem o HAVING, o que será mostrado:

     

    SELECT
     f.Item, CONVERT
    (varchar
    , f.DtRecebimento, 103) AS
     Expr1, i.Descricao

    FROM Itens AS i INNER JOIN

    Ficha AS f ON i.ID = f.Item

    WHERE (f.Registro = @Registro)

    group by f.Item, f.DtRecebimento, i.Descricao

    
    
    
    select
     f.Item, CONVERT
    (varchar
    , f.DtRecebimento, 103) as
     Expr1, i.Descricao

    from ItensEPI AS i INNER JOIN

    FichaEPI AS f ON i.ID = f.Item

    where (f.Candidato = @CAND)

    group by f.Item, f.DtRecebimento, i.Descricao

    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    quarta-feira, 27 de outubro de 2010 16:09
  • Se tiver 4 registros (2 do mesmo item) >

    O Primeiro retorna apenas 1 linha de cada item, sem repetições. (2 linhas)
    O Segundo retorna tudo repetindo item. (todos os registros)

    Acho que uma alternativa é usar um CASE. Mas gostaria de entender o que está acontecendo ;/

    Fiz várias tentativas e percebi que quando coloco no select o f.DtRecebimento ele repete tudo, só tirar ele pára de repetir as linhas que não quero. Mas preciso exibir a DATA na consulta


    SOLUÇÃO ------------------------------------------------------------------

    Fiz a conferência dos registros de ENTRADA E SAIDA e constatei que na entrada estava sendo registrada a DATA e HORA em DtRecebimento e no momento da SAIDA deveria registrar a mesma DATA e HORA na DtRecebimento, mas estava inserindo apenas a DATA havendo então diferenças entre elas. Mesmo com o código do usuário IGUAL e Código do ITEM as condições não eram respeitadas, por isso que não filtrava quando pedia para exibir as DtRecebimento.

    • Editado Allen Castro quarta-feira, 27 de outubro de 2010 19:40 solução
    • Sugerido como Resposta Marco Antônio Pinheiro quarta-feira, 27 de outubro de 2010 19:48
    • Marcado como Resposta Eder Costa quarta-feira, 15 de dezembro de 2010 14:39
    quarta-feira, 27 de outubro de 2010 17:34
  • EXCELENTE...Já tava ficando estranho esse caso!!!!

    Att.,


    Marco Antônio Pinheiro / MCTS - Database Developer 2008 http://marcoantoniopinheiro.blogspot.com Se o post foi útil, não esqueça de marcá-lo.
    quarta-feira, 27 de outubro de 2010 19:48