Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

bioshock

Ideias SELECTs

Mensagens Recomendadas

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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.