×
Linguagem de Programação ADVPL
Perguntas Dúvida while
- lsoliv
- Autor do Tópico
- Desconectado
- Membro Júnior
Menos
Mais
- Postagens: 36
- Obrigados Recebidos: 0
10 anos 7 meses atrás #21943
por lsoliv
Dúvida while foi criado por lsoliv
Bom dia pessoal, estou fazendo um relatório e num determinado trecho do código, o while está dando loop infinito. Já quebrei a cabeça e não consigo ver o erro. Alguém pode me ajudar?
Obrigado,
DO WHILE _cARQTMP3->(!Eof())
DBSELECTAREA("TEMPO")
DBAPPEND()
IF !EMPTY(_cARQTMP3->D2_DOC)
_FIELD->DTSAIDA :=_cARQTMP3->D2_EMISSAO
_FIELD->SERIESAID :=_cARQTMP3->D2_SERIE
_FIELD->NFSAIDA :=_cARQTMP3->D2_DOC
_FIELD->QTDESAIDA :=_cARQTMP3->D2_QUANT
_FIELD->VUNITSAID :=_cARQTMP3->D2_PRCVEN
_FIELD->TESSAIDA :=_cARQTMP3->D2_TES
_FIELD->SUBLOTESA :=_cARQTMP3->D2_NUMLOTE
ENDIF
DBSELECTAREA("_cARQTMP3")
DBSKIP()
ENDDO
Obrigado,
DO WHILE _cARQTMP3->(!Eof())
DBSELECTAREA("TEMPO")
DBAPPEND()
IF !EMPTY(_cARQTMP3->D2_DOC)
_FIELD->DTSAIDA :=_cARQTMP3->D2_EMISSAO
_FIELD->SERIESAID :=_cARQTMP3->D2_SERIE
_FIELD->NFSAIDA :=_cARQTMP3->D2_DOC
_FIELD->QTDESAIDA :=_cARQTMP3->D2_QUANT
_FIELD->VUNITSAID :=_cARQTMP3->D2_PRCVEN
_FIELD->TESSAIDA :=_cARQTMP3->D2_TES
_FIELD->SUBLOTESA :=_cARQTMP3->D2_NUMLOTE
ENDIF
DBSELECTAREA("_cARQTMP3")
DBSKIP()
ENDDO
Por favor Acessar ou Registrar para participar da conversa.
- kanaamlrr
- Desconectado
- Membro Platina
Menos
Mais
- Postagens: 1576
- Obrigados Recebidos: 4
10 anos 7 meses atrás #21944
por kanaamlrr
Respondido por kanaamlrr no tópico Dúvida while
Quando você executa esse comando:
DBSELECTAREA("_cARQTMP3")
Ele volta para o inicio do arquivo.
O ideal seria gravar o Recno do registro corrente antes de mudar a área para o append, e após o DBSELECTAREA("_cARQTMP3") utilizar uma dbgoto(recno) para posicionar a tabela no lugar certo.
Abraço!
DBSELECTAREA("_cARQTMP3")
Ele volta para o inicio do arquivo.
O ideal seria gravar o Recno do registro corrente antes de mudar a área para o append, e após o DBSELECTAREA("_cARQTMP3") utilizar uma dbgoto(recno) para posicionar a tabela no lugar certo.
Abraço!
Por favor Acessar ou Registrar para participar da conversa.
- lsoliv
- Autor do Tópico
- Desconectado
- Membro Júnior
Menos
Mais
- Postagens: 36
- Obrigados Recebidos: 0
- kanaamlrr
- Desconectado
- Membro Platina
Menos
Mais
- Postagens: 1576
- Obrigados Recebidos: 4
10 anos 7 meses atrás #21952
por kanaamlrr
Respondido por kanaamlrr no tópico Dúvida while
Leandro,
Dei uma olhada melhor no seu código e dá para resolver de uma forma bem mais simples.
Deveria ficar mais ou menos assim:
dessa forma você não precisa setar a área antiga, pois toda vez que você dá um selectarea, o arquivo é posicionado no inicio, portanto o que estava acontecendo era:
faz append
volta o _cARQTMP3 para o 1º registro
da um skip e vai para o 2º e entra no loop
depois faz tudo de novo, por isso estava em loop infinito.
tenta dessa forma que eu coloquei e veja se dá certo
Abraço!
Dei uma olhada melhor no seu código e dá para resolver de uma forma bem mais simples.
Deveria ficar mais ou menos assim:
Local nRecno := 0
DO WHILE _cARQTMP3->(!Eof())
DBSELECTAREA("TEMPO")
DBAPPEND()
IF !EMPTY(_cARQTMP3->D2_DOC)
_FIELD->DTSAIDA :=_cARQTMP3->D2_EMISSAO
_FIELD->SERIESAID :=_cARQTMP3->D2_SERIE
_FIELD->NFSAIDA :=_cARQTMP3->D2_DOC
_FIELD->QTDESAIDA :=_cARQTMP3->D2_QUANT
_FIELD->VUNITSAID :=_cARQTMP3->D2_PRCVEN
_FIELD->TESSAIDA :=_cARQTMP3->D2_TES
_FIELD->SUBLOTESA :=_cARQTMP3->D2_NUMLOTE
ENDIF
_cARQTMP3->(DBSKIP())
ENDDO
dessa forma você não precisa setar a área antiga, pois toda vez que você dá um selectarea, o arquivo é posicionado no inicio, portanto o que estava acontecendo era:
faz append
volta o _cARQTMP3 para o 1º registro
da um skip e vai para o 2º e entra no loop
depois faz tudo de novo, por isso estava em loop infinito.
tenta dessa forma que eu coloquei e veja se dá certo
Abraço!
Por favor Acessar ou Registrar para participar da conversa.
- lsoliv
- Autor do Tópico
- Desconectado
- Membro Júnior
Menos
Mais
- Postagens: 36
- Obrigados Recebidos: 0
- lalberto
- Desconectado
- Administrador
Menos
Mais
- Postagens: 3676
- Obrigados Recebidos: 6
10 anos 7 meses atrás - 10 anos 7 meses atrás #21954
por lalberto
Luiz Alberto Vieira Alves
Proprietário
55 (12) 9 8256-5905 (Vivo)
www.3lsystems.com.br
www.masteradvpl.com.br
Respondido por lalberto no tópico Dúvida while
Faz Assim
Local nRecno := 0
DO WHILE _cARQTMP3->(!Eof())
nRecno := _cARQTMP3->(Recno())
DBSELECTAREA("TEMPO")
DBAPPEND()
IF !EMPTY(_cARQTMP3->D2_DOC)
_FIELD->DTSAIDA :=_cARQTMP3->D2_EMISSAO
_FIELD->SERIESAID :=_cARQTMP3->D2_SERIE
_FIELD->NFSAIDA :=_cARQTMP3->D2_DOC
_FIELD->QTDESAIDA :=_cARQTMP3->D2_QUANT
_FIELD->VUNITSAID :=_cARQTMP3->D2_PRCVEN
_FIELD->TESSAIDA :=_cARQTMP3->D2_TES
_FIELD->SUBLOTESA :=_cARQTMP3->D2_NUMLOTE
ENDIF
DBSELECTAREA("_cARQTMP3")
_cARQTMP3->(dbGoTo(nRecno))
_cARQTMP3->(DBSKIP())
ENDDO
Local nRecno := 0
DO WHILE _cARQTMP3->(!Eof())
nRecno := _cARQTMP3->(Recno())
DBSELECTAREA("TEMPO")
DBAPPEND()
IF !EMPTY(_cARQTMP3->D2_DOC)
_FIELD->DTSAIDA :=_cARQTMP3->D2_EMISSAO
_FIELD->SERIESAID :=_cARQTMP3->D2_SERIE
_FIELD->NFSAIDA :=_cARQTMP3->D2_DOC
_FIELD->QTDESAIDA :=_cARQTMP3->D2_QUANT
_FIELD->VUNITSAID :=_cARQTMP3->D2_PRCVEN
_FIELD->TESSAIDA :=_cARQTMP3->D2_TES
_FIELD->SUBLOTESA :=_cARQTMP3->D2_NUMLOTE
ENDIF
DBSELECTAREA("_cARQTMP3")
_cARQTMP3->(dbGoTo(nRecno))
_cARQTMP3->(DBSKIP())
ENDDO
Luiz Alberto Vieira Alves
Proprietário
55 (12) 9 8256-5905 (Vivo)
www.3lsystems.com.br
www.masteradvpl.com.br
Ultima edição: 10 anos 7 meses atrás por lalberto.
Por favor Acessar ou Registrar para participar da conversa.
Tempo para a criação da página:0.099 segundos