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:
¡¡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 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.
¿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.
¿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;
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.
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;
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?
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".
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