Clipper On Line • Ver Tópico - Loop/movenext com ADODB no xHarbour
Página 1 de 1

Loop/movenext com ADODB no xHarbour

MensagemEnviado: 13 Set 2018 10:56
por fertriod3
Olá caríssimos,

Tenho que percorrer um recordset, numa consulta ao MySQL com ADO. No xharbour com DBF eu faria assim:

while !chq->(eof())                                         
   if ascan(arr_reg,Cid->numreg) == 0 .OR. Cid->numreg == "   "
      chq->(dbskip())
      loop
   endif
   chq->(dbskip())
end


O loop (abaixo) no recordset dá erro, alguem sabe como deveria proceder?

while !oRSChq:eof()                                         
   if ascan(arr_reg,Cid->numreg) == 0 .OR. Cid->numreg == "   "
      oRsChq:movenext()
      orsChq:loop()
   endif
   oRsChq:movenext()
end


Obrigado

Loop/movenext com ADODB no xHarbour

MensagemEnviado: 13 Set 2018 12:13
por alxsts
Olá!

O método "loop" não existe em ADO.

Tente assim:
 while !oRSChq:eof()                    
  if ascan(arr_reg, oRSChq:fields:"numreg") == 0 .OR. oRSChq:fields:"numreg" == " "
     oRsChq:movenext()
     LOOP
  endif
  oRsChq:movenext()
end

Deve ser código exemplo pois está esquisito. Se não satisfizer a condição, despreza registro. Senão, despreza registro...

Loop/movenext com ADODB no xHarbour

MensagemEnviado: 13 Set 2018 13:29
por fertriod3
Beleza Alexandre, eu alterei aqui e pelo menos passou sem erro, agora vou conferir o relatorio.
Muito obrigado pela força

Loop/movenext com ADODB no xHarbour

MensagemEnviado: 14 Set 2018 10:45
por JoséQuintas
alxsts escreveu:O método "loop" não existe em ADO.


Não existe nem em ADO, e nem em DBF.
Tem a ver com DO WHILE/ENDDO e não banco de dados.

Estranhei o Fields, que eu saiba seria Fields( "codigo" ):Value

E nesta parte talvez melhor inverter:

if ascan(arr_reg, oRSChq:fields:"numreg") == 0 .OR. oRSChq:fields:"numreg" == " "

Deste jeito nem perde tempo fazendo scan se for " " (apesar que a comparação continua esquisita)

IF oRSChq:fields( "numreg" ):Value == " " .OR. ascan(arr_reg, oRSChq:fields( "numreg" ):Value ) == 0

Loop/movenext com ADODB no xHarbour

MensagemEnviado: 14 Set 2018 12:53
por alxsts
Olá!

JoséQuintas escreveu:Tem a ver com DO WHILE/ENDDO e não banco de dados.

Loop é um comando xBase. Pose ser usado com Do...While...Enddo, For...Next e provavelmente For...Each...Next (nunca testei).
JoséQuintas escreveu:Estranhei o Fields, que eu saiba seria Fields( "codigo" ):Value

Tem razão... na pressa, esqueci o :value. O correto é rs:fields("field"):value
JoséQuintas escreveu:E nesta parte talvez melhor inverter:

Tem razão. Eu ia dizer isto. Esta técnica é conhecida como shortcutting, ou seja: numa série de condições agrupadas com .OR., qualquer uma delas que for verdadeira valida toda a serie. Da mesma forma, numa série de condições agrupadas com .AND., qualquer uma delas que falhar invalida toda a serie. Este é o comportamento padrão do compilador e pode ser alterado para testar todas as condições, com o switch -z (isto vem do Cl*pper).

Loop/movenext com ADODB no xHarbour

MensagemEnviado: 21 Set 2018 15:37
por fertriod3
Amigos,

Realmente, deixando somente "loop" resolveu. Coloquei em produção esses dias e deu tudo certo. Obrigado José Quintas e Alexande Santos pela ajuda. Interessante a dica de que o loop faz tem a ver com o DO WHILE e não com a base de dados que é usada, eu ainda misturo as coisas, rs

Loop/movenext com ADODB no xHarbour

MensagemEnviado: 21 Set 2018 15:42
por fertriod3
Outra coisa que ia me esquecendo, somente pra deixar registrado: Cid->numreg é em dbf e eu acesso normalmente com select (não sei se é possível fazer select com dbf) então nesse caso é dbf junto com MySql
ascan(arr_reg,Cid->numreg) == 0 .OR. Cid->numreg == "   "


Até mais