Para desplegar una lista de opciones agrupadas por un atributo en AngularJS, puedes utilizar el elemento select de la siguiente manera

<select ng-model="myColor" ng-options="color.name group by color.shade for color in colors">
  </select>

Pero ¿qué pasa si tu modelo no contiene un atributo que te permita agrupar los elementos? sino más bien, depende de algún cálculo, varios atributos o cualquier otra condición. Bueno, pues resulta que la cláusula group by es una expresión de AngularJS, esto nos permite utilizar una función para agrupar los elementos. Un ejemplo sería de la siguiente forma.
Supongamos que tenemos el modelo

    $scope.colors = [
      {name:'black', shade:'dark'},
      {name:'white', shade:'light'},
      {name:'red', shade:'dark'},
      {name:'blue', shade:'dark'},
      {name:'yellow', shade:'light'}
    ];

Y queremos crear grupos de acuerdo a la longitud del nombre. Lo haríamos de la siguiente manera

<select ng-model="myColor" ng-options="color.name group by longitud(color) for color in colors"></select>

y en nuestro controlador

        $scope.longitud = function(color){
            var grupo
            switch (color.name.length){
                case 5: grupo = 'Cinco letras'
                    break
                case 4: grupo = 'Cuatro letras'
                    break
                case 3: grupo = 'Tres letras'
                    break
                default: grupo = 'Otro'
            }
            return grupo
        }

De esta forma puedes utilizar cualquier condición para crear los grupos que necesites.

Fuentes:

Anuncios

git – saltos de línea CRLF

Si en tu equipo de trabajo utilizan computadoras con Windows y Linux (o Mac) para desarrollar, seguramente tendrán un problema con los saltos de línea. Git resuelve este problema mediante el parámetro de configuración ‘core.autocrlf’.

En las computadoras con Windows establece este parámetro en ‘true’ mediante el comando

git config –global core.autocrlf true

En las computadoras con Linux (Mac) debe ser falso (default).

CP-1252

Otro problema que se nos presentó, debido a este ambiente heterogéneo, fue la codificación de los proyectos. La codificacioón por default en Windows (en español) es CP-1252 mientras que Linux utiliza UTF-8. Para que nuestros proyectos Maven puedan ser compilados en ambas plataformas, es necesario agregar el siguiente parámetro de configuración al archivo pom.xml

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

Fuentes:
git book
http://stackoverflow.com/questions/9976616/maven-platform-encoding

Si necesitas un control para desplegar una lista de opciones, puedes utilizar un ListGrid y activar el modo de selección con casillas (checkbox).

Debes tener en cuenta, si quieres ejecutar código cuando cambie la selección, que el evento SelectionChangedHandler se manda llamar para cada elemento seleccionado.

    ListGrid grdOpciones = new ListGrid();
    grdOpciones.setSelectionType(SelectionStyle.SIMPLE);
    grdOpciones.setSelectionAppearance(SelectionAppearance.CHECKBOX);
    grdOpciones.addSelectionChangedHandler(new SelectionChangedHandler() {
        @Override
        public void onSelectionChanged(SelectionChangedEvent event) {
            updateOpciones();
        }
    });

Esto es ineficiente cuando el usuario marca la casilla del encabezado para seleccionar todos los elementos. En este caso, convendría utilizar el evento SelectionUpdatedHandler que se dispara una sola vez.

    grdOpciones.addSelectionUpdatedHandler(new SelectionUpdatedHandler() {
        @Override
        public void onSelectionUpdated(SelectionUpdatedEvent event) {
            updateOpciones();
        }
    });

Fuentes:
http://forums.smartclient.com/showthread.php?t=15971

En una aplicación con múltiples módulos, es probable que diferentes módulos accedan a distintas bases de datos o esquemas y con distintas credenciales.

Para configurar multiples conexiones en Datanucleus hay que crear un archivo jdoconfig.xml en la carpeta META-INF del classpath (WEB-INF/classes/META-INF en una aplicación web). Si utilizas Maven crea el archivo en la carpeta src/main/resources/META-INF y Maven copiara el archivo y la carpeta al classpath.


<?xml version="1.0" encoding="UTF-8"?>

<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">

<persistence-manager-factory name="compras">

<property name="javax.jdo.PersistenceManagerFactoryClass"

value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory"/>

<property name="javax.jdo.option.ConnectionDriverName" value="oracle.jdbc.OracleDriver"/>

<property name="javax.jdo.option.ConnectionURL" value="jdbc:oracle:thin:@132.147.0.1:1521:dbcompras"/>

<property name="javax.jdo.option.ConnectionUserName" value="usrcompras"/>

<property name="javax.jdo.option.ConnectionPassword" value="secret"/>

<property name="javax.jdo.option.DetachAllOnCommit" value="true"/>

</persistence-manager-factory>

<persistence-manager-factory name="recursoshumanos">

<property name="javax.jdo.PersistenceManagerFactoryClass"

value="org.datanucleus.api.jdo.JDOPersistenceManagerFactory"/>

<property name="javax.jdo.option.ConnectionDriverName" value="oracle.jdbc.OracleDriver"/>

<property name="javax.jdo.option.ConnectionURL" value="jdbc:oracle:thin:@192.168.0.250:1521:dbrh"/>

<property name="javax.jdo.option.ConnectionUserName" value="usrrh"/>

<property name="javax.jdo.option.ConnectionPassword" value="topsecret"/>

<property name="javax.jdo.option.DetachAllOnCommit" value="true"/>

</persistence-manager-factory>

</jdoconfig>

