- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Problema ao fazer while de verificação
×
Linguagem de Programação ADVPL
Perguntas Problema ao fazer while de verificação
- cintra_daniel
- Autor do Tópico
- Desconectado
- Membro Especialista
Menos
Mais
- Postagens: 95
- Obrigados Recebidos: 0
11 anos 5 meses atrás #14496
por cintra_daniel
Problema ao fazer while de verificação foi criado por cintra_daniel
Pessoal Bom dia!
Tenho que fazer uma verificação, em minha tabela de documentos, para ver se existe algum documento que ja foi substituído porém por algum motivo não foi setado automaticamente como obsoleto, e continua como vencido. Fiz a estrutura abaixo, porém as duas listagens cTRB parece que estão retornando os mesmos dados ao invés de duas listas diferentes para que eu possa comparar... é um pouco complexo, mas se alguém tiver um pouco de paciência para tentar entender e me ajudar ficarei grato!
cQuery3 := "SELECT XI2_TPDOC,XI2_LOCAL,XI2_STATUS FROM XI2010 WHERE D_E_L_E_T_ = '' AND XI2_STATUS = 'Vencido'"
_cQuery2 := "SELECT XI2_TPDOC,XI2_LOCAL,XI2_STATUS FROM XI2010 WHERE D_E_L_E_T_ = '' AND XI2_STATUS = 'Em dia'"
DbUseArea(.T., "TOPCONN", TcGenQry(,, cQuery3), cTRB3, .T., .T.)
DbUseArea(.T., "TOPCONN", TcGenQry(,, _cQuery2), _cTRB2, .T., .T.)
DbSelectArea(cTRB3)
While (cTRB3)->(!Eof())
DbSelectArea(_cTRB2)
While (_cTRB2)->(!Eof())
If ((cTRB3)->XI2_TPDOC == (_cTRB2)->XI2_TPDOC .And. (cTRB3)->XI2_LOCAL == (_cTRB2)->XI2_LOCAL)
If ((cTRB3)->XI2_STATUS == 'Vencido' .And. (_cTRB2)->XI2_STATUS == 'Em dia')
If XI2->(dbSetOrder(2),dbSeek(xFilial("XI2")+(cTRB3)->XI2_TPDOC+(cTRB3)->XI2_LOCAL+(cTRB3)->XI2_STATUS))
Reclock("XI2", .F.)
XI2->XI2_STATUS := 'Obsoleto'
MsUnlock("XI2")
EndIf
EndIf
EndIf
(_cTRB2)->(DbSkip())
EndDo
(cTRB3)->(DbSkip())
EndDo
DbCloseArea(cTRB3)
DbCloseArea(_cTRB2)
Tenho que fazer uma verificação, em minha tabela de documentos, para ver se existe algum documento que ja foi substituído porém por algum motivo não foi setado automaticamente como obsoleto, e continua como vencido. Fiz a estrutura abaixo, porém as duas listagens cTRB parece que estão retornando os mesmos dados ao invés de duas listas diferentes para que eu possa comparar... é um pouco complexo, mas se alguém tiver um pouco de paciência para tentar entender e me ajudar ficarei grato!
cQuery3 := "SELECT XI2_TPDOC,XI2_LOCAL,XI2_STATUS FROM XI2010 WHERE D_E_L_E_T_ = '' AND XI2_STATUS = 'Vencido'"
_cQuery2 := "SELECT XI2_TPDOC,XI2_LOCAL,XI2_STATUS FROM XI2010 WHERE D_E_L_E_T_ = '' AND XI2_STATUS = 'Em dia'"
DbUseArea(.T., "TOPCONN", TcGenQry(,, cQuery3), cTRB3, .T., .T.)
DbUseArea(.T., "TOPCONN", TcGenQry(,, _cQuery2), _cTRB2, .T., .T.)
DbSelectArea(cTRB3)
While (cTRB3)->(!Eof())
DbSelectArea(_cTRB2)
While (_cTRB2)->(!Eof())
If ((cTRB3)->XI2_TPDOC == (_cTRB2)->XI2_TPDOC .And. (cTRB3)->XI2_LOCAL == (_cTRB2)->XI2_LOCAL)
If ((cTRB3)->XI2_STATUS == 'Vencido' .And. (_cTRB2)->XI2_STATUS == 'Em dia')
If XI2->(dbSetOrder(2),dbSeek(xFilial("XI2")+(cTRB3)->XI2_TPDOC+(cTRB3)->XI2_LOCAL+(cTRB3)->XI2_STATUS))
Reclock("XI2", .F.)
XI2->XI2_STATUS := 'Obsoleto'
MsUnlock("XI2")
EndIf
EndIf
EndIf
(_cTRB2)->(DbSkip())
EndDo
(cTRB3)->(DbSkip())
EndDo
DbCloseArea(cTRB3)
DbCloseArea(_cTRB2)
Por favor Acessar ou Registrar para participar da conversa.
- kanaamlrr
- Desconectado
- Membro Platina
Menos
Mais
- Postagens: 1576
- Obrigados Recebidos: 4
11 anos 5 meses atrás #14497
por kanaamlrr
Respondido por kanaamlrr no tópico Problema ao fazer while de verificação
Já que você está trabalhando com alias, tira os 2 dbSelectArea, não tem necessidade deles...
Tenta assim e ve se funciona
cQuery3 := "SELECT XI2_TPDOC,XI2_LOCAL,XI2_STATUS FROM XI2010 WHERE D_E_L_E_T_ = '' AND XI2_STATUS = 'Vencido'"
_cQuery2 := "SELECT XI2_TPDOC,XI2_LOCAL,XI2_STATUS FROM XI2010 WHERE D_E_L_E_T_ = '' AND XI2_STATUS = 'Em dia'"
DbUseArea(.T., "TOPCONN", TcGenQry(,, cQuery3), cTRB3, .T., .T.)
DbUseArea(.T., "TOPCONN", TcGenQry(,, _cQuery2), _cTRB2, .T., .T.)
XI2->(dbSetOrder(2)
While (cTRB3)->(!Eof())
While (_cTRB2)->(!Eof())
If ((cTRB3)->XI2_TPDOC == (_cTRB2)->XI2_TPDOC .And. (cTRB3)->XI2_LOCAL == (_cTRB2)->XI2_LOCAL)
If ((cTRB3)->XI2_STATUS == 'Vencido' .And. (_cTRB2)->XI2_STATUS == 'Em dia')
If XI2->(dbSeek(xFilial("XI2")+(cTRB3)->XI2_TPDOC+(cTRB3)->XI2_LOCAL+(cTRB3)->XI2_STATUS)))
Reclock("XI2", .F.)
XI2->XI2_STATUS := 'Obsoleto'
MsUnlock("XI2")
EndIf
EndIf
EndIf
(_cTRB2)->(DbSkip())
EndDo
(cTRB3)->(DbSkip())
EndDo
DbCloseArea(cTRB3)
DbCloseArea(_cTRB2)
Tenta assim e ve se funciona
Por favor Acessar ou Registrar para participar da conversa.
- cintra_daniel
- Autor do Tópico
- Desconectado
- Membro Especialista
Menos
Mais
- Postagens: 95
- Obrigados Recebidos: 0
11 anos 5 meses atrás #14501
por cintra_daniel
Respondido por cintra_daniel no tópico Problema ao fazer while de verificação
Então cara, parece que os 2 alias ainda estão retornando a mesma lista...
Porque a listagem do cTRB3 só tem 1 registro, e a do _cTRB2 tem vários.. e a minha intenção, é justamente comparar uma com a outra... e quando eu estou debugando ta retornando os mesmos valores... nos dois cTRB..
que que será que pode estar errado ainda?
Porque a listagem do cTRB3 só tem 1 registro, e a do _cTRB2 tem vários.. e a minha intenção, é justamente comparar uma com a outra... e quando eu estou debugando ta retornando os mesmos valores... nos dois cTRB..
que que será que pode estar errado ainda?
Por favor Acessar ou Registrar para participar da conversa.
- kanaamlrr
- Desconectado
- Membro Platina
Menos
Mais
- Postagens: 1576
- Obrigados Recebidos: 4
11 anos 5 meses atrás #14504
por kanaamlrr
Respondido por kanaamlrr no tópico Problema ao fazer while de verificação
Então, mas o cTRB3 e o _cTRB2 estão com quais valores?
Seria interessante você definir antes do dbUseArea
pode ser que eles estejam pegando os mesmos alias, por isso está sobrepondo a segunda execução de query...
Seria interessante você definir antes do dbUseArea
cQuery3 := "SELECT XI2_TPDOC,XI2_LOCAL,XI2_STATUS FROM XI2010 WHERE D_E_L_E_T_ = '' AND XI2_STATUS = 'Vencido'"
_cQuery2 := "SELECT XI2_TPDOC,XI2_LOCAL,XI2_STATUS FROM XI2010 WHERE D_E_L_E_T_ = '' AND XI2_STATUS = 'Em dia'"
cTRB3 := "TRB3"
_cTRB2 := "TRB2"
DbUseArea(.T., "TOPCONN", TcGenQry(,, cQuery3), cTRB3, .T., .T.)
DbUseArea(.T., "TOPCONN", TcGenQry(,, _cQuery2), _cTRB2, .T., .T.)
pode ser que eles estejam pegando os mesmos alias, por isso está sobrepondo a segunda execução de query...
Por favor Acessar ou Registrar para participar da conversa.
- cintra_daniel
- Autor do Tópico
- Desconectado
- Membro Especialista
Menos
Mais
- Postagens: 95
- Obrigados Recebidos: 0
11 anos 5 meses atrás #14505
por cintra_daniel
Respondido por cintra_daniel no tópico Problema ao fazer while de verificação
Então, acho que eu consegui resolver...
Mudei o nome dos campos em uma das querys, porque como o nome dos campos são iguais, acho que ele tava fazendo confusão...
cQuery3 := "SELECT XI2_TPDOC,XI2_LOCAL,XI2_STATUS FROM XI2010 WHERE D_E_L_E_T_ = '' AND XI2_STATUS = 'Vencido'"
_cQuery2 := "SELECT XI2_TPDOC TPDOC1,XI2_LOCAL LOCAL1,XI2_STATUS STATUS1 FROM XI2010 WHERE D_E_L_E_T_ = '' AND XI2_STATUS = 'Em dia'"
Sobre o que você eu seto antes assim ó...
Local _cTRB2 := CriaTrab(NIL, .F.)
Local _cQuery2 := ""
Local cTRB3 := CriaTrab(NIL, .F.)
Local cQuery3 := ""
Tive que colocar um AllTrim nas variáveis de comparação aqui ó..
If ((cTRB3)->XI2_TPDOC == (_cTRB2)->TPDOC1 .And. (cTRB3)->XI2_LOCAL == (_cTRB2)->LOCAL1)
If (AllTrim((cTRB3)->XI2_STATUS) == 'Vencido' .And. AllTrim((_cTRB2)->STATUS1) == 'Em dia')
If XI2->(dbSeek(xFilial("XI2")+(cTRB3)->XI2_TPDOC+(cTRB3)->XI2_LOCAL+(cTRB3)->XI2_STATUS))
Reclock("XI2", .F.)
XI2->XI2_STATUS := 'Obsoleto'
MsUnlock("XI2")
EndIf
EndIf
EndIf
E ai deu certo... setou o documento como Obsoleto.. mas de qualquer forma, obrigado pela ajuda! =D
Mudei o nome dos campos em uma das querys, porque como o nome dos campos são iguais, acho que ele tava fazendo confusão...
cQuery3 := "SELECT XI2_TPDOC,XI2_LOCAL,XI2_STATUS FROM XI2010 WHERE D_E_L_E_T_ = '' AND XI2_STATUS = 'Vencido'"
_cQuery2 := "SELECT XI2_TPDOC TPDOC1,XI2_LOCAL LOCAL1,XI2_STATUS STATUS1 FROM XI2010 WHERE D_E_L_E_T_ = '' AND XI2_STATUS = 'Em dia'"
Sobre o que você eu seto antes assim ó...
Local _cTRB2 := CriaTrab(NIL, .F.)
Local _cQuery2 := ""
Local cTRB3 := CriaTrab(NIL, .F.)
Local cQuery3 := ""
Tive que colocar um AllTrim nas variáveis de comparação aqui ó..
If ((cTRB3)->XI2_TPDOC == (_cTRB2)->TPDOC1 .And. (cTRB3)->XI2_LOCAL == (_cTRB2)->LOCAL1)
If (AllTrim((cTRB3)->XI2_STATUS) == 'Vencido' .And. AllTrim((_cTRB2)->STATUS1) == 'Em dia')
If XI2->(dbSeek(xFilial("XI2")+(cTRB3)->XI2_TPDOC+(cTRB3)->XI2_LOCAL+(cTRB3)->XI2_STATUS))
Reclock("XI2", .F.)
XI2->XI2_STATUS := 'Obsoleto'
MsUnlock("XI2")
EndIf
EndIf
EndIf
E ai deu certo... setou o documento como Obsoleto.. mas de qualquer forma, obrigado pela ajuda! =D
Por favor Acessar ou Registrar para participar da conversa.
- kanaamlrr
- Desconectado
- Membro Platina
Menos
Mais
- Postagens: 1576
- Obrigados Recebidos: 4
- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Problema ao fazer while de verificação
Tempo para a criação da página:0.119 segundos