gt:         addCampoGroup(new JSelectCampo(psTabla, psNombre));
context: package ListDatos;
  
  import utiles.*;
  import java.io.*;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  
  /**
   * Objeto base para crear una select independiente de la base de datos
   */
  public final class JSelect implements java.io.Serializable, ISelectEjecutarSelect, Cloneable {
  
      private static final long serialVersionUID = 33333315L;
      /**
       *Constante indica todos los campos de la tabla
       */
      public static final String mcsTodosCampos = "*";
      /**
       *Constante Indica el tipo de Campos de la select sin modicicador (sin disticnt)
       */
      public static final int mclCamposNada = 0;
      /**
       *Constante Indica el tipo de Campos de la select sin repetidos
       */
      public static final int mclCamposDistinct = 1;
  
      //Lista de campos
      private final JListaElementos moCampos = new JListaElementos();
      //tipo de los campos
      private int mlCamposTipo = mclCamposNada;
      //where
      private JListDatosFiltroConj moFiltro = null;
      //form
      private JSelectFrom moTablas = null;
      //Lista de campos de group
      private JListaElementos moGroup = new JListaElementos();
      //Lista de campos del order
      private JListaElementos moOrder = new JListaElementos();
      //indica si es comprimido o no
      private boolean mbComprimido = false;
      /**select a pelo, si esta establecida se ejecuta esta, procurar no usar*/
      public String msSelectAPelo = null;
      /**
       *Permisos
       */
      private String msUsuario = null;
       /**
       *PassWord
       */
      private String msPassWord = null;
      /**
       *Permisos
       */
      private String msPermisos = null;
  
      private IListaElementos<Serializable> moMETAINFORMACION=null;
  
      /**
       * Constructor
       */
      public JSelect() {
          super();
          setTabla(null);
      }
  
      /**
       * Constructor
       * @param psTabla tabla inicial de la select
       */
      public JSelect(final String psTabla) {
          super();
          setTabla(psTabla);
      }
  
      /**
       * Constructor
       * @param psTabla tabla inicial de la select
       * @param psTablaAlias Alias de la tabla inicial de la select
       */
      public JSelect(final String psTabla, final String psTablaAlias) {
          super();
          setTabla(psTabla, psTablaAlias);
      }
  
      /**
       * anade un campo a la select
       * @param psNombre nombre del campo
       */
      public void addCampo(final String psNombre) {
          moCampos.add(new JSelectCampo(psNombre));
      }
  
      /**
       * anade un campo a la select
       * @param psTabla nombre tabla
       * @param psNombre nombre del campo
       */
      public void addCampo(final String psTabla, final String psNombre) {
          moCampos.add(new JSelectCampo(psTabla, psNombre));
      }
  
      /**
       * anade un campo a la select
       * @param plFuncion funcion
       * @param psTabla nombre tabla
       * @param psNombre nombre campo
       */
      public void addCampo(final int plFuncion, final String psTabla, final String psNombre) {
          moCampos.add(new JSelectCampo(plFuncion, psTabla, psNombre));
      }
  
      /**
       * anade un campo a la select
       * @param poCampo campo a anadir
       */
      public void addCampo(final JSelectCampo poCampo) {
          moCampos.add(poCampo);
      }
  
      /**
       * devuelve el campo de la select
       * @return objeto campo
       * @param i indice del campo
       */
      public JSelectCampo getCampo(final int i) {
          return (JSelectCampo) moCampos.get(i);
      }
  
      public IListaElementos getCampos() {
          return moCampos;
      }
  
      /**
       * numero de campos
       * @return numero de campos
       */
      public int getCountCampos() {
          return moCampos.size();
      }
  
      /**borramos todos los campo*/
      public void removeAllCampos() {
          moCampos.clear();
      }
  
      /**
       * tipo(Distinct,...) inicial de los campos de la select
       * @param plTipo establece una propiedad de los campos de la select(por ejemplo mclCamposDistinct)
       */
      public void setCamposTipo(final int plTipo) {
          mlCamposTipo = plTipo;
      }
  
  
      /**Devuelve si un campo esta en la lista de ordenacion*/
      public boolean isCampoOrdenado(String psTabla, String psCampo){
          boolean lbResult = false;
          for(int i = 0 ; i < moOrder.size() && !lbResult; i++){
              JSelectCampo loCampo = (JSelectCampo) moOrder.get(i);
              if(loCampo.getTabla().equalsIgnoreCase(psTabla) &&
                 loCampo.getNombre().equalsIgnoreCase(psCampo)){
                  lbResult = true;
              }
          }
          return lbResult;    
      }
  
      /**
       *
       * @return Devuelve si hay agrupacion
       */
      public boolean isAgrupado(){
          return getCamposGroup().size()>0;
      }
      /**
       *
       * @param Establece si es agrupado
       */
      public void setAgrupado(boolean pbAgrupado){
          getCamposGroup().clear();
          if(pbAgrupado){
              for(int i = 0 ; i < moCampos.size(); i++){
                  JSelectCampo loCampo = (JSelectCampo) moCampos.get(i);
                  if(loCampo.getFuncion() == loCampo.mclFuncionNada){
                      addCampoGroup(loCampo.getTabla(), loCampo.getNombre());
                  }
              }
          }
      }
  
      /**
       * devuevle el objeto form de la select
       * @return el objeto from
       */
      public JSelectFrom getFrom() {
          return moTablas;
      }
  
      /**
       * establece la tabla inicial
       * @param psTabla tabla inicial
       */
      public void setTabla(final String psTabla) {
          moTablas = new JSelectFrom(psTabla);
      }
  
      /**
       * establece la tabla inicial
       * @param psTabla tabla inicial
       */
      public void setTabla(final String psTabla,final String psTablaAlias) {
          moTablas = new JSelectFrom(psTabla, psTablaAlias);
      }
  
      /**
       * anade un campo del group by a la select
       * @param psNombre nombre del campo
       */
      public void addCampoGroup(final String psNombre) {
          addCampoGroup(new JSelectCampo(psNombre));
      }
  
      /**
       * anade un campo del group by a la select
       * @param psTabla  nombre del tabla
       * @param psNombre  nombre del campo
       */
      public void addCampoGroup(final String psTabla, final String psNombre) {
          addCampoGroup(new JSelectCampo(psTabla, psNombre));
      }
  
      /**
       * anade un campo del group by a la select y el campo del select simultaneamente
       * @param psTabla  nombre del tabla
       * @param psNombre  nombre del campo
       */
      public void addCampoGroupYCampo(final String psTabla, final String psNombre) {
  