Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Instanciar datamodule (https://www.clubdelphi.com/foros/showthread.php?t=94201)

botones67 28-09-2019 18:49:47

Instanciar datamodule
 
1 Archivos Adjunto(s)
Hola a todos.
Miren tengo esta unidad donde intento instanciar un datamodule que contiene un Ttable + Provider + Cliendataset todo parece ir bien hasta que intento modificar los datos de cliente, es como si no lo instanciara pero desde el form si veo todos los componentes del datamodule.
En la parte de abajo del código resalto donde da error.
Sabéis que puede ocurrir?
Gracias , un saludo para todos.
Código Delphi [-]
unit entrada;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, unit1,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Buttons, RzButton, Vcl.StdCtrls,
  RzLabel, Vcl.Mask, RzEdit, FireDAC.Stan.Intf, FireDAC.Stan.Option,
  FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf,
  FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt, Data.DB,
  FireDAC.Comp.DataSet, FireDAC.Comp.Client;

type
  TForm3 = class(TForm)
    RzToolbarButton2: TRzToolbarButton;
    RzToolbarButton1: TRzToolbarButton;
    edit1: TRzEdit;
    RzLabel1: TRzLabel;
    edit2: TRzEdit;
    RzLabel2: TRzLabel;
    procedure RzToolbarButton2Click(Sender: TObject);
    procedure RzToolbarButton1Click(Sender: TObject);
    procedure RzButton1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    public
  var
    dT: Tdatos;
    { Public declarations }
  end;
var
  Form3: TForm3;
implementation

uses
  general, Unit2;

{$R *.dfm}

procedure TForm3.FormCreate(Sender: TObject);
begin
  dT := Tdatos.Create(self);
end;

procedure TForm3.FormDestroy(Sender: TObject);
begin
  dT.Free;
end;

procedure TForm3.RzButton1Click(Sender: TObject);
var
  frm3: TForm3;
begin
  frm3 := TForm3.Create(self);
  try
    frm3.ShowModal
  finally
    FreeAndnil(frm3);
  end;
end;

procedure TForm3.RzToolbarButton1Click(Sender: TObject);
begin
  close;
end;

procedure TForm3.RzToolbarButton2Click(Sender: TObject);
begin

  if inserta then
  begin
    dt.proce.ExecProc; // generador de ID firebird
  [b]  dt.cliente.Append; AQUI DA ERROR ( VER IMAGEN ADJUNTA)
    dt.cliente.FieldByName('id').AsInteger :=
      dt.proce.ParamByName('CODD4').AsInteger;
    dt.cliente.FieldByName('material').asstring := edit1.Text;
    dt.cliente.FieldByName('Suministra').asstring := edit2.Text;
    dt.cliente.Post;
    dt.cliente.ApplyUpdates(-1);
    dt.Conexion.Commit;
    close;
  end;
  if edita then
  begin
    dT.cliente.edit; AQUI DA ERROR  ( VER IMAGEN ADJUNTA).
    dT.cliente.FieldByName('material').asstring := edit1.Text;
    dT.cliente.FieldByName('suministra').asstring := edit2.Text;
    dT.cliente.Post;
    dT.cliente.ApplyUpdates(-1);
    dT.Conexion.Commit;
    close;
  end;
end;

end.

Casimiro Notevi 28-09-2019 19:15:15

¿No estará activo?

botones67 28-09-2019 19:47:30

Gracias Casimiro por tu ayuda.
Pues si que lo está,además hace cosas muy raras , sales y entras en la aplicación y lo datos están actualizados.:mad:

Casimiro Notevi 28-09-2019 20:11:18

Echa un vistazo a estos enlaces.

botones67 28-09-2019 21:25:21

Bueno ya miré con anterioridad la mitad de ellos y casi todos coinciden en que está cerrado el dataset pero aqui no es el caso.
Al final solo instanciaré de las form y el datamodule lo creare al inicio que ya probé y no da problemas.
El objetivo era no cargar mucho la red.
Gracias Casimiro nuevamente.

Neftali [Germán.Estévez] 30-09-2019 09:20:02

Siempre puedes preguntar (con un IF) por el estado del Dataset, antes de realizar el Edit.

Código Delphi [-]
if not dT.cliente.Active then
    dT.cliente.Open
else
    dT.cliente.Edit;

botones67 01-10-2019 12:44:46

Gracias por contestar.
Si, ya lo hice también y está abierto.
No será que clientdataset no se lleva bien con instanciar los datamodules?
Si creo el datamodule al inicio no hay problemas.
Gracias .

Neftali [Germán.Estévez] 01-10-2019 15:37:40

Cita:

Empezado por botones67 (Mensaje 533683)
Si, ya lo hice también y está abierto.
No será que clientdataset no se lleva bien con instanciar los datamodules?
Si creo el datamodule al inicio no hay problemas.


Es raro, porque yo instancio Datamodules y los creo en ejecución sin problemas.
No será algo relacionado con el código que estás utilizando; Otro datamodule relacionado, algún evento que está saltando sobre otro objeto,...

botones67 02-10-2019 09:16:26

Hola Germán.
El código ya lo ves arriba donde creo el datamodule.
Una vez creado veo sin problemastodo lo que contiene pero a la hora de actualizar se queja dice que no está abierto los datos.
No sé, un expediente X.
Gracias un saludo.

movorack 02-10-2019 14:25:58

¿Y el código del datamodule? ¿Donde realizas la conexión? Es que con lo que muestras es apenas normal que los datasets estén inactivos.

botones67 02-10-2019 17:57:17

Buenas.
A ver , Añado un datamodule a proyecto , suelto todos los componentes conexión , dataset, datasource a ect ect , todo conectado ok , pero no lo lo creo con la ejecución del programa , solo lo instancio en el
Form que me hace falta .
También he probado
Conectarlo todo en ejecución y sigue igual.
He de decir que todo
Funciona si creo el datamodule con el único del
Programa.
Gracias por interesaros .

movorack 02-10-2019 18:21:48

Buenas.
A ver, no está de más que valides si está conectado y activo y si no, pues haces lo propio. (Es decir: Lo conectas y lo abres... lo escribo por si no se entiende que quise decir con "lo propio")

botones67 02-10-2019 19:55:05

Reholas...:p
Gracias por tu atención.
Pues eso, que no esta de mas , no, ya lo hago y no funciona.:)

