× Linguagem de Programação ADVPL

Perguntas Problema ao fazer while de verificação

Mais
11 anos 5 meses atrás #14496 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)

Por favor Acessar ou Registrar para participar da conversa.

Mais
11 anos 5 meses atrás #14497 por kanaamlrr
Já que você está trabalhando com alias, tira os 2 dbSelectArea, não tem necessidade deles...

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.

Mais
11 anos 5 meses atrás #14501 por cintra_daniel
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?

Por favor Acessar ou Registrar para participar da conversa.

Mais
11 anos 5 meses atrás #14504 por kanaamlrr
Então, mas o cTRB3 e o _cTRB2 estão com quais valores?

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.

Mais
11 anos 5 meses atrás #14505 por cintra_daniel
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

Por favor Acessar ou Registrar para participar da conversa.

Mais
11 anos 5 meses atrás #14506 por kanaamlrr
Beleza!!
Negócio maluco esse dos campos, eu nunca tinha visto esse problema.
Valeu por compartilhar a solução!

Por favor Acessar ou Registrar para participar da conversa.

Tempo para a criação da página:0.119 segundos
Joomla templates by a4joomla