Guerra7 Posted June 24, 2012 at 04:45 PM Report Share #465229 Posted June 24, 2012 at 04:45 PM Boas, não sei se abri o tópico no lugar correcto... Eu estou a fazer um projecto para apresentar agora no final do ano do meu curso e como estou numa loja de informática a estagiar e não tinha ideias para a pap então comecei a fazer um programa do género que eles lá têm... Quando vou para inserir um novo cliente à base dados ( feita em Access ) tenho vários campos para preencher mas por vezes não é preciso preencher todos, basta o Nome e o Numero de telemóvel do cliente ... Estou a fazer a contagem dos clientes Automaticamente fazendo o Max da coluna Numero ( que é do tipo Codcliente ) e depois adiciono mais 1 ao numero que lá está...até ai tudo bem.. Quando eu preencho só o Nome e o Telemóvel e carrego em Guardar , da-me um erro " Tipo de dados incorrecto na expressão de critérios " não percebo porque... porque à uns tempos fiz uma Agenda mesmo para mim ... e tenho Nome , Email , Telemóvel , se eu preencher só o Nome e o Telemóvel insere na base dados e não dá erro nenhum...e a coluna Email fica em branco. Era isso que eu queria fazer para este programa que estou a fazer agora ... Deixo aqui o código que tenho para o INSERT : 'Declaração de Variaveis para cada uma das caixas de texto. Dim numero, nome, numerocontribuinte, morada, codigopostal, pais, zona, telefone, telemovel, email, fax As String 'Guardar nas variaveis o que é digitado nas caixas de texto. numero = txtnumerocliente.Text nome = txtnome.Text numerocontribuinte = txtnumerocontribuinte.Text morada = txtmorada.Text codigopostal = txtcodigopostal.Text pais = cbpaises.SelectedValue.ToString zona = txtzona.Text telefone = txttelefone.Text telemovel = txttelemovel.Text email = txtemail.Text fax = txtfax.Text 'Inserir os dados na tabela Clientes da Base Dados. Try cmd.CommandText = "INSERT INTO Clientes(Numero, Nome, Ncontribuinte, Morada, Codigopostal, Pais, Zona, Telefone, Telemovel, Email, Fax) values('" + numero + "','" + nome + "','" + numerocontribuinte + "','" + morada + "','" + codigopostal + "','" + pais + "','" + zona + "','" + telefone + "','" + telemovel + "','" + email + "','" + fax + "');" cmd.ExecuteNonQuery() MessageBox.Show("O registo foi inserido na Base Dados :" & vbNewLine & "Nome : " & txtnome.Text & vbNewLine & "Telemóvel : " & txttelemovel.Text & "", "Facturação Xiracomp - Registo do Cliente", MessageBoxButtons.OK, MessageBoxIcon.Information) txtnome.ResetText() txtnumerocontribuinte.ResetText() txtmorada.ResetText() txtcodigopostal.ResetText() cbpaises.SelectedValue = "Portugal" txtzona.ResetText() txttelefone.ResetText() txttelemovel.ResetText() txtemail.ResetText() txtfax.ResetText() 'Verifica o Número máximo na Coluna Numero da Tabela Clientes e adiciona mais um número. 'A caixa de texto fica enable, para nao poder alterar o numero. Dim Da1 As New OleDb.OleDbDataAdapter("Select MAX(Numero) From Clientes", sqlConexao) Dim ds1 As New DataTable Da1.Fill(ds1) txtnumerocliente.Text = ds1.Rows(0)(0).ToString + 1 txtnumerocliente.Enabled = False Catch ex As Exception MessageBox.Show(ex.Message, "Facturação Xiracomp - Registo do Cliente", MessageBoxButtons.OK, MessageBoxIcon.Information) End Try Deixo aqui também a tabela Clientes: http://imageshack.us/photo/my-images/99/basedadostabelaclientes.png/ Espero que me possam ajudar sff . . . Link to comment Share on other sites More sharing options...
acao Posted June 24, 2012 at 11:37 PM Report Share #465270 Posted June 24, 2012 at 11:37 PM boas amigo Guerra7, não tenho como testar o seu cod neste pc. 1 - referente ao numero (CodCliente) você pode fazer conforme está a fazer mas eu recomendava o Numero com «numeração automatica» evitava de pesquisar o ultimo registo. no caso de optar conforme está fazendo terá que colocar o cod de busca do numero antes de carregar a variavel numero. 2 - no insert into o + junto ás variaveis deve substituir por & , penso que o + não é recomendado. 3 - não vi a ligação à base de dados. deixo-lhe aqui um cod, altere as sua necessidades. Public Sub GravarDados() Dim conexao As New OleDb.OleDbConnection Dim sqlCadTelGravar As String Dim Cm As New OleDb.OleDbCommand Try conexao.ConnectionString = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\BaseDados\GestaoChamadasTelefonicas.accdb;Jet OLEDB:Database Password= " & vCodDB & ";") conexao.Open() sqlCadTelGravar = "INSERT INTO ListaTelefonica(NumTelfone,IDColaborador) VALUES ( " & txtNumTelefone.Text & ", " & vCadTelIdColaborador & ")" Cm.CommandText = sqlCadTelGravar Cm.Connection = conexao Dim vCadTelgravar As Integer = Cm.ExecuteNonQuery() If vCadTelgravar < 1 Then MsgBox("O registo não foi efectuado") Else MsgBox("Registo efectuado com sucesso") End If Catch ex As Exception MessageBox.Show(ex.Message, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Error) End Try conexao.Close() Cm.Connection = Nothing conexao = Nothing deixo-lhe aqui outro toturial, opte pelo que mais lhe convier: https://wiki.portugal-a-programar.pt/dev_net/vb.net/access/ cumps acao Link to comment Share on other sites More sharing options...
Guerra7 Posted June 25, 2012 at 12:51 AM Author Report Share #465278 Posted June 25, 2012 at 12:51 AM Obrigado por ter respondido, eu tive a ver e já troquei e meti como me disse...o numero é que deixei como tinha , ao adicionar mais um depois de fazer o select Max(Numero).... Vou por aqui a imagem de como eu queria fazer e ainda me dá o erro : http://imageshack.us/photo/my-images/444/erroaoadicionarcliente.png/ E deixo aqui também o código já alterado... O Botão Guardar : Private Sub tsbguardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbguardar.Click 'Declaração de Variaveis para cada uma das caixas de texto. Dim numero, nome, numerocontribuinte, morada, codigopostal, pais, zona, telefone, telemovel, email, fax As String 'Guardar nas variaveis o que é digitado nas caixas de texto. numero = txtnumerocliente.Text nome = txtnome.Text numerocontribuinte = txtnumerocontribuinte.Text morada = txtmorada.Text codigopostal = txtcodigopostal.Text pais = cbpaises.SelectedValue.ToString zona = txtzona.Text telefone = txttelefone.Text telemovel = txttelemovel.Text email = txtemail.Text fax = txtfax.Text 'Inserir os dados na tabela Clientes da Base Dados. Try sqlgravar = "INSERT INTO Clientes (Numero, Nome, Ncontribuinte, Morada, Codigopostal, Pais, Zona, Telefone, Telemovel, Email, Fax) values('" & numero & "','" & nome & "','" & numerocontribuinte & "','" & morada & "','" & codigopostal & "','" & pais & "','" & zona & "','" & telefone & "','" & telemovel & "','" & email & "','" & fax & "');" cm.CommandText = sqlgravar cm.Connection = conexao Dim registo As String = cm.ExecuteNonQuery() If registo < 1 Then MsgBox("O registo não foi efectuado") Else MessageBox.Show("O registo foi inserido com sucesso :" & vbNewLine & "Nome : " & txtnome.Text & vbNewLine & "Telemóvel : " & txttelemovel.Text & "", "Programa de Gestão Xiracomp - Registo do Cliente", MessageBoxButtons.OK, MessageBoxIcon.Information) End If txtnome.ResetText() txtnumerocontribuinte.ResetText() txtmorada.ResetText() txtcodigopostal.ResetText() cbpaises.SelectedValue = "Portugal" txtzona.ResetText() txttelefone.ResetText() txttelemovel.ResetText() txtemail.ResetText() txtfax.ResetText() 'Verifica o Número máximo na Coluna Numero da Tabela Clientes e adiciona mais um número. 'A caixa de texto fica enable, para nao poder alterar o numero. Dim Da1 As New OleDb.OleDbDataAdapter("Select MAX(Numero) From Clientes", conexao) Dim ds1 As New DataTable Da1.Fill(ds1) txtnumerocliente.Text = ds1.Rows(0)(0).ToString + 1 txtnumerocliente.Enabled = False Catch ex As Exception MessageBox.Show(ex.Message, "Programa de Gestão Xiracomp - Registo do Cliente", MessageBoxButtons.OK, MessageBoxIcon.Information) End Try conexao.Close() cm.Connection = Nothing conexao = Nothing End Sub E agora está aqui a ligação à base dados : ( Como tenho no inicio ) Imports System.Data.Odbc Public Class registarclientes Dim conexao As New OleDb.OleDbConnection Dim sqlgravar As String Dim cm As New OleDb.OleDbCommand e no form_load tenho : conexao.ConnectionString = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Bruno Guerra\Visual Basic\Projectos\PAP - Bruno Guerra\Xiracomp.accdb;") conexao.Open() Link to comment Share on other sites More sharing options...
acao Posted June 25, 2012 at 01:54 AM Report Share #465283 Posted June 25, 2012 at 01:54 AM (edited) isto deveria estar antes das variaveis e depois da abertura da db. 'Verifica o Número máximo na Coluna Numero da Tabela Clientes e adiciona mais um número. 'A caixa de texto fica enable, para nao poder alterar o numero. Dim Da1 As New OleDb.OleDbDataAdapter("Select MAX(Numero) From Clientes", conexao) Dim ds1 As New DataTable Da1.Fill(ds1) txtnumerocliente.Text = ds1.Rows(0)(0).ToString + 1 txtnumerocliente.Enabled = False aqui « Imports System.Data.Odbc» ou esta mal escrito ou está errado deveria ser Oledb E agora está aqui a ligação à base dados : ( Como tenho no inicio ) Imports System.Data.Odbc Public Class registarclientes Dim conexao As New OleDb.OleDbConnection Dim sqlgravar As String Dim cm As New OleDb.OleDbCommand isto não pode estar aqui, porque estamos a fechar a conexao no final do cod, ou coloca este cod dentro do evento clik do botao ou terá que eliminar cod fechar a ligação. e no form_load tenho : conexao.ConnectionString = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Bruno Guerra\Visual Basic\Projectos\PAP - Bruno Guerra\Xiracomp.accdb;") conexao.Open() é o que estou a ver, existe também a declaração da variavel numero, telefone, fax que deveria ser long, mas penso que não interfere no erro. para testar poderá colocar breakpoints e ir correndo o cod e verificar mesmo em que local dá o erro. edit: acrescentar info: na query (insert Into) pode usar directamente os campos «txtnumerocliente.Text» poupa codigo. cumps acao Edited June 25, 2012 at 02:00 AM by acao Link to comment Share on other sites More sharing options...
Guerra7 Posted June 25, 2012 at 02:37 AM Author Report Share #465286 Posted June 25, 2012 at 02:37 AM isto deveria estar antes das variaveis e depois da abertura da db. aqui « Imports System.Data.Odbc» ou esta mal escrito ou está errado deveria ser Oledb isto não pode estar aqui, porque estamos a fechar a conexao no final do cod, ou coloca este cod dentro do evento clik do botao ou terá que eliminar cod fechar a ligação. é o que estou a ver, existe também a declaração da variavel numero, telefone, fax que deveria ser long, mas penso que não interfere no erro. para testar poderá colocar breakpoints e ir correndo o cod e verificar mesmo em que local dá o erro. edit: acrescentar info: na query (insert Into) pode usar directamente os campos «txtnumerocliente.Text» poupa codigo. cumps acao Já fiz as alterações...e continua a dar o erro do " Tipo de dados incorrecto na expressão de critérios " . Mas o que não percebo é que se eu preencher só o campo do Nome e o Telemóvel dá o erro ... mas se eu preencher os no mínimo o Nome , Numero Contribuinte , Telefone, Telemóvel e Fax já insere na base dados ... e se preencher todos os campos insere também... Não percebo mesmo porque que só preenchendo aqueles dois campos ( Nome e Telemóvel ) dá erro ... Link to comment Share on other sites More sharing options...
Guerra7 Posted June 25, 2012 at 09:11 AM Author Report Share #465311 Posted June 25, 2012 at 09:11 AM Já fiz as alterações...e continua a dar o erro do " Tipo de dados incorrecto na expressão de critérios " . Mas o que não percebo é que se eu preencher só o campo do Nome e o Telemóvel dá o erro ... mas se eu preencher os no mínimo o Nome , Numero Contribuinte , Telefone, Telemóvel e Fax já insere na base dados ... e se preencher todos os campos insere também... Não percebo mesmo porque que só preenchendo aqueles dois campos ( Nome e Telemóvel ) dá erro ... Outra duvida que tenho é no insert quando faço pela textbox como é que devo por sqlgravar = ("INSERT INTO Clientes (Numero, Nome, Ncontribuinte, Morada, Codigopostal, Pais, Zona, Telefone, Telemovel, Email, Fax) values('" & txtnumerocliente.Text & "','" & txtnome.Text & "','" & txtnumerocontribuinte.Text & "','" & txtmorada.Text & "','" & txtcodigopostal.Text & "','" & cbpaises.SelectedValue & "','" & txtzona.Text & "','" & txttelefone.Text & "','" & txttelemovel.Text & "','" & txtemail.Text & "','" & txtfax.Text & "');") Em relação como estão separadas , com as aspas e as películas .. Link to comment Share on other sites More sharing options...
jpaulino Posted June 25, 2012 at 12:23 PM Report Share #465345 Posted June 25, 2012 at 12:23 PM Recomendo que leias estes dois artigos, usando: VB.NET: Gestão de Dados em SQL Server - Parte I VB.NET: Gestão de Dados em SQL Server - Parte II São para SQL mas como referido no artigo: No caso da utilização de bases de dados em Microsoft Access (*.mdb) é necessário apenas alterar as classes sendo a estrutura igual (ex. SQL = SqlConnection; Access = OleDbConnection). Também é necessário alterar o namespace que se importa, não sendo o System.Data.SqlClient mas sim o System.Data.OleDb. Link to comment Share on other sites More sharing options...
acao Posted June 25, 2012 at 02:40 PM Report Share #465377 Posted June 25, 2012 at 02:40 PM (edited) boas isso deve ser por causa dos valores nulos, para cada valor que poderá ser nulo e na db o campo seja númerico coloca assim na query: " & IIf(txtMatricula.Text = "", "Null", txtMatricula.Text).ToString ou se pretender alterar conforme indiquei no 1 post e agora o amigo Jpaulino, seria assim: command.Parameters.Add("@nome", OleDbType.VarChar).Value = IIf(TextBox1.Text.Equals(String.Empty), DBNull.Value, TextBox1.Text) Em relação como estão separadas , com as aspas e as películas .. se o valor for numerico é apenas aspas e se for string ou data é pila e aspas. Ps: amigo Jpaulino poderia ver o link colocado no meu 1º post que não está a funcionar, penso que seja um tutorial do nosso amigo bioshock ou seu. optar por uma maneira ou outra não lhe sei dizer a mais vantajosa ou mais rápida, porque conforme está a fazer utiliza menos cod, provavelmente deve-se utilizar a outra opção, mas o amigo Jpaulino já que intreviu e se quiser dar uma dicas, mesmo para me elucidar. também agradeço. Edit: acrescentar inf. Amigo Jpaulino referente ao toturial já vi que o erro é de acesso ao espaço Wiki «erro «Warning: include()» » e não de acesso ao tutorial , obrigado. cumps acao Edited June 25, 2012 at 02:56 PM by acao Link to comment Share on other sites More sharing options...
jpaulino Posted June 26, 2012 at 06:23 AM Report Share #465557 Posted June 26, 2012 at 06:23 AM Edit: acrescentar inf. Amigo Jpaulino referente ao toturial já vi que o erro é de acesso ao espaço Wiki «erro «Warning: include()» » e não de acesso ao tutorial , obrigado. Já estamos a ver o que se passa com a wiki. 😉 optar por uma maneira ou outra não lhe sei dizer a mais vantajosa ou mais rápida, porque conforme está a fazer utiliza menos cod, provavelmente deve-se utilizar a outra opção, mas o amigo Jpaulino já que intreviu e se quiser dar uma dicas, mesmo para me elucidar. também agradeço. A utilização dos parameters é sempre recomendado pois embora existam mais 3/4 linhas de código, resolvem inúmero problemas como SQL Injection, Internacionalização (números, datas, formatações), caracteres (O'Conner por exemplo), etc. Melhor mesmo só utilizando um ORM (Entity Framework, NHybernate, etc) Link to comment Share on other sites More sharing options...
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