Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Problemas al insertar en una tabla (https://www.clubdelphi.com/foros/showthread.php?t=9275)

vhirginia 19-04-2004 18:53:22

Problemas al insertar en una tabla
 
Queremos insertar nuevos datos a traves de una interfaz gráfica y usamos el método insert y append, pero nos borra los datos que ya tenemos, es decir, nos sobreescribe. El problema es que desde el principio ya nos muestra los datos de lo primero que encuentra en la tabla.¿podeis ayudarnos?

roman 19-04-2004 19:08:52

¿En qué momento usas Insert/Append?

Es normal que de entrada aparezcan los datos que ya tienes, de hecho los del primer registro ya que éste es el primero que se activa al momento de abrir la tabla. El método Insert o Append debes usarlo antes de comenzar a editar los datos y no después para agregar un registro en blanco.

// Saludos

vhirginia 19-04-2004 19:14:08

Llamamos a Append antes de abrir la unidad que va a insertar el registro, es decir en el botón que llama a la unidad. Una vez insertados los datos ponemos en el botón de Aceptar el tabla.Post y tenemos puesto el tabla.FlushBuffers en el AfterPost de la tabla.

marcoszorrilla 19-04-2004 20:11:26

Si tenemos un formulario con unos controles Dbedit conectados a la tabla que fuere, lo lógico sería algo como esto:

Llamada desde el menú:

Por ejemplo:
1:Altas
2:Modificaciones

Con una variable pública o global según los casos
Código:

Estado:=1;
 Application.CreateForm(TMiFormulario, MiFormulario);
 MiFormulario.ShowModal;

En el formulario que sirve tanto para dar altas o hacer modificaciones:
Código:

Case estado of
 1:MiTabla.append;
 2:MiTabla.Edit;
 end;

Un Saludo.

vhirginia 20-04-2004 16:41:25

Necesitamos otra información
 
Lo de los comandos append y edit ya lo sabíamos ,el problema es que al insertar nos lo hace encima de otro registro .Gracias.

roman 20-04-2004 16:57:46

Mira, lo que te dice Marcos tendría que funcionar. No veo razón para que un Insert sobreescriba un registro anterior. Sería bueno que nos escribieras un poco del código que usas, tanto en el formulario que llama al que hace la inserción como en éste. Incluye de ser posible los eventos que tienes asociados a los datasets.

// Saludos

vhirginia 20-04-2004 17:24:02

¿A qué te refieres cuando hablas de los eventos asociados a los datasets?
En el evento dataset del datasource tenemos la tabla asociada al datasource

roman 20-04-2004 17:31:53

Cita:

Empezado por vhirginia
¿A qué te refieres cuando hablas de los eventos asociados a los datasets?
En el evento dataset del datasource tenemos la tabla asociada al datasource

Eventos de la tabla, como el AfterPost que mencionaste al principio.

// Saludos

vhirginia 20-04-2004 17:37:46

no hay ningun evento de la tabla q se llame dataset,solo hay del tipo:
after...
before...
on...
El unico sitio donde aparece dataset es en la pestaña events del datasource

roman 20-04-2004 17:40:32

Dataset es el nombre genérico para componentes tipo Table, Query, etc. (todos desciende de él) Por el momento no te preocupes de eso, donde dije DataSet cámbialo por Tabla. Lo que te digo es si hay algún otro evento como el AfterPost que tienes asociado a la tabla y que quizá pudiera estar metiendo ruido.

// Saludos

vhirginia 20-04-2004 17:42:26

No, no tenemos nada más que el afterpost, y en él hacemos:tabla.FlushBuffers

roman 20-04-2004 17:48:57

Sí bueno, pero nos quedamos en los eventos y ya no nos escribiste el código. Por favor escribe el código que estás usando para ver si de ahí podemos ver qué pasa.

// Saludos

vhirginia 20-04-2004 17:55:37

Este es el codigo de la unidad en la que estan incluidos los botones para insertar,modificar ,mostrar y eliminar(un cliente)que representan a 4 unidades distintas.

[code]
unit Unit9;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, DBCtrls, Db, DBTables, Grids, DBGrids, jpeg, StdCtrls, Menus,
Buttons;

type
TForm9 = class(TForm)
Label1: TLabel;
Image1: TImage;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
MainMenu1: TMainMenu;
Archivo1: TMenuItem;
Nuevo1: TMenuItem;
Modificar1: TMenuItem;
Eliminar1: TMenuItem;
Mostrar1: TMenuItem;
Salir1: TMenuItem;
Ayuda1: TMenuItem;
Acercade1: TMenuItem;
BitBtn5: TBitBtn;
Tabla_clientes: TTable;
DataSourceclientes: TDataSource;
procedure Acercade1Click(Sender: TObject);
procedure Salir1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure Nuevo1Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure Mostrar1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure Modificar1Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure Eliminar1Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure Tabla_clientesAfterPost(DataSet: TDataSet);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form9: TForm9;

implementation

{$R *.DFM}
uses Unit4, Unit3, Unit23, Unit25, Unit26, Unit27;

procedure TForm9.Acercade1Click(Sender: TObject);
begin
Form4.Visible:=True;
end;

procedure TForm9.Salir1Click(Sender: TObject);
begin
Form9.Visible:=False;
end;

procedure TForm9.Button1Click(Sender: TObject);
begin
Form3.Visible:=True;
Form9.Visible:=False;
end;

procedure TForm9.BitBtn1Click(Sender: TObject);
begin
Form23.Visible:=true;
Form9.Visible:=False;
Tabla_clientes.Insert;
end;

procedure TForm9.Nuevo1Click(Sender: TObject);
begin
Form23.Visible:=true;
end;

procedure TForm9.BitBtn4Click(Sender: TObject);
begin
Form25.Visible:=true;
Form9.Visible:=false;
end;

procedure TForm9.Mostrar1Click(Sender: TObject);
begin
Form25.Visible:=true;
Form9.Visible:=false;
end;

procedure TForm9.BitBtn2Click(Sender: TObject);
begin
Form26.Visible:=true;
Form9.Visible:=false;
Tabla_clientes.Edit;
end;

procedure TForm9.Modificar1Click(Sender: TObject);
begin
Form26.Visible:=true;
Form9.Visible:=false;
end;

procedure TForm9.BitBtn3Click(Sender: TObject);
begin
Form27.Visible:=true;
Form9.Visible:=false;
Tabla_clientes.Delete;
end;

procedure TForm9.Eliminar1Click(Sender: TObject);
begin
Form27.Visible:=true;
Form9.Visible:=false;
end;

procedure TForm9.BitBtn5Click(Sender: TObject);
begin
Form9.Visible:=False;
Form3.Visible:=True;
end;

procedure TForm9.Tabla_clientesAfterPost(DataSet: TDataSet);
begin
Tabla_clientes.Insert;
end;

end.
[code]


Lo siguiente es el codigo de la unidad de dar de alta un nuevo cliente:

[code]
unit Unit23;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls, Db, DBTables, DBCtrls, Mask;

type
TForm23 = class(TForm)
Label1: TLabel;
Image1: TImage;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Button1: TButton;
Button2: TButton;
Label9: TLabel;
DataSourceclientes: TDataSource;
Tabla_clientes: TTable;
Tabla_edificios: TTable;
DataSourceedificios: TDataSource;
GroupBox1: TGroupBox;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
DBEdit3: TDBEdit;
DBEdit4: TDBEdit;
DBEdit5: TDBEdit;
Tipo: TDBRadioGroup;
DBEdit6: TDBEdit;
DBEdit7: TDBEdit;
DBEdit8: TDBEdit;
DBLookupComboBox1: TDBLookupComboBox;
DBLookupComboBox2: TDBLookupComboBox;
DBLookupComboBox3: TDBLookupComboBox;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Tabla_clientesAfterPost(DataSet: TDataSet);
procedure Tabla_edificiosAfterPost(DataSet: TDataSet);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form23: TForm23;

implementation

{$R *.DFM}

uses Unit9, Unit24;

procedure TForm23.Button2Click(Sender: TObject);
begin
Form23.Visible:=false;
Form9.Visible:=true;
end;

procedure TForm23.Button1Click(Sender: TObject);
begin
Tabla_clientes.Post;
Form23.Visible:=false;
Form24.Visible:=true;
end;

procedure TForm23.Tabla_clientesAfterPost(DataSet: TDataSet);
begin
Tabla_clientes.FlushBuffers;
end;

procedure TForm23.Tabla_edificiosAfterPost(DataSet: TDataSet);
begin
Tabla_edificios.FlushBuffers;
end;

end.
[code]

roman 20-04-2004 18:10:12

Visto por encima hay algo raro: tanto en Form9 como en Form23 tienes una componente llamada Tabla_clientes. Cuando abres Form23 el Tabla_clientes es el del Form9 mientras que el Post que haces en Form23 es el de su propia Tabla_clientes. Esto no está bien, tienes que usar la misma componente.

Si este es el error, y creo que así es, te recomiendo el uso de módulos de datos (DataModule) para colocar tus componentes TTable que vayas a usar desde distintos formularios.

// Saludos

vhirginia 20-04-2004 18:40:06

Hemos cambiado una cosa, y es que teníamos declaradas en cada Form la tabla y el datasource, y ahora suponemos que hay que usar siempre el mismo. De todas formas, al ejecutar, nos ha dado el siguiente error:
Proyect Proyecto.exe raised exception class EDatabaseError with message "Tablaclientes:dataset not in edit or insert mode". Process stopped.

jachguate 20-04-2004 18:42:24

Hola vhirginia. Tu intento de poner las etiquetas code ha sido bueno... pero te faltó la barra para cerrarlas:

[ code] [ /code] (sin el espacio).

Creo que te has excedido al poner todo el código de las unidades, y aún asi, me he esforzado yo por leerlo y encuentro que:

Código:

procedure TForm9.BitBtn1Click(Sender: TObject);
begin
  Form23.Visible:=true;
  Form9.Visible:=False;
  Tabla_clientes.Insert;  // Esto pone en modo de inserción la tabla_clientes que está
  //colgada del Form9
end;

procedure TForm23.Button1Click(Sender: TObject);
begin
  Tabla_clientes.Post;  // Esto hace post a la tabla_clientes que está colgada
  // del Form23 (que no es la misma que se puso en inserción)!!
  Form23.Visible:=false;
  Form24.Visible:=true;
end;

Actualización
Veo que el mensaje durmió en una de las pestañas de mi mozilla durante un buen rato antes de contestarlo... con lo que ya tuvo movimiento que no había visto (y la conclusión de román es la misma a la que yo llego... )

Hasta luego.

;)

