Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Providers
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-10-2008
Buelos Buelos is offline
Miembro
 
Registrado: jun 2007
Posts: 51
Poder: 11
Buelos Va por buen camino
no puedo hacer applyupdates en clientdataset

Buenas tardes compañeros, tengo un problema que me esta matando la cabeza, he probado de todo y no he dado con el chiste, ojala me puedan ayudar, estoy desarrollando una aplicacion cliente servidor, en el servidor uso componentes ibx (actualizados a la version 7.04 esto lo encontre en un blog), tengo un ibdatabase un ibtansaction, un datasetprovider y un ibquery con la siguiente sentencia sql
Código SQL [-]delete from profesores where nombreProf=:ProfesorAEliminar

en el cliente tengo un socketconnection, un clientdataset, un datasource, un edit y un boton, al hacer click en el boton debe tomarme lo que esta en el edit pasarlo como parametro al clientdataset y ejecutarme la sentencia sql del servidor y eliminarme los registros correspondientes, en el boton tengo este codigo
Código Delphi [-]form1.ClientDataSet2.Params[0].AsString:=form1.Edit2.Text; form1.ClientDataSet2.Execute;

si lo hago asi, lo elimina correctamente pero el cambio no se ve reflejado en mi bd hasta que cierro mi aplicacion, yo necesito que se vea reflejado inmediatamente, segun lo que he leido en diferentes foros manuales y tutoriales esto lo hago con la funcion applyupdates(), pero al poner esta funcion me bota un error "project Project1.exe raised exception class EDatabaseError whit message 'ClientDataSet2:Cannot perfom this operation on a closed dataset'. Process stopped. Use Step or Run to continue". ahora segun esto entonces yo pongo la siguiente linea de codigo antes del applyupdate Código Delphi [-]form1.ClientDataSet2.Open;

, y al hacer esto entonces me bota el siguiente error "project Project1.exe raised exception class EDBClient whit message 'Mismatch in datapacket.'.Process stopped. Use Step or Run to continue"., Este mismo error aparece cuando trato de poner la propiedad del clientdataset active:=true, sea por codigo o en el objetcinspector. La verdad he probado mil y mil cosas y la verdad ya no tengo mas ideas, no se si el error este en el clientdataset o en la sentencia sql o en donde, agradesco en el alma cualquier ayuda u orientacion que me puedan brindar. muchas gracias de antemano por el interes el tiempo y la ayuda que me puedan brindar chao
Responder Con Cita
  #2  
Antiguo 23-10-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 259
Poder: 15
Rockin Va por buen camino
pon el siguiente codigo en tu servidor de capa intermedia, en el evento ApplyUpdates de tu DataSetProvider:

Código Delphi [-]
if TTransaction.InTransaction then
begin
      TTransaction.Commit;
end;

Espero que te valga.
Responder Con Cita
  #3  
Antiguo 23-10-2008
Buelos Buelos is offline
Miembro
 
Registrado: jun 2007
Posts: 51
Poder: 11
Buelos Va por buen camino
Hola rockin muchas gracias por la ayuda, la he implementado y no ha hecho nada, no se pero tengo la impresion ke mi problema viene del ibquery o del clientdataset pero no he dado con el chiste, en todas partes donde he leido dicen ke ddebo poner el applyupdates en el evento afterpost pero es que nisquiera llego a ese evento es decir cuando pongo clientdataset.post me dice ke el cds no esta en modo insercion le pongo el clientdataset.insert o .edit y me dice que el datasetdebe estar abierto, pongo clientdataset.open y me arroja el error de mismatch in datapacket, ke es lo mismo que me pasa cuando intento poner en true la propiedad active, la verdad no se que esta pasando si sirve de ayuda el codigo sql que pongo en el ibquery es
Código SQL [-]
delete campo1 from tabla where campo2=arametro
no se que estoy haciendo mal, cualquier pista es bienvenida muchas gracias por el tiempo y la voluntad, ya estoy super cabezon con esto de nuevo muchas gracias y ojala puedan ayudarme
Responder Con Cita
  #4  
Antiguo 24-10-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 259
Poder: 15
Rockin Va por buen camino
Para borrar datos con un ClientDataSet debes de implementarlo de la siguiente manera, por ejemplo;

Código Delphi [-]
with CDSClientes do
Close;
CommandText:= 'select * from clientes where cod_cliente= :cod_cliente'
Params.ParambyName('cod_cliente').AsInteger:= StrToint(txtCodCliente.text);
Open;
Delete;
end;

Cambia la sentencia SQL para elegir el registro a borrar, una vez hecho eso tienes que poner en el evento AfterDelete del CDSClientes lo siguiente;

Código Delphi [-]
CDSClientes.ApplyUpdates(0);

Así para borrar, para insertar o modificar es igual pero en vez de DELETE pon INSERT para insertar y EDIT para borrar, luego tienes que llamar al POST y haber puesto en el evento CDSClientes.AfterPost, lo mismo que antes, es decir:

Código Delphi [-]
CDSClientes.ApplyUpdates(0);

Pruebalo, tiene que funcionarte.

Suerte
Responder Con Cita
  #5  
Antiguo 25-10-2008
Buelos Buelos is offline
Miembro
 
Registrado: jun 2007
Posts: 51
Poder: 11
Buelos Va por buen camino
Gracias por la ayuda Rockin eh hecho lo que me recomendo y ma salio perfecto, en serio muchas gracias por todo, no sabe lo importante que era para mi resolver este conflicto de verdad muchas gracias.
Responder Con Cita
  #6  
Antiguo 26-10-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 259
Poder: 15
Rockin Va por buen camino
De nada, me alegro de que te funcione. Para eso estamos por aqui.

Saludos.
Responder Con Cita
  #7  
Antiguo 27-10-2008
Buelos Buelos is offline
Miembro
 
Registrado: jun 2007
Posts: 51
Poder: 11
Buelos Va por buen camino
Problema al modificar

Buenas tardes rockin otra ves yo por aca, que pena tanta molestia, pero es que tengo un nuevo problema, la solucion esta perfecta, cuando elimino o inserto (con algunas modificaciones de orden) me funciona correctamente, pero cuando trato de modificar hago el mismo procedimiento pero no he podido me bota errores, cuando lo hago asi
Código Delphi [-]
with ClientDataSet2 do
begin
Close;
CommandText:='select * from materia WHERE nombre_materia=:materia';
open;
edit;
Params.ParambyName('materia').AsString:=edit1.Text;
Params.ParambyName('id').AsInteger:=strtoint(edit2.Text);
post;
end;
me bota un error que dice Project Project1.exe raised exception class EDatabaseError whit message 'ClientDataSet2:Parameter 'id' not found'. Process stopped. Use Step or Run to continue.
segun lo que he analizado y las pruebas que he hecho este error lo bota porke en el commandtext no le paso el parametro de id, entonces trato de incluir en el commandtext el parametro id y lo hago asi
Código Delphi [-]
CommandText:='select * from materia WHERE nombre_materia=:materia or id_materia=:id';
pero al hacer esto me dice Project Project1.exe raised exception class EDatabaseError whit message 'field 'Nombre_materia' must have a value'. Process stopped. Use Step or Run to continue.
he probado muchas cosas y nada me ha resultado, puede ke sea una bobada la verdad no se pero ya me estan saliendo canas verdes tratando de arreglar esto, le agradeceria si me pudiera ayuda, y muchas gracias por toda la atencion y el tiempo dedicado a la solucion de mi problema.
se me olvidaba el codigo ke tiene el ibquery es el siguiente
Código SQL [-]
UPDATE materia
 SET nombre_materia=:materia
 WHERE id_materia=:id
le agradesco en el alma cualquier ayuda que me pueda brindar chao
Responder Con Cita
  #8  
Antiguo 27-10-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 259
Poder: 15
Rockin Va por buen camino
Así por encima tienes que realizar lo siguiente:

Vete a tu DataSet del Servidor de Capa Intermedia, con el boton derecho pulsa en Fields Editor, añade todos los campos de la tabla.

Luego elige el campo Key que entiendo será el ID, y en sus propiedades dile que es el KeyFields, ahora en la propiedad ProviderFlags pon a true el pfInKey.

Vete a tu DataSetProvider y pon la propiedad UpdateMode a upWhereKeyOnly.

Prueba a ver que tal y nos cuentas.

Saludos.
Responder Con Cita
  #9  
Antiguo 27-10-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 259
Poder: 15
Rockin Va por buen camino
Pon lo siguiente:

Código Delphi [-]
with ClientDataSet2 do
begin
Close;
CommandText:='select * from materia WHERE nombre_materia=:materia and id = :id';
open;
edit;
Params.ParambyName('materia').AsString:=edit1.Text;
Params.ParambyName('id').AsInteger:=strtoint(edit2.Text);
post;
end;


Y no olvide realizar lo siguiente:

Vete a tu DataSet del Servidor de Capa Intermedia, con el boton derecho pulsa en Fields Editor, añade todos los campos de la tabla.

Luego elige el campo Key que entiendo será el ID, y en sus propiedades dile que es el KeyFields, ahora en la propiedad ProviderFlags pon a true el pfInKey.

Vete a tu DataSetProvider y pon la propiedad UpdateMode a upWhereKeyOnly.

Prueba a ver que tal y nos cuentas.

Saludos.[/quote]
Responder Con Cita
  #10  
Antiguo 27-10-2008
Buelos Buelos is offline
Miembro
 
Registrado: jun 2007
Posts: 51
Poder: 11
Buelos Va por buen camino
Hola rockin ya hice lo que me indico y nada que me quiere funcionar ahora me genera un nuevo error este dice Project Project1.exe raised exception class EDBClient whit message 'Field value required'. Process stopped. Use Step or Run to continue. hice todos los pasos como me indico, no se que pueda estar mal, ojala pueda ayudarme una ves mas a solucionar mi problema, estare aca atento y pues haciendo pruebas en mi aplicacion, de nuevo muchas gracias por toda la ayuda y la colaboracion y espero pueda ayudarme, muchas gracias y chao
Responder Con Cita
  #11  
Antiguo 28-10-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 259
Poder: 15
Rockin Va por buen camino
Perdona me he confudido ponlo siguiente
Código Delphi [-]
with ClientDataSet2 do
begin
Close;
CommandText:='select * from materia WHERE  id = :id'; //sentencia para buscar el registro que quieras modifcar
Params.ParambyName('id').AsInteger:=strtoint(edit2.Text);
open;
edit;
FieldByname('materia').AsString:=edit1.Text;
post;
end;

Primero haz la consulta del registro que quieres modificar, y luego lo modifics con FieldByname, prueba a ver que tal.

Saludos.

Última edición por Rockin fecha: 28-10-2008 a las 20:17:25.
Responder Con Cita
  #12  
Antiguo 29-10-2008
Buelos Buelos is offline
Miembro
 
Registrado: jun 2007
Posts: 51
Poder: 11
Buelos Va por buen camino
Muchisisisisisimas gracias

hola rockin mil y mil gracias, me ha salvado la vida ahora todo me funciona correctamente, esa era la solucion, ya esta funcionando como debe ser, de nuevo muchisimas gracias, no tengo como pagarle por la ayuda, pero tenga por seguro que lo pondre en los agradecimientos de mi tesis, de nuevo muchisimas gracias por la ayuda y la dedicacion a la solucion de mi problema. gracias y chao
Responder Con Cita
  #13  
Antiguo 29-10-2008
Rockin Rockin is offline
Miembro
 
Registrado: may 2003
Ubicación: Málaga
Posts: 259
Poder: 15
Rockin Va por buen camino
Nada para eso estamos para ayudarnos, me alegro que te haya valido.

Saludos.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Duda con CancelUpdates y ApplyUpdates con ClientDataSet David Conexión con bases de datos 1 11-02-2011 20:00:07
ayuda ClientDataSet, DataSetProvider y ApplyUpdates cmm07 Varios 1 23-03-2008 08:27:28
ClientDataSet - ApplyUpdates luchopriet Providers 8 17-11-2007 09:19:21
No puedo hacer un LOCATE [], con un ClientDataSet David Conexión con bases de datos 2 13-06-2007 19:01:17
Error en Applyupdates() de ClientDataSet con TIbQuery y Delphi 7 jmoran Conexión con bases de datos 1 16-07-2003 18:47:03


La franja horaria es GMT +2. Ahora son las 10:55:42.


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