Ir al contenido


Foto

[RESUELTO] Consulta con un ABM en Delphi 7


  • Por favor identifícate para responder
11 respuestas en este tema

#1 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 26 septiembre 2010 - 11:01

Hola como están? Les quiero realizar la siguiente consulta.

Resulta que tengo un formulario con unos Edit en los cuales se pueden cargar valores para luego almacenarlos en la tabla de una base de datos.
Y tengo 4 botones con las operaciones básicas. Nuevo, Modificar, Borrar, Guardar y Cancelar.

El problema que tengo es con el código para el botón guardar y sobre todo con el manejo de los estados de la tabla.
Lo que quiero es que sirva tanto para la inserción como para la modificación de registros. Y asi evitarme crear otro botón y separar por una parte todo el código para insertar y por otra todo el código para modificar que prácticamente es lo mismo, la unica diferecia es el estado de la tabla.

Es posible realizar esto?

Lo que estuve probando es agregar al botón Nuevo, el código Tabla.insert; despúes de habilitar los Edit, limpiarlos y demás. Hasta ahí bien.
Luego en el botón Guardar, ya no definir el estado de la tabla teniendo en cuenta que ya debería estar en estado de inserción y directamente tomar los valores de los Edit para finalizar con Tabla.post;
Pero cuando lo hago así, Delphi me envía un error de que la tabla no esta es estado de inserción ni de moficación por lo tanto no lo puedo realizar.

Creo que la pregunta es bastante sencilla, pero me tope con esto y lo quiero para asi evitar tener que poner el mismo código en otro botón. Estuve buscando en google pero no encontre mucho. Sería algo similar a lo que hace el botón de Post en el DBNavigator, es solo un botón que sirve para la modificación y la inserción.
Espero haberme explicado.

Saludos!




  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 27 septiembre 2010 - 02:40

Buenas,

Y no te sería más sencillo usar componentes DataAware? (es decir, TDBEdits,....). Estos controles ya se encargan de poner en edición el dataset asociado o de limpiar los campos en caso de inserción de un registro.

Así sólo tienes que controlar el "post" en un botón de "aceptar"

Nos leemos

  • 0

#3 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 27 septiembre 2010 - 09:34

Hola cadetill, gracias por la respuesta!

En el caso de utilizar estos componentes, a donde especifico que quiero hacer una inserción o una modificación? Eso no me quedo muy claro.
Otra cosa, en el boton Guardar es donde debería controlar el "post" como me decis, pero aqui solo iría por ejemplo:



delphi
  1. TClientes.FieldByName('nombre').asstring:=Enombre.Text;
  2. TClientes.FieldByName('apellido').asstring:=Eapellido.Text;
  3. TClientes.FieldByName('direccion').asstring:=Edireccion.Text;
  4. TClientes.Post;



Lo que me falta saber es a donde especifico "Tabla.Insert" o "Tabla.Edit". Teniendo en cuenta que tengo dos botones mas en el formulario "Nuevo y Modificar"

Saludos!
  • 0

#4 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 27 septiembre 2010 - 09:44

Hola amigo GUN10...

De qué manera distinguirás que tu formulario esté en Inserción o Edición ???, es decir, cuándo decides que quieres hacer una inserción de un registro nuevo o una modificación de uno ya ingresado ?

Saludox ! :)
  • 0

#5 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 27 septiembre 2010 - 09:46

Hola
Insert:


delphi
  1. TClientes.Last;
  2. TClientes.Insert;
  3. TClientes.FieldByName('nombre').asstring:=Enombre.Text;
  4. TClientes.FieldByName('apellido').asstring:=Eapellido.Text;
  5. TClientes.FieldByName('direccion').asstring:=Edireccion.Text;
  6. TClientes.Post;


Edit:


delphi
  1. TClientes.edit;


Saludos
  • 0

#6 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 27 septiembre 2010 - 09:58

Gracias por las respuestas Fenareth y Caral.
Como lo explicaba en la primera parte, tengo 5 botones con los cuales quiero hacer lo siguiente.
Tengo un botón "Nuevo", el que indicaría que la tabla esta en estado de inserción y otro "Modificar" para poner la tabla en estado de edición.

El problema es que quiero poner UN solo botón para realizar el "Post" ya sea para la inserción o modificación y asi evitar tener que poner por ejemplo:

Botón que guarda un registro nuevo:



delphi
  1. TClientes.Insert;
  2. TClientes.FieldByName('nombre').asstring:=Enombre.Text;
  3. TClientes.FieldByName('apellido').asstring:=Eapellido.Text;
  4. TClientes.FieldByName('direccion').asstring:=Edireccion.Text;
  5. TClientes.Post;



Botón que guarda cambios:



delphi
  1. TClientes.Edit;
  2. TClientes.FieldByName('nombre').asstring:=Enombre.Text;
  3. TClientes.FieldByName('apellido').asstring:=Eapellido.Text;
  4. TClientes.FieldByName('direccion').asstring:=Edireccion.Text;
  5. TClientes.Post;