jachguate 20-04-2004 18:46:52

Cita:

Empezado por vhirginia
ahora suponemos que hay que usar siempre el mismo.

Bueno... esa suposición es correcta y lógica, no te parece??

El error que te está dando, indica que al hacer post, la tabla no está en modo de inserción/edición.

Si mantenes algo de la estructura anterior, te valdria con:

Código:

procedure TForm9.BitBtn1Click(Sender: TObject);
begin
  Form23.Visible:=true;
  Form9.Visible:=False;
  Form23.Tabla_clientes.Insert;
end;

Hasta luego.

;)

roman 20-04-2004 18:48:27

Cita:

Empezado por vhirginia
Hemos cambiado una cosa, y es que teníamos declaradas en cada Form la tabla y el datasource, y ahora suponemos que hay que usar siempre el mismo. De todas formas, al ejecutar, nos ha dado el siguiente error:
Proyect Proyecto.exe raised exception class EDatabaseError with message "Tablaclientes:dataset not in edit or insert mode". Process stopped.

Bueno, pero ahora la cosa ha cambiado y las descripciones anteriores quizá no sean suficientes. ¿Cómo quedó el código luego del cambio? No publiques todo, basta lo referente a Form9 y Form23 (es decir no todos los eventos Click) y si agregaste un DataModule o no.

