FusionPwN Posted May 19, 2014 at 11:06 PM Report #556315 Posted May 19, 2014 at 11:06 PM Boas, eu estou a trabalhar na minha PAP, e estou com um grande problema e nao consigo avançar sem resolver. Estou a usar uma base de dados em MySql, tenho 2 tabelas de momento login(ID,login,password,ID_FUNCIONARIO) e funcionario(ID_FUNCIONARIO,bi,nif,nome,data_nasc,morada,email,contacto). Em seguida tenho 2 forms novo funcionario, e registo de login, depois de eu inserir os dados do funcionario aparece o form de registo de login para eu adicionar os respetivos dados de login do funcionario em questao. A minha duvida e a seguinte, eu quero que o meu INSERT INTO no form de registo vá buscar o valor do ID_FUNCIONARIO da tabela funcionario. Aqui vai o codigo que tenho de momento INSERIR FUNCIONARIO Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If nome.Text = "" Or bi.Text = "" Or nif.Text = "" Or datanasc.Text = "" Then MsgBox("Existem Campos por preencher! Todos eles são de preenchimento obrigatório!", MsgBoxStyle.Exclamation, "Preencher Campos") ElseIf bi.Text.Length < 8 Then MsgBox("O Número de Identificação Civil deve conter no minimo 8 digitos!", MsgBoxStyle.Exclamation, "Bi Inválido") ElseIf nif.Text.Length < 9 Then MsgBox("O Número de Identificação Fiscal deve conter no minimo 9 digitos!", MsgBoxStyle.Exclamation, "NIF Inválido") Else Try con.Open() cmd.Connection = con cmd.CommandText = "SELECT * FROM funcionario WHERE bi = '" & bi.Text & "'" cmd.ExecuteNonQuery() Dim ler As MySqlDataReader = cmd.ExecuteReader If ler.HasRows = 0 Then con.Close() ler.Close() Try ''Inserir Funcionario con.Open() cmd.Connection = con cmd.CommandText = "INSERT INTO funcionario (bi,nif,nome,data_nasc,morada,email,contacto) VALUES ('" & bi.Text & "', '" & nif.Text & "','" & nome.Text & "','" & datanasc.Text & "','" & morada.Text & "','" & email.Text & "', '" & contacto.Text & "');" cmd.ExecuteNonQuery() Dim frm As New reglogin frm.MdiParent = principal frm.Show() Catch ex As Exception MessageBox.Show("Erro ao inserir o registo. Erro: " & ex.Message, "Dados de Funcionario") Finally con.Close() End Try Else MsgBox("Esse BI já existe no sistema!", MsgBoxStyle.Exclamation, "BI duplicado") End If Catch ex As Exception MessageBox.Show("Erro na Consulta de registo já existente. Erro: " & ex.Message, "Consultar se já existe registo") Finally con.Close() End Try End If End Sub INSERIR LOGIN Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If user.Text = "" Or pw.Text = "" Or tipou.SelectedItem = "" Then MsgBox("Existem Campos por preencher! Todos eles são de preenchimento obrigatório!", MsgBoxStyle.Exclamation, "Preencher Campos") ElseIf user.Text.Length > 5 Then MsgBox("O seu Nome de Utilizador deve conter no minímo 5 digitos!", MsgBoxStyle.Exclamation, "Nome de Utilizador curto") ElseIf pw.Text.Length > 6 Then MsgBox("A sua Palavra Passe de conter no minímo 6 digitos!", MsgBoxStyle.Exclamation, "Palavra Passe curta") Else Try con.Open() cmd.Connection = con cmd.CommandText = "SELECT * FROM login WHERE LOGIN = '" & user.Text & "'" cmd.ExecuteNonQuery() Dim ler As MySqlDataReader = cmd.ExecuteReader If ler.HasRows = 0 Then con.Close() ler.Close() Try ''Registar Login con.Open() cmd.Connection = con cmd.CommandText = "INSERT INTO login (LOGIN,PASSWORD,PERM,ID_FUNCIONARIO) VALUES ('" & user.Text & "', '" & pw.Text & "','" & tipou.SelectedItem & "');" cmd.ExecuteNonQuery() Me.Close() MsgBox("Registado com Sucesso") Catch ex As Exception MessageBox.Show("Erro ao inserir o registo. Erro: " & ex.Message, "Dados de Funcionario") Finally con.Close() End Try Else MsgBox("Esse Nome de Utilizador já está registado!", MsgBoxStyle.Exclamation, "Nome de Utilizador duplicado") End If Catch ex As Exception MessageBox.Show("Erro na Consulta de registo já existente. Erro: " & ex.Message, "Consultar se já existe registo") Finally con.Close() End Try End If End Sub
nelsonr Posted May 20, 2014 at 08:44 AM Report #556340 Posted May 20, 2014 at 08:44 AM Boas, não percebi muito bem. Inseres um funcionario e queres saber o ID que esse funcionario ficou para usares no form seguinte? As tuas tabelas têm um campo ID autonumber? Caso tenham, apos inserir o funcionario podes executar o comando "SELECT LAST_INSERT_ID();" para ler o ultimo ID criado. http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
FusionPwN Posted May 20, 2014 at 10:21 AM Author Report #556342 Posted May 20, 2014 at 10:21 AM Boas, não percebi muito bem. Inseres um funcionario e queres saber o ID que esse funcionario ficou para usares no form seguinte? As tuas tabelas têm um campo ID autonumber? Caso tenham, apos inserir o funcionario podes executar o comando "SELECT LAST_INSERT_ID();" para ler o ultimo ID criado. http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id Basicamente os dados do funcionario estao em 2 tabelas diferentes, a tabela funcionario tem os dados pessoais, e a tabela login tem os dados de inicio de sessao no programa, na tabela funcionario o campo ID_FUNCIONARIO e automatico, o que eu quero e que a query do INSERIR LOGIN va buscar esse valor do ID_FUNCIONARIO
nelsonr Posted May 20, 2014 at 10:33 AM Report #556343 Posted May 20, 2014 at 10:33 AM Então para fazeres isso vais ter de saber com que ID o funcionario ficou depois de inserires, correcto? Experimenta usar o que indiquei no post anterior para ires buscar o ID e usar esse ID na inserção do registo na tabela de login
FusionPwN Posted May 20, 2014 at 10:59 AM Author Report #556348 Posted May 20, 2014 at 10:59 AM Então para fazeres isso vais ter de saber com que ID o funcionario ficou depois de inserires, correcto? Experimenta usar o que indiquei no post anterior para ires buscar o ID e usar esse ID na inserção do registo na tabela de login Tentei com este codigo mas o valor que aparece na label é "True" Private Sub loadid() Using con As MySqlConnection = jokenconn() Try con.Open() cmd.Connection = con cmd.CommandText = "SELECT LAST_INSERT_ID();" cmd.ExecuteNonQuery() Dim ler As MySqlDataReader = cmd.ExecuteReader Label5.Text = ler.Read Catch ex As Exception MsgBox(ex.ToString) Finally con.Close() End Try End Using End Sub Private Sub reglogin_Load(sender As Object, e As EventArgs) Handles MyBase.Load loadid() End Sub
nelsonr Posted May 20, 2014 at 11:14 AM Report #556350 Posted May 20, 2014 at 11:14 AM ler.Read retorna true/false de acordo com o ter registos para ler. Tenta algo do tipo Label5.Text = ler.GetInt32(0).ToString() 1 Report
FusionPwN Posted May 20, 2014 at 11:31 AM Author Report #556356 Posted May 20, 2014 at 11:31 AM (edited) ler.Read retorna true/false de acordo com o ter registos para ler. Tenta algo do tipo Label5.Text = ler.GetInt32(0).ToString() fiz como disses-te e tava-me a dar erro a dizer que tinha que fazer read primeiro, adicionei a linha ler.read() e depois adicionei o que disses-te, agora o valor que aparece na label e sempre "0" Private Sub loadid() Using con As MySqlConnection = jokenconn() Try con.Open() cmd.Connection = con cmd.CommandText = "SELECT LAST_INSERT_ID();" cmd.ExecuteNonQuery() Dim ler As MySqlDataReader = cmd.ExecuteReader ler.Read() Label5.Text = ler.GetInt32(0).ToString() Catch ex As Exception MsgBox(ex.ToString) Finally con.Close() End Try End Using End Sub Edited May 20, 2014 at 11:45 AM by FusionPwN
nelsonr Posted May 20, 2014 at 11:46 AM Report #556358 Posted May 20, 2014 at 11:46 AM Isso deve ser porque estás a fazer uma ligação nova. Tenta fazer esse comando logo a seguir ao inserires o funcionario, usando a mesma ligação
FusionPwN Posted May 20, 2014 at 11:48 AM Author Report #556360 Posted May 20, 2014 at 11:48 AM nao dá porque sao 2 forms diferentes o problema é esse
nelsonr Posted May 20, 2014 at 11:50 AM Report #556362 Posted May 20, 2014 at 11:50 AM Se mesmo assim não der, pode ter a ver como o campo id esta configurado. No entanto podes sempre fazer o select do funcionario com login igual ao user.Text acabado de usar na inserção Mas isso convem leres logo depois de inserires o funcionario. Se necessario, logo passas esse ID para o outro form. Confirma primeiro que se leres depois de inserires está a ler correctamente
FusionPwN Posted May 20, 2014 at 11:55 AM Author Report #556366 Posted May 20, 2014 at 11:55 AM (edited) Em vez disso tudo nao dá para fazer um SELECT que vá buscar o maior valor da coluna ID_FUNCIONARIO? EDIT: Será isto? SELECT MAX(Price) AS HighestPrice FROM Products; Edited May 20, 2014 at 11:57 AM by FusionPwN
nelsonr Posted May 20, 2014 at 11:59 AM Report #556369 Posted May 20, 2014 at 11:59 AM Dar dá, mas se é fiavel ou não depende da utilização da tua aplicação.
FusionPwN Posted May 20, 2014 at 12:03 PM Author Report #556371 Posted May 20, 2014 at 12:03 PM Já consegui com esse SELECT MAX, pela minha logica penso que nao vai dar problemas visto que o ultimo ID inserido vai ser sempre maior do que o anterior. Muito Obrigado pela ajuda 👍
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now