none
Como devolver tabela depois de selecionar 1ª tabela? RRS feed

  • Pergunta

  • Boas pessoal,

    Uma questão, tenho um comando pesquisa por nif:

    strSQL = "SELECT * FROM sfid_nif,cliente,contagsm1 WHERE sfid_nif.fidnif=@fidnif AND fidsfid=@fidsfid AND nif=@nif AND contagsm1.fidnif=@fidnif"

    caso o nif exista nas tabelas indicadas será devolvido os valores para as text pretendidas.

    Contudo é perfeitamente possível existir um nif, que não se encontra na tabela contagsm1 (isto porque é um cliente existente em ficha mas ainda não tem conta criada)

    E se eu pesquisar por um nif que não esta na contagsm1, a pesquisa indica que o nif não existe, como é que se contorna esta solução?

    Com if? A onde?

    Colocando assim ele devolve a ficha do cliente porque existe em duas tabelas.

    Protected Sub pesquisa_nif_botao_Click(sender As Object, e As EventArgs) Handles pesquisa_nif_botao.Click


    strConnection = ConnectionStrings("GESCOMERCIALConnectionString"). ConnectionString


    dbConn = New SqlClient.SqlConnection(strConnection)
    dbConn.Open()


    strSQL = "SELECT * FROM sfid_nif,cliente WHERE sfid_nif.fidnif=@fidnif AND fidsfid=@fidsfid AND nif=@nif"


    dCmd = New SqlCommand(strSQL, dbConn)
    dCmd.Parameters.Add(New SqlParameter("fidnif", pesquisanifbox.Text))
    dCmd.Parameters.Add(New SqlParameter("fidsfid", Label1.Text))
    dCmd.Parameters.Add(New SqlParameter("nif", pesquisanifbox.Text))


    Dim rs As SqlDataReader = dCmd.ExecuteReader


    If rs.Read() Then
    'existem valores?? 


    pesquisanifbox.Text = ""


    nifbox.Text = rs("nif")
    nomebox.Text = rs("nome")
    moradabox.Text = rs("morada")
    localidadebox.Text = rs("localidade")


    nifbox.Enabled = True
    nifbox.BackColor = Drawing.Color.LightBlue
    nomebox.Enabled = True
    nomebox.BackColor = Drawing.Color.LightBlue
    datacontatobox.Enabled = True
    datacontatobox.BackColor = Drawing.Color.LightBlue
    moradabox.Enabled = True
    moradabox.BackColor = Drawing.Color.LightBlue
    localidadebox.Enabled = True
    localidadebox.BackColor = Drawing.Color.LightBlue
    codigopostalbox.Enabled = True
    codigopostalbox.BackColor = Drawing.Color.LightBlue
    contatosbox.Enabled = True
    contatosbox.BackColor = Drawing.Color.LightBlue
    responsavelbox.Enabled = True
    responsavelbox.BackColor = Drawing.Color.LightBlue
    cliente_gravarbotao.Enabled = False
    cliente_atualizarbotao.Enabled = True
    fidelizacao_novobotao.Enabled = True
    fidelizacao2_novobotao.Enabled = True




    Else
    'não existem valores
    Label8.Text = "Não existe o Nif indicado"
    pesquisanifbox.Text = ""
    nifbox.Text = ("")
    nomebox.Text = ("")
    moradabox.Text = ("")
    localidadebox.Text = ("")
    End If
    End If
    dbConn.Close()


    End Sub

    Queria que depois de executar o 1º select e caso exista valor ele execute o segundo select

    strSQL = "SELECT * FROM detalhe_fid_gsm1 WHERE detalhe_fid_gsm1.fidnif=@fidnif"

    e caso exista valor neste select devolva o valor - contagsm1box.Text = rs("n_conta") caso não exista que devolva 0

    quarta-feira, 1 de agosto de 2012 23:58

Respostas

  • Ruben,

           O seu código não está funcionando da forma desejada porque você está utilizando um JOIN errado, ao invés de um LEFT JOIN. Vou colocar um exemplo semelhante ao seu para que você possa testar.

           O ponto mais importante que devo chamar a atenção é sobre o uso da sintaxe antiga do INNER JOIN, tome cuidado pois essa construção não funciona nas versões mais novas do SQL Server.

    SELECT * 
      FROM sfid_nif
      JOIN cliente
        ON SFID_NIF.codigo_cliente = cliente.codigo_Cliente
      LEFT JOIN contagsm1
        on SFID_NIF.Nota = contagsm1.Nota
     WHERE -- Veja bem a construção da sua cláusula where para ter certeza que retornará os valores corretos.
    sfid_nif.fidnif=@fidnif AND fidsfid=@fidsfid AND nif=@nif AND contagsm1.fidnif=@fidnif


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    • Sugerido como Resposta Roberson Naves quinta-feira, 2 de agosto de 2012 15:22
    • Marcado como Resposta RubenmSoares quinta-feira, 2 de agosto de 2012 17:18
    quinta-feira, 2 de agosto de 2012 02:13
    Moderador

Todas as Respostas

  • Ruben,

           O seu código não está funcionando da forma desejada porque você está utilizando um JOIN errado, ao invés de um LEFT JOIN. Vou colocar um exemplo semelhante ao seu para que você possa testar.

           O ponto mais importante que devo chamar a atenção é sobre o uso da sintaxe antiga do INNER JOIN, tome cuidado pois essa construção não funciona nas versões mais novas do SQL Server.

    SELECT * 
      FROM sfid_nif
      JOIN cliente
        ON SFID_NIF.codigo_cliente = cliente.codigo_Cliente
      LEFT JOIN contagsm1
        on SFID_NIF.Nota = contagsm1.Nota
     WHERE -- Veja bem a construção da sua cláusula where para ter certeza que retornará os valores corretos.
    sfid_nif.fidnif=@fidnif AND fidsfid=@fidsfid AND nif=@nif AND contagsm1.fidnif=@fidnif


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    • Sugerido como Resposta Roberson Naves quinta-feira, 2 de agosto de 2012 15:22
    • Marcado como Resposta RubenmSoares quinta-feira, 2 de agosto de 2012 17:18
    quinta-feira, 2 de agosto de 2012 02:13
    Moderador
  • Roberto,

    Muito muito, obrigado  

    Funcionou na perfeição :) 

    Um abraço

    quinta-feira, 2 de agosto de 2012 17:18