Para obtener una instancia PersistenceManagerFactory podríamos tener una clase PMF en cada módulo (suponiendo que son proyectos distintos) como la siguiente. Cambiando solamente el nombre de acuerdo al PersistenceManagerFactory que vamos a utilizar. También podrías recibir como parámetro el nombre del PersistenceManagerFactory y almacenarlo en un Map para usos posteriores, esto si los módulos se encuentran en el mismo proyecto.


public class PMF {

private static final PersistenceManagerFactory instance=JDOHelper.getPersistenceManagerFactory("compras");

private PMF() {

}

public static PersistenceManagerFactory get(){

return instance;

}

}

Y lo usarías de la siguiente forma


public static List<Compra> getCompras(){

List<Compra> compras;

PersistenceManager pm = PMF.get().getPersistenceManager();

Transaction tx = pm.currentTransaction();

try{

tx.begin();

Query query = pm.newQuery(Compra.class);

jueces=(List<Compra>) query.execute();

tx.commit();

}finally{

if(tx.isActive()){

tx.rollback();

}

pm.close();

}

return compras;

}

Fuentes:

http://www.datanucleus.org/products/datanucleus/jdo/pmf_named.html
http://stackoverflow.com/questions/1297473/maven-including-a-meta-inf-folder-in-the-classes-folder

 

Normalmente cuando quieres utilizar el texto que se muestra al usuario para un parámetro, en vez del valor, utilizas la propiedad params[“parameterName”].displayText en un “dynamic text” en tu reporte. Si intentas hacer esto con un parámetro que permite la selección de múltiples valores, sólo obtendrás un valor nulo o en blanco. La opción es que utilices un script en el método onFetch del DataSet para reemplazar los valores del parámetro con los valores del campo que utilizas para mostrarlo al usuario.

Necesitas declarar una variable en el método “initialize” del reporte que contendrá las claves de los valores seleccionados, separados por una coma.

parameterSelectedValues=params["parameterName"].value.join(",");

 

después reemplazamos las claves en el método “onFetch” del DataSet

if(parameterSelectedValues.indexOf(row["id"].toString()) != null){
&nbsp; &nbsp; parameterSelectedValues=parameterSelectedValues.replace(row["id"].toString(),row["name"].toString());
}&nbsp;

 

y finalmente colocar un DynamicText en tu reporte con el valor

parameterSelectedValues;

 

El ejemplo completo lo encuentras aquí.

 

En un proyecto me solicitaron que realizará una “búsqueda universal” sobre un conjunto de registros, es decir, ingresar algunas palabras y que el sistema encuentre los que coincidan en cualquiera de sus campos (solo los de tipo texto obviamente). Bueno, pues encontré dos problemas: comparar múltiples columnas y los acentos y la capitalización.

El primer problema lo resolvemos con sentencias “OR”
Ejemplo:

SELECT *
FROM TCORRESPONDENCIAS
WHERE
  SEMITIDO LIKE ‘%CONSEJO%’
  OR SDIRIGIDOA LIKE ‘%CONSEJO%’
  OR SCOMENTARIOS LIKE ‘%CONSEJO%’;

El segundo problema lo resolvemos alterando las preferencias de la sesión -está dura el tiempo que tengamos abierta la conexión-. Cuando ejecutamos sentencias SQL desde nuestros programas es recomendable cerrar la conexión inmediatamente después (aunque la mayoría de librerías implementa un “pool” de conexiones y esto no suceda en realidad), entonces tendríamos que modificar la sesión cada vez que ejecutemos la consulta.
Para que las comparaciones de cadena se hagan sin tomar en cuenta los acentos o la capitalización, ejecuta primero los siguientes comandos:

ALTER SESSION SET NLS_COMP=ANSI;
ALTER SESSION SET NLS_SORT=GENERIC_BASELETTER;

Luego realiza tu búsqueda normalmente. Ejemplos:

SELECT *
FROM TCORRESPONDENCIAS
WHERE
  SEMITIDO LIKE ‘%direccion%’;

SELECT *
FROM TCORRESPONDENCIAS
WHERE
  SEMITIDO LIKE ‘%Dirección%’;

SELECT *
FROM TCORRESPONDENCIAS
WHERE
  SEMITIDO LIKE ‘%DIRECCIÓN%’;

estas 3 consultas devolverán los mismos registros.

Un tercer problema sería buscar varias palabras. Aquí depende si quieres que los resultados contengan todas las palabras (AND) o sólo alguna de ellas (OR), podemos utilizar la función REGEXP_LIKE en vez de LIKE para que nos quede en una sola línea

EJEMPLO “OR” (alguna palabra en algun campo)

SELECT *
FROM TCORRESPONDENCIAS
WHERE
  REGEXP_LIKE(SDIRIGIDOA, ‘.*CONSEJO.*|.*JUDICATURA.*’)
  OR REGEXP_LIKE(SCOMENTARIOS, ‘.*CONSEJO.*|.*JUDICATURA.*’);

EJEMPLO “AND” (todas las palabras en algun campo)

SELECT *
FROM TCORRESPONDENCIAS
WHERE
  (REGEXP_LIKE(SDIRIGIDOA, ‘.*CONSEJO.*’)
  AND REGEXP_LIKE(SDIRIGIDOA, ‘.*JUDICATURA.*’))
  OR
  (REGEXP_LIKE(SCOMENTARIOS, ‘.*CONSEJO.*’)
  AND REGEXP_LIKE(SCOMENTARIOS, ‘.*JUDICATURA.*’));

Fuentes:
http://oracle.ittoolbox.com/
http://www.orasite.com/tutoriales/