Série da semana: Primeiros passos no Angular

Veja mais

Prodecure de Pesquisa dentro de outra pesquisa

19/02/2019

18

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:


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 ?
Responder

Post mais votado

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!
Responder

Mais Posts

19/02/2019

Wictor

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!


Exatamente amigo .. mas como relacionar isso na procedure ? qual é o código ? pois nos cursos que fiz nunca vi algo parecido
Responder

19/02/2019

Joel Rodrigues

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.
Responder

19/02/2019

Renato Dias

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 + '%'
Responder

19/02/2019

Wictor

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 + '%'


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
Responder

19/02/2019

Renato Dias

tente na linha 19 substituir o código por: da.Fill(dt, "sp_buscarProdutosNome")
Responder

19/02/2019

Wictor

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"
Responder

19/02/2019

Renato Dias

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
Responder

19/02/2019

Renato Dias

e volte a linha que preenche o dataTable como era antes:


da.Fill(dt)
Responder

19/02/2019

Wictor

e volte a linha que preenche o dataTable como era antes:


da.Fill(dt)



ta osso ! não funciona
Responder

20/02/2019

Renato Dias

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()
Responder

20/02/2019

Wictor

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()



amigo não pesquisou nem o nome assim ! to ficando levemente revoltado kkkk
Responder