Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-04-2004
vhirginia vhirginia is offline
Miembro
 
Registrado: mar 2004
Posts: 64
Poder: 23
vhirginia Va por buen camino
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]
Responder Con Cita
  #2  
Antiguo 20-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 20-04-2004
vhirginia vhirginia is offline
Miembro
 
Registrado: mar 2004
Posts: 64
Poder: 23
vhirginia Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 20-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 30
jachguate Va por buen camino
Cool

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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #5  
Antiguo 20-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #6  
Antiguo 20-04-2004
vhirginia vhirginia is offline
Miembro
 
Registrado: mar 2004
Posts: 64
Poder: 23
vhirginia Va por buen camino
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;
Responder Con Cita
  #7  
Antiguo 20-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿Y en qué línea te marca el error?

// Saludos
Responder Con Cita
  #8  
Antiguo 21-04-2004
vhirginia vhirginia is offline
Miembro
 
Registrado: mar 2004
Posts: 64
Poder: 23
vhirginia Va por buen camino
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
Responder Con Cita
  #9  
Antiguo 21-04-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
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;
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #10  
Antiguo 20-04-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 30
jachguate Va por buen camino
Cool

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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 07:31:31.


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
Copyright 1996-2007 Club Delphi