Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-05-2011
Vales08 Vales08 is offline
Miembro
 
Registrado: feb 2011
Posts: 133
Poder: 7
Vales08 Va por buen camino
Smile Pasar registros desde un dbgrid a otro dbgrid con botones..

Hola!
Necesito una ayudita con esto.. Tengo un formulario, el cual posee dos dbgrid, en el dbgrid1 tengo todas las coberturas medicas que estan cargadas en una tabla, y en el dbgrid2 necesito mostrar las coberturas medicas q selecciono de la primer grilla mencionada. Yo quiero que esto se realice mediante botones que estaran entre medio de las dos grillas.
boton1, el cual me pasara un regitro seleccionado;
boton2, el cual pasara todos los registros (en caso que quiera a todos);
boton3, el cual me regresara de nuevo un registro pasado con anterioridad;
boton3, el cual me regresara todos los registros que habia pasado con anterioridad.

Para que entiendan mejor el funcionamiento que quiero, les explico que funcion cumple ese formulario..
Es un formulario para cargar profesionales, carga muchos datos y uno de ellos es la cobertura medica, yo lo habia hecho con un dblookupcombobox, pero me di cuenta q un profesional puede trabajar con muchas coberturas medicas, por lo tanto necesitaba algo de lo cual yo pudiera seleccionar varias coberturas, en vez de una. Es por esa razon que plantee las dos grillas, me parecio algo más facil de manejar.

La relacion entre las tablas Profesionales, y Coberturas Medicas es de NaN, por lo tanto aparece una nueva tabla con la relacion.. El dbgrid2 estaria relacionado al datasource de esta ultima tabla, o sea, la relacion.

Yo he estudiado, pero aun estoy en aprendizaje con todo lo que es programacion y hay cosas que no he hecho nunca y que necesitaria de su ayuda para poder ir adquiriendo esos conocimientos.
Espero haber sido clara con la explicacion..

Desde ya muchas gracias, y espero puedan ayudarme.-
Saludos.-

Última edición por Vales08 fecha: 18-05-2011 a las 19:46:30.
Responder Con Cita
  #2  
Antiguo 18-05-2011
Vales08 Vales08 is offline
Miembro
 
Registrado: feb 2011
Posts: 133
Poder: 7
Vales08 Va por buen camino
PD: pasar registros desde un dbgrid a otro dbgrid con botones..

Me olvide de comentarles que trabajo con delphi 7, sql manager..
Uso ibdataset, ibquerys, ibdatasourse para cada dataset y query, ibtransaction.. todo en un DataModule
Responder Con Cita
  #3  
Antiguo 18-05-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 1.706
Poder: 12
oscarac Va por buen camino
en la parte inferior de esta pagina encontraras temas similares
por lo pronto revisa aqui
saludos
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #4  
Antiguo 18-05-2011
Vales08 Vales08 is offline
Miembro
 
Registrado: feb 2011
Posts: 133
Poder: 7
Vales08 Va por buen camino
Ya he revisado, pero eh probado y nada.. no me funiciona. para lo que quiero no me sirve..
muchas gracias igual.
Responder Con Cita
  #5  
Antiguo 19-05-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.684
Poder: 27
ecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todos
Hola Vales08.

Para hacer lo que buscas creo que tendrías que tener:
.- Una tabla MEDICOS.
.- Una tabla COBERTURAS.
.- Una tabla COBERT_X_MEDICO.

Donde la tabla COBERT_X_MEDICO está en relación Master/detail con MEDICOS por el campo ReferMedico / Medico_ID.

Para ejemplificar tu caso usemos:
.- DBGridMedicos.
.- DBGridCoberturas.
.- DBGridDetalle.

En DBGridCoberturas ponemos la propiedad: Options -> dgMultiSelect a True, así podrás elegir una, varias o todas las coberturas (Ctr+click o Shift+Flecha abajo).

