Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   Clientdataset - Insert / update registros (https://www.clubdelphi.com/foros/showthread.php?t=84803)

vicens22 08-12-2013 16:15:07

Clientdataset - Insert / update registros
 
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:

Código Delphi [-]
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

Comprueba el Status y afecta los cambios...
 
Código Delphi [-]
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

LoQueYoUso
 
Utilizo cuatro botones: Altas, Guardar,Modificar y Cancelar. Es una base de datos de mamíferos con orden, familia y especies.
Código Delphi [-]
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.
Código Delphi [-]
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
Código Delphi [-]
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

Código Delphi [-]
 (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


La franja horaria es GMT +2. Ahora son las 18:24:56.

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