PDA

Ver la Versión Completa : RequestLive de TQuery no puede, q mas puedo usar?


nefy
19-06-2004, 02:35:33
Hola necesito modifcar el valor de un campo resultado de una consulta y no puedo hacerlo con Update pues debo de asignar a los campos el resultado de ciertas operaciones segun los valores de cada registro. Obviamente asigne True a RequestLive pero al tratar de hacer las modificaciones me enviaba un error ("Cannot Modify a ReadOnly Dataset"), lei en la ayuda y el problema segun era q no debo usar Joins, Distincts, etc en la consulta para poder modificarla. La modifique de este manera:
SELECT Contratos.NCONTRATO, Clientes.RAZON_SOCIAL, Ventas_mov.NUM_RECIBO,
Ventas_mov.FECHA, Ventas_mov.EFECTIVO, Ventas_mov.CHEQUE, Ventas_mov.BANCO,
Ventas_mov.NUM_CHQ, Ventas_mov.CVE_COBRADOR, Ventas_mov.IDUsuario,
Clientes.MUNICIPIO, Ventas_mov.Comision, Contratos.Tipo, Contratos.Vendedor,
Ventas_mov.CLAVECOMISION
FROM Contratos, Clientes, Ventas_Mov
Where (Contratos.NCONTRATO = Ventas_mov.NCONTRATO)
AND (Contratos.NUM_CLI = Clientes.NUM_CLI)
AND(Contratos.VENDEDOR = '+QuotedStr(IntToStr(VendedoresNUM_VEN.Value))+') ';

Pero sigue enviandome el mensaje de error y pues segun yo he cumplido los terminos establecidos. Mi pregunta es: ¿Esta mal la consulta (para q sea modificable obviamente)?, ¿Es imposble hacerlo de esta manera y si existe otro camino?.

Nota:Uso Delphi 6, Paradox 7 y un TQuery para la consulta. Ya cheque y los .db no son solo lectura.

Salu2

roman
19-06-2004, 04:19:40
Normalmente no podrás modificar los resultados de una consulta que involucre varias tablas.

Echale una leída a la ayuda de la componente TUpdateSql. Esta componente se usa precisamente para casos como el tuyo.

// Saludos

nefy
19-06-2004, 21:06:31
Hola Roman, tarde pues me puse a seguir tu consejo y solo tengo un ultimo problema. Genero la consulta y campos persistentes para el Query q la construye. Ademas añadi un campo calculado (MONTOCOMISION) q obtiene el total q deseo asignar a un campo fisico (COMISION) de una de las tablas involucradas en la consulta, ahora lo q me falta es pasarle una clave consecutiva para identificar a los regsitros incluidos en dicha consulta en particular y el valor del campo calculado que corresponde a cada registro.
Hago lo siguiente en AfterPost de la cabecera:

procedure TDM.ComisionesAfterPost(DataSet: TDataSet);
begin
UpdateComision.ModifySQL.Text:='update Ventas_Mov '+
'set '+
' CLAVECOMISION = :'+QuotedStr(IntToStr(ComisionesCLAVE.Value))+','+
' COMISION = :MONTOCOMISION '+
' where'+
' NUM_RECIBO = :OLD_NUM_RECIBO and'+
' NCONTRATO = :OLD_NCONTRATO and'+
' IDUsuario = :OLD_IDUsuario and'+
' FECHA = :OLD_FECHA and'+
' EFECTIVO = :OLD_EFECTIVO and'+
' CHEQUE = :OLD_CHEQUE and'+
' BANCO = :OLD_BANCO and'+
' NUM_CHQ = :OLD_NUM_CHQ and'+
' CVE_COBRADOR = :OLD_CVE_COBRADOR and'+
' CLAVECOMISION = :OLD_CLAVECOMISION and'+
' COMISION = :OLD_COMISION';
UpdateComision.ExecSQL(ukModify);
DetailComision.ApplyUpdates;
end;
Y el error es que al dar ExecSQL, me manda un mensaje de error q dice q el valor de COMISIONESClave.Value no es un campo. La razon es obvia pues no es un campo de la consulta. Pero el punto es q debo de asignar dicho valor a todos los registros. Asi q cual es la sintaxis para q acepte dicho valor?. Busque en los mensajes del Foro y en la ayuda de Delphi pero no encontre la solucion.

Espero haberme explicado.

Salu2.

Nota: Al asignar update Object al Query la Rejilla me permite agregar valores y supuestamente se guardan pero no ocurre en la realidad.

nefy
21-06-2004, 19:19:19
Hola una vez mas, leyendo mas acerca del UpdateSQL encontre q este permite editar sobre el resultado de la consulta pero segun como el desarrollador lo establezca se estaran vaciando los datos almacenados en cache a la base de datos y como mi sistema estara en red intente hacer la actualizacion despues de guardar en la tabla de cabecera asi:
MyQuery.Database.StartTransaction;
try
MyQuery.ApplyUpdates;
MyQuery.Database.Commit;
MyQuery.CommitUpdates;
except
MyQuery.Database.Rollback;
end;
Pero envia una excepcion ("Type mistmatch Expresion"), a decir verdad no encuentro la razon de dicha excepcion pues ya no modifico la sentencia de actualizacion generada por el UpdateSQLEditor, sino q solo "vuelco los datos" a la Bd con las instrucciones anteriorermente citadas. El codigo q me genera el editor es:
update Ventas_Mov
set
NUM_RECIBO = :NUM_RECIBO,
NCONTRATO = :NCONTRATO,
IDUsuario = :IDUsuario,
FECHA = :FECHA,
EFECTIVO = :EFECTIVO,
CHEQUE = :CHEQUE,
BANCO = :BANCO,
NUM_CHQ = :NUM_CHQ,
CVE_COBRADOR = :CVE_COBRADOR,
CLAVECOMISION = :CLAVECOMISION,
COMISION = :COMISION
where
NUM_RECIBO = :OLD_NUM_RECIBO and
NCONTRATO = :OLD_NCONTRATO and
IDUsuario = :OLD_IDUsuario and
FECHA = :OLD_FECHA and
EFECTIVO = :OLD_EFECTIVO and
CHEQUE = :OLD_CHEQUE and
BANCO = :OLD_BANCO and
NUM_CHQ = :OLD_NUM_CHQ and
CVE_COBRADOR = :OLD_CVE_COBRADOR and
CLAVECOMISION = :OLD_CLAVECOMISION and
COMISION = :OLD_COMISION


Esperando haberme explicado escucho sugerencias.
Salu2