ADODB - ERRO AO INSERIR DADOS NO BD

USUARIO.EXCLUIDOS 30/12/2003 12:38:37
#2891
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.
USUARIO.EXCLUIDOS 30/12/2003 13:12:50
#2898
Resposta escolhida
Viu, qdo vc usa o AddNew, basta usar 1 vez:
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
USUARIO.EXCLUIDOS 30/12/2003 13:34:27
#2900
Então faz assim:
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