Mejorando la experiencia de usuario en AbanQ
La verdad, es que cada día que pasa, me sorprende más gratamente AbanQ. Primero porque examinando el código, es robusto, y está construido con criterio (es raro ver código creado utilizando paradigmas de programación orientado a objetos reales y especialmente utilizandos patrones de diseño adecuadamente, como el objeto FLObjectFactory, que implementa el patrón del mismo nombre…).
Pero siempre hay detalles que son mejorables, especialmente en la interfaz final del usuario, y en la llamada “experiencia de usuario” (qué dificultades o ayudas encuentra el usuario en el programa, siendo simplistas). Partimos de la base de utilizar la versión 2.3 y los módulos 2.2.
Existe una opción en el área de Facturación, dentro de Facturas, en el formulario maestro de Facturas de Proveedores: el botón “Asociar” (nombre mal elegido según mi punto de vista) que permite crear una factura de proveedor a partir de los albaranes emitidos por este. En este formulario, se pueden especificar unos parámetros de búsqueda para así obtener el listado de albaranes que cumplen esos criterios. Esos albaranes se agregan en un control QListView.
El problema de usabilidad viene cuando uno desea consultar algunos datos de ese QListView. Por ejemplo, no presenta ninguna opción de ordenación. ¿Es posible ordenarlo? Veamos como
La idea que he seguido es la de añadir un ComboBox que contenga el listado de las columnas que muestra el QListView. Según lo que el usuario escoja en ese ComboBox el QListView se ordena de una forma u otra. El formulario quedaría así…

Se observa que se ha incluído el ComboBox “Ordenar Por”. Eso se hace editando los ficheros agruparalbaranesprov.ui o agruparalbaranescli.prov, y añadiendo un control QComboBox desde QtDesigner. Además, también en QtDesigner añadimos los campos por los que queremos ordenar. En mi caso: “Nº Interno Alb.”, “Fecha”, “Total sin IVA”, “Total con IVA”, “Cod. Proveedor”, “Nombre”, “Nº Alb. Proveedor”
Ahora toca modificar un poquito de código QSA. Para ello, debemos editar el fichero agruparalbaranesprov.qs o agruparalbaranescli.qs (depende de si queréis habilitarlo en la parte de clientes o proveedores). Vamos a agregar una nueva función dentro de la clase oficial
// dpinelo: Para permitir ordenar
function establecerOrden() {
return this.ctx.oficial_establecerOrden();
}
El cuerpo de esa función sería
function oficial_establecerOrden()
{
var cbOrden:QComboBox = this.child("cbOrden");
if (cbOrden.currentText == "Nº Interno Alb." ) {
this.iface.ordenAlbaranes = "codigo";
} else if ( cbOrden.currentText == "Fecha" ) {
this.iface.ordenAlbaranes = "fecha";
} else if ( cbOrden.currentText == "Total sin IVA" ) {
this.iface.ordenAlbaranes = "neto";
} else if ( cbOrden.currentText == "Total con IVA" ) {
this.iface.ordenAlbaranes = "total";
} else if ( cbOrden.currentText == "Cod. Proveedor" ) {
this.iface.ordenAlbaranes = "codproveedor";
} else if ( cbOrden.currentText == "Nombre" ) {
this.iface.ordenAlbaranes = "nombre";
} else if ( cbOrden.currentText == "Nº Alb. Proveedor" ) {
this.iface.ordenAlbaranes = "numproveedor";
} else {
this.iface.ordenAlbaranes = "codproveedor,codalmacen DESC";
}
this.iface.actualizar();
}
Como veis, sólo asigno a cada nombre que aparece en el ComboBox el nombre del campo en base de datos. Y ahora viene la madre del cordero, queremos que cuando el usuario seleccione un item del ComboBox, se produzca la ordenación: sólo debemos añadir en la función init, la siguiente conexión
connect(this.child("cbOrden"), "activated(int)", this, "iface.establecerOrden");
En mi caso, cbOrden es el nombre que le he dado al control QComboBox en QtDesigner.
Sin embargo, si probáis esto no funcionará, ¿por qué? Porque QComboBox no está registrado en el QSA de AbanQ, y por tanto no podemos instanciar un objeto QComboBox en AbanQ. ¿Solución? Modificar el código fuente de AbanQ registrando QComboBox.
Sencillo: nos vamos al fichero FLObjectFactory.cpp , añadimos en el constructor:
FLObjectFactory::FLObjectFactory() : QSObjectFactory(), util_( 0 ), voidObject_( 0 ) {
...
registerClass( "QComboBox", "QComboBox" );
}
Recompilamos, y listo, podremos ordenar.
6 Septiembre 2009 at 7:33 pm
Hola David,
estoy planteándome implementar un módulo de inmobiliaria y quería saber si es posible usar componentes gráficos que en principio no estén implementados, por ejemplo, un control de calendario en el cual se muestre la ocupación de una serie de inmuebles. Supongo que podrán implementarse estos controles en QT y luego usarlos.
Confirmame esta sospecha si lo saber. Un saludo.
27 Noviembre 2009 at 11:44 am
El problema que probablemente encuentres es la versión de las Qt. Las 3.3 están ya claramente desfasadas (vamos por la versión 4.5 y la 4.6 está en una fase beta muy avanzada)… Quizás esperaría a que saliera AbanQ en la Qt4, aunque no conocemos fecha de publicación ni siquiera hay una hoja de ruta clara (un roadmap que dicen los ingleses).
Yo esperaría, puede que tengas problemas de integración por las obsoletas librerías.