Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Desarrollo en Delphi para Android
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-12-2013
vicens22 vicens22 is offline
Miembro
NULL
 
Registrado: dic 2010
Posts: 61
Poder: 14
vicens22 Va por buen camino
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

Última edición por Casimiro Notevi fecha: 09-03-2014 a las 22:42:53.
Responder Con Cita
  #2  
Antiguo 08-12-2013
Avatar de juanelo
juanelo juanelo is offline
Miembro
 
Registrado: sep 2007
Posts: 1.083
Poder: 18
juanelo Va por buen camino
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.
__________________
Ya tengo Firma!
Responder Con Cita
  #3  
Antiguo 08-12-2013
vicens22 vicens22 is offline
Miembro
NULL
 
Registrado: dic 2010
Posts: 61
Poder: 14
vicens22 Va por buen camino
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

Última edición por vicens22 fecha: 08-12-2013 a las 19:15:51.
Responder Con Cita
  #4  
Antiguo 09-03-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 415
Poder: 14
bulc Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 13-03-2014
vicens22 vicens22 is offline
Miembro
NULL
 
Registrado: dic 2010
Posts: 61
Poder: 14
vicens22 Va por buen camino
Buenas tardes,

Finalmente conseguí resolverlo.
Muchas gracias por la ayuda.

Saludos,

Vicente
Responder Con Cita
  #6  
Antiguo 13-03-2014
Avatar de juanelo
juanelo juanelo is offline
Miembro
 
Registrado: sep 2007
Posts: 1.083
Poder: 18
juanelo Va por buen camino
Sería ilustrativo para todos que compartas la solución.
__________________
Ya tengo Firma!
Responder Con Cita
  #7  
Antiguo 05-05-2014
tulio tulio is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 300
Poder: 21
tulio Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 05-05-2014
Avatar de bulc
bulc bulc is offline
Miembro
 
Registrado: jun 2010
Posts: 415
Poder: 14
bulc Va por buen camino
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
Responder Con Cita
  #9  
Antiguo 05-05-2014
tulio tulio is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 300
Poder: 21
tulio Va por buen camino
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
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
buscar registros de un ClientDataSet a otro clientDataSet novato_erick Conexión con bases de datos 2 02-02-2013 20:48:09
Trigger Update or insert amerika111 MS SQL Server 0 03-08-2011 21:18:52
Insert or update dependiendo de pk Joe_Balda Firebird e Interbase 4 13-08-2010 16:04:12
Insert con ClientDataSet Rockin Conexión con bases de datos 25 15-07-2008 17:38:47
por que duplicidad de registros con clientdataset sin ingresar registros ...mysql Arturo MySQL 3 05-09-2006 18:39:37


La franja horaria es GMT +2. Ahora son las 14:52:49.


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