Hola,
En realidad en tu código sólo aparece un close, y es antes de abrir el query con el ORDER BY aplicado:
Código Delphi
[-]
query1.Close;
sql:='select * from fichaventa'+#13+
'where cliente = '+inttostr(datos.tticketcliente.value)+#13+
'and saldo <> 0'+#13+
'order by numero,fecha';
...
La respuesta que te di en realidad no sé si es la correcta o no, sólo sé que aplicando un INDEX o un ORDER BY tu dataset asociado cambia completamente su orden, por lo que al navegar con el NEXT no podrías obtener el resultado deseado.
Creo que lo más gráfico sería que pusieras un DBGrid enlazado a ese dataset para ver cómo realmente están ordenados los datos.
Pero como dije, no es la respuesta absoluta a tu problema, pero es lo que se me ocurre. Quizás no estás posteando el código exacto donde te da el problema...
Saludos!