Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-12-2004
[Nbull] Nbull is offline
Miembro Premium
 
Registrado: nov 2004
Ubicación: Valencia-España
Posts: 168
Poder: 20
Nbull Va por buen camino
Question Query1 cannot modify a read-only dataset

Hola, voy directo al grano tenia mi programa basado todo en Ttable,pero, las busquedas con muchos registros se hacen muy lentas, entonces decidi pasarlo a Tquery por que me comentasteis algunos del foro que al realizar las busquedas bajo Sql iria mucho más rapido.Esto es verdad y asi lo solucione, lo que pasa es que cuando quiero insertar o eliminar registros de mis tablas me sale:

'Query1: cannot modify a read-only dataset'

En principio pense que seria por que no habia puesto el query en edit o en insert pero me sigue pasando igual,asi que no se como solucionarlo.

Para añadir mis registros hago : Query1.post; igual que con las Ttables no se si lo hago bien o esta ahi el problema.

Muchas Gracias a Todos.


Un Saludo
Responder Con Cita
  #2  
Antiguo 09-12-2004
ramonibk ramonibk is offline
Miembro
 
Registrado: may 2004
Posts: 193
Poder: 20
ramonibk Va por buen camino
has probado a usar qyr de ADO.??????

a mi me estan funcionando sin problema.
Responder Con Cita
  #3  
Antiguo 09-12-2004
[Nbull] Nbull is offline
Miembro Premium
 
Registrado: nov 2004
Ubicación: Valencia-España
Posts: 168
Poder: 20
Nbull Va por buen camino
Pues la verdad es que no he probado, en principio debe ser igual que el Query normal, nada mas que lo tienes que conectar con la base de datos no?


De todas formas ¿se trabaja de la misma forma con los querys que con las tables?
Responder Con Cita
  #4  
Antiguo 09-12-2004
ramonibk ramonibk is offline
Miembro
 
Registrado: may 2004
Posts: 193
Poder: 20
ramonibk Va por buen camino
Bueno yo soy bastante novato en todos estos temas. pero por las pruebas que he echo me he encontrado que con los qry estandar tienes que generar parametros insert o Update independientes. dirigiendolos a las tablas. pero con los ADO es mas sencillo de echo si tu añades a un qryADO un DBNavigator veras que automaticamente te añade las funciones de insercion y modificacion lo que no pasa con los qry estandar.
Responder Con Cita
  #5  
Antiguo 09-12-2004
[Nbull] Nbull is offline
Miembro Premium
 
Registrado: nov 2004
Ubicación: Valencia-España
Posts: 168
Poder: 20
Nbull Va por buen camino
Muchas gracias Ramonibk, de momento ya me deja hacer un post y me ha habilitado los botones del DbNavigator que se me habian anulado el de borrar registros y de refrescar la tabla.

Ahora me ha surjido otro problema, no se como se borran registros de la tabla.Tengo un dbgrid y un botón y el codigo que he usado es el siguiente:

Código Delphi [-]
var
button : integer;
begin
button := application.messagebox ('¿Realmente desea borrar la empresa?', 
'¿Seguro?', MB_yesno + mb_iconwarning); // Mostramos un mensaje de advertencia
if button = IDYes then begin // Si ha pulsado si...
Query2.Edit;
Query2.SQL.Text:='DELETE * FROM agenda WHERE Nombre');
Query2.open; // Borramos el registro activo.
end else // sino, no hacemos nada.
No se que puede estar mal pero me dice que no puede borrar varios recordset.A ver si me puedes ayudar.

Lo dicho muchas gracias y un Saludo

Última edición por Nbull fecha: 10-12-2004 a las 09:46:08.
Responder Con Cita
  #6  
Antiguo 09-12-2004
MiguelC MiguelC is offline
Miembro
 
Registrado: oct 2003
Ubicación: República Dominicana
Posts: 15
Poder: 0
MiguelC Va por buen camino
Query1 cannot mod...

