ADODB - ERRO AO INSERIR DADOS NO BD
Olá galera,
To montando um cadastro de clientes e carrego os campos no Load do form. Tõ fazendo tudo no braço, no código. To utilizando dois Menus um toolbar e um menu simples. Tem tido muitas complicações... Tipo se tento inserir uma Linha no BD ele da erro no Select Case dos BtÂÂÂ's do Toolbar e tal... Meus Menus tem btÂÂÂ's de navegação (proximo/anterior)). Na verdade to tentando inserir uma linha e chamar o Requery do RecordeSet e movimentar para o ultimo registro!!! já pra atualizar os campos e quando o cara clicar no proximo/anterior já aparecer o registro que ele adicionou... Então, na hora que tento inserir o registro ele da erro de BOF ou EOF é verdadeiro sendo que eles estão no Case dos btÂÂÂ's Anterior/Proximo. Isso tem acontecido pq o banco ta vazio. Resolvi abrir o BD e adicionar um registro pra ver se ia funcionar a minha inserção através do Form. POis bem agora quando tento inserir da o seguinte erro no meu trato erros.
Erro Numero: 3001
Descrição: Os argumentos são incorretos, estão fora do intervalo aceitavel ou estão em conflito...
Fonte: ADODB.RecordSet
Meu código no bt Salvar do Menu e no bt Salvar do Toolbar:
.....
If ValidaControlesSalvar = True Then
SalvarNovo
FechaControles
On Error Resume Next
banco.BeginTrans
rsInicializar.AddNew
rsInicializar.AddNew rsInicializar("nm_cliente") = frmClientes.txtNome.Text
rsInicializar.AddNew rsInicializar("CnpjCpf") = frmClientes.txtCpfCnpj.Text
rsInicializar.AddNew rsInicializar("Tipo") = TipoCliente
rsInicializar.AddNew rsInicializar("TipoFaturamento") = TipoFat rsInicializar.AddNew rsInicializar("Estatos") = EstatusCliente
rsInicializar.AddNew rsInicializar("End_Rua") = frmClientes.txtRua.Text
rsInicializar.AddNew rsInicializar("End_Numero") = frmClientes.txt_Numero.Text
rsInicializar.AddNew rsInicializar("End_Complemento") = frmClientes.txtComplemento.Text
rsInicializar.AddNew rsInicializar("End_Bairro") = frmClientes.txtBairro.Text
rsInicializar.AddNew rsInicializar("End_Cidade") = frmClientes.txtCidade.Text
rsInicializar.AddNew rsInicializar("End_Estado") = frmClientes.cboEstado.Text
rsInicializar.AddNew rsInicializar("End_Cep") = frmClientes.txtCep.Text
rsInicializar.AddNew rsInicializar("Tel_Res") = frmClientes.txtTelRes.Text
rsInicializar.AddNew rsInicializar("Tel_Com") = frmClientes.txtTelCom.Text
rsInicializar.AddNew rsInicializar("Tel_Fax") = frmClientes.txtTelFax.Text
rsInicializar.AddNew rsInicializar("Email") = frmClientes.txtEmail.Text
rsInicializar.AddNew rsInicializar("Www") = frmClientes.txtWww.Text
rsInicializar.Update
If Err.Number 0 Then
banco.RollbackTrans
MsgBox "Erro! Erro ao tentar adicionar registros ao Cadastro de Clientes" & Chr(13) & _
" Informe os dados abaixo para suporte tecnico." & Chr(13) & _
"- Erro numero:" & Err.Number & "." & Chr(13) & _
"- Descrição:" & Err.Description & "." & Chr(13) & _
"- Fonte:" & Err.Source & ".", vbCritical, "GR Express - Faturamento - Cadastro de Clientes"
'Unload frmClientes
'Set frmClientes = Nothing
Exit Sub
Else
banco.CommitTrans
rsInicializar.Requery
rsInicializar.MoveFirst
If IsNull(rsInicializar("id_Cliente")) = True Then
frmClientes.txtCodCliente.Text = 0
Else
.... abaixo eu tõ validando os dados vindo do BD pra mostrar...
Espero que tenha sido claro!!! UQem puder ajudar fico agradecido desde já!!! Obrigado.
To montando um cadastro de clientes e carrego os campos no Load do form. Tõ fazendo tudo no braço, no código. To utilizando dois Menus um toolbar e um menu simples. Tem tido muitas complicações... Tipo se tento inserir uma Linha no BD ele da erro no Select Case dos BtÂÂÂ's do Toolbar e tal... Meus Menus tem btÂÂÂ's de navegação (proximo/anterior)). Na verdade to tentando inserir uma linha e chamar o Requery do RecordeSet e movimentar para o ultimo registro!!! já pra atualizar os campos e quando o cara clicar no proximo/anterior já aparecer o registro que ele adicionou... Então, na hora que tento inserir o registro ele da erro de BOF ou EOF é verdadeiro sendo que eles estão no Case dos btÂÂÂ's Anterior/Proximo. Isso tem acontecido pq o banco ta vazio. Resolvi abrir o BD e adicionar um registro pra ver se ia funcionar a minha inserção através do Form. POis bem agora quando tento inserir da o seguinte erro no meu trato erros.
Erro Numero: 3001
Descrição: Os argumentos são incorretos, estão fora do intervalo aceitavel ou estão em conflito...
Fonte: ADODB.RecordSet
Meu código no bt Salvar do Menu e no bt Salvar do Toolbar:
.....
If ValidaControlesSalvar = True Then
SalvarNovo
FechaControles
On Error Resume Next
banco.BeginTrans
rsInicializar.AddNew
rsInicializar.AddNew rsInicializar("nm_cliente") = frmClientes.txtNome.Text
rsInicializar.AddNew rsInicializar("CnpjCpf") = frmClientes.txtCpfCnpj.Text
rsInicializar.AddNew rsInicializar("Tipo") = TipoCliente
rsInicializar.AddNew rsInicializar("TipoFaturamento") = TipoFat rsInicializar.AddNew rsInicializar("Estatos") = EstatusCliente
rsInicializar.AddNew rsInicializar("End_Rua") = frmClientes.txtRua.Text
rsInicializar.AddNew rsInicializar("End_Numero") = frmClientes.txt_Numero.Text
rsInicializar.AddNew rsInicializar("End_Complemento") = frmClientes.txtComplemento.Text
rsInicializar.AddNew rsInicializar("End_Bairro") = frmClientes.txtBairro.Text
rsInicializar.AddNew rsInicializar("End_Cidade") = frmClientes.txtCidade.Text
rsInicializar.AddNew rsInicializar("End_Estado") = frmClientes.cboEstado.Text
rsInicializar.AddNew rsInicializar("End_Cep") = frmClientes.txtCep.Text
rsInicializar.AddNew rsInicializar("Tel_Res") = frmClientes.txtTelRes.Text
rsInicializar.AddNew rsInicializar("Tel_Com") = frmClientes.txtTelCom.Text
rsInicializar.AddNew rsInicializar("Tel_Fax") = frmClientes.txtTelFax.Text
rsInicializar.AddNew rsInicializar("Email") = frmClientes.txtEmail.Text
rsInicializar.AddNew rsInicializar("Www") = frmClientes.txtWww.Text
rsInicializar.Update
If Err.Number 0 Then
banco.RollbackTrans
MsgBox "Erro! Erro ao tentar adicionar registros ao Cadastro de Clientes" & Chr(13) & _
" Informe os dados abaixo para suporte tecnico." & Chr(13) & _
"- Erro numero:" & Err.Number & "." & Chr(13) & _
"- Descrição:" & Err.Description & "." & Chr(13) & _
"- Fonte:" & Err.Source & ".", vbCritical, "GR Express - Faturamento - Cadastro de Clientes"
'Unload frmClientes
'Set frmClientes = Nothing
Exit Sub
Else
banco.CommitTrans
rsInicializar.Requery
rsInicializar.MoveFirst
If IsNull(rsInicializar("id_Cliente")) = True Then
frmClientes.txtCodCliente.Text = 0
Else
.... abaixo eu tõ validando os dados vindo do BD pra mostrar...
Espero que tenha sido claro!!! UQem puder ajudar fico agradecido desde já!!! Obrigado.
Viu, qdo vc usa o AddNew, basta usar 1 vez:
Vc pode ligar os controles depois de abrir o recordset com:
Ficaria assim:
rsInicializar.AddNew
, q 1 linha será adicionada no banco, com todos os registros vazios, prontos para edição.Vc pode ligar os controles depois de abrir o recordset com:
Set txt.DataSource = rsInicializar 'liga à  tabela
txt.DataField = rsInicializar.Fields("campo")
.Ficaria assim:
rsInicializar.Open
Set txt1.DataSource = rsInicializar
Set txt2.DataSource = rsInicializar
'... ... ... e assim por diante
txt1.DataField = rsInicializar.Fields("Campo1")
txt2.DataField = rsInicializar.Fields("Campo2") '... ...
'Para inserir um novo registro, no Click de 1 botão Adicionar, por exemplo.:
rsInicializar.AddNew
'Daà todos os controles ligados ao recordset ficarão vazios. O usuário digita e clica em 1 botão Atualizar, q rodará:
rsInicializar.Update
Então faz assim:
O pb de usar esse código é q os controles não estão ligados ao recordset. Se vc fizer um Recordset.MoveNext, terá q popular novamente os TextBoxs.
Mas dê 1 olhada nessas 2 propriedades q falei: DataSource e DataField, elas facilitam bastante. Outro jeito de usá-las é assim:
Com isso, qdo vc clicar num botão Próximo ou Anterior, os txts serão automaticamente preenchidos com registros. Vc tem q checar a BOF e EOF tb:
rsInicializar.AddNew
rsInicializar("nm_cliente") = frmClientes.txtNome.Text
rsInicializar("CnpjCpf") = frmClientes.txtCpfCnpj.Text
rsInicializar("Tipo") = TipoCliente
rsInicializar("TipoFaturamento") = TipoFat
rsInicializar("Estatos") = EstatusCliente
rsInicializar("End_Rua") = frmClientes.txtRua.Text
rsInicializar("End_Numero") = frmClientes.txt_Numero.Text
rsInicializar("End_Complemento") = frmClientes.txtComplemento.Text
rsInicializar("End_Bairro") = frmClientes.txtBairro.Text
rsInicializar("End_Cidade") = frmClientes.txtCidade.Text
rsInicializar("End_Estado") = frmClientes.cboEstado.Text
rsInicializar("End_Cep") = frmClientes.txtCep.Text
rsInicializar("Tel_Res") = frmClientes.txtTelRes.Text
rsInicializar("Tel_Com") = frmClientes.txtTelCom.Text
rsInicializar("Tel_Fax") = frmClientes.txtTelFax.Text
rsInicializar("Email") = frmClientes.txtEmail.Text
rsInicializar("Www") = frmClientes.txtWww.Text
rsInicializar.Update
O pb de usar esse código é q os controles não estão ligados ao recordset. Se vc fizer um Recordset.MoveNext, terá q popular novamente os TextBoxs.
Mas dê 1 olhada nessas 2 propriedades q falei: DataSource e DataField, elas facilitam bastante. Outro jeito de usá-las é assim:
Dim ctl as Control 'variável ctl do tipo Control (controles do formulário)
For Each ctl in Controls 'coleção Controls de Control
If TypeOf ctl is TextBox Then
Set ctl.DataSource = adoRecordset.DataSource
End If
Next ctl
txt1.DataField = adoRecordset.Fields("campo1") ... ...
Com isso, qdo vc clicar num botão Próximo ou Anterior, os txts serão automaticamente preenchidos com registros. Vc tem q checar a BOF e EOF tb:
Tópico encerrado , respostas não são mais permitidas