PROBLEMA COM EOF E BOF

VENOMGZ 14/12/2010 11:35:01
#359503
Bom dia amigos

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
LUIZCOMINO 14/12/2010 11:51:46
#359507
amigo pq você não usa o comando DISTINCT ex:

[Ô]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
JEISONANTONI 14/12/2010 11:54:31
#359508
bom, apesar de vc nao colokar a string de consulta, vc verifica se EOF e BOF sao FALSE, se form vai pro primeiro e grava os dados se um dos dois for Verdadeiro vc vai para o grava dados, mas se EOF é verdadeiro não retornou nenhum registro, por isso da erro quando vc verifica o campo RIM([Ô]verificador[Ô]) pois o mesmo nao tem nada...

axo q é isso, espero ter ajudado...
VENOMGZ 14/12/2010 11:59:20
#359509
amigo, primeiramente grato pela atenção

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

=/

VENOMGZ 14/12/2010 12:02:07
#359510
codigo completo do programa:

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


JEISONANTONI 14/12/2010 12:06:46
#359511
vc comentou a linha [Ô]While Not RIM.EOF[Ô] descomente ela e tente novamente
VENOMGZ 14/12/2010 13:12:22
#359519
eu comentei de proposito pra testar o codigo, comentei e fiz a rotina do contador pra ele ir fazendo enquanto a variavel não for igual ao total de registros da tabela... mas tanto um quanto o outro não ta dando certo =/

se eu descomento e executo, ele termina o laço e vai direto pro wend
JEISONANTONI 14/12/2010 13:17:34
#359520
sim, ele nao entra no while pq a recordset está vazia
VENOMGZ 14/12/2010 13:32:52
#359522
mas tem dados la =/

o q eu poderia fazer para resolver isso?

tipo, quando o campo verificador está 0 (não marcado) funciona normal...
JEISONANTONI 14/12/2010 13:57:10
#359524
sim, vc faz uma consulta nos dados somente dakeles que tem o verificador igual a zero.
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.
LUIZCOMINO 14/12/2010 13:59:11
#359525
Sub GravarDados()
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
Página 1 de 2 [17 registro(s)]
Tópico encerrado , respostas não são mais permitidas