Hola.
Bueno yo uso los Objetos Querys Standard incluso para hacer un mantenimiento completo a una tabla en específico (SELECT, INSERT, UPDATE, DELETE) y funcionan bien. Por la parte del código que publicas veo que quieres hacer un open (Query2.open), pero estas utilizando una sentencia SQL para actualización, como el Delete, y tanto el Delete, como el Insert y el UpDate, cuando se usan en Objetos Querys, lo correcto es ejecutar un “ExecSQL”, osea, tendrías (Query2.ExecSQL) porque usas un Delete, si fuerea un Select, entonces si deberias hacer un “Open”.
Por otra parte y en el mismo orden , veo que estás utilizando un “Where” como condición del borrado que quieres hacer, pero por lo menos en el código que enviaste noto el siguiente error:

Tu código Incorrecto:
Query2.SQL.Text:='DELETE * FROM agenda WHERE Nombre');

Lo correcto:
Ejemplo: Quieres Borrar Un Registro que tiene entre otras cosas un campo llamado Nombre que tiene almacenado --> ‘Juan’…
Entonces para que tengas la idea, podría ser:
VariableNombre:= ‘Juan’;
y sustituye tu línea de código por esta:

Query2.SQL.Text:='DELETE * FROM agenda WHERE Nombre = ' + QuotedStr(VariableNombre) );

En Resumen yo utilizaría los Querys Standar, y sería algo como esto:

Query2.Close;
Query2.Clear;
Query2.SQL.Text:='DELETE * FROM agenda WHERE Nombre = ' + QuotedStr(VariableNombre) );
Query2.ExecSQL; // Borramos el registro activo.

Y si lo quieres un poco más decente:

With Query2 Do
Begin
Close;
Sql.Clear;
Sql.Text:='DELETE * FROM agenda WHERE Nombre = ' + QuotedStr(VariableNombre));
ExecSQL;
End;

Suerte...
__________________
"La unión del Código hace la Fuerza" LMCV
Responder Con Cita
  #7  
Antiguo 10-12-2004
marcost marcost is offline
Registrado
 
Registrado: abr 2004
Posts: 9
Poder: 0
marcost Va por buen camino
Tambien puedes parametrizar la consulta

Código:
with TADOQuery.Create (Self) do 
begin
   SQL.Add ('DELETE FROM AGENDA WHERE Nombre = :Nombre'); 
   Parameters.ParamByName ('Nombre').Value := VariableNombre;
   ExecSQL;
 end;
Suerte
Responder Con Cita
  #8  
Antiguo 10-12-2004
[Nbull] Nbull is offline
Miembro Premium
 
Registrado: nov 2004
Ubicación: Valencia-España
Posts: 168
Poder: 20
Nbull Va por buen camino
Hola a los dos, os cuento he probado vuestro codigo y no me funciona, me produce una excepción en las dll del Ado o algo asi. Mi pregunta es:

Tengo un Dbgrid en el que se visualiza mi tabla agenda y un botón Borrar que lo que quiero que haga es borrar el registro que este seleccionado, estoy gastando AdoQuery y la verdad que si puedo hacerlo con el mejor por que no me apetece cambiarme otra vez a los query normales por que hay cosas que solo me van con los Ado.Podeis ayudarme el código que tengo ahora mismo para el Boton es esl siguiente:
Código Delphi [-]
procedure TForm1.BorrarClick(Sender: TObject);
var
button : integer;
begin
button := application.messagebox ('¿Realmente desea borrar la empresa?', 
'¿Seguro?', MB_yesno + mb_iconwarning); // Mostramos un mensaje de advertencia
if button = IDYes then begin // Si ha pulsado si...
Query2.Insert;
Query2.ClearFields;
Query2.SQL.Text:='DELETE * FROM agenda WHERE Nombre='+ quotedStr(DbNombre2.Field.Text);
Query2.ExecSQL; // Borramos el registro activo.
end else // sino, no hacemos nada.
end;

Y me sale esta excepción:

'Access violation at address 1F453E6E in module Msado15.dll'

Supongo que sera porque el código que me habeis dicho es para querys normales y yo uso los Adoquerys, la verdad es que no tengo ni pajolera idea de por que me sale esto.

Ante todo daros las gracias por vuestro tiempo.

Un Saludo.

