Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki
Proyecto AjpdSoft: Foros

AjpdSoft :: Ver tema - Multiselección cxGrid Delphi, gridmode
Foros de discusión Buscar Perfil FAQ Iniciar sesión
Information Multiselección cxGrid Delphi, gridmode

Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net   
Ver tema anterior :: Ver tema siguiente
AutorMensaje
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: Multiselección cxGrid Delphi, gridmode Responder citando

Estoy desarrollando una aplicación de contabilidad, facturación, recursos humanos y nóminas para mi empresa. No tengo conocimientos avanzados de programación. Por circunstancias de mi empresa estoy usando Borland Delphi 6 como lenguaje de programación. La base de datos que uso es MySQL. Vuestra web me ha sido de muchísima utilidad para empezar con Delphi. Sobre todo me he basado en vuestra aplicación completa:

http://www.ajpdsoft.com/modules.php?name=Downloads&d_op=viewdownloaddetails&lid=304

¡¡Muchas gracias por publicarla gratuitamente con el código fuente!!

He hecho varias ventanas y me funciona todo bien, ahora tengo que hacer con el componente TcxGrid de DevExpress una multiselección, quiero que el usuario pueda seleccionar varios registros del grid y que al pulsar un botón la aplicación coja un dato de cada registro (en concreto el correo electrónico) y envíe un mail "masivo" a todos los seleccionados.

Pero no tengo ni idea de cómo hacer multiselección (selección de varios registros del grid) usando el cxGrid (uso la versión 6 de ExpressQuantumGrid de Developer Express).

He visto el post de este foro:

http://www.ajpdsoft.com/modules.php?name=Foros&file=viewtopic&t=96

pero es para el DBGrid que incluye Delphi.
MensajePublicado:
Vie Nov 23, 2012 11:03 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Multiselección cxGrid Delphi, gridmode Responder citando



Anuncios



varios escribió:
He hecho varias ventanas y me funciona todo bien, ahora tengo que hacer con el componente TcxGrid de DevExpress una multiselección, quiero que el usuario pueda seleccionar varios registros del grid y que al pulsar un botón la aplicación coja un dato de cada registro (en concreto el correo electrónico) y envíe un mail "masivo" a todos los seleccionados.

Pero no tengo ni idea de cómo hacer multiselección (selección de varios registros del grid) usando el cxGrid (uso la versión 6 de ExpressQuantumGrid de Developer Express).


¿En qué modo tienes el cxGrid? consulta la propiedad "DataController" - "DataModeController" - "GridMode". En función del valor de esta propiedad podrás usar un método u otro para recorrer los registros seleccionados por el usuario en el cxGrid. La propiedad anterior estará en el cxGridDBTableView.
MensajePublicado:
Vie Nov 23, 2012 11:08 am
Top of PageVer perfil de usuario
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: Re: Multiselección cxGrid Delphi, gridmode Responder citando



Anuncios



alonsojpd escribió:
¿En qué modo tienes el cxGrid? consulta la propiedad "DataController" - "DataModeController" - "GridMode". En función del valor de esta propiedad podrás usar un método u otro para recorrer los registros seleccionados por el usuario en el cxGrid. La propiedad anterior estará en el cxGridDBTableView.


GridMode = False

¿Tengo que activar algo más para la multiselección? lo digo porque al seleccionar ya compilando la aplicación no me selecciona varios registros a la vez.
MensajePublicado:
Vie Nov 23, 2012 11:09 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Multiselección cxGrid Delphi, gridmode Responder citando



Anuncios



varios escribió:
GridMode = False

¿Tengo que activar algo más para la multiselección? lo digo porque al seleccionar ya compilando la aplicación no me selecciona varios registros a la vez.


Sí, tienes que cambiar a True el parámetro "OptionSelection" - "MultiSelect" (del cxGridDBTableView).