Luego la asignación la podes hacer mediante Drag&Drop o en el evento OnClick de un TButton, esta última forma es la que uso para el ejemplo.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i:= 0 to GridCoberturas.SelectedRows.Count -1 do
  begin
    GridCoberturas.DataSource.DataSet.GotoBookmark(Pointer(GridCoberturas.SelectedRows.Items[i]));
    GridDetalle.DataSource.DataSet.Append;
    GridDetalle.DataSource.DataSet.FieldByName('ReferMedico').AsInteger:=
      GridMedicos.DataSource.DataSet.FieldByName('Medico_id').AsInteger;
    GridDetalle.DataSource.DataSet.FieldByName('Cobertura').AsString:=
      GridCoberturas.DataSource.DataSet.FieldByName('Cobertura').AsString;
    GridDetalle.DataSource.DataSet.Post;
  end;
end;

DBGridCoberturas, sólo debería mostrarse para que el usuario pueda realizar la elección de las posibles coberturas y luego cerrarse. Cuando quieras mostrar las coberturas que trabaja un médico usas un DBGrid u otro componente que haga referencia a la tabla COBERT_X_MEDICO y te las mostrará.

Espero haber interpretado lo que querías hacer...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 19-05-2011
Vales08 Vales08 is offline
Miembro
 
Registrado: feb 2011
Posts: 133
Poder: 7
Vales08 Va por buen camino
Hola, como andas?
Eres muy bueno en interpretacion, explicacion y en delphi jaja..
Justamente la funcionalidad que quiero es esta que me has dado...
Lo aplicare lo antes posible y te dare una respuesta de si me ha sido util o no.. pero seguramente que si xq yo a las tablas ya las tengo echas y el codigo y todo esta muy bien explicado..

muchas gracias.-
En cuanto lo tenga te confirmare si me ha sido util, pero es lo que queria..

Saludos.-
Responder Con Cita
  #7  
Antiguo 19-05-2011
Vales08 Vales08 is offline
Miembro
 
Registrado: feb 2011
Posts: 133
Poder: 7
Vales08 Va por buen camino
Lo unico que veo es que yo no necesito una grilla de medicos xq presisamente eso es lo que estoy por dar de alta o cargar... a tal prfesiona que estoy ingresando con sus datos tengo q seleccionarle las coberturas..
No se si me explico..
a lo que yo entiendo q haces es poner una grilla medicos para identificar a que medico le asigno las coberturas.. o estoy entendiedno mal??
Responder Con Cita
  #8  
Antiguo 19-05-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.684
Poder: 27
ecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todos
Hola Vales08.

No, no estas entendiendo mál, tu interpretación es correcta, eso funcionaría para una modificación del médico y no para un ingreso. Lo hice así para simplificar el ejemplo.

En tu caso deberías cambiar la línea:
Código Delphi [-]
GridDetalle.DataSource.DataSet.FieldByName('ReferMedico').AsInteger:=
      GridMedicos.DataSource.DataSet.FieldByName('Medico_id').AsInteger;

Por:
Código Delphi [-]
GridDetalle.DataSource.DataSet.FieldByName('ReferMedico').AsInteger:= DataSet.FieldByName('Medico_id').AsInteger;
Pero no es tán simple, te encontrás con el problema de tener que asignar un identificador que todavía no tenés ya que el médico todavía no se ha guardado. Es decir que vas a tener que hacer un Post en la tabla Médicos sin tener seguramente, todos sus campos ingresados. Una forma de solucionarlo es usando CachedUpdates.
Si mál no recuerdo trabajas con componentes IBX, estos tienen una pequeña complicación a la hora de usar CachedUpdates y tablas en relacion master/detail: Tenes que desactivar el DataSource del detail antes de guardar y volverlo a conectar luego de haber guardado.

Es decir que quedaría:
Código Delphi [-]
....
(* Detalle de apertura de las tablas tbMedicos y tbDetCober (coberturas x médico) *)
begin
   DModule.tbDetCober.CachedUpdates:= True;
   DModule.tbMedicos.CachedUpdates:= True;
   DModule.tbDetCober.Open;
   DModule.tbMedicos.Open;
end;
...
(* En algún punto antes de ejecutar Button1Click debés hacer: *)
  DModule.tbMedicos.Post;