Que son practicamente lo mismo nada mas que cambia el estado de la tabla.
Como dije anteriormente, trate de poner el estado de la tabla cuando se hace click en el botón "Nuevo" pero despues me da un error cuando hago "post" desde el boton guardar, me dice que la tabla no esta en estado de edición ni de inserción.

Espero haberme explicado mejor. Saludos!
  • 0

#7 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 27 septiembre 2010 - 10:03

Y si en el boton de Guardar colocas algo como:



delphi
  1. if DataSet.State in [dsInsert,dsEdit] then
  2.   DataSet.Post;



De esta manera controlas el error que te manda el botón (y)

Saludox ! :)
  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 27 septiembre 2010 - 10:08

O puedes hacer esto también:



delphi
  1. procedure TForm1.NuevoClick(Sender: TObject);
  2. begin
  3.   TClientes.Insert;
  4. end;
  5.  
  6. procedure TForm1.ModificarClick(Sender: TObject);
  7. begin
  8.   TClientes.Edit;
  9. end;
  10.  
  11. procedure TForm1.PostClick(Sender: TObject);
  12. begin
  13.   TClientes.FieldByName('nombre').asstring:=Enombre.Text;
  14.   TClientes.FieldByName('apellido').asstring:=Eapellido.Text;
  15.   TClientes.FieldByName('direccion').asstring:=Edireccion.Text;
  16.   TClientes.Post;
  17. end;



Me estoy perdiendo de algo ?

Salud OS
  • 0

#9 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 27 septiembre 2010 - 10:13

Segun lo tienes lo ideal seria asi:



delphi
  1. if tCLientes.Locate('MiClave', 'Valor', [locaseinsensitive]) then
  2.   TClientes.Edit
  3. else
  4.   TClientes.Edit;
  5.  
  6. TClientes.FieldByName('nombre').asstring:=Enombre.Text;
  7. TClientes.FieldByName('apellido').asstring:=Eapellido.Text;
  8. TClientes.FieldByName('direccion').asstring:=Edireccion.Text;
  9. TClientes.Post;



Asi te ahorras tambien el boton nuevo.
  • 0

#10 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 27 septiembre 2010 - 10:15

Hola
Lo ideal es SQL, pero tambien:
Aqui tienes un ejemplo con access.
Modifica, inserta, elimina y guarda.
Saludos

Archivos adjuntos


  • 0

#11 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 27 septiembre 2010 - 10:40

Buenas,

A ver, vayamos por partes. Si suponemos que tenemos 3 botones (añadir, modificar, aceptar), así de entrada te sobra el de modificar. Si usas componentes DataAware, éstos se encargarán de poner en edición el registro seleccionado (o de ponerlo en inserción si es que no hay registros en la tabla).

Entonces tenemos suficiente con 2 botones, añadir y aceptar.

¿Qué código hay que poner en cada uno de ellos? El código es fácil y sencillo

Botón añadir:



delphi
  1. MiTabla.Append;



Botón aceptar:



delphi
  1. if MiTabla.State in [dsInsert,dsEdit] then
  2.   MiTabla.Post;



Espero te ayude

Nos leemos

  • 0

#12 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 27 septiembre 2010 - 11:19

Gracias a todos por las respuestas y recomendaciones que me dieron. Por suerte ya pude solucionar el problema y lograr que la aplicación realice lo que queria.

Estaba manejando el código que varios de ustedes me mostraron:



delphi
  1. procedure TForm1.NuevoClick(Sender: TObject);
  2. begin
  3.   TClientes.Insert;
  4. end;
  5.  
  6. procedure TForm1.ModificarClick(Sender: TObject);
  7. begin
  8.   TClientes.Edit;
  9. end;
  10.  
  11. procedure TForm1.PostClick(Sender: TObject);
  12. begin
  13.   TClientes.FieldByName('nombre').asstring:=Enombre.Text;
  14.   TClientes.FieldByName('apellido').asstring:=Eapellido.Text;
  15.   TClientes.FieldByName('direccion').asstring:=Edireccion.Text;
  16.   TClientes.Post;
  17. end;



Pero parece que se daba el error que antes comentaba porque, en el botón "Guardar", hacia unas validaciones para que no me ingrese por ejemplo el mismo DNI o CUIT por medio de Locate(); Entonces quizás ahi ya se salia del estado de inserción o modificación.
Lo solucione gracias al código que también, varios de ustedes agregaron:



delphi
  1. if Tabla.State in [dsInsert] then
  2.   begin
  3.       .
  4.       .
  5.       .
  6.       Tabla.Post;
  7.   end;
  8. else
  9.   begin
  10.       if Tabla.State in [dsEdit] then
  11.         begin
  12.             .
  13.             .
  14.             .
  15.             Tabla.Post
  16.         end;
  17.   end;



Al terminar de hacer las validaciones y búsquedas, vuelvo a poner la tabla en el estado que corresponde y hago "post"
         
Si hay algo que hice mal o creen que debo corregir, se los agradecere si me lo indican.
Pero por el momento va bien.

Saludos y nuevamente gracias!!
  • 0




IP.Board spam blocked by CleanTalk.