PDA

Ver la Versión Completa : Clientdataset - Insert / update registros


vicens22
08-12-2013, 16:15:07
Buenas tardes,

Sigo con las pruebas con el uso de datasnap server, conectado con una bd ms sql para la gestión de datos desde un dispositivo Android.

Ya conseguí poder recuperar datos en un listbox y selecionando una fila mostrar los datos completos de un registro.
Ahora intento poder modificar o añadir registros a una tabla, utilizando el mismo componente que utilizo para recuperarlos, un clientdataset. Es la primera vez que lo utilizo, por ello imagino que me estoy dejando algo importante, pero de momento no consigo descubrirlo. Tanto al intentar modificar un registro, como al intentar añadir uno nuevo, aunque no me lanza ningún error, el registro no se modifica o crea.

El código que utilizo es el siguiente:

procedure TuFichaCliente.BtnEditDatosGenClick(Sender: TObject);
var nModificados :integer;
begin

if cds_FichaCli.State in dsEditModes then begin
btnEditDatosGen.StyleLookup:='composetoolbutton';
cds_FichaCli.Edit;
cds_FichaCli.FieldByName('Direccion').value := edDireccion.Text;
cds_FichaCli.Post;
nModificados := cds_FichaCli.ChangeCount;
showmessage('nModificados='+inttostr(nModificados));
cds_FichaCli.ApplyUpdates(0);
end
else begin
btnEditDatosGen.StyleLookup:='donetoolbutton';
// cds_FichaCli.Edit;
edEmpresa.SetFocus;
end;


end;

Como podeis ver, en este código solo pretento modificar el campo dirección, por el introducido en un campo edit, pero la modificación no se realiza en ningún caso. También he intentado añadir un registro nuevo sin éxito.

Alguien puede echarme un cable ??
Gracias anticipadas ... !!!

Saludos,

Vicens

juanelo
08-12-2013, 17:37:59
Que tal,
Recuerda que para poder hacer uso del applyupdates y este realice las operaciones en la base de datos, necesitas que tu CDS tenga ligado un TDataSetProvider para poder dirigir los cambios a la BD.

vicens22
08-12-2013, 19:03:44
Hola,

Si, efectivamente tengo un componente TDSproviderConnection conectado al ClienteDataSet, de hecho la conexión con la base de datos y la tabla de clientes funciona correctamente y puedo recuperar sin problema los registros.
Lo que no consigo es poder modificar o añadir un registro, aunque como he explicado no me lanza ningún error.

Gracias.

Saludos,

Vicens

bulc
09-03-2014, 22:11:43
If DataSource1.DataSet.State in [dsInsert, dsEdit] then
begin
ClientDataSet1.Post;
ClientDataSet2.ApplyUpdates(0) // Máximo un error
end

Lo podrías ampliar para hacer más comprobaciones de los campos, en aras de blindar la operación.
También puedes usar el evento AfterInsert que se realizó la operación.

vicens22
13-03-2014, 20:49:56
Buenas tardes,

Finalmente conseguí resolverlo.
Muchas gracias por la ayuda.

Saludos,

Vicente

juanelo
13-03-2014, 21:47:24
Sería ilustrativo para todos que compartas la solución.

tulio
05-05-2014, 14:25:00
Hola Vicens22

te cuento que estoy con el mismo problema que planteaste en este hilo, te pido por favor si podes mostrar la parte del codigo que pudiste hacer el insert en el clientdataset

saludos

tulio

bulc
05-05-2014, 17:23:22
Utilizo cuatro botones: Altas, Guardar,Modificar y Cancelar. Es una base de datos de mamíferos con orden, familia y especies.

procedure TForm1.BitBtn2Click(Sender: TObject); //Guardar Familia
begin
if (ClientDataSet3.State in [dsEdit, dsInsert]) then
begin
ClientDataSet3.Post;
ClientDataSet3.ApplyUpdates(-1);
//DataSource1.DataSet.Refresh; // Da 'Error catastrófico' !!
DBGrid1.Columns[0].Font.Color:= clNavy;
end else
ClientDataSet3.Cancel;
end;