...
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i:= 0 to GridCoberturas.SelectedRows.Count -1 do
  begin
    GridCoberturas.DataSource.DataSet.GotoBookmark(Pointer(GridCoberturas.SelectedRows.Items[i]));
    with DModule do
    begin
      tbDetCober.DataSource:= nil; (* desconectar DataSource *)
      tbDetCober.Append;
      tbDetCober.FieldByName('REFMEDICO').AsInteger:= tbMedicos.FieldByName('MEDICO_ID').AsInteger;
      tbDetCober.FieldByName('COBERTURA').AsString:= tbCoberturas.FieldByName('COBERTURA').AsString;
      tbDetCober.Post;  (* guardar *)
      IBdatabase1.ApplyUpdates([tbDetCober]); (* aplicar updates *)
      tbDetCober.DataSource:= DModule.dsMedicos; (* reconectar DataSource *)
    end;
  end;
end;

Si hay algo en lo que no me expliqué bién, decimelo y te adjunto un código de ejemplo.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 19-05-2011 a las 09:20:18.
Responder Con Cita
  #9  
Antiguo 21-05-2011
Vales08 Vales08 is offline
Miembro
 
Registrado: feb 2011
Posts: 133
Poder: 7
Vales08 Va por buen camino
hola ecfisa!!

Mil disculpas por no contestarte antes, eh tenido muchos inconvenientes personales y no habia podido aplicar lo que me has dado... En serio perdon xq has ocupado tu tiempo para ayudarme y no eh sido agradable en ese sentido..

Ahora voy a contestarte, el primer codigo que me habias dado igualmente lo guardare xq tengo que hacerlo en la parte de modificacion asiq me sirve mucho igual..

Con respecto al segundo codigo, lo entiendo pero me gustaria saber en que parte ingreso este codigo:

Código:
(* Detalle de apertura de las tablas tbMedicos y tbDetCober (coberturas x médico) *)
begin
   DModule.tbDetCober.CachedUpdates:= True;
   DModule.tbMedicos.CachedUpdates:= True;
   DModule.tbDetCober.Open;
   DModule.tbMedicos.Open;
end;
O lo hago directamente desde otro lugar sin codigo??

Y otra consulta, el siguiente codigo del post:
Código:
(* En algún punto antes de ejecutar Button1Click debés hacer: *)
  DModule.tbMedicos.Post;
Podria hacerlo en el FormShow?
Ya que yo para dar de alta o cargar el medico tengo que presionar el boton ACEPTAR, pero si hago el codigo alli se me guardara todo menos las coberturas, no se si me explico.? Entonces tengo que hacerlo en un lugar donde guarde todo inmediatamente antes de presionar el boton de seleccionar las coberturas, pero que a la vez luego pueda seleccionar las coberturas para ese medico..
Creo que hice mucho lio al explicar, pero tengo esperanzas de que me interpretes ja.

Si me contestas esto, podre completar todo y ver si realmente me funciona todo o tengo algun problema...
muchas gracias por todo, me has ayudado mucho..
Responder Con Cita
  #10  
Antiguo 21-05-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.684
Poder: 27
ecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todos
Hola Vales08.

Con respecto a el código que abre las tablas:
Código Delphi [-]
   DModule.tbDetCober.CachedUpdates:= True;
   DModule.tbMedicos.CachedUpdates:= True;
   DModule.tbDetCober.Open;
   DModule.tbMedicos.Open;
lo podes hacer en el evento OnCreate u OnShow, respetando siempre que la asignación de CachedUpdates va previo a la apertura.

En cuanto al post de la tabla maestro, antes de que guardes la tabla detalle y de ese modo tener el ID del maestro para asignar al campo de referencia del detalle:
Código Delphi [-]
tbDetCober.FieldByName('REFMEDICO').AsInteger:= tbMedicos.FieldByName('MEDICO_ID').AsInteger;
Si se presenta el problema que cuando ingresas las coberturas, aún tenés campos de la tabla MEDICOS con valores no asignados y requeridos (que ingresarás mas adelante) dales algún valor para realizar el post. Luego los sobreescribiras cuando ingreses el valor en el componente correspondiente. Y por último los datos los confirmaras con el ApplyUpdates sobre la tabla MEDICOS.

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #11  
Antiguo 21-05-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.684
Poder: 27
ecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todos
Hola Vales08.

Se me pasó por alto comentarte una idea, podés confirmar los cambios al salir del form o mediante un Botón.

