Prodecure de Pesquisa dentro de outra pesquisa
Olá pessoal, estou com uma duvida cruel aqui, preciso de criar uma procedure que trabalhe da seguinte forma:
No meu banco de dados SQL eu preciso de achar um produto pelo nome e dentro dos resultados obtidos pesquisar a aplicação daquele produto, dai seria uma pesquisa dentro da outra pesquisa .
fiz 2 procedures no SQL um pra pesquisa do nome e outra pra pesquisa da aplicação, segue elas:
E no VB eu usei o seguinte código
Para nome:
Para a Aplicação
Resumindo dessa forma ele esta pesquisando o nome certinho, porem quando entro com os dados da aplicação ele exibe os dados de outros produtos que não estão relacionado ao nome dos itens que filtrei anteriormente . Alguém sabe me explicar como se faz ?
No meu banco de dados SQL eu preciso de achar um produto pelo nome e dentro dos resultados obtidos pesquisar a aplicação daquele produto, dai seria uma pesquisa dentro da outra pesquisa .
fiz 2 procedures no SQL um pra pesquisa do nome e outra pra pesquisa da aplicação, segue elas:
create proc sp_buscarProdutosNome @nome VARCHAR(60) as begin select * from produtos where nome like '%'+ @nome + '%' end go create proc sp_buscarProdutosAplicacao @Aplicacao VARCHAR(80) as begin select * from produtos where Aplicacao like '%' + @Aplicacao + '%' end go
E no VB eu usei o seguinte código
Para nome:
Private Sub txt_buscarNome_TextChanged(sender As Object, e As EventArgs) Handles txt_buscarNome.TextChanged If txt_buscarNome.Text = "" And dg2.Rows.Count > 0 Then Listar() Else Dim dt As New DataTable Dim da As SqlDataAdapter Try abrir() da = New SqlDataAdapter("sp_buscarProdutosNome", con) da.SelectCommand.CommandType = CommandType.StoredProcedure da.SelectCommand.Parameters.AddWithValue("@nome", txt_buscarNome.Text) da.Fill(dt) dg2.DataSource = dt ContarLinhas() Catch ex As Exception MessageBox.Show("Erro ao Listar" + ex.Message) fechar() End Try End If End Sub
Para a Aplicação
Private Sub Txt_Buscar_apli_TextChanged(sender As Object, e As EventArgs) Handles Txt_Buscar_apli.TextChanged If Txt_Buscar_apli.Text = "" And dg2.Rows.Count > 0 Then Listar() Else Dim dt As New DataTable Dim da As SqlDataAdapter Try abrir() da = New SqlDataAdapter("sp_buscarProdutosAplicacao", con) da.SelectCommand.CommandType = CommandType.StoredProcedure da.SelectCommand.Parameters.AddWithValue("@Aplicacao", Txt_Buscar_apli.Text) da.Fill(dt) dg2.DataSource = dt ContarLinhas() Catch ex As Exception MessageBox.Show("Erro ao Listar" + ex.Message) fechar() End Try End If End Sub
Resumindo dessa forma ele esta pesquisando o nome certinho, porem quando entro com os dados da aplicação ele exibe os dados de outros produtos que não estão relacionado ao nome dos itens que filtrei anteriormente . Alguém sabe me explicar como se faz ?
Wictor
Curtidas 0
Melhor post
Ana Lichirgu
19/02/2019
Você não está relacionando uma pesquisa na outra...Pelo que entendi vc precisa pegar a aplicação dos produtos listados na primeira proc, certo?
Então, na segunda procedure vc tem que receber a listagem de produtos da primeira e a partir dela pegar a aplicação de cada produto.
Espero ter ajudado!
Então, na segunda procedure vc tem que receber a listagem de produtos da primeira e a partir dela pegar a aplicação de cada produto.
Espero ter ajudado!
GOSTEI 1
Mais Respostas
Wictor
19/02/2019
Você não está relacionando uma pesquisa na outra...Pelo que entendi vc precisa pegar a aplicação dos produtos listados na primeira proc, certo?
Então, na segunda procedure vc tem que receber a listagem de produtos da primeira e a partir dela pegar a aplicação de cada produto.
Espero ter ajudado!
Então, na segunda procedure vc tem que receber a listagem de produtos da primeira e a partir dela pegar a aplicação de cada produto.
Espero ter ajudado!
Exatamente amigo .. mas como relacionar isso na procedure ? qual é o código ? pois nos cursos que fiz nunca vi algo parecido
GOSTEI 0
Joel Rodrigues
19/02/2019
Fala, Wictor. Beleza?
Creio que a solução para esse problema é mais simples do que você imagina. Na verdade bastaria fazer um único select com os dois filtros (por nome e por aplicação).
No primeiro momento, se passar só o nome e não passar a aplicação, a expressão LIKE '%%' vazia vai retornar verdadeiro para todos os produtos, ou seja, apenas o filtro por nome vai ter resultado.
Posteriormente, se passar nome e aplicação, os dois filtros atuarão em conjunto, filtrando pelo nome e pela aplicação do produto.
Creio que a solução para esse problema é mais simples do que você imagina. Na verdade bastaria fazer um único select com os dois filtros (por nome e por aplicação).
No primeiro momento, se passar só o nome e não passar a aplicação, a expressão LIKE '%%' vazia vai retornar verdadeiro para todos os produtos, ou seja, apenas o filtro por nome vai ter resultado.
Posteriormente, se passar nome e aplicação, os dois filtros atuarão em conjunto, filtrando pelo nome e pela aplicação do produto.
GOSTEI 0
Renato Dias
19/02/2019
Boa tarde, Wictor. Pelo que entendi na mesma tabela de produtos você quer consultar produtos que atendam o critério de consulta para o campo nome e também ao critério de consulta para o campo aplicação. Você pode fazer as duas coisas em uma mesma consulta. Você coloca os dois critérios unidos por "AND", para confirmar que retornem registros que atendam a AMBOS critérios.
select * from produtos where nome like '%'+ @nome + '%' AND Aplicacao like '%' + @Aplicacao + '%'
select * from produtos where nome like '%'+ @nome + '%' AND Aplicacao like '%' + @Aplicacao + '%'
GOSTEI 0
Wictor
19/02/2019
Boa tarde, Wictor. Pelo que entendi na mesma tabela de produtos você quer consultar produtos que atendam o critério de consulta para o campo nome e também ao critério de consulta para o campo aplicação. Você pode fazer as duas coisas em uma mesma consulta. Você coloca os dois critérios unidos por "AND", para confirmar que retornem registros que atendam a AMBOS critérios.
select * from produtos where nome like '%'+ @nome + '%' AND Aplicacao like '%' + @Aplicacao + '%'
select * from produtos where nome like '%'+ @nome + '%' AND Aplicacao like '%' + @Aplicacao + '%'
lancei assim no SQL
create proc sp_buscarProdutosNome @nome VARCHAR(60), @Aplicacao VARCHAR(80) as begin select * from produtos where nome like '%'+ @nome + '%'and Aplicacao like '%' + @Aplicacao + '%' end go
e assim no VB
Private Sub txt_buscarNome_TextChanged(sender As Object, e As EventArgs) Handles txt_buscarNome.TextChanged If txt_buscarNome.Text = "" And dg2.Rows.Count > 0 Then Listar() Else Dim dt As New DataTable Dim da As SqlDataAdapter Try abrir() da = New SqlDataAdapter("sp_buscarProdutosNome", con) da.SelectCommand.CommandType = CommandType.StoredProcedure da.SelectCommand.Parameters.AddWithValue("@nome", txt_buscarNome.Text) da.SelectCommand.Parameters.AddWithValue("@Aplicacao", Txt_Buscar_apli.Text) da.Fill(dt) dg2.DataSource = dt ContarLinhas() Catch ex As Exception MessageBox.Show("Erro ao Listar" + ex.Message) fechar() End Try End If End Sub
e não foi
GOSTEI 0
Renato Dias
19/02/2019
tente na linha 19 substituir o código por: da.Fill(dt, "sp_buscarProdutosNome")
GOSTEI 0
Wictor
19/02/2019
tente na linha 19 substituir o código por: da.Fill(dt, "sp_buscarProdutosNome")
Primeiramente amigo .. agradeço o empenho . realmente estou precisando disso
mas infelizmente não compilou
o erro esta sublinhado no "Fill"
GOSTEI 0
Renato Dias
19/02/2019
substitua as linhas em que passa os parâmetros da procedure no vb:
da.SelectCommand.Parameters.Add("@nome", SqlDbType.Varchar, 60, "nome")
da.SelectCommand.Parameters.Add("@Aplicacao", SqlDbType.Varchar, 80, "Aplicacao")
da.SelectCommand.Parameters("@nome").Value = txt_buscarNome.Text
da.SelectCommand.Parameters("@Aplicacao").Value = Txt_Buscar_apli.Text
da.SelectCommand.Parameters.Add("@nome", SqlDbType.Varchar, 60, "nome")
da.SelectCommand.Parameters.Add("@Aplicacao", SqlDbType.Varchar, 80, "Aplicacao")
da.SelectCommand.Parameters("@nome").Value = txt_buscarNome.Text
da.SelectCommand.Parameters("@Aplicacao").Value = Txt_Buscar_apli.Text
GOSTEI 0
Renato Dias
19/02/2019
e volte a linha que preenche o dataTable como era antes:
da.Fill(dt)
da.Fill(dt)
GOSTEI 0
Wictor
19/02/2019
e volte a linha que preenche o dataTable como era antes:
da.Fill(dt)
da.Fill(dt)
ta osso ! não funciona
GOSTEI 0
Renato Dias
19/02/2019
Boa tarde Wictor
O código que vou te passar, foi testado em uma aplicação console Visual Basic. Testei e retornou os dados da stored procedure para um datareader, em seguida percorre o datareader e preenche um datatable, que é o que você está usando para preencher o grid, certo? Espero que ajude:
Dim dt As New DataTable
Dim stringConexao As String = "(sua string de conexão)"
Dim conexao As SqlConnection = New SqlConnection(stringConexao)
Dim testCMD As SqlCommand = New SqlCommand("sp_buscarProdutosNome", conexao)
testCMD.CommandType = CommandType.StoredProcedure
Dim nome As SqlParameter = testCMD.Parameters.Add("@nome", SqlDbType.VarChar, 60)
nome.Direction = ParameterDirection.Input
Dim Aplicacao As SqlParameter = testCMD.Parameters.Add("@Aplicacao", SqlDbType.VarChar, 80)
Aplicacao.Direction = ParameterDirection.Input
nome.Value = "celular"
Aplicacao.Value = "Eletrônicos"
conexao.Open()
Dim leitor As SqlDataReader = testCMD.ExecuteReader()
dt.Columns.Add("nome")
dt.Columns.Add("Aplicacao")
Dim str(1) As String
Console.WriteLine("produtos:")
Do While leitor.Read
Console.WriteLine("nome: ", leitor.GetString(0))
Console.WriteLine("Aplicação: ", leitor.GetString(1))
str(0) = leitor.Item(0)
str(1) = leitor.Item(1)
dt.Rows.Add(str)
Loop
leitor.Close()
Console.ReadLine()
O código que vou te passar, foi testado em uma aplicação console Visual Basic. Testei e retornou os dados da stored procedure para um datareader, em seguida percorre o datareader e preenche um datatable, que é o que você está usando para preencher o grid, certo? Espero que ajude:
Dim dt As New DataTable
Dim stringConexao As String = "(sua string de conexão)"
Dim conexao As SqlConnection = New SqlConnection(stringConexao)
Dim testCMD As SqlCommand = New SqlCommand("sp_buscarProdutosNome", conexao)
testCMD.CommandType = CommandType.StoredProcedure
Dim nome As SqlParameter = testCMD.Parameters.Add("@nome", SqlDbType.VarChar, 60)
nome.Direction = ParameterDirection.Input
Dim Aplicacao As SqlParameter = testCMD.Parameters.Add("@Aplicacao", SqlDbType.VarChar, 80)
Aplicacao.Direction = ParameterDirection.Input
nome.Value = "celular"
Aplicacao.Value = "Eletrônicos"
conexao.Open()
Dim leitor As SqlDataReader = testCMD.ExecuteReader()
dt.Columns.Add("nome")
dt.Columns.Add("Aplicacao")
Dim str(1) As String
Console.WriteLine("produtos:")
Do While leitor.Read
Console.WriteLine("nome: ", leitor.GetString(0))
Console.WriteLine("Aplicação: ", leitor.GetString(1))
str(0) = leitor.Item(0)
str(1) = leitor.Item(1)
dt.Rows.Add(str)
Loop
leitor.Close()
Console.ReadLine()
GOSTEI 0
Wictor
19/02/2019
Boa tarde Wictor
O código que vou te passar, foi testado em uma aplicação console Visual Basic. Testei e retornou os dados da stored procedure para um datareader, em seguida percorre o datareader e preenche um datatable, que é o que você está usando para preencher o grid, certo? Espero que ajude:
Dim dt As New DataTable
Dim stringConexao As String = "(sua string de conexão)"
Dim conexao As SqlConnection = New SqlConnection(stringConexao)
Dim testCMD As SqlCommand = New SqlCommand("sp_buscarProdutosNome", conexao)
testCMD.CommandType = CommandType.StoredProcedure
Dim nome As SqlParameter = testCMD.Parameters.Add("@nome", SqlDbType.VarChar, 60)
nome.Direction = ParameterDirection.Input
Dim Aplicacao As SqlParameter = testCMD.Parameters.Add("@Aplicacao", SqlDbType.VarChar, 80)
Aplicacao.Direction = ParameterDirection.Input
nome.Value = "celular"
Aplicacao.Value = "Eletrônicos"
conexao.Open()
Dim leitor As SqlDataReader = testCMD.ExecuteReader()
dt.Columns.Add("nome")
dt.Columns.Add("Aplicacao")
Dim str(1) As String
Console.WriteLine("produtos:")
Do While leitor.Read
Console.WriteLine("nome: ", leitor.GetString(0))
Console.WriteLine("Aplicação: ", leitor.GetString(1))
str(0) = leitor.Item(0)
str(1) = leitor.Item(1)
dt.Rows.Add(str)
Loop
leitor.Close()
Console.ReadLine()
O código que vou te passar, foi testado em uma aplicação console Visual Basic. Testei e retornou os dados da stored procedure para um datareader, em seguida percorre o datareader e preenche um datatable, que é o que você está usando para preencher o grid, certo? Espero que ajude:
Dim dt As New DataTable
Dim stringConexao As String = "(sua string de conexão)"
Dim conexao As SqlConnection = New SqlConnection(stringConexao)
Dim testCMD As SqlCommand = New SqlCommand("sp_buscarProdutosNome", conexao)
testCMD.CommandType = CommandType.StoredProcedure
Dim nome As SqlParameter = testCMD.Parameters.Add("@nome", SqlDbType.VarChar, 60)
nome.Direction = ParameterDirection.Input
Dim Aplicacao As SqlParameter = testCMD.Parameters.Add("@Aplicacao", SqlDbType.VarChar, 80)
Aplicacao.Direction = ParameterDirection.Input
nome.Value = "celular"
Aplicacao.Value = "Eletrônicos"
conexao.Open()
Dim leitor As SqlDataReader = testCMD.ExecuteReader()
dt.Columns.Add("nome")
dt.Columns.Add("Aplicacao")
Dim str(1) As String
Console.WriteLine("produtos:")
Do While leitor.Read
Console.WriteLine("nome: ", leitor.GetString(0))
Console.WriteLine("Aplicação: ", leitor.GetString(1))
str(0) = leitor.Item(0)
str(1) = leitor.Item(1)
dt.Rows.Add(str)
Loop
leitor.Close()
Console.ReadLine()
amigo não pesquisou nem o nome assim ! to ficando levemente revoltado kkkk
GOSTEI 0