procedure TForm1.BitBtn3Click(Sender: TObject); //CANCELAR CDS2
begin
if ClientDataSet3.State in [dsInsert, dsEdit] then
ClientDataSet3.Cancel;
end;

procedure TForm1.BitBtn5Click(Sender: TObject); // ALTA ESPECIE cds3
begin
if ClientDataSet3.State in [dsBrowse] then
ClientDataSet3.Insert;
ClientDataSet3.FieldByName('ENUM').AsInteger:= StrToInt(Label2.Caption)+1;
Button1.Click;
EsAltaE:=True;
end;

procedure TForm1.BitBtn6Click(Sender: TObject); //GUARDA ESPECIE
begin
if ClientDataSet3.State in [dsInsert, dsEdit] then
begin
if DataSource3.DataSet.FieldByName('ESP').asString='' then
begin
ClientDataSet3.Cancel;
Button2.Click; // EEDIT_NO
EsAltaE:=False;
Exit;
end else
begin
ClientDataSet3.Post;
ClientDataSet3.ApplyUpdates(-1);
//Detrás del Apply porque así el nuevo número ya se guardó.
REVISA_GEN_ESP(IBQuery3, esAltaE, Label2);
end;
end;
Button2.Click; //EEDIT_NO
EsAltaE:=False;
BitBtn5.Enabled:=True;
BitBtn8.Enabled:=True;
end;

procedure TForm1.BitBtn7Click(Sender: TObject); // CANCELAR ESPECIE 3
begin
if ClientDataSet3.State in [dsInsert, dsEdit] then
ClientDataSet3.Cancel;
end;

Para automatizar el incremento del nº de registro uso: Select GEN_ID(GEN_ESP, 1) FROM RDB$DATABASE, cuando es un Alta de nuevo registro. (Variable EsAlta:=True).
Espero que se entienda. Aquí la función externa para el autoincremento.

Function REVISA_GEN_ESP( IBQuery3: TIBQuery; EsAltaE : Boolean ; Label2: TLabel) : Integer;
Var
Avance : String; // Si EsNuevo=True, then Avance is 1.
begin
if EsAltaE then Avance:='1' else Avance:='0';
IBQuery3.Close;
IBQuery3.SQL.Clear;
IBQuery3.SQL.ADD('SELECT GEN_ID( GEN_ESP,'+Avance+' ) FROM RDB$DATABASE');
IBQuery3.Open; // Primero se abre y luego se recoge el resultado;
Result := IBQuery3.Fields[0].AsInteger;
Label2.Caption:= IntToStr(Result); // Label2 = GEN_ESP de ESPECIE.
EsAltaE:=False;
END;

Suerte,
Bulc

tulio
05-05-2014, 18:03:22
Gracias Bult

te cuento, estoy tratando de hacer un alta de un registro desde una aplicacion android sobre un servidor datasnap, el mismo corre en una pc que tiene una ip fija y apunta a una tabla de firebird 2.5 , las consultas la puedo hacer sin problemas viendo los registros en mi celular, pero al querer dar un alta no puedo.

si coloco este codigo clientmodule1.Jcalles.insert;
clientmodule1.JCallesCODIGO.AsString:='CODIGO';
clientmodule1.JCallesDESCRI.AsString:='DESCRIPCION';
Clientmodule1.JCalles.Post;

no da error , lo ejecuta , pero cuando reviso la tabla no hay nada grabado

Cuando uso parte del codigo que me recomendaste

(Clientmodule1.JCalles.State in [dsEdit, dsInsert]) then
begin
Clientmodule1.JCalles.Post;
Clientmodule1.JCalles.ApplyUpdates(-1);

me dice que no reconoce dsedit y dsinsert, Me faltara alguna UNIT ?

Saludos y muchas Gracias

tulio