Para recorrer todos los registros seleccionados del cxGrid y obtener el valor de uno o varios campos de esos registros puedes usar el siguiente código Delphi (para el caso de GridMode=False):

Código:

var
  i : integer;
  emailTodos, emailActual : string;
  RecIdx, ColIdx : integer;
  codigoUsuario : variant;
begin
  emailTodos := '';

  for i := 0 to (tablaAlumnosCursoView.Controller.SelectedRecordCount - 1) do
  begin
    RecIdx := tablaAlumnosCursoView.Controller.SelectedRecords[i].RecordIndex;
    ColIdx := tablaAlumnosCursoView.DataController.GetItemByFieldName('codigousuario').Index;
    codigoUsuario := tablaAlumnosCursoView.DataController.Values[RecIdx, ColIdx];

    //email de la empresa
    emailActual := '';
    emailActual := obtenerCampo(codigoUsuario, vtTablaUsuario, 'email');

    //si no tiene de la empresa se intenta con el particular
    if emailActual = '' then
      emailActual := obtenerCampo(codigoUsuario, vtTablaUsuario, 'emailparticular');
    if emailActual <> '' then
      if emailTodos <> '' then
        emailTodos := emailTodos + ';' + emailActual
      else
        emailTodos := emailActual;     
  end;

  enviarEmailUsuariosCursoRRHH (tTabla.fieldbyname('codigo').AsInteger,
      tTabla.fieldbyname('nombre').AsString, tTabla.fieldbyname('referencia').AsString,'',
      tTabla.fieldbyname('tipo').AsString, tTabla.fieldbyname('horas').AsString,
      txtMateria.Caption, lsEntidad.Text, emailTodos);


En el ejemplo anterior debes saber:

1. tablaAlumnosCursoView: será el cxGridDBTableView que tendrá la propiedad "MultiSelect" a True.
2. codigousuario: es el nombre del campo de la tabla asociada al cxGrid del que obtendremos el dato para el registro al que hace referencia la línea del grid actual seleccionada.

Lo demás, si lo analizas un poco, verás que es un ejemplo parecido al que nos comentas que necesitas, recorremos todos los registros seleccionados por el usuario, obtenemos el correo electrónico de cada uno de ellos (usando la función obtenerCampo), guardamos los correos electrónicos separados por ; en una variable y usamos otra función para enviar el correo masivo a los usuarios seleccionados.
MensajePublicado:
Vie Nov 23, 2012 11:25 am
Top of PageVer perfil de usuario
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: Re: Multiselección cxGrid Delphi, gridmode Responder citando



Anuncios



alonsojpd escribió:
Sí, tienes que cambiar a True el parámetro "OptionSelection" - "MultiSelect" (del cxGridDBTableView).

Para recorrer todos los registros seleccionados del cxGrid y obtener el valor de uno o varios campos de esos registros puedes usar el siguiente código Delphi (para el caso de GridMode=False):

Código:

var
  i : integer;
  emailTodos, emailActual : string;
  RecIdx, ColIdx : integer;
  codigoUsuario : variant;
begin
  emailTodos := '';

  for i := 0 to (tablaAlumnosCursoView.Controller.SelectedRecordCount - 1) do
  begin
    RecIdx := tablaAlumnosCursoView.Controller.SelectedRecords[i].RecordIndex;
    ColIdx := tablaAlumnosCursoView.DataController.GetItemByFieldName('codigousuario').Index;
    codigoUsuario := tablaAlumnosCursoView.DataController.Values[RecIdx, ColIdx];

    //email de la empresa
    emailActual := '';
    emailActual := obtenerCampo(codigoUsuario, vtTablaUsuario, 'email');

    //si no tiene de la empresa se intenta con el particular
    if emailActual = '' then
      emailActual := obtenerCampo(codigoUsuario, vtTablaUsuario, 'emailparticular');
    if emailActual <> '' then
      if emailTodos <> '' then
        emailTodos := emailTodos + ';' + emailActual
      else
        emailTodos := emailActual;     
  end;

  enviarEmailUsuariosCursoRRHH (tTabla.fieldbyname('codigo').AsInteger,
      tTabla.fieldbyname('nombre').AsString, tTabla.fieldbyname('referencia').AsString,'',
      tTabla.fieldbyname('tipo').AsString, tTabla.fieldbyname('horas').AsString,
      txtMateria.Caption, lsEntidad.Text, emailTodos);


