Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
bioshock

Ideias SELECTs

Recommended Posts

bioshock

Olá pessoal, gostava que me dessem umas ideias de como fazer o que pretendo, de forma a simplificar e a obter uma melhor programação.

Possuo um Form de Login, onde faço a selecção dos dados na base de dados:

"SELECT Utilizador, Senha, Acesso FROM TLogin WHERE [utilizador] = @utilizador and [senha] = @senha and [Acesso] = @acesso"

E utilizo uma "manha" como:

MenuOpções.Label2.Text = "Cliente"

Após o Login, entro na área de opções, nesta área, não utilizo nenhum SELECT.

Mas aparece-me aquela manhã a dizer: "Acesso: Cliente" (consoante o acesso);

O problema consiste quando eu tento editar os dados referentes a este cliente, a este cliente que fez o login.

Ou seja, existe uma label que diz "Editar dados", clicando nela, abrir-me-à um form onde mostra várias Textboxs, que por sua vez deverão ser preenchidas consoante o Cliente.

De que forma é que preencho estas textboxs?

Devo utilizar um SELECT com INNER JOIN ? (para obter o ID de quem fez o login?)

O que me sugerem? Obrigado!

Share this post


Link to post
Share on other sites
paulo silva

Boas,

A junção das tabelas deves sempre fazer, mas para guardares um ID podes criar uma variável no modulo e atribuires o valor enquanto tiveres o programa aberto essa variável irá se manter a menos que a limpes entretanto.

Cumprimentos Paulo Silva

Share this post


Link to post
Share on other sites
bioshock

Olá, eu já pensei nisso..mas não sei se é a melhor maneira de aplicar o que quero fazer.

Obrigado.

EDIT: Mas de que forma é que eu posso obter o ID do user que faz logIn? Alguém sabe?

Share this post


Link to post
Share on other sites
ByMySlf

Com o select que colocaste no teu primeiro post não consegues trazer logo o ID do utilizador pretendido?

Share this post


Link to post
Share on other sites
bioshock

Eu posso estar a fazer as coisas mal...mas não.

Eu utilizo esse SELECT para apenas fazer o login, não chamo ID nenhum.

Share this post


Link to post
Share on other sites
ByMySlf

Eu percebi que utilizas o tal select para efectuares o login, mas não será possível, nesse select, colocares algo deste género:

"SELECT ID, Utilizador, Senha, Acesso FROM TLogin WHERE [utilizador] = @utilizador and [senha] = @senha and [Acesso] = @acesso"

Assim, efectuas o login e ficas logo com o ID do utilizador.

Desculpa lá se estou a perceber mal a tua dúvida e estou a sugerir algo disparatado.

Share this post


Link to post
Share on other sites
jpaulino

Desculpa lá se estou a perceber mal a tua dúvida e estou a sugerir algo disparatado.

É também isso que entendo :)

@bioshock,

No teu form de login, que dados utilizas do comando SQL ? Podes mostrar esse código?

Share this post


Link to post
Share on other sites
bioshock

Não, tu até podes estar a dizer bem.

O problema é que eu preciso de buscar este ID quando entro noutro form, para apenas filtrar os dados deste ID em específico.

Share this post


Link to post
Share on other sites
bioshock

É também isso que entendo :)

@bioshock,

No teu form de login, que dados utilizas do comando SQL ? Podes mostrar esse código?

Sub Login()
        Try
            ' Connexão com a Base de dados;
            Dim myConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & My.Application.Info.DirectoryPath & "\BaseDados.mdb';Persist Security Info=True;"
            ' Criação da query para seleccionar os dados provenientes das tabelas;
            Dim query As String = "SELECT Utilizador, Senha, Acesso FROM TLogin WHERE [utilizador] = @utilizador and [senha] = @senha and [Acesso] = @acesso"
            ' Cria a connexão;
            Dim connection As New OleDbConnection(myConnectionString)
            ' Define os parametros a serem mostrados;
            Dim command As New OleDbCommand(query, connection)
            command.Parameters.Add("@utilizador", OleDbType.VarChar).Value = TextBox1.Text
            command.Parameters.Add("@password", OleDbType.VarChar).Value = TextBox2.Text
            command.Parameters.Add("@acesso", OleDbType.VarChar).Value = "Administrador"
            ' Abre a connexão;
            connection.Open()

            ' Cria uma variável para ler os dados da BD;
            Dim reader As OleDbDataReader = command.ExecuteReader()
            ' Caso existam registos;
            If reader.HasRows Then
                ' Fez login com sucesso!; 
                MessageBox.Show("Bem-Vindo " & TextBox1.Text & vbCrLf & vbCrLf & "Acesso: Administrador", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Warning)
                MenuOpções.Show()
                MenuOpções.Label2.Text = "Administrador"
                MenuOpções.Label4.Text = TextBox1.Text
                Me.Close()
            Else
                MessageBox.Show("Erro")
            End If
            ' Fecha a connexão e limpa as variáveis;
            connection.Close()
            connection = Nothing
            command = Nothing
        Catch ex As Exception
            MessageBox.Show(ex.ToString)
        End Try
    End Sub

Edit: Portanto, no Form Menuopções, aparecem-me uma série de informações, entre elas a edição dos meus dados (O meu nome, morada..etc)

E eu queria que ao entrar nesse Form de edição de dados, ele fosse procurar pelo ID da pessoa que fez login para filtrar apenas e só os dados dessa pessoa.

Share this post


