Dúvida While - Iniciante ADVPL

Senhores Bom Dia, Sou novo no ADVPL estou montando um relatório e fiz esse trecho de While onde alimento a variável cTrans com os dados de uma Query, porém preciso limpar a variável após o preenchimento porque ela vai receber vários dados vindos do resultado da query, então preciso que ela receba imprima e limpe.

Como fazer?

OBRIGADO.


DbSelectArea("SB1")
DbSetorder(1)
If DbSeek(xFilial("SB1")+aSldIni[nX,3])
    TMP->( DbGotop() )
    While TMP->(!EOF()) .AND. aSldIni[nX,3] == TMP->D3_COD // Se o código do produto for exatamente igual.
        cTrans := TMP->QUANT
        TMP->(dbskip())
    Enddo    
Endif

Eraldo,

Não entendi muito bem o que você está precisando mas para limpar uma variável é só informar 0 para ela


cTrans := 0

DbSelectArea("SB1") 
SB1->(DbSetorder(1)) 
If SB1->(DbSeek(xFilial("SB1")+aSldIni[nX,3])) 
    TMP->( DbGotop() ) 
    While TMP->(!EOF()) .AND. aSldIni[nX,3] == TMP->D3_COD // Se o código do produto for exatamente igual. 
        cTrans := TMP->QUANT 
        TMP->(dbskip()) 
    Enddo
Endif

Felipe Bom Dia,

Através desse While eu verifico se o código do produto que trouxe no retorno da minha query é igual o código que está no array aSldIni, caso sim a variável cTrans recebe o valor e tenho já o trecho de impressão, o que está acontecendo é que por exemplo ela encontra o produto 000001 e imprime o valor dele acaba depois repetindo para todos os outros produtos, por isso acredito que eu deva limpar ela, pra quando entrar no while de novo vir zerada.

Eraldo, então isso que fiz resolve seu problema, o cTrans recebe zero no inicio e passa pelo while, depois ele volta para o while e zera a variavel. Pois o aSldIni está em um for, depois do For você zerá a variável

Não entendi também muito bem o que você deseja, mas vejamos, se voce usou um BEGINSQL...ENDSQL voce jogou o resultado da query dentro de um alias, caso voce queira "destruir" esse alias, se sobrescrever o alias(caso ele seja uma variavel) com outro valor o apontamento "se perde". Mas assim, ao meu ver a sua variavel "cTrans" não está armazenando nada alem do ultimo registro do LOOP, afinal, todas as vezes você sobrescreve o valor dela, talvez lhe seja mais útil utilizar um ARRAY, alimentando-o com a função AADD.

Por sinal esta é a documentação do WHILE.

Patrick.

Eu joguei o resultado da query em um alias TMP, nessa query eu capturo na SD3 movimentos de transferência para imprimir no relatório. O que acontece é que tenho vários códigos de produto no relatório, quero que toda vez que ache o código imprima o valor, zere a variável pra imprimir se encontrar o próximo.

Bom, nesse caso dentro do próprio loop voce teria que usar o metodo que impressão. Mas eu recomendaria passar as informações para um array, para ficar mais organizado.

Boa tarde,

Não entendi bem , mas vou tentar ajudar tenta assim:


cTrans := 0

DbSelectArea("SB1") 
SB1->(DbSetorder(1)) 
If SB1->(DbSeek(xFilial("SB1")+aSldIni[nX,3])) 
    TMP->( DbGotop() ) 
    While TMP->(!EOF()) .AND. aSldIni[nX,3] == TMP->D3_COD // Se o código do produto for exatamente igual. 
        cTrans := TMP->QUANT 
        //--chama a função aqui e zera 
         cTrans := 0
        TMP->(dbskip()) 
    Enddo
Endif

Uma dica que poderia te dar é tentar usar o nome da variável compatível com o tipo de dados que ela vai receber. No seu caso cTrans está recebendo um númerico. Poderia ser por exemplo nTrans. Sobre sua dúvida se o zerar é a própria variável que recebeu o dado da query basta vc usar cTrans := 0 a cada fim da laço.