movorack 02-10-2019 21:14:49

Estamos a ciegas. tocarías que compartas el código.

Casimiro Notevi 02-10-2019 22:33:23

Estaría bien ver el código, ya que resulta muy extraño.

botones67 03-10-2019 12:54:16

Bueno bueno.:(
Quiero daros las gracias y a su vez pediros perdón por la insistencia ,pero efectivamente no abría el dataset correctamente y claro,si no está abierto mal asunto, perdón.:D
La cuestión ahora es la siguente tengo un form general donde tengo el grid con los datos del dataset y un botón que llama a otro form donde añado o editar dependiendo del usuario.
El este último form es donde creo el hago el create del datamodule y añado o modificó los registros y surge la duda.:cool:
Cuando salgo de ese fin en realidad si se modificaron los datos pero no los veo actualizados hasta que no llamo al método refresh del dataset,¿ Hay alguna manera del poder ver los datos actualizados sin necesidad de llamar a citado método cada vez que los modifico ?
Yo hago así en la salida del form
Código Delphi [-]
Var Dt:  tdatamudule1;
Dt:=tdatamudule1.ceate(self);

Dt.Clientes.edit;
.....
.....  Igualo los campos 
....
Dt.clientes.post;
Dt.clientes.applyupdate(-1);
DT.connexion.commit;
Sí aquí refresco no se refleja en el grid ,solo se refleja si hago refresh desde el form donde tengo el grid pero 
no me parece muy correcto refrescar el grid cada vez que modifico o añado algún registro.
Bueno; por último pediros perdón por la paciencia que tenéis conmigo.
Gracias a todos.

gatosoft 03-10-2019 15:03:35

Todos los que estamos pendientes de esta novela, queremos ver si en algún lugar aparece la linea que resalto en rojo:

Código Delphi [-]
Var Dt:  tdatamudule1;
Dt:=tdatamudule1.ceate(self);

Dt.Clientes.Open;

Dt.Clientes.edit;
.....
.....  Igualo los campos 
....
Dt.clientes.post;
Dt.clientes.applyupdate(-1);
DT.connexion.commit;
Sí aquí refresco no se refleja en el grid ,solo se refleja si hago refresh desde el form donde tengo el grid pero 
no me parece muy correcto refrescar el grid cada vez que modifico o añado algún registro.

gatosoft 03-10-2019 15:13:24

El error original apunta a eso: "Cannot perform this operation o a closed dataset"... litermalmente dice: "no se puede hacer esta operación en un dataset cerrado"... No puedes insertar, actualizar o eliminar en un dataset que está cerrado.

El clientDataset se abre con un open, o en el momento que asignas un valor a XMLData o sise crea como un dataset en memoria en tiempo de diseño con "Create Dataset"... pero al parecer ninguna de estas aciones se está llevando a cabo...

saludo,

Casimiro Notevi 03-10-2019 15:55:25

Cita:

Empezado por gatosoft (Mensaje 533747)
Todos los que estamos pendientes de esta novela, queremos ver si en algún lugar aparece la linea que resalto en rojo:
Dt.Clientes.Open;

Pues sí :)

botones67 03-10-2019 19:06:17

A la... se acabo la novela.;););)
GatoSoft; eso + actualizaba los datos donde no debía, si no fuera por vosotros......
Gracias.


La franja horaria es GMT +2. Ahora son las 18:39:35.

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