Clipper On Line • Ver Tópico - Loop/movenext com ADODB no xHarbour
Mudar para estilo Clássico
Discussão sobre SQL
Postar uma resposta

Loop/movenext com ADODB no xHarbour

13 Set 2018 10:56

Olá caríssimos,

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

Código:
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?

Código:
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

13 Set 2018 12:13

Olá!

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

Tente assim:
Código:
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

13 Set 2018 13:29

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

14 Set 2018 10:45

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

14 Set 2018 12:53

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

21 Set 2018 15:37

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

21 Set 2018 15:42

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
Código:
ascan(arr_reg,Cid->numreg) == 0 .OR. Cid->numreg == "   "


Até mais
Postar uma resposta