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)
-   -   Insert sucesivos (https://www.clubdelphi.com/foros/showthread.php?t=93641)

ASEP 17-12-2018 17:48:17

Insert sucesivos
 
Buenas Tardes:

Estoy interesado en hacer inserciones en una query sucesivas, me explico, cuando termine una inserción que comience otra sin iteración del usuario, lo he intentado en el evento Afterpost de la query en cuestión y no me hace ni caso ¿como podria o deberia hacer esto? Gracias por anticipado.

Casimiro Notevi 18-12-2018 09:44:38

Hola, y ¿cómo lo has hecho, dónde está el código que has usado?
Por favor, dale un vistazo a nuestra guía de estilo, gracias.
Y bienvenido.

Neftali [Germán.Estévez] 18-12-2018 15:19:38

Cita:

Empezado por ASEP (Mensaje 530011)
Estoy interesado en hacer inserciones en una query sucesivas, me explico, cuando termine una inserción que comience otra sin iteración del usuario, lo he intentado en el evento Afterpost de la query en cuestión y no me hace ni caso


La verdad es que con lo que explicas no se entiende muy bien el proceso que estás realizando.

¿Estás trabajamdo desde un formulario?
¿Estás realizando un Post?
¿Puedes realizar luego manualmente un Append?

ASEP 18-12-2018 16:23:59

Buenas Casimiro, tienes razón me tire a la piscina sin leer las guías de estilo del foro.

Vuelvo a plantear la pregunta a ver si esta vez me expreso mejor.



Estoy trabajando con Delphi Embarcadero® Delphi® 2010 frente a una base de datos de firebird 2.5.

Lo que pretendo es, al abrir un formulario desde una acción en otro formulario, que este se abra en modo insert, mostrándome los campos del formulario en blanco para la inserción, y cuando el usuario valide los datos de entrada, el formulario vuelva a ponerse en modo inserción sin que el usuario haga nada más que darle a la V “ post” de la barra de menús y así sucesivamente hasta que el usuario cierre la ventana del formulario.

Trabajo con un módulo de datos en el que tengo un tableset, que es el que necesito hacerle el insert cuando abra el formulario.

Lo que hago es cuando se pulsa el botón de acción del formulario llamador, el llamado se abre en modo insert por que en el evento FormPaint del formulario tengo.

Código Delphi:

Código Delphi [-]

procedure From2.FormPaint(Sender: TObject);
var
  Estado: TDataSetState;
begin
  with ModuloDatos do
  begin
    if (tableset1.State <> dsInsert) then
       BEGIN
         LFDcampo.SetFocus;
         tablaset1.last;
         tableset1.insert;

       END;
  end;
end;

También lo he puesto “ y me convence más” en el evento del formulario OnShow, pero aquí al abrirlo me hace lo que quiero pero al validar el formulario no vuelve a insertar, para ello he puesto en los eventos AfterInsert ó AfterPost del dataset el código

Código Delphi [-]
with ModuloDatos do
  begin
    if (tableset1.State <> dsInsert) then
       BEGIN
            tableset1.insert;
       END;
 end;

Pero este código no hace nada, pasa de mi.

La pregunta es: que evento hay después de una inserción en un dataset que pueda volver a ejecutar otro insert. o como debo de realizar esto....



Espero haberme explicado mejor…. Gracias por anticipado.

Neftali [Germán.Estévez] 18-12-2018 19:47:31

1 Archivos Adjunto(s)
Ahora las cosas quedan un poco más claras.

Cita:

Empezado por ASEP (Mensaje 530022)

Lo que pretendo es, al abrir un formulario desde una acción en otro formulario, que este se abra en modo insert, mostrándome los campos del formulario en blanco para la inserción, y cuando el usuario valide los datos de entrada, el formulario vuelva a ponerse en modo inserción sin que el usuario haga nada más que darle a la V “ post” de la barra de menús y así sucesivamente hasta que el usuario cierre la ventana del formulario.

Lo primero que te diría viendo el código que has puesto, es que intentes utilizar los eventos correctos para cada cosa.
Por ejemplo, el evento FormPaint que utilizas "salta" muchas veces (cada vez que se pinta el formulario) así que posiblemente ese código se esté ejecutando muchas más veces de las necesarias.

Para lo que quieres hacer, básicamente necesitas hacer un Post (para guardar los datos actuales) y un Append (cada vez que quiereas añadir un registro nuevo).
Seguramente será más facil con un ejemplo, que explicarlo todo. Te adjunto un proyecto con lo básico para lo que necesitas.



Al finaol se trata de abrir el formulario y realizar el primer Append. Una vez que guardas el registro con Post, vuelves a realizar otro Append para añadir uno nuevo.

ASEP 19-12-2018 08:43:11

Muchísimas Gracias Neftali, es justo lo que necesitaba, me ha quedado super claro....

GRACIAS... ^\||/

oscarac 27-12-2018 16:00:02

Complementando un poco y quiza te ayude, yo hago algo similar a esto

tengo una variable que forma un bucle
p_opcion := 0;


Código Delphi [-]
  p_opcion := 0;
  While p_opcion = 0 do
  Begin
      CdsDetalle.Append
      frmIngresoComprobantesVariosD := TfrmIngresoComprobantesVariosD.Create(nil);
      frmIngresoComprobantesVariosD.FormStyle := fsNormal;
      frmIngresoComprobantesVariosD.Visible := False;
      frmIngresoComprobantesVariosD.ShowModal;
  End;


y en el boton de cancelar del formulario donde se agregan los datos coloco esto

Código Delphi [-]
procedure TfrmIngresoComprobantesVariosD.BtnCancelClick(Sender: TObject);
begin
  frmIngresoComprobantesVarios.p_opcion := -1;
  frmIngresoComprobantesVarios.CdsDetalle.Cancel;
  Close;
end;


de esa manera se sale del bucle

ASEP 22-01-2019 14:16:07

Muchas gracias Oscarac

Al González 29-01-2019 20:41:57

Solucionada la consulta de ASEP, me pregunto por qué usar una variable numérica en lugar de Boolean (True/False), estimado oscarac. :)

Cita:

Empezado por oscarac (Mensaje 530195)
tengo una variable que forma un bucle
Código Delphi [-]
  p_opcion := 0;
  While p_opcion = 0 do
  Begin
      CdsDetalle.Append
      frmIngresoComprobantesVariosD := TfrmIngresoComprobantesVariosD.Create(nil);
      frmIngresoComprobantesVariosD.FormStyle := fsNormal;
      frmIngresoComprobantesVariosD.Visible := False;
      frmIngresoComprobantesVariosD.ShowModal;
  End;

//..

procedure TfrmIngresoComprobantesVariosD.BtnCancelClick(Sender: TObject);
begin
  frmIngresoComprobantesVarios.p_opcion := -1;
  frmIngresoComprobantesVarios.CdsDetalle.Cancel;
  Close;
end;



La franja horaria es GMT +2. Ahora son las 01:49:41.

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