public String getSelectStatement() throws ExcepcionAplicacion {
   check();
   String alias;
   TipoAgregacionBase agregacion;
   TipoAgregacionEnumeration tipoAgregacion;
   VistaFuncionColBase grupo;
   boolean orden;
   ArrayList<String> detalle = new ArrayList<>();
   ArrayList<String> resumen = new ArrayList<>();
   ArrayList<String> grafico = new ArrayList<>();
   ArrayList<String> groupBy = new ArrayList<>();
   ArrayList<String> orderBy = new ArrayList<>();
   for (VistaFuncionColBase vistaFuncionCol : _columnas) {
     alias = vistaFuncionCol.getAlias();
     agregacion = vistaFuncionCol.getAgregacion();
     tipoAgregacion =
         agregacion == null ? null : TipoAgregacionEnumeration.valueOf(agregacion.getNumero());
     grupo = check(vistaFuncionCol.getGrupo());
     orden = BitUtils.valueOf(vistaFuncionCol.getOrden());
     // <editor-fold defaultstate="collapsed">
     //          if (_columnasOcultas.contains(vistaFuncionCol)) {
     //              addDetalle(detalle, alias, false);
     //              addResumen(resumen, alias, tipoAgregacion, grupo, false);
     //              addGrafico(grafico, alias, tipoAgregacion, grupo, false);
     //              continue;
     //          }
     // </editor-fold>
     addDetalle(detalle, alias, true);
     addResumen(resumen, alias, tipoAgregacion, grupo, true);
     addGrafico(grafico, alias, tipoAgregacion, grupo, true);
     addGroupBy(groupBy, alias, tipoAgregacion, grupo);
     addOrderBy(orderBy, alias, orden);
   }
   switch (_tipo) {
     case DETALLE:
       return select(false, detalle, _from, _where, null, orderBy);
     case RESUMEN:
       if (EnumFormatoGuardar.ARCHIVO.equals(_formato)) {
         return select(false, resumen, _from, _where, groupBy, groupBy);
       } else {
         return select(false, detalle, _from, _where, null, orderBy);
       }
     case GRAFICO:
       if (grafico.isEmpty()) {
         grafico.add("1");
         return select(false, grafico, _from, _where, null, grafico);
       } else {
         return select(true, grafico, _from, _where, null, grafico);
       }
     default:
       return null;
   }
 }
 private void init() throws ExcepcionAplicacion {
   _vista = EJBL.getVistaFuncionFacade().find(_id, true);
   if (_vista == null) {
     throw new ExcepcionAplicacion(Bitacora.getTextoMensaje(CBM.VISTA_NO_DISPONIBLE, _nombre));
   }
   _nombre = _vista.getNombre();
   _from = from(_select);
   if (StringUtils.isBlank(_from)) {
     // vista "{0}" no tiene origen
     throw new ExcepcionAplicacion(
         Bitacora.getTextoMensaje(CBM.ERROR_COMANDO_SELECT_VISTA_1, _nombre));
   }
   _where = where(_select);
   _columnas = new ArrayList<>(_vista.getVistaFuncionColByVistaCollection());
   _columnasOcultas = new ArrayList<>();
   _grupos = new ArrayList<>();
   _agregaciones = new ArrayList<>();
   VistaFuncionColPorSecuencia c1 = new VistaFuncionColPorSecuencia();
   VistaFuncionColPorId c2 = new VistaFuncionColPorId();
   Comparator<VistaFuncionColBase> comparator =
       (Comparator<VistaFuncionColBase>) ComparatorUtils.chainedComparator(c1, c2);
   Collections.sort((List<VistaFuncionColBase>) _columnas, comparator);
   boolean parametrosRestringidos =
       TLC.getControlador().esFuncionConParametrosRestringidos(_vista.getFuncion().getIdFuncion());
   String codigoDominio = _vista.getFuncion().getIdDominio().getCodigoDominio();
   TipoAgregacionBase agregacion;
   TipoAgregacionEnumeration tipoAgregacion;
   VistaFuncionColBase grupo;
   String alias;
   String propertyColumn;
   Long propertySelect;
   boolean parametroAutorizado;
   for (VistaFuncionColBase vistaFuncionCol : _columnas) {
     agregacion = vistaFuncionCol.getAgregacion();
     tipoAgregacion =
         agregacion == null ? null : TipoAgregacionEnumeration.valueOf(agregacion.getNumero());
     grupo = vistaFuncionCol.getGrupo();
     alias = vistaFuncionCol.getAlias();
     if (parametrosRestringidos) {
       propertyColumn = BaseBundle.getPropertyColumn(codigoDominio, alias);
       propertySelect = BaseBundle.getPropertySelect(codigoDominio, alias);
       parametroAutorizado =
           propertyColumn == null
               || propertySelect == null
               || TLC.getControlador().esParametroAutorizado(propertyColumn, propertySelect);
     } else {
       parametroAutorizado = true;
     }
     if (parametroAutorizado) {
       if (tipoAgregacion != null) {
         if (TipoAgregacionEnumeration.GRUPO.equals(tipoAgregacion)) {
           if (grupo != null && vistaFuncionCol.getId().equals(grupo.getId())) {
             _grupos.add(vistaFuncionCol);
             _ultimo = vistaFuncionCol;
           }
         } else {
           _agregaciones.add(vistaFuncionCol);
         }
       }
       _orden |= BitUtils.valueOf(vistaFuncionCol.getOrden());
     } else {
       _columnasOcultas.add(vistaFuncionCol);
     }
   }
   if (_columnasOcultas.isEmpty()) {
     if (_columnas.isEmpty()) {
       // vista "{0}" no tiene columnas
       throw new ExcepcionAplicacion(
           Bitacora.getTextoMensaje(CBM.ERROR_COMANDO_SELECT_VISTA_2, _nombre));
     }
     switch (_tipo) {
       case DETALLE:
         if (_grupos.isEmpty()) {
         } else if (_agregaciones.isEmpty()) {
           // vista "{0}" no tiene agregaciones
           throw new ExcepcionAplicacion(
               Bitacora.getTextoMensaje(CBM.ERROR_COMANDO_SELECT_VISTA_4, _nombre));
         }
         break;
       case GRAFICO:
         if (_grupos.isEmpty()) {
           // vista "{0}" no tiene grupos
           throw new ExcepcionAplicacion(
               Bitacora.getTextoMensaje(CBM.ERROR_COMANDO_SELECT_VISTA_3, _nombre));
         }
         if (_agregaciones.isEmpty()) {
           // vista "{0}" no tiene agregaciones
           throw new ExcepcionAplicacion(
               Bitacora.getTextoMensaje(CBM.ERROR_COMANDO_SELECT_VISTA_4, _nombre));
         }
         agregacion = null;
         for (VistaFuncionColBase vistaFuncionCol : _agregaciones) {
           if (BitUtils.valueOf(vistaFuncionCol.getGraficable())) {
             continue;
           }
           agregacion = vistaFuncionCol.getAgregacion();
           tipoAgregacion = TipoAgregacionEnumeration.valueOf(agregacion.getNumero());
           TLC.getBitacora()
               .error(
                   CBM.COLUMNA_NO_GRAFICABLE,
                   vistaFuncionCol.getNombre(),
                   tipoAgregacion.getLabel());
         }
         if (agregacion != null) {
           throw new ExcepcionAplicacion(
               Bitacora.getTextoMensaje(CBM.VISTA_NO_GRAFICABLE, _nombre));
         }
         break;
       case RESUMEN:
         if (_agregaciones.isEmpty()) {
           // vista "{0}" no tiene agregaciones
           throw new ExcepcionAplicacion(
               Bitacora.getTextoMensaje(CBM.ERROR_COMANDO_SELECT_VISTA_4, _nombre));
         }
         break;
     }
   } else {
     for (VistaFuncionColBase vistaFuncionCol : _columnasOcultas) {
       TLC.getBitacora().error(CBM.COLUMNA_NO_AUTORIZADA, vistaFuncionCol.getNombre());
     }
     throw new ExcepcionAplicacion(Bitacora.getTextoMensaje(CBM.VISTA_NO_AUTORIZADA, _nombre));
   }
   if (_orden) {
   } else {
     // vista "{0}" no tiene orden
     TLC.getBitacora().warn(CBM.ERROR_COMANDO_SELECT_VISTA_5, _nombre);
   }
   _vistaValida = true;
 }
 private String agg(String alias, boolean visible, TipoAgregacionEnumeration tipo) {
   String funcion = TLC.getInterpreteSql().getNombreFuncionAgregacion(tipo);
   String prefijo = StrUtils.getIdentificadorSqlLowerCase(tipo.getLabel());
   String value = visible ? funcion + "(" + alias + ")" : "NULL";
   return value + " AS " + prefijo + "__" + alias;
 }