Usando Firebird sería algo como:
Código Delphi [-]
procedure TForm1.btnConfirmaClick(Sender: TObject);
begin
   if MessageDlg('¿Confirma los cambios ?',mtConfirmation,[mbYes,mbNo],0)= mrYes then
   begin
     DModule.tbDetCober.DataSource:= nil; (* desconectar DataSource *)
     DModule.IBDatabase.ApplyUpdates([Module.tbMedicos, DModule.tbDedCober]);
     DModule.tbDetCober.DataSource:=:= DMDatos.dsMedicos; (* conectar detalle *)
     DMConect.IBTransaction.CommitRetaining;
   end
   else
     DMConect.IBTransaction.RollbackRetaining;
end;
Por último, si querés verificar al salir si en el buffer de cached existen registros sin confirmar, podes consultar la propiedad UpdatesPending de tipo Boolean.

Creo que no me quedó nada en el tintero, pero bueno vos dirás luego...


Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 25-05-2011 a las 01:15:11.
Responder Con Cita
  #12  
Antiguo 24-05-2011
Vales08 Vales08 is offline
Miembro
 
Registrado: feb 2011
Posts: 133
Poder: 7
Vales08 Va por buen camino
Smile Resuelto

Hola ecfisa!!!
Estoy contenta porque me ha funcionado perfecto tu codigo.. realemnte ah sido de muy gran ayuda..
te cuento que me ha hecho renegar, ya que yo tenia otro codigo para dar de altay todo lo demas, pero eh podido soluionarlo bien y me funciona muy bien..
El codigo:
Código:
   DModule.tbDetCober.CachedUpdates:= True;
   DModule.tbMedicos.CachedUpdates:= True;
   DModule.tbDetCober.Open;
   DModule.tbMedicos.Open;
no me ha hecho falta, yo tengo las tablas abiertas siempre desde el datamodue y aparte funciona bien sin él..

Te paso como me ha quedado el codigo para que lo veas, espero no haberme mandado ninguna macana jaja.

Código:
(*Boton que esta entre las grillas, el cual pasa las coberturas de una a otra*)
procedure TProfesional.pasar_cober_prof_aClick(Sender: TObject);
var
  i: Integer;
begin
  for i:= 0 to Grilla_cob_prof_aa.SelectedRows.Count -1 do
  begin
    Grilla_cob_prof_aa.DataSource.DataSet.GotoBookmark(Pointer(Grilla_cob_prof_aa.SelectedRows.Items[i]));
    with DM do
    begin
      DSET_prof_cober.DataSource:= nil; (* desconectar DataSource *)
      DSET_prof_cober.Append;
      DSET_prof_cober.FieldByName('ID_PROF').AsInteger:=DSET_prof.FieldByName('ID_PROF').AsInteger;
      DSET_prof_cober.FieldByName('COBERTURA_MEDICA').AsString:= DSET_cob_med.FieldByName('NOMBRE').AsString;
      DSET_prof_cober.Post;  (* guardar *)
      Base_datos.ApplyUpdates([DSET_prof_cober]); (* aplicar updates *)
      DSET_prof_cober.DataSource:= DM.DSET_prof.DataSource; (* reconectar DataSource *)
    end;
  end;
end;
 
(*Boton donde confirmo los datos ingresados del paciente antes de asignarle las coberturas*)
procedure TProfesional.ConfirmarClick(Sender: TObject);
begin
   if MessageDlg('¿Desea guardar los datos ingresados?',mtConfirmation,[mbYes,mbNo],0)= mrYes then
   begin
     DM.DSET_prof_cober.DataSource:=nil; (* desconectar DataSource *)
     DM.DSET_profESTADO.Value:=0;
     DM.DSET_profEDAD.Value:=edad_prof_a.Value;
     DM.Base_datos.ApplyUpdates([DM.DSET_prof, DM.DSET_prof_cober]);
     DM.DSET_prof_cober.DataSource:=DM.DSET_prof.DataSource; (* conectar detalle *)
     DM.Transaccion.CommitRetaining;
   end
   else
     DM.Transaccion.RollbackRetaining;
