Creo que ese query3.next en medio del código no va, creo que es al final del bucle:
Código Delphi
[-]
query3.Open
while not query3.eof do
begin
query3.next;
end;
Una sugerencia, divide y vencerás. Por ejemplo:
Código Delphi
[-]procedure TFormMain.Abre(qry:TQuery);
begin
TRY
Qry.open;
EXCEPT
messagedlg('Error en consulta:'+ qry.Name + #13+QRY.SQL.TEXT,mterror,[mbok],0);
Abort; END;
end;
Ahora puedes sustituir esas líneas de código por una llamada a este procedimiento, reusándolo.
Código Delphi
[-]
abre(query2);
abre(query3);
abre(query4);
Si usas esta vieja técnica con otras cosas de tu código, verás que tu procedimiento se acorta bastante, no te mareas con el scroll vertical, es más legible, entendible y encontrarás los errores más rápidamente.
Saludos