Ideias SELECTs - Visual Basic .NET - Portugal-a-Programar
Ideias SELECTs
By bioshock, April 4, 2010 in Visual Basic .NET
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!
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.
Olá, eu já pensei nisso..mas não sei se é a melhor maneira de aplicar o que quero fazer.
EDIT: Mas de que forma é que eu posso obter o ID do user que faz logIn? Alguém sabe?
Com o select que colocaste no teu primeiro post não consegues trazer logo o ID do utilizador pretendido?
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.
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.
É também isso que entendo
No teu form de login, que dados utilizas do comando SQL ? Podes mostrar esse código?
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.
Dim myConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & My.Application.Info.DirectoryPath & "\BaseDados.mdb';Persist Security Info=True;"
Dim query As String = "SELECT Utilizador, Senha, Acesso FROM TLogin WHERE [utilizador] = @utilizador and [senha] = @senha and [Acesso] = @acesso"
command.Parameters.Add("@acesso", OleDbType.VarChar).Value = "Administrador"
' Cria uma variável para ler os dados da BD;
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
MessageBox.Show("Erro")
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.
Na query do form principal vais buscar o ID do utilizador, como tinha sugerido em cima:
...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.
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.
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.
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 & ""
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.
Qual a "ligação" entre a tabela1 e a tabela2?
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.
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?
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?
Dar um erro
Tira lá o "WHERE" para isso funcionar!
E para questões novas, novos tópicos
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.
@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);"