Página 1 de 1

DO WHILE BUGANDO ....

Enviado: 23 Abr 2024 08:47
por deividdjs
bom dia prezados ... sempre fiz essa rotina desta maneira e desde que migrei de xharbour para harbour 3.5, vendo tendo alguns probleminhas que não tinha na versão anterior ... um deles é essa rotina abaixo ..

o bizarro é que quando eu saldo para o proximo registo continua sendo o mesmo pedido e ele cai fora do while ...

sempre fiz assim :

Código: Selecionar todos

do while RECEBER->cc_codped = TMPFAT->cc_pedfat

   ......

   skip

enddo
e mudei para a forma a baixo pra tentar burlar o erro ... o exemplo acima nem entra na rotina .. e no exemplo abaixo ele entra porém ao invés de ficar na rotina e dar um loop porque o pedido é igual .. ele sai .. bem estranho !!

Código: Selecionar todos

	 select RECEBER
         IF RECEBER->(ordsetfocus("RECCX_03"),DBSEEK(TMPFAT->cc_pedfat))   
			   
				do while .T. .and. !EOF()
	   		
				   BLOQ_REG()                                
	   		   replace cc_seqfact with IIF(RECEBER->cc_seqfact == space(10),c_seqfact,old_seqfact),;
					        cc_factura with c_notasped,;
	   		           cc_histor  with "Factura n§ " + c_notasped
	   		           DBCOMMIT()
   	   		        unlock
   	   		
					        DBSKIP()
	      
					if RECEBER->cc_codped = TMPFAT->cc_pedfat
					   loop
					 else
						exit
					endif
     
   	   	enddo
			
			ENDIF
   	  
			select TMPFAT                             
	   	DBSKIP()                                  
	      
  			c_pedfat := cc_pedfat                          
	      
	   ENDDO	                                            
	     
	ENDIF
Abraço!

DO WHILE BUGANDO ....

Enviado: 23 Abr 2024 09:53
por JoséQuintas
Eu diria que está meio doido isso.
O normal é testar .NOT. Eof(), pra não entrar em loop infinito.
Não dá pra saber que área está testando.
Também pode ser problema de índice, não sei dizer.
Também pode ser índice errado.
Essas coisas não dá pra adivinhar vendo o fonte.

Também é normal atribuir erros ao que começamos a testar, e não olhar direito o fonte.

Apesar de poder usar ALIAS nas coisas, e apesar de eu usar no fonte pra compilação -w3 -es2, prefiro o modo tradicional de posicionar a área a ser usada e depois retornar à anterior.

Código: Selecionar todos

SELECT receber
...
SELECT temp
SET ORDER TO x
SEEK receber->chave
DO WHILE temp->chave == receber->chave .AND. ! Eof()
   SKIP
ENDDO
SET ORDER TO 1 // se precisar voltar a algum default
SELECT receber
Isso se considerar que é desse jeito o relacionamento.

DO WHILE BUGANDO ....

Enviado: 23 Abr 2024 11:10
por deividdjs
Sim Zé ..

na realidade é um teste que fiz pra ver se funcionava .. porem ele sai do while sendo q o registro (numero do pedido igual) faz parte da condição ... e o indice está correto está indexado pelo numero do pedido ...

eu fazia assim e funcionava na versao em xharbour .. e funcionava perfeitamente

Código: Selecionar todos

index on cc_codped                                   tag reccx_03 

Código: Selecionar todos

	  select RECEBER
         IF RECEBER->(ordsetfocus("RECCX_03"),DBSEEK(TMPFAT->cc_pedfat))   
			   
				do while RECEBER->cc_codped = TMPFAT->cc_pedfat
	   		
				   BLOQ_REG()                                
	   		   replace cc_seqfact with IIF(RECEBER->cc_seqfact == space(10),c_seqfact,old_seqfact),;
					        cc_factura with c_notasped,;
	   		           cc_histor  with "Factura n§ " + c_notasped
	   		           DBCOMMIT()
   	   		        unlock
   	   		
					        DBSKIP()
	      
   	   	enddo
			
			ENDIF

DO WHILE BUGANDO ....

Enviado: 23 Abr 2024 13:34
por JoséQuintas
Olhei melhor, mas continua esquisito.

Está fazendo SEEK em RECEBER, do número da fatura.
Durante o do while grava coisas....
Se a gravação alterar o índice, altera a ordem, altera o que vai ser processado.
Tem que usar um índice onde o que for gravado não altere a ordem.

Supondo que o índice seja por fatura + outro número, e esse outro número está zerado.
Ao gravar número, ele passa a ser o último da fila, e o skip vai pular todos os demais, porque zero vém antes de qualquer número.

DO WHILE BUGANDO ....

Enviado: 23 Abr 2024 20:32
por deividdjs
É assim .. a base temporária TMPFAT estão os números de pedidos que foram impressas notas fiscais..então eu abro o Receber.dbf ordeno por pedido e busco em receber o pedido para posicionar o cursor na base e entro no while e gravo os dados da fatura e sequencial no receber.dbf .. se for venda parcelada.. ele percorre a base e grava em todos os lançamentos com o mesmo número de pedido .. volta para o TMPFAT vai para o próximo pedido e faz tudo outra vez .. então… neste caso dados gravados não altera o índice ou a ordem da base ..

DO WHILE BUGANDO ....

Enviado: 24 Abr 2024 10:37
por JoséQuintas
E qual a ordem ? só pedido ou pedido + alguma coisa ?

Utilize o debug e acompanhe linha a linha, e verifique variáveis, área aberta e posição.

Coloque Altd() antes do do while, e compile com -b
Pode ser que precise alterar o fonte pra forçar recompilar com -b, caso seja incremental