end;
A parte de eso, hice un append cuando cierro el formulario, ya que lo necesito para cuando vuelva a ingresar al form y no me aparezca el registro que cargue por ultima vez.

Mi ultima duda y 'creo' que no molesto mas: como hago para que se me vacie la grilla donde deposito las coberturas elegidas?? porque cada vez que voy a ingresar un profesional y a asignarle las coberturas, me figuran todas las anteriores ja.


Muchas gracias por todo..
saludos.-
Responder Con Cita
  #13  
Antiguo 25-05-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.684
Poder: 27
ecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todosecfisa es conocido por todos
Hola Vales. (Creo que ya nos conocemos lo suficiente para no usar el apellido)

Si te referís al DBGrid conectado con la tabla que almacena las coberturas por médico, no tendrían que aparecer luego de haber realizado Append.
A menos que no tengas bién establecida la relación maestro/detalle.

Creo (no recuerdo bién) que usabas componentes IBX...
Te pongo un ejemplo para establecer una relación m/d con dos TIBDataSet.

El TDataSet afectado es el detalle teniendo que tener en su propiedad DataSource el nombre del DataSource del TDataSet que será su master (médicos).
Creo que en tu caso el nombre seria parecido a: dsMedicos (->tbMedicos).
Luego en la propiedad SelectSQL la sentencia sería:
Código SQL [-]
SELECT * FROM COBERTXMEDICO 
WHERE REF_MEDICO = :MEDICO_ID
(Los nombres de tabla y campos seguramente diferirán, las sentencias no )

Ahí tenés establecida la relación m/d. En la grilla sólo aparecerán las coberturas cuando consultes o modifiques un médico. Pero no así en un nuevo ingreso, ya que el nuevo registro no tiene ningún detalle asociado todavía.

Un saludo y me alegro que vayas bién con tu proyecto.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 25-05-2011 a las 01:38:49.
Responder Con Cita
  #14  
Antiguo 26-05-2011
Vales08 Vales08 is offline
Miembro
 
Registrado: feb 2011
Posts: 133
Poder: 7
Vales08 Va por buen camino
Hola ecfisa..

Lo tenia hecho al reves, que boba.. Ahora me funciona barbaro..
Muchas gracias x tu ayuda y tu tiempo..

Saludos.-
Responder Con Cita
  #15  
Antiguo 21-11-2011
amyleemikami amyleemikami is offline
Registrado
 
Registrado: nov 2011
Posts: 2
Poder: 0
amyleemikami Va por buen camino
Holaaa

Estas En La Linea La Moderadora?? Neesito Ayuda Con Delphi

Repondeme Porfaaa
Responder Con Cita
  #16  
Antiguo 21-11-2011
Avatar de Neftali
Neftali Neftali is offline
-Germán Estévez-
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 15.242
Poder: 10
Neftali Va camino a la famaNeftali Va camino a la fama
Cita:
Empezado por amyleemikami Ver Mensaje
Estas En La Linea La Moderadora?? Neesito Ayuda Con Delphi
Hola y bienvenido al foro.
Normalmente todos los que entran en el foro, necesitan ayuda, pero esta no es la forma de pedirla.

Revisa la Guía de estilo de los foros.

Un saludo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #17  
Antiguo 21-11-2011
amyleemikami amyleemikami is offline
Registrado
 
Registrado: nov 2011
Posts: 2
Poder: 0
amyleemikami Va por buen camino
Okiz

SI ENTIENDO, pero estoy en este foro por el mismo tema
y nome corre el programa co los ejemplos o ayudas que dan T_T
Responder Con Cita
  #18  
Antiguo 21-11-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 27.159
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Pasar Datos De Dbgrid A Otro Helg17 Tablas planas 7 27-03-2009 10:16:37
Pasar informacion de un dbgrid a otro schaka Conexión con bases de datos 3 11-02-2008 10:15:32
Pasar lineas de in dbgrid a otro dbgrid look OOP 3 21-09-2007 23:16:29
Agregar registros a un DBGRID provenientes de otro Formulario JoanKa Varios 2 19-05-2006 01:58:09
Pasar datos desde un DBGrid jdangosto OOP 2 19-02-2005 16:55:37


La franja horaria es GMT +2. Ahora son las 04:43:50.


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