En el ejemplo anterior debes saber:

1. tablaAlumnosCursoView: será el cxGridDBTableView que tendrá la propiedad "MultiSelect" a True.
2. codigousuario: es el nombre del campo de la tabla asociada al cxGrid del que obtendremos el dato para el registro al que hace referencia la línea del grid actual seleccionada.

Lo demás, si lo analizas un poco, verás que es un ejemplo parecido al que nos comentas que necesitas, recorremos todos los registros seleccionados por el usuario, obtenemos el correo electrónico de cada uno de ellos (usando la función obtenerCampo), guardamos los correos electrónicos separados por ; en una variable y usamos otra función para enviar el correo masivo a los usuarios seleccionados.


Ok, me funciona perfectamente, muchas gracias.

Una última cuestión, si tuviera el GridMode = True ¿qué cambia?
MensajePublicado:
Vie Nov 23, 2012 11:27 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Multiselección cxGrid Delphi, gridmode Responder citando



Anuncios



varios escribió:
Ok, me funciona perfectamente, muchas gracias.

Una última cuestión, si tuviera el GridMode = True ¿qué cambia?


En ese caso puedes usar un marcador, más o menos como en el DBGrid de Delphi (TBookmarkStr). En este caso tienes la ventaja de que puedes usar el origen de datos al que hace referencia el cxGrid directamente por lo que no tendrás que usar tipos de datos variant y sería más cómodo. El código para un cxGrid con GridMode=True y multiselección sería:

Código:

var
  i : integer;
  bm : TBookmarkStr;
  emailTodos, emailActual : string;
  codigoUsuario : integer;
begin
  emailTodos := '';

  for i := 0 to (tablaAlumnosCursoView.Controller.SelectedRecordCount - 1) do
  begin
    bm := tablaAlumnosCursoView.DataController.GetSelectedBookmark(i);
    mdRRHH.tcRRHHCursoUsuarios.Bookmark := bm;
    codigoUsuario := mdRRHH.tcRRHHCursoUsuarios.FieldByName('codigousuario').AsInteger;

    //email de la empresa
    emailActual := '';
    emailActual :=
        obtenerCampo(codigoUsuario, vtTablaUsuario, 'email');

    //si no tiene de la empresa se intenta con el particular
    if emailActual = '' then
      emailActual :=
          obtenerCampo(codigoUsuario, vtTablaUsuario, 'emailparticular');
    if emailActual <> '' then
      if emailTodos <> '' then
        emailTodos := emailTodos + ';' + emailActual
      else
        emailTodos := emailActual;
  end;   


Como ves en este caso es más "cómodo" porque no tienes que usar tipos de datos variant y accedes directamente al TQuery al que hace referencia el cxGrid en su propiedad "DataController" - "DataSource", en nuestro caso "mdRRHH.tcRRHHCursoUsuarios".

Si no tienes activado el GridMode=True y usas el DataController.GetSelectedBookmark te dará este error en depuración:

---------------------------
Debugger Exception Notification
---------------------------
Project facturacion.exe raised exception class EcxInvalidDataControllerOperation with message 'DataController not in GridMode'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------


Y este en tiempo de ejecución: "DataController not in GridMode".
MensajePublicado:
Vie Nov 23, 2012 11:51 am
Top of PageVer perfil de usuario
Mostrar mensajes de anteriores:   
Todas las horas son GMT - 1 Horas
Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net  

Cambiar a:  
Key
  Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A