Inquiridor
FUNCTION

Discussão Geral
-
Boa tarde!
Tenho uma tabela GradeProdutos onde eu tenho a descricao da Grade, exemplo: Camisa Polo
Tenho uma Tabela Produtos, onde tenho 5 opções de grade: Cor: Azul, Tamanho: GG,
Nesse exemplo usei 2 itens da grade. A descricao completa do produto fica: Camisa Polo Azul GG
eu pensei que em cada VIEW ou Function que eu fizer vou ter que montar essa descricao completa, e corro o risco de ficar diferente de uma view para a outra, ou ate mesmo se eu quiser alterar o modelo de construcao desse nome eu teria que ir em todas as views que existisse e fazer a alteracao.
Entao pensei em fazer uma FUNCTION que retorna a descricao completa, e sempre que eu for fazer uma view, function ou procedure que use a descricaocompleta eu usaria essa FUNCTION.
Primeira pergunta, devo mesmo fazer isso, ou seria bobeira?
Fazendo a FUNCTION eu fiz passando o ID_Produto como parametro, e essa é minha duvida, se faço uma FUNCTION passando o parametro, ou faço uma com toda a tabela pra fazer INNER JOIN quando fazer uma VIEW.
Hoje minha FUNCTION esta assim:
ALTER FUNCTION [FN_CE100_Produtos_DescricaoComnpleta_Table] ( @ID_Produto INT ) RETURNS TABLE AS RETURN SELECT dbo.CE100_Grade.Descricao + CASE WHEN NOT dbo.CE100_Produtos.ItemGrade_01_Valor IS NULL THEN ' ' + dbo.CE100_Produtos.ItemGrade_01_Valor ELSE '' END + CASE WHEN NOT dbo.CE100_Produtos.ItemGrade_02_Valor IS NULL THEN ' ' + dbo.CE100_Produtos.ItemGrade_02_Valor ELSE '' END + CASE WHEN NOT dbo.CE100_Produtos.ItemGrade_03_Valor IS NULL THEN ' ' + dbo.CE100_Produtos.ItemGrade_03_Valor ELSE '' END + CASE WHEN NOT dbo.CE100_Produtos.ItemGrade_04_Valor IS NULL THEN ' ' + dbo.CE100_Produtos.ItemGrade_04_Valor ELSE '' END + CASE WHEN NOT dbo.CE100_Produtos.ItemGrade_05_Valor IS NULL THEN ' ' + dbo.CE100_Produtos.ItemGrade_05_Valor ELSE '' END AS DescricaoCompleta FROM dbo.CE100_Produtos WITH(NOLOCK) INNER JOIN dbo.CE100_Grade WITH(NOLOCK) ON dbo.CE100_Produtos.ID_Grade = dbo.CE100_Grade.ID_Grade WHERE (dbo.CE100_Produtos.ID_Produto = @ID_Produto)
Todas as Respostas
-
-
Jose Diz obrigado. Voce disse que algumas tabelas nao sao normatizadas por performance. Nesse caso acha que tenho que normatizar, ou sigo nessa linha?
Tem funcao que retorna valor, mas minha preocupação é que como passa o parametro ID, e se o select retorna 100 ou 1000 itens vai executar a function para cada item.
Por isso estava pensando em fazer uma FUNCAO que retorna todos os itens, fazendo um INNER JOIN com a tabela na VIEW.
O que voce acha?
-
-
Obrigado a todos, eu utilizaria em uma view por exemplo:
ALTER VIEW [VwCE100_Produtos] AS SELECT dbo.CE100_Produtos.ID_Produto, dbo.CE100_Grade.ID_Grade, dbo.CE100_Grade.ID_Objeto, dbo.MA730_Empresas.ID_Empresa, dbo.MA730_Empresas.Nome AS EmpNome, dbo.MA730_Empresas.RazaoSocial AS EmpRS, dbo.MA730_Empresas.Nome + ' - ' + dbo.MA730_Empresas.RazaoSocial AS EmpNomeRS, dbo.MA732_Filiais.ID_Filial, dbo.MA732_Filiais.Nome AS FilialNome, dbo.MA732_Filiais.RazaoSocial AS FilialRS, dbo.MA732_Filiais.Nome + ' - ' + dbo.MA732_Filiais.RazaoSocial AS FilialNomeRS, dbo.CE100_Grade.ID_Tipo, dbo.CE900_TipoProduto.Descricao AS TipoDesc, dbo.CE100_Grade.Descricao, dbo.CE100_Produtos.ItemGrade_01_Valor, dbo.CE100_Produtos.ItemGrade_02_Valor, dbo.CE100_Produtos.ItemGrade_03_Valor, dbo.CE100_Produtos.ItemGrade_04_Valor, dbo.CE100_Produtos.ItemGrade_05_Valor, FN_CE100_Produtos_DescricaoComnpleta.DescricaoCompleta, dbo.CE100_Grade.ID_UnidadeEstoque, dbo.CE901_Unidade.Sigla AS UniEstSigla, dbo.CE901_Unidade.Descricao AS UniEstDesc, dbo.CE100_Produtos.ID_Fabricante, dbo.CE153_Fabricante.Descricao AS FabDesc, dbo.CE150_Grupo.ID_Grupo, dbo.CE150_Grupo.Descricao AS GruDesc, dbo.CE100_Produtos.ID_Classe, dbo.CE155_Classe.Descricao AS ClaDesc, dbo.CE100_Produtos.ComissaoP, dbo.CE100_Produtos.EstoqueMinimo, dbo.CE100_Produtos.EstoqueMaximo, dbo.CE100_Grade.ControlaLote, dbo.CE100_Produtos.Inativo FROM dbo.CE100_Produtos INNER JOIN dbo.CE100_Grade ON dbo.CE100_Produtos.ID_Grade = dbo.CE100_Grade.ID_Grade INNER JOIN dbo.MA350_AssociacaoFiliais ON dbo.CE100_Grade.ID_Objeto = dbo.MA350_AssociacaoFiliais.ID_Objeto AND dbo.CE100_Grade.ID_Grade = dbo.MA350_AssociacaoFiliais.ID_IndicePrimario INNER JOIN dbo.MA732_Filiais ON dbo.MA350_AssociacaoFiliais.ID_Filial = dbo.MA732_Filiais.ID_Filial INNER JOIN dbo.MA730_Empresas ON dbo.MA732_Filiais.ID_Empresa = dbo.MA730_Empresas.ID_Empresa INNER JOIN dbo.CE901_Unidade ON dbo.CE100_Grade.ID_UnidadeEstoque = dbo.CE901_Unidade.ID_Unidade INNER JOIN dbo.CE153_Fabricante ON dbo.CE100_Produtos.ID_Fabricante = dbo.CE153_Fabricante.ID_Fabricante INNER JOIN dbo.CE155_Classe ON dbo.CE100_Produtos.ID_Classe = dbo.CE155_Classe.ID_Classe INNER JOIN dbo.CE900_TipoProduto ON dbo.CE100_Grade.ID_Tipo = dbo.CE900_TipoProduto.ID_Tipo INNER JOIN dbo.CE150_Grupo ON dbo.CE100_Grade.ID_Grupo = dbo.CE150_Grupo.ID_Grupo CROSS APPLY dbo.FN_CE100_Produtos_DescricaoComnpleta_Table (dbo.CE100_Produtos.ID_Produto) AS FN_CE100_Produtos_DescricaoComnpleta GO