Dos cosas: Te puedes ahorrar la variable "Consulta" y puedes hacer que el sistema te diga en que línea te equivocaste en caso de algún error en tu consulta SQL.
Con la forma que estas utilizando, si tienes algún error en la instrucción SQL, el sistema te dirá que hay un error "SQL error en la línea 1". Esto es porque pones toda la instrucción en una variable "String" y se la pasas al componente TADOQuery en una sola línea.
Si utilizas la siguiente forma, te ahorras la variable "consulta" y le pasas la instrucción SQL bien organizada en varias líneas, con lo que, si existe algún error, el sistema te dirá en que línea está el error:
Código Delphi
[-]
with UnAdoQuery do begin
If active then close;
SQL.Clear;
SQL.Add('Select CveProd, Descripcion, CantVta, PrecioV, ');
SQL.Add('Sum(CantVta*PrecioV) ');
SQL.Add('From producto P, venta V');
SQL.Add('Where V.CveProd = P.CveProd ');
SQL.Add('and V.NoVenta = :numero');
SQL.Add('Group By CveProd, Descripcion, CantVta, PrecioV');
Parameters.ParamByName('Numero').Value := numero;
Open;
end;
Ahora mi duda es ¿por qué utilizas a "numero" como string? se supone que "numero" es un número, ¿no sería mejor manejarlo como "integer" o como "Float"?