El error lo manda cuando intentas modificar los campos de una tabla que no está ni en modo de edición (luego del Edit) ni en modo de inserción (luego de Append o Insert).

// Saludos

vhirginia 20-04-2004 18:58:29

Ahora es este nuestro nuevo código, en la unidad que tiene todo:
Código:

procedure TForm9.BitBtn1Click(Sender: TObject);
begin
Form23.Visible:=true;
Form9.Visible:=False;
Tabla_clientes.Insert;
end;

procedure TForm9.Tabla_clientesAfterPost(DataSet: TDataSet);
begin
Tabla_clientes.FlushBuffers;
end;


y en la unidad de insertar :
Código:

procedure TForm23.Button1Click(Sender: TObject);
begin
Form9.Tabla_clientes.Post;
Form23.Visible:=false;
Form24.Visible:=true;
end;


roman 20-04-2004 19:08:41

¿Y en qué línea te marca el error?

// Saludos

vhirginia 21-04-2004 12:02:34

El programa se para,pero si que elimina registros de la tabla
 
No nos da la línea del error,sólo nos dice que la tabla de clientes no esta en insert o edit mode.
Muchas gracias

guillotmarc 21-04-2004 13:15:36

Hola.

Solo un consejo, este código es muy dificil de mantener y entender. Ponle nombres a los componentes, y evita el acceder a los componentes de otros formularios.

En lugar de Form9 y Form23, llámalos frmClientes y frmProductos, y en lugar de BitBtn1 y Button1 llámalos btnInsertar y btnGuardar. O algo parecido, verás como entonces el código se entiende mucho mejor.

