No es eficiente... primero, porque intentas manejar un query como si fuese una tabla. Desde hace mucho se ha dicho que el manejo de componentes TTables, en la mayoría de los casos no es recomendado.
Por otro lado, no todos los componentes TQuery te permiten editar sus salidas, debido a que hay resultados complejos que pueden venir de diferentes tablas.
Además no es eficiente que hagas una consulta de todos los Productos... para modificar solo uno de ellos.
En tu segundo código veo una línea que sobra... y es el Open: cuando invocas el "active", implícitamente estas haciendo un open.
Finalmente, Retomando lo que propone Casimiro, deberías hacer algo como:
Código Delphi
[-] with Query do
begin
Close;
SQL.Clear;
SQL.Add('update productos set fechaalta=:v1, detalle=:v2, categoria=:v3 where codigo=:v4');
prepare
Parambyname('fecha_alta').Value := FormatDateTime('DD/MM/YYYY', Date);
Parambyname('detalle').AsString := Memo1.Lines.Text;
Parambyname('categoria').AsString := Edit1.Text;
ExecSQL;
end;