Última edición por Nbull fecha: 10-12-2004 a las 09:47:13. Razón: Salia muy grande el mensaje
Responder Con Cita
  #9  
Antiguo 10-12-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Te recomiendo utilizar los componentes "ADOCommand" cuando quieras realizar un delete. La instrucción SQLde borrado la pones en el CommandText y la ejecutas con Execute.

No debe darte ningún error. Espero que te sirva. Un saludo.
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
Responder Con Cita
  #10  
Antiguo 10-12-2004
[Nbull] Nbull is offline
Miembro Premium
 
Registrado: nov 2004
Ubicación: Valencia-España
Posts: 168
Poder: 20
Nbull Va por buen camino
Muchas gracias Javier,pero no consigo que me borre el registro que tengo seleccionado, me ha borrado toda la tabla menos mal que lo primero que cree fue la rutina de la copia de seguridad .

¿Me puedes decir que cadena he de poner en el AdoCommand para que me borre el registro seleccionado en el Dbgrid?

Muchisimas Gracias, sino fuera por esta comunidad no se que seria de muchos de nosotros.
Un saludo.
Responder Con Cita
  #11  
Antiguo 10-12-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Suponiendo que el ADOCommand se llame ADOCommand1 y el DBGrid está asociado al DataSource de nombre DataSource1, el texto a poner es como te había comentado Nbull y completo podría ser:
Código Delphi [-]
ADOCommand1.CommandText:='DELETE * FROM agenda WHERE nombre=:nombre';
ADOCommand1.Parameters.Paramvalues['nombre'] := QuotedStr(DataSource1.DataSet.FieldByName('nombrecampo').asString);
ADOCommand1.Execute;
Por supuesto, debes tener configurada la propiedad "Connection" del ADOCommand, para poder conectarte a la BD.

Un saludo.
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
Responder Con Cita
  #12  
Antiguo 10-12-2004
[Nbull] Nbull is offline
Miembro Premium
 
Registrado: nov 2004
Ubicación: Valencia-España
Posts: 168
Poder: 20
Nbull Va por buen camino
Pues muchas Gracias Javier, pero, ahora no me da error pero no me borra elregistro seleccionado, no me hace nada, lo he puesto conforme tu me has dicho la conexion la hago bien,pero el ca... no me borra el registro, no se como lo podre solucionar.

Si sabes lo que le puede pasar cuentamelo, muchas gracias de todos modos.
Responder Con Cita
  #13  
Antiguo 14-12-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
Hola, te recomiendo que traces la ejecución, parándote en la línea de la instrucción Execute, en ese momento vas al menú "Run" y con la opción Evaluate o Inspect, le pides que te de el contenido de "ADOCommand1.CommandText", así podrás ver la instrucción con la sustitución del parámetro "nombre" y podrás copiarla y llevártela a Access para probarla.

Un saludo.
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
Responder Con Cita
  #14  
Antiguo 14-12-2004
[Nbull] Nbull is offline
Miembro Premium
 
Registrado: nov 2004
Ubicación: Valencia-España
Posts: 168
Poder: 20
Nbull Va por buen camino
Hola Javier, al final ya lo solucione, el problema es que no me cogia el parametro 'nombre' cuando tu ponias:

Cita:
ADOCommand1.CommandText:='DELETE * FROM agenda WHERE nombre=:nombre';
no me ponia el registro seleccionado, lo solucione asi:
Código Delphi [-]
 
ADOCommand1.CommandText:='DELETE * FROM agenda WHERE Nombre='+ QuotedStr(DataSource3.DataSet.FieldByName('Nombre').asString);

Ahora solo me falta que me refresque la tabla cuando borro el registro, pero eso ya se hacerlo, Muchas gracias por tu ayuda.
Responder Con Cita
  #15  
Antiguo 14-12-2004
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
La solución es correcta, pero si quieres utilizar de todas maneras el parámetro, solo debes darle un espacio entre el nombre del parámetro y la comilla simple
Código Delphi [-]
ADOCommand1.CommandText:='DELETE * FROM agenda WHERE nombre=:nombre ';
Un saludo.
__________________
Se hace lo que se puede que siempre es menos de lo que se dice
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 10:29:59.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi