PROBLEMA COM EOF E BOF
estou criando uma pequena aplicação que passa informações de um banco de dados em access utilizado por um outro aplicativo para um servidor sql, porém com algumas diferenças de acordo com que me pediram
estou tendo dificuldade quanto a verificação de dados para que não hajam dados duplicados, adicionei um campo boleano na tabela do access, que quando o dado for verificado, marque este campo, para que seja feita uma verificação no laço para que ele não seja inserido novamente, fiz o seguinte:
Private Sub cmdExport_Click()
If Not RIM.BOF And Not RIM.EOF Then
RIM.MoveFirst
GravarDados
End
Else
GravarDados
End
End If
End Sub
Sub GravarDados()
GeraContador
i = 0
[ô]While Not RIM.EOF
While i <> Contador([Ô]contador[Ô])
If RIM([Ô]verificador[Ô]) = 0 Then
VNF = RIM([Ô]nfiscal[Ô])
VForn = RIM([Ô]fornecedor[Ô])
VData = RIM([Ô]data_nf[Ô])
VVcto = RIM([Ô]vcto[Ô])
VValor = RIM([Ô]valor[Ô])
DBS.Execute [Ô]exec adc_nfiscal [Ô] & _
[Ô]@nfiscal =[ô][Ô] + VNF + [Ô][ô],[Ô] & _
[Ô]@fornecedor =[ô][Ô] + VForn + [Ô][ô],[Ô] & _
[Ô]@data_nf =[ô][Ô] + VData + [Ô][ô],[Ô] & _
[Ô]@vcto =[ô][Ô] + VVcto + [Ô][ô],[Ô] & _
[Ô]@valor =[ô][Ô] + VValor + [Ô][ô],[Ô] & _
[Ô]@os =[ô][Ô] + VOS([Ô]os[Ô]) + [Ô][ô][Ô]
DBM.Execute [Ô]update itens_rimce set Verificador = [ô]1[ô] where nfiscal =[ô][Ô] + VNF + [Ô][ô][Ô]
MsgBox [Ô]Dados Importados com sucesso.[Ô], vbInformation, [Ô]Conclusão[Ô]
RIM.MoveNext
Else
MsgBox [Ô]Dados já exportados anteriormente[Ô], vbInformation, [Ô]Aviso[Ô]
End If
i = i + 1
Wend
[ô]Wend
End Sub
mas quando ele chega na linha:
If RIM([Ô]verificador[Ô]) = 0 Then
ele da o erro falando que bof ou eof são verdadeiros ou que o registro foi apagado... isso acontece na segunda vez que o programa é rodado quando os campos boleanos estão preenchidos, se estiverem em branco, roda normal... o que eu poderia fazer para resolver este problema?
mais detalhes, no sql tem um campo id_processo que é autonumerico, e o campo nfiscal pode receber dados duplicados
grato a quem puder me ajudar
[Ô]SELECT DISTINCT campo1,campo2 FROM TABELA[Ô]
ele não exibe os registros duplicados na consulta, ai você pode criar um laço para jogar os dados do acess no sqlserver, tipo você da um select distinct em um recordset depois cria um laço para fazer insert em outro recordset do sqlserver.
---------------------------ou tente
Private Sub cmdExport_Click()
If Not RIM.EOF Then
RIM.MoveFirst
GravarDados
End
Else
GravarDados
End
End If
End Sub
Sub GravarDados()
GeraContador
i = 0
[ô]While Not RIM.EOF
While i <> Contador([Ô]contador[Ô])
If RIM([Ô]verificador[Ô]) = 0 Then
VNF = RIM([Ô]nfiscal[Ô])
VForn = RIM([Ô]fornecedor[Ô])
VData = RIM([Ô]data_nf[Ô])
VVcto = RIM([Ô]vcto[Ô])
VValor = RIM([Ô]valor[Ô])
DBS.Execute [Ô]exec adc_nfiscal [Ô] & _
[Ô]@nfiscal =[ô][Ô] + VNF + [Ô][ô],[Ô] & _
[Ô]@fornecedor =[ô][Ô] + VForn + [Ô][ô],[Ô] & _
[Ô]@data_nf =[ô][Ô] + VData + [Ô][ô],[Ô] & _
[Ô]@vcto =[ô][Ô] + VVcto + [Ô][ô],[Ô] & _
[Ô]@valor =[ô][Ô] + VValor + [Ô][ô],[Ô] & _
[Ô]@os =[ô][Ô] + VOS([Ô]os[Ô]) + [Ô][ô][Ô]
DBM.Execute [Ô]update itens_rimce set Verificador = [ô]1[ô] where nfiscal =[ô][Ô] + VNF + [Ô][ô][Ô]
MsgBox [Ô]Dados Importados com sucesso.[Ô], vbInformation, [Ô]Conclusão[Ô]
RIM.MoveNext
Else
MsgBox [Ô]Dados já exportados anteriormente[Ô], vbInformation, [Ô]Aviso[Ô]
End If
i = i + 1
Wend
[ô]Wend
End Sub
axo q é isso, espero ter ajudado...
então... eu ja fiz uma select para me retornar o que quero, e seria nessa recordset, alguns dados vão ser duplicados no campo nfiscal porque a pessoa que adicionou errado, mas gostaria que cada vez que eu executasse o comando, ele verificasse quais dados já foram passados pro sql e ignora-los, por isso adicionei no access o campo boleano, o comando é esse no modulo:
Sub AbrirRIM()
axsql = [Ô]select nfiscal, fornecedor, sum(preco) as valor,data_nf,vcto,verificador from itens_rimce where verificador = 0 group by nfiscal, fornecedor, data_nf,vcto,verificador[Ô]
Set RIM = New ADODB.Recordset
RIM.CursorLocation = adUseClient
RIM.Open axsql, DBM
End Sub
pegou os resultados que eu queria normalmente
tentei alterar o cmdExport como vc disse mas deu a mesma coisa, atualmente o campo [Ô]verificador[Ô] no access que é boleano, está todo preenchido, queria testar o momento que ele verifica que os dados já foram adicionados e não adicionar novamente verifcando e adicionando apenas o que não foi passado pro sql ainda, mas mesmo mudando para [Ô]If rim.eof then[Ô] continua com o mesmo problema no mesmo lugar
=/
modulo
Citação:Global DBM As ADODB.Connection
Global DBS As ADODB.Connection
Global RIM As ADODB.Recordset
Global Contador As ADODB.Recordset
Sub AbrirMDB()
Set DBM = New ADODB.Connection
DBM.ConnectionString = [Ô]Provider=Microsoft.Jet.OLEDB.4.0; Data Source =[Ô] & App.Path & [Ô]
ipcd_508509.mdb[Ô]
DBM.CursorLocation = adUseClient
DBM.Open
End Sub
Sub AbrirSQL()
Set DBS = New Connection
DBS.ConnectionString = [Ô]Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=gerador;Data Source=192.168.0.3[Ô]
DBS.Open
End Sub
Sub AbrirRIM()
axsql = [Ô]select nfiscal, fornecedor, sum(preco) as valor,data_nf,vcto,verificador from itens_rimce where verificador = 0 group by nfiscal, fornecedor, data_nf,vcto,verificador[Ô]
Set RIM = New ADODB.Recordset
RIM.CursorLocation = adUseClient
RIM.Open axsql, DBM
End Sub
Sub GeraContador()
axsql = [Ô]select count(nfiscal) as contador from itens_rimce[Ô]
Set Contador = New ADODB.Recordset
Contador.CursorLocation = adUseClient
Contador.Open axsql, DBM
End Sub
no formulario
Citação:Dim VNF As String
Dim VForn As String
Dim VData As String
Dim VVcto As String
Dim VValor As String
Dim i As Integer
Private Sub cmdExport_Click()
AbrirMDB
AbrirSQL
AbrirRIM
If Not RIM.EOF Then
RIM.MoveFirst
GravarDados
End
Else
GravarDados
End
End If
End Sub
Sub GravarDados()
GeraContador
i = 0
[ô]While Not RIM.EOF
While i <> Contador([Ô]contador[Ô])
If RIM([Ô]verificador[Ô]) = 0 Then
VNF = RIM([Ô]nfiscal[Ô])
VForn = RIM([Ô]fornecedor[Ô])
VData = RIM([Ô]data_nf[Ô])
VVcto = RIM([Ô]vcto[Ô])
VValor = RIM([Ô]valor[Ô])
DBS.Execute [Ô]exec adc_nfiscal [Ô] & _
[Ô]@nfiscal =[ô][Ô] + VNF + [Ô][ô],[Ô] & _
[Ô]@fornecedor =[ô][Ô] + VForn + [Ô][ô],[Ô] & _
[Ô]@data_nf =[ô][Ô] + VData + [Ô][ô],[Ô] & _
[Ô]@vcto =[ô][Ô] + VVcto + [Ô][ô],[Ô] & _
[Ô]@valor =[ô][Ô] + VValor + [Ô][ô],[Ô] & _
[Ô]@os =[ô][Ô] + VOS([Ô]os[Ô]) + [Ô][ô][Ô]
DBM.Execute [Ô]update itens_rimce set Verificador = [ô]1[ô] where nfiscal =[ô][Ô] + VNF + [Ô][ô][Ô]
MsgBox [Ô]Dados Importados com sucesso.[Ô], vbInformation, [Ô]Conclusão[Ô]
RIM.MoveNext
Else
MsgBox [Ô]Dados já exportados anteriormente[Ô], vbInformation, [Ô]Aviso[Ô]
End If
i = i + 1
Wend
[ô]Wend
End Sub
se eu descomento e executo, ele termina o laço e vai direto pro wend
o q eu poderia fazer para resolver isso?
tipo, quando o campo verificador está 0 (não marcado) funciona normal...
dai vc verifica se o .EOF, se for False move pro primeiro registro e vai pra função gravardados.
se o .EOF for True vc chama a função gravadados, dai la ele tenta verificar se o verificador é igual a zero, mas não possui registro no recordset pq ja percorreu antes.
faz assim.
f Not RIM.EOF Then
RIM.MoveFirst
GravarDados
End
Else
RIM.MoveFirst
GravarDados
End
End If
ve se vai dar erro antes de chamara a função.
GeraContador
i = 0
[ô]While Not RIM.EOF
While i <> Contador([Ô]contador[Ô])
If NOt RIM([Ô]verificador[Ô]) Then
VNF = RIM([Ô]nfiscal[Ô])
VForn = RIM([Ô]fornecedor[Ô])
VData = RIM([Ô]data_nf[Ô])
VVcto = RIM([Ô]vcto[Ô])
VValor = RIM([Ô]valor[Ô])
DBS.Execute [Ô]exec adc_nfiscal [Ô] & _
[Ô]@nfiscal =[ô][Ô] + VNF + [Ô][ô],[Ô] & _
[Ô]@fornecedor =[ô][Ô] + VForn + [Ô][ô],[Ô] & _
[Ô]@data_nf =[ô][Ô] + VData + [Ô][ô],[Ô] & _
[Ô]@vcto =[ô][Ô] + VVcto + [Ô][ô],[Ô] & _
[Ô]@valor =[ô][Ô] + VValor + [Ô][ô],[Ô] & _
[Ô]@os =[ô][Ô] + VOS([Ô]os[Ô]) + [Ô][ô][Ô]
DBM.Execute [Ô]update itens_rimce set Verificador = [ô]1[ô] where nfiscal =[ô][Ô] + VNF + [Ô][ô][Ô]
MsgBox [Ô]Dados Importados com sucesso.[Ô], vbInformation, [Ô]Conclusão[Ô]
Else
MsgBox [Ô]Dados já exportados anteriormente[Ô], vbInformation, [Ô]Aviso[Ô]
End If
i = i + 1
RIM.MoveNext
Wend
[ô]Wend
End Sub