Link to post
Share on other sites
ByMySlf

Na query do form principal vais buscar o ID do utilizador, como tinha sugerido em cima:

"SELECT ID, Utilizador, Senha, Acesso FROM TLogin WHERE [utilizador] = @utilizador and [senha] = @senha and [Acesso] = @acesso"

...guardas esse ID numa variável e passas essa variável ao form MenuOpções.

No load do MenuOpções vais buscar os dados relativos ao ID que foi passado pelo form principal.

É o que me ocorre de momento.

Share this post


Link to post
Share on other sites
bioshock

Pois, foi o que eu já tinha pensado. Guardar o ID numa variável definida no module e passa-la de form em form..

Bem, vou tentar, depois dou algum feedback. Obrigado.

Share this post


Link to post
Share on other sites
jpaulino

Pois, foi o que eu já tinha pensado. Guardar o ID numa variável definida no module e passa-la de form em form..

Se está definida num módulo, não precisas de passar de form em form, pois ela está disponível em todo o lado (se estiver declarada como pública)

Se queres fazer as coisas como deve ser, dever usar um ExecuteScalar() e não um ExecuteReader(), alterando o T-SQL para: "SELECT ID FROM TLogin WHERE [utilizador] = @utilizador and [senha] = @senha and [Acesso] = @acesso"

Caso tenhas um número é porque encontrou (login válido) e esse número utilizas para atribuir à variável que está definida no módulo.

Share this post


Link to post
Share on other sites
bioshock

Se está definida num módulo, não precisas de passar de form em form, pois ela está disponível em todo o lado (se estiver declarada como pública)

Se queres fazer as coisas como deve ser, dever usar um ExecuteScalar() e não um ExecuteReader(), alterando o T-SQL para: "SELECT ID FROM TLogin WHERE [utilizador] = @utilizador and [senha] = @senha and [Acesso] = @acesso"

Caso tenhas um número é porque encontrou (login válido) e esse número utilizas para atribuir à variável que está definida no módulo.

Sim, era a isso que me estava a referir. Quando disse passar de form em form, era isso. Está declarada como pública.

Bem, já consegui por isto a funcionar da maneira que disseste, com o ExecuteScalar(), vou só fazer aqui umas "arrumações" para tornar o código mais limpo e depois tento por a seleccionar os dados com aquele login.

Obrigado, depois dou feedback.

Share this post


Link to post
Share on other sites
bioshock

Olá de novo!

Estou a tentar fazer um INSERT de dados ao utilizador logado.

Então, pensei em fazer:

INSERT INTO Tabela1 ([Nome], [Email]) VALUES (@nome, @email) WHERE ID.Tabela2 = " & Variavel & ""

Entenda-se por:

Variavel guarda o ID do utilizador logado;

Tabela1 = Edição Dados

Tabela2 = Login

Contudo, ele dá-me erro no ExecuteNonQuery, diz que a instrução está incorrecta, que falta ";" no fim..já experimentei por e nada.

Share this post


Link to post
Share on other sites
bioshock

Também tentei isto:

Dim query As String = "INSERT INTO TClientes([Nome], [Morada]) VALUES(@nome, @morada) SELECT IDUtilizador FROM TLogin WHERE TLogin.IDUtilizador = " & PegaID & "" 

(Foi um exemplo que apanhei no google)

A ligação entre a TClientes e TLogin é uma relação simples. Pois é uma relação de um para um.

Share this post


Link to post
Share on other sites
ByMySlf

Na TClientes não existe nenhuma referência à TLogin? Alguma ForeignKey ou assim?

Estas perguntas todas é para tentar perceber a relação entre as duas tabelas.

EDIT: Se estás a fazer um insert qual a utilidade do where na query?

Share this post


Link to post
Share on other sites
bioshock

Existe, foi o que eu te disse. Existe uma relação, de Chave primária TClientes com chave primária TLogin.

A utilidade do WHERE na query (no meu ponto de raciocínio) é para ele inserir os dados no utilizador que fez o login.

Porque senão houver nenhum WHERE, ou seja, se for um INSERT puro, todos os utilizadores que fizerem login vão ver os mesmos dados, percebes?

Share this post


Link to post
Share on other sites
jpaulino

EDIT: Se estás a fazer um insert qual a utilidade do where na query?

Dar um erro :)

@bioshock,

Tira lá o "WHERE" para isso funcionar!

E para questões novas, novos tópicos :P

Share this post


Link to post
Share on other sites
ByMySlf

Dim query As String = "INSERT INTO TClientes([iDUtilizador], [Nome], [Morada]) VALUES(@idutiliz, @nome, @morada) 

Ao parâmetro @utiliz atribuis o valor da variável que guarda o ID do utilizador.

Pelo que estou a entender, basta fazeres assim.

EDIT: Não sejas mau jpaulino.  :P

Share this post


Link to post
Share on other sites
bioshock

@ByMySlf, Não funciona, mas é normal que não funcione essa tua instrução, estás a dizer que tenho um campo chamado "IDUtilizador" na tabela Clientes.

Contudo, foi só mudar aqui algumas coisas e a inserção ficou a funcionar, eis o resultado:

Dim query As String = "INSERT INTO TClientes([iDCliente], [Nome], [Morada]) VALUES (" & PegaID & ", @nome, @morada);"

Obrigado!

Share this post


Link to post
Share on other sites
ByMySlf

Escrevi [iDUtilizador] apenas como mero exemplo. Esqueci-me de referir isso.  :P

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.