Jump to content

Recommended Posts

Posted

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
Posted

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

Posted

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

Posted

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"

QvabvQd.jpg

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
Posted (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 by FusionPwN
Posted

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

Posted (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 by FusionPwN
Posted

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 👍

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
×
×
  • Create New...

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.