Además accedes directamente a las propiedades y componentes de un Formulario desde otros. Esto puede ser un gran problema cuando el programa sea muy grande, puesto que cuando debas modificar un formulario, no sabes en cuantos otros sitios te va a afectar. Para eso se inventó la modularidad, lo que hay dentro de un formulario solo lo debe tocar él mismo. Si otros formularios necesitan algo, declara un función pública para que la llamen, y programa el código en esa función (que estará en el mismo formulario).

O sea donde pones :

Código:

procedure TForm23.Button1Click(Sender: TObject);
begin
Form9.Tabla_clientes.Post;
Form23.Visible:=false;
Form24.Visible:=true;
end;

Seria mejor algo como :

Código:

procedure frmProductos.btnGuardarClick(Sender: TObject);
begin
  frmClientes.Guardar;
  Visible := false;
  frmPrincipal.Mostrar;
end;
/* La próxima función estará definida publicamente en frmClientes (antes Form9) */
procedure frmClientes.Guardar;
begin
  TablaClientes.Post;
end;
/* La próxima función estará definida publicamente en frmPrincipal (antes Form24) */
procedure frmPrincipal.Mostrar;
begin
  Visible := True;
end;


vhirginia 21-04-2004 13:18:42

Ya hemos solucionado nuestros problemas con las tablas, muchas gracias.Le queríamos comentar a jachguate :
-Todavía no tenemos tu nivel de conocimientos de delphi,pero muchas gracias por el recochineo de tus comentarios

guillotmarc 21-04-2004 13:21:21

Cita:

Empezado por vhirginia
No nos da la línea del error,sólo nos dice que la tabla de clientes no esta en insert o edit mode.

Pues lo dice muy claro. En esa tabla no has hecho el Insert. O el Insert lo has hecho en otra tabla (quizá con el mismo nombre pero en otro formulario), o bien no has ejecutado el código que debería hacer el Insert.

Saludos.

roman 21-04-2004 16:22:09

Cita:

Empezado por vhirginia
comentar a jachguate :
-Todavía no tenemos tu nivel de conocimientos de delphi,pero muchas gracias por el recochineo de tus comentarios

vhirginia, debo decirte que me sorprende este comentario. He releido las observaciones de jachguate y me parecen respetuosas y solamente da algunas indicaciones que facilitan a los demás leer el código lo cual redunda en beneficio propio de quienes formulan una pregunta. El compañero jachguate ha sido siempre una persona muy dispuesta a ayudarnos a todos.

// Saludos

jachguate 21-04-2004 16:43:17

Cita:

Empezado por vhirginiapero
muchas gracias por el recochineo de tus comentarios

Por el queeeeee????

Menos mal que existe la encarta... tuve que valerme de ella para saber que me querias decir.

Cita:

Empezado por encarta
recochineo.

m. coloq. Burla o ironía molestas que acompañan a algo que se hace o dice

No acostumbro dar explicaciones... pero lo haré esta vez para que no se de un malentendido...

Me imagino que te referis a esto:

Cita:

Empezado por jachguate
Tu intento de poner las etiquetas code ha sido bueno...

Esto no lo dije ironicamente... lo dije en serio, podes comprobarlo con la frase siguiente:
Cita:

Empezado por jachguate
pero te faltó la barra para cerrarlas:

[ code] [ /code](sin el espacio).

y a esto:

Cita:

Empezado por jachguate
Bueno... esa suposición es correcta y lógica, no te parece??

Esto si que es irónico... pero podes tomarlo como la ironia de un amigo :p

Hasta luego.

;)

marcoszorrilla 21-04-2004 17:36:31

Como he participado en el hilo aunque brevemente, tengo que añadir que nuestro compañero JachGuate, según ya dijo Román se caracteriza por ser una persona educada por lo que te puedo asegurar que no hubo "recochineo", simplemente una interpretación erronea de sus palabras.

Un Saludo a todos.

vhirginia 21-04-2004 18:53:58

Muchas gracias
 
No pasa nada hombre, muchas gracias a todos por vuestra ayuda. Nos habéis sido de gran utilidad y lo seguireis siendo, pq todavia nos quedan algunas cosillas por ahí.¿de donde sois?

jachguate 21-04-2004 22:13:28

Guatemala! :p Te suena... ;)

marcoszorrilla 21-04-2004 22:41:24

Yo de (Cantabria) España.

Un Saludo.

roman 21-04-2004 22:54:57

Ciudad de México, Presente

// Saludos


La franja horaria es GMT +2. Ahora son las 18:53:23.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi