Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Providers (https://www.clubdelphi.com/foros/forumdisplay.php?f=10)
-   -   no puedo hacer applyupdates en clientdataset (https://www.clubdelphi.com/foros/showthread.php?t=61027)

Buelos 22-10-2008 19:39:13

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

Rockin 23-10-2008 12:35:44

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.

Buelos 23-10-2008 20:00:47

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=:parametro
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

Rockin 24-10-2008 14:42:48

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

Buelos 25-10-2008 02:55:36

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.

Rockin 26-10-2008 19:25:06

De nada, me alegro de que te funcione. Para eso estamos por aqui.

Saludos.

Buelos 27-10-2008 19:20:07

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

Rockin 27-10-2008 19:39:37

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.

Rockin 27-10-2008 19:42:25

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]

Buelos 28-10-2008 00:13:01

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

Rockin 28-10-2008 07:06:10

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.

Buelos 29-10-2008 01:18:25

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

Rockin 29-10-2008 11:04:28

Nada para eso estamos para ayudarnos, me alegro que te haya valido.

Saludos.


La franja horaria es GMT +2. Ahora son las 10:33:37.

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