PDA

Ver la Versión Completa : Como programar algo así? (ver texto)


jcapitan
31-05-2007, 03:45:44
Amigos, tengo un problemilla con los forms no modales. Resulta que genero un modal desde un form principal, y ya puedo moverme de uno a otro y llamarlo desde el pricipal a través de su caption (en un hilo anterior me dieron el tip para hacer esto), bueno hasta todo bien, el problema aparece cuando .....

En cada form no modal tengo un componente
FIBDataSet ligado a su respectiva tabla y su DataBase (el cual esta en un data module), tengo un dbgrid en el form no modal ligado al datasource ligado al FIBDataSet mencionado arriba, bueno al crear el no modal abro el dataset, y lo muestro filtrado en el grid (filtrado de acuerdo al valor del caption el cual es un valor numerico), pero... cuando creo varios y me muevo a uno anterior, y quiero meter datos a la tabla y que se refleje en el grid del no modal seleccionado, resulta que aparecen en el ultimo form generado, imagino que es porque es el que se encuentra activo por ser el ultimo generado, y es que como tienen el mismo nombre (creo que por ahi esta la jugada), creo que tengo que generarlos en tiempo de ejecución o no? y si es asi como lo hago, y si hay otra manera cual es? o que estoy haciendo mal?

Espero alguien pueda ayudarme en este problemilla.
Mil gracias.

Neftali [Germán.Estévez]
31-05-2007, 12:28:59
Por favor intenta poner títulos descriptivos a los hilos. El que has puesto al actual (que estaría bien que modificaras...) no ayuda a búsquedas posteriores.

roman
31-05-2007, 16:47:56
Además de lo que ya te comentó Neftalí, yo te recomiendo que medites bien tu pregunta y la formules con mayor claridad. Yo, al menos no entiendo que quieres decir con puedo moverme de uno a otro, siendo que uno de los dos es modal, y menos entiendo lo de llamarlo desde el pricipal a través de su caption.

Pero menos aún entiendo qué tiene que ver el formulario modal en todo esto si después únicamente hablas de formularios no modales.

// Saludos

jcapitan
31-05-2007, 19:44:33
Disculpen por el título del hilo.

Bueno, lo que estoy intentando es lo siguiente:

Tengo la ventana principal de la aplicacion, ahi tengo una linea de comandos, el cual uno de los comandos es para generar "papeletas" o registros nuevos, en esta papeleta se puede capturar informacion; esta ventana de la papeleta la muestro con Form.Show porque el sistema tiene que ser capaz de poder generar tantas papeletas como sean necesarias y poder moverse de una a otra teniendolas en pantalla, y poder modificar los campos; el registro que muestran las papeletas por lógica debe ser de acuerdo al ticket de la misma, el cual muestro en el caption (UN NUMERO). El problema que quería explicarles es que cuando genero las papeletas (2 por ejemplo) y las tengo en pantalla y me muevo a la primera que generé, cuando meto datos (unas notas) se me reflejan en la ultima y no en la que seleccioné.

Cabe mencionar que la llamada de la papeleta o ventana lo hago de la siguiente manera:

frmNew:=TfrmNew.Create(Self);
frmNew.Caption:=IntToStr(NewFolio);
frmNew.Show; (esto con la finalidad de poder moverme de una a otra)


tambien menciono que en el form que genero (frmNew) tengo un FIBDataSet y lo que hago es llamar siempre a la misma para generar una papeleta nueva, y lo unico que cambio es el ticket. ¿Es correcto esto? ¿o es por lo que tengo el problemilla?

espero ahora me haya explicado, discupen si aun no queda claro.

mil gracias.

AzidRain
31-05-2007, 22:29:06
A ver si traduje bien:

Tienes una tabla FB, y puedes crear tantos formularios como quieras para insertar nuevos registros en la tabla. Estos registros sin embargo no se guardan hasta que uno presiona "Guardar" (o algo similar) por lo que mientras tanto esos datos capturados en cada ventana quedan "en el limbo".

Ahora bien, si usaste componentes dbaware, todas las instancias de esos controles apuntarán a un solo dataset por lo que los cambios que hagas en cualquier ventana se propagan a las otras como magia.

Solucion: No uses controles dataware y dale al formulario la capacidad de guardar el mismo sus datos al dataset en forma independiente. Además puedes usar un campo autoincrementado para guardar el numero de papeleta de manera que no necesites saber éste numero sino hasta que se guarda en la tabla.

Como se trata de ventanas no-modales, se crea una instancia de cada una cada vez que "generas" una papelete. Por eso creo que debes ponerle el códig o necesario para insertar y guardar los datos en el dataset de forma independiente de manera que cada instancia pueda trabajar de forma independiente.

jcapitan
01-06-2007, 04:59:12
Lo que mencionas (http://www.clubdelphi.com/foros/image.php?u=6828&dateline=1165511126 (http://www.clubdelphi.com/foros/member.php?u=6828) AzidRain (http://www.clubdelphi.com/foros/member.php?u=6828)) es precisamente o que quiero hacer, que trabajen de manera independientes las "papeletas".

Mas detalles:

Primero, tengo un DataModule, en el cual tengo un FIBDatabase, un FIBTransaction, y unos FIBDataSet.
ok.

Ahora

Desde mi form principal, voy a llamar y mostrar a mi ventana (.Show) para capturar mis datos del nuevo registro.

el codigo que tengo es el siguiente:


frmNew:=TfrmNew.Create(Self);
frmNew.Caption:=IntToStr(NewFolio);
frmNew.Show;

Este codigo es el que ejecuto cada que pongo el comando de generar una nueva papeleta, es decir si abro 5 este codigo es el que se ejecuta 5 veces, con el cual las mantengo en pantalla y me muevo de una a otra sin problemas (solo el moverme :-( )

Cabe mencionar los componentes que tengo en esta ventana (frmNew):
2 FIBDataSet que estan ligados al FIBDatabase del DataModule, esto con el fin de que cada papeleta tenga su propia consulta y su grid, bien hasta ahi todo bien (creo) , tengo igualmente un boton en el frmNew con el cual mando a llamar otra ventana en la cual meto las notas para la papeleta seleccionada ( y aqui viene el problema), en esta nueva ventana (notas) grabo cada que doy un enter y limpio el campo esperando una nueva nota (esto por motivos de registro en cuanto a tiempo, fecha, usuario, etc), si la nota es vacia simplemente se cierra la ventana y regresa al frmNew, en la cual se me deben de reflejar las notas de esa papeleta.
cuando grabo las notas lo hago de la siguiente manera (la cual es donde creo que esta el problema)

frmNew.tblDetalles.Insert;
frmNew.tblDetallesFOLIO.AsString:=Caption;
frmNew.tblDetallesOPERADOR.Value:=Operador;
frmNew.tblDetallesNOTA.AsString:=NotasMemo.Lines.Text;
frmNew.tblDetallesHORA.Value:=Now;
frmNew.tblDetallesDIA.Value:=Now;
frmNew.tblDetalles.Post;

En esta form (frmNew) tengo: un boton para las notas (llama a un form en la cual meto las notas), un componente dbgrid y 2 FIBDataBase (reporte y notas de las cuales guardo hora, usuario y la nota en si) que usa al FIBDatabase que se encuentra en el DataModule (mencionado al inicio), al crearse la ventana (frmNew) asigno un nuevo numero de papeleta, y abro el FIBDatabase con la condicion de folio=NewFolio para que me muestre en el grid las notas relacionadas a este folio (las notas estan en otra tabla como mencione arriba) , bien pues cuando abro una sola papeleta no hay broncas click al boton par añadir notas y cuando voy guardando las notas aparecen en el grid de la papeleta, pero... cuando abro dos y me muevo a la primera papeleta y quiero meter las notas, las mete en la ultima pepeleta creada, ese es el problema, como le hago para que cada papeleta sea independiente y cuando me mueva a cualquiera los componentes o tablas que se activen sean las de la papeleta en uso y no la ultima generada.

¿Es por el crearlas con el mismo nombre? ¿Como puedo hacer esto?

AzidRain
01-06-2007, 16:35:57
checa esto:
folio=NewFolio
que es el filtro que usas para las tablas de detalle de cada papeleta (notas)

Al usar la primera papeleta supongamos que newFolio es igual a 1, ok?, entonces el grid solo mostrara las notas del folio 1, hasta aqui ok. Pero que pasa cuando abrimos una nueva papeleta, NewFolio ahora vale 2, por ejemplo, y el de esta nueva ventana muestra solo las papeletas del folio 2. Todo bien hasta aqui...ahora volvamos a la primera papeleta...

Sorpresa! Como la tabla filtra por NewFolio que en este momento vale 2, adivina que notas te muestra e inserta?? las de la última papeleta!!!

Solución:
Quick & Dirty:
folio=Caption
(veo que usas caption para guardar el folio)

MAs Decente:
Crea una propiedad que llamaremos Folio para la frmNew y un método como esto:


Procedure frmNew.AsignaFolio(unFolio:Integer);
Begin
Folio := unFolio; // Folio es una propiedad integer de frmNew
Caption := Format('Papeleta num %d',[NewFolio]); //Ponemos el título
// Aqui colocas la asignación del filtro de la tabla de manera
// que quede filtro=Folio
end;



Tu código para crear las notas quedaria así:


frmNew.tblDetalles.Insert;
frmNew.tblDetallesFOLIO.AsINTEGER:=Folio; // Aqui cambió
frmNew.tblDetallesOPERADOR.Value:=Operador;
frmNew.tblDetallesNOTA.AsString:=NotasMemo.Lines.Text;
frmNew.tblDetallesHORA.Value:=Now;
frmNew.tblDetallesDIA.Value:=Now;
frmNew.tblDetalles.Post;



En tu form principal harias esto:

frmNew:=TfrmNew.Create(Self);
frmNew.AsignaFolio(NewFolio); //Aqui cambió
frmNew.Show;


Con esto debe funcionar, ahora cuando creas una papeleta ésta guarda su propio folio devuelto por NewFolio y filtro de la tabla muestra y añade solo notas correspondientes.

Ojala te funcione

olbeup
04-06-2007, 11:44:35
Hay una variable que casi nunca se utiliza en los formularios que es el tab, pon hay el numero de folio y juega con el.

Un saludo.
:cool: