package q02b.exe.comun;



import java.math.BigDecimal;

import java.util.ArrayList;

import java.util.Date;

import java.util.Vector;



import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.jsp.PageContext;



import org.apache.commons.beanutils.BasicDynaBean;



import q02b.exe.arquitectura.beans.Q02bBaseBean;

import q02b.exe.arquitectura.dataobjects.Q02bDAOException;

import q02b.exe.arquitectura.webCommon.beans.Q02bProcessLauncherBean;

import q02b.exe.arquitectura.webCommon.utils.gdtp.Q02bGenericDataTransferProtocol;

import q02b.exe.cuestionariosSMAnu.beans.Q02bCuestionariosSMBean;

import q02b.exe.cuestionariosVTMAnu.beans.Q02bCuestionariosVTMAnuBean;

import q02b.exe.cuestionarioVAPM.beans.Q02bCuestionarioVAPMBean;



import q02b.exe.utils.Q02bFormatData;

import q02b.exe.utils.Q02bNILocator;

import q02b.exe.utils.Q02bCODLocator;



import es.ejie.frmk.conectores.conectorJDBC.Q70ConectorJDBC;

import es.ejie.frmk.infraestructura.tablas.Q70GestorTablasCodigos;

import es.ejie.frmk.infraestructura.traza.Q70TraceLevel;

import es.ejie.frmk.infraestructura.traza.Q70Traza;

import es.ejie.frmk.listeners.base.Q70ListenerUtils;



public class Q02bCoddataLauncher extends Q02bBaseBean implements Q02bProcessLauncherBean {

	

	private static final long serialVersionUID = 1L;

	/** Objeto tablaBD usado para buscar en base de datos */

	//protected TablaBDWWHISPLA tablaHISPLA=null;

	private String S99B_JNDI_DATASOURCE = Q70ListenerUtils.getApplicationProperty("CoddataLauncher",null,"S99_JNDI_DATASOURCE");

	private static Q70Traza tr = Q70Traza.getSingleton();

	private static final String COMPONENTE = "DAO_CODDATA_ACCESO_DATOS";

	/**

     *  Constructor vacío

     */



	 /* (non-Javadoc)

     * @see com.bbk.arquitectura.webCommon.beans.ProcessLauncherBean#initProcessLauncherBean(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)

     */

    public void initProcessLauncherBean(HttpServletRequest request, HttpServletResponse response) throws Q02bDAOException {

		init(request,response);



    }



	/* (non-Javadoc)

     * @see com.bbk.arquitectura.webCommon.beans.ProcessLauncherBean#initProcessLauncherBean(javax.servlet.jsp.PageContext)

     */

    public void initProcessLauncherBean(PageContext context) throws Q02bDAOException {

    	this.request 	= (HttpServletRequest)context.getRequest();

    	this.response 	=(HttpServletResponse)context.getResponse();

    }



	 public Q02bGenericDataTransferProtocol launch() throws Exception {

    	try{	       

			if (tr.isTraceActive()){

				tr.trace(COMPONENTE, Q70TraceLevel.INFO, this.getClass().getName() + ":launch: entrando");

			}

            String proceso = getParametro("METHOD");



            if ( proceso.equals("getComboData")){

	            return this.getComboData();

	        } else if (proceso.equals("getComboDataJS")){

	        	return this.getComboDataJS();

	        } else if (proceso.equals("getListaVariasColumnas")){

	        	return this.getListaVariasColumnas();

	        } else if (proceso.equals("getNI")){

	        	return this.getNI();

	        }else if (proceso.equals("getCOD")){

	        	return this.getCOD();

	        }

	        else if (proceso.equals("getNumCuestionariosPortada")){

	        	return this.getNumCuestionariosPortada();

	        }else if (proceso.equals("getNumCuestionariosPortadaSM")){

	        	return this.getNumCuestionariosPortadaSM();

	        }

            return null;

    	}catch(Exception e){

			return this.processException(e);

        }

     }

       

    /**

	 * Se invoca para obtener los valores de un combo de manera asíncrona desde una etiqueta

	 * 

	 * @return Q02bGenericDataTransferProtocol

	 */

    public Q02bGenericDataTransferProtocol getComboData() throws Exception {

    	//Se declaran las variables que no se van a modificar

    	final String TRACE_NAME	= ":getComboData:";

    	final String RESULT_1 	= "RESULT_1";

    	//Conexión a base de datos

    	java.sql.Connection conn = null;

    	

    	if (tr.isTraceActive()){

			tr.trace(COMPONENTE, Q70TraceLevel.INFO, this.getClass().getName() + TRACE_NAME + " entrando");

		}

    	//Resultado que se devolverá

    	Q02bGenericDataTransferProtocol result = new Q02bGenericDataTransferProtocol(); 

    	//Objetos necesarios para lanzar la query

    	java.sql.PreparedStatement 	prepStmt = null;

        java.sql.ResultSet 			rs 		 = null;

        //Se almacena la query

        StringBuffer 				querySelect = new StringBuffer("");

        StringBuffer 				queryFrom 	= new StringBuffer("");

        StringBuffer 				queryWhere	= new StringBuffer("");

        StringBuffer 				query		= new StringBuffer("");

        try{ 

        	 //Se obtiene la conexión a la base de datos

        	 conn = Q70ConectorJDBC.getSingleton().getConnection(S99B_JNDI_DATASOURCE);

			 //Se obtiene el nombre de la tabla, el nombre de la columna que contiene los valores

        	 //de los códigos y el nombre de las columnas que contienen las descripciones que se 

        	 //quieren visualizar

 			 String tableNameSelect 	= (String)getMapaDatos().get("TABLE");

 			 String codColumNameSelect	= (String)getMapaDatos().get("COD_COLUM_NAME_SELECT");

 			 String descColumNameSelect = (String)getMapaDatos().get("DESC_COLUM_NAME_SELECT");

 			 //Se obtiene el elemento separador si lo hubiera

 			 String elementoSeparador   = (String)getMapaDatos().get("SEPARADOR");

 			 //Se obtiene el nombre de la columna por la que se quiere hacer la where y su valor

 			 String codColumNameWhere	= (String)getMapaDatos().get("COD_COLUM_NAME_WHERE");

 			 String valueColumWhere  	= (String)getMapaDatos().get("VALUE_COLUM_NAME_WHERE");

 			 Boolean numericColumWhere	= Boolean.valueOf((String)getMapaDatos().get("NUMERIC_COLUM_WHERE"));

 			 String valueOptionalWhere  = (String)getMapaDatos().get("VALUE_OPTIONAL_WHERE");

 			 //Se obtiene el order by

 			 String columNameOrderBy	= (String)getMapaDatos().get("COLUM_ORDER_BY");

 			 //Se obtiene el orden del order by

 			 String ordenNameOrderBy	= (String)getMapaDatos().get("ORDEN_ORDER_BY");

 			 

 			 //Se elabora la parte SELECT

        	 querySelect.append("SELECT ").append(codColumNameSelect).append(",");

        	 //Se comprueba si se ha introducido varias columnas de descripción a recuperar

        	 if(descColumNameSelect.indexOf(",")>0){

        		 //Se obtienen las demás columnas

        		 String[] columnas = descColumNameSelect.split(",");

        		 //Se recorren y se pegan

        		 for(int i=0;i<columnas.length;i++){

        			 querySelect.append(columnas[i]);

        			 //Si no es el último, se pega la coma

        			 if(i!=(columnas.length-1)){

        				 querySelect.append(", ");

        			 }

        		 }

        	 } else {

        		 querySelect.append(descColumNameSelect);

        	 }

        	 //Se elabora la parte FROM

        	 queryFrom.append(" FROM ").append(tableNameSelect);

        	 //Se elabora la parte WHERE

			 queryWhere.append(" WHERE ").append(codColumNameWhere).append(" = ");			 	

			 //Si es numérico se busca de este manera

			 if(numericColumWhere.booleanValue()){

				 queryWhere.append(valueColumWhere);

			 } else {

				 queryWhere.append("'").append(valueColumWhere).append("'");

			 }

			 //Si existen claúsulas opcionales WHERE se añaden

			 if(!Q02bFormatData.esVacio(valueOptionalWhere)){

				 queryWhere.append(" AND ").append(valueOptionalWhere);

			 }

			 //Si existe el order by se le pega

			 if(!Q02bFormatData.esVacio(columNameOrderBy)){

				 queryWhere.append(" ORDER BY ").append(columNameOrderBy);

			 }

			 //Se indica si el orden es ascendente y descendente

			 if(!Q02bFormatData.esVacio(columNameOrderBy) && !Q02bFormatData.esVacio(ordenNameOrderBy)){

				 queryWhere.append(" ").append(ordenNameOrderBy);

			 }

			 

			 //Se genera la select completa

			 query = query.append(querySelect.toString()).append(queryFrom.toString()).append(queryWhere.toString());

			  			 

			 //Se realiza un prepareStatement para lanzar la query

        	 prepStmt 	= conn.prepareStatement(query.toString());

        	 rs 		= prepStmt.executeQuery(); 

			 

        	 //Se añade un grupo al result

			 result.addGroup(RESULT_1);

			 result.addProperty(RESULT_1,"RESULT","OK");

			 

			 int i = 0;		

        	 while (rs.next()){	

        		 result.addProperty(RESULT_1,"CODIGO_"+i,rs.getString(codColumNameSelect));

        		 if(descColumNameSelect.indexOf(",")>0){

            		 //Se obtienen las demás columnas

            		 String[] 	columnas 		 = descColumNameSelect.split(",");

            		 //Variable para obtener la descripción total

            		 StringBuffer 	descripcionTotal = new StringBuffer();

            		 //Se comprueba si no existe elemento separador

            		 if(Q02bFormatData.esVacio(elementoSeparador)){

            			 elementoSeparador = " ";

            		 }

            		 //Se recorren las columnas para obtener la descripción

            		 for(int j=0;j<columnas.length;j++){

            			 descripcionTotal.append(rs.getString(columnas[j]));

            			 //Si no es el último, se pega el separador

            			 if(j!=(columnas.length-1)){

            				 descripcionTotal.append(elementoSeparador);

            			 }

            		 }

            		 result.addProperty(RESULT_1,"DESCRIPCION_"+i,descripcionTotal.toString());

        		 } else {

            		 result.addProperty(RESULT_1,"DESCRIPCION_"+i,rs.getString(descColumNameSelect));

        		 }

        		 i++;

        	 }			

			 result.addProperty(RESULT_1,"NUMREGISTROS",String.valueOf(i));

        	 return result;      

        	 

       }catch(Exception ex){

    	    result.addProperty("RESULT_1","RESULT","NOOK");

            java.io.StringWriter sw = new java.io.StringWriter();

            java.io.PrintWriter pw = new java.io.PrintWriter(sw);

            ex.printStackTrace(pw);

            tr.trace(COMPONENTE, Q70TraceLevel.ERROR, this.getClass().getName() + TRACE_NAME + sw.getBuffer ().toString());

            throw new Q02bDAOException(ex);

       }finally{

    	   try{

    		   rs.close();

    		   prepStmt.close();

    		   conn.close();

    	   }catch(Exception ex){}

    	   if (tr.isTraceActive()){

    		    tr.trace(COMPONENTE, Q70TraceLevel.INFO, this.getClass().getName() + TRACE_NAME + " saliendo");                

           }          

       }

    }

       

       /**

   	 	* Se invoca para obtener los valores de un combo de manera asíncrona desde una

   	 	* función JavaScript

   	 	* 

   	 	* @return Q02bGenericDataTransferProtocol

   	 	*/

       public Q02bGenericDataTransferProtocol getComboDataJS() throws Exception {

       		//Se declaran las variables que no se van a modificar

       		final String TRACE_NAME	= ":getComboDataJS:";

       		final String RESULT_1 	= "RESULT_1";

       		final String TRUE	 	= "true";

       		

        	if (tr.isTraceActive()){

    			tr.trace(COMPONENTE, Q70TraceLevel.INFO, this.getClass().getName() + TRACE_NAME + " entrando");

    		}

        	//Variables necesarias

        	Vector v = new Vector();

        	//Resultado que se devolverá

        	Q02bGenericDataTransferProtocol result = new Q02bGenericDataTransferProtocol();         

        	try{

   			 	//Se obtiene el nombre de la tabla, el nombre de la columna que contiene los valores

           	 	//de los códigos y el nombre de las columnas que contienen las descripciones que se 

           	 	//quieren visualizar

    			 String tableNameSelect 	= (String)getMapaDatos().get("TABLE");

    			 String codColumNameSelect	= (String)getMapaDatos().get("COD_COLUM_NAME_SELECT");

    			 String descColumNameSelect = (String)getMapaDatos().get("DESC_COLUM_NAME_SELECT");

    			 String optionalWhere	    = (String)getMapaDatos().get("OPTIONAL_WHERE");

    			 String idioma 		 		= (String)getMapaDatos().get("IDIOMA");

    			 String distinct 		 	= (String)getMapaDatos().get("DISTINCT");

    			 String columOrder 		 	= (String)getMapaDatos().get("COLUM_ORDER");

    			 String sentidoOrder 		= (String)getMapaDatos().get("SENTIDO_ORDER");

    			 //Se asignan al vector las columnas recuperadas

    			 v.add(descColumNameSelect);

    			 v.add(codColumNameSelect);

    			 //Se comprueba si se ha introducido una optionalWhere

    			 if(Q02bFormatData.esVacio(optionalWhere)){

    				 optionalWhere = null;

    			 }

    			 if(!Q02bFormatData.esVacio(columOrder)){

    				 optionalWhere = ((optionalWhere== null)?" 1=1 ":optionalWhere) +" ORDER BY "+ columOrder +" "+sentidoOrder ;

    			 }

    			 

            	 //Se añade un grupo al result

    			 result.addGroup(RESULT_1);

    			 result.addProperty(RESULT_1,"RESULT","OK");

            	 //Se obtiene el ArrayList con los datos

    			 ArrayList lista = Q70GestorTablasCodigos.getSingleton().selectRecordsFromTable(tableNameSelect,optionalWhere,idioma,v);

    			 //Si se ha seleccionado la opción distinct, entramos para modificar la lista obtenida de la base de datos

    			 if (TRUE.equals(distinct)){

			          //Se redefine la lista con los resultados

			          lista = this.obtenerListaDistinct(lista,codColumNameSelect);			           

 	             }

    			 //Se recorren los objetos devueltos

    			 for (int i=0; i < lista.size();i++){

    				 String codigo 	= null;

    				 //se trata el código teniendo en cueta que puede ser de diversos tipos de datos

    			 if ((((BasicDynaBean) lista.get(i)).get(codColumNameSelect)) instanceof String) {    				

    				codigo 		= (((BasicDynaBean)lista.get(i)).get(codColumNameSelect)).toString();

					}else if((((BasicDynaBean) lista.get(i)).get(codColumNameSelect)) instanceof BigDecimal)

					{	

    				 codigo 		= ((BigDecimal)((BasicDynaBean)lista.get(i)).get(codColumNameSelect)).toString();

					}else

					{

						codigo 		= ((Integer)((BasicDynaBean)lista.get(i)).get(codColumNameSelect)).toString();

					}

    			 

    			 	String descripcion = null;

    			 	//Se trata la desc teniendo en cueta que puede ser de diversos tipos de datos

    			 	if(((BasicDynaBean)lista.get(i)).get(descColumNameSelect)instanceof String )

    			 	{	

    				descripcion 	= (String)((BasicDynaBean)lista.get(i)).get(descColumNameSelect);

    			 	}

    			 	else if(((BasicDynaBean)lista.get(i)).get(descColumNameSelect)instanceof BigDecimal)

    			 	{

    			 		descripcion = ((BigDecimal)((BasicDynaBean)lista.get(i)).get(descColumNameSelect)).toString();

    			 	}else

    			 	{

    			 		descripcion = ((Integer)((BasicDynaBean)lista.get(i)).get(descColumNameSelect)).toString();

    			 	}

    				result.addProperty(RESULT_1,"CODIGO_"+i,codigo);

    				result.addProperty(RESULT_1,"DESCRIPCION_"+i,descripcion);

    			 }

    			 //Se indica el número de registros generados

    			 result.addProperty(RESULT_1,"NUMREGISTROS",String.valueOf(lista.size()));

    			 //Se devuelve el resultado

    			 return result;   	

            }catch(Exception ex){

            	result.addProperty("RESULT_1","RESULT","NOOK");

                java.io.StringWriter sw = new java.io.StringWriter();

                java.io.PrintWriter pw = new java.io.PrintWriter(sw);

                ex.printStackTrace(pw);

                tr.trace(COMPONENTE, Q70TraceLevel.ERROR, this.getClass().getName() + TRACE_NAME + sw.getBuffer ().toString());

                throw new Q02bDAOException(ex);

           }

       }

       

       

      

      /**

	 	* Función que devuelve aquellos roles que no tienen ninguna restricción. De este modo y, comparando con los roles del usuario del sistema,

	 	* podemos conocer a qué objetos (seccion, temas, etc...) tiene acceso.

	 	* 

	 	* @param tableRoles 		- Tabla que contiene los roles del sistema

	 	* @param codColumTableRoles - Columna del número interno del rol

	 	* @param tableRolesObjeto   - Tabla que relaciona el rol con el objeto concreto e.j. relación rol-sección, rol-tema etc...

	 	* 

	 	* @return ArrayList

	 	*/
/*
      private ArrayList obtenerRolesSinRestricciones(String tableRoles,String codColumTableRoles,String tableRolesObjeto) throws Exception

      {

      		//Se declaran las variables que no se van a modificar

      		final String TRACE_NAME	= ":obtenerRolesSinRestricciones:";

      		//Se instancia el ArrayList

      		ArrayList array = new ArrayList();

      		//Conexión a base de datos

      		java.sql.Connection 		conn 	 = null;

        	//Objetos necesarios para lanzar la query

        	java.sql.PreparedStatement 	prepStmt = null;

            java.sql.ResultSet 			rs 		 = null;

            //Se almacena la query

            StringBuffer 				query	 = new StringBuffer("");

            try{

       	 		//Se obtiene la conexión a la base de datos

       	 		conn = Q70ConectorJDBC.getSingleton().getConnection(S99B_JNDI_DATASOURCE);

       	 		//Se construye la query

       	 		query.append("SELECT ").append(codColumTableRoles).append(" FROM ").append(tableRoles);

       	 		query.append(" WHERE ").append(codColumTableRoles).append(" NOT IN (SELECT distinct(");

       	 		query.append(codColumTableRoles).append(") FROM ").append(tableRolesObjeto).append(")");

   				//Se realiza un prepareStatement para lanzar la query

       	 		prepStmt 	= conn.prepareStatement(query.toString());

       	 		rs 			= prepStmt.executeQuery(); 

       	 		//Mientras existan registros

	       	 	while (rs.next()){

	       	 		array.add(rs.getString(codColumTableRoles));

	       	 	}

	       	 	//Se devuelve el array con los roles

	       	 	return array;

            } catch(Exception ex){

                java.io.StringWriter sw = new java.io.StringWriter();

                java.io.PrintWriter pw = new java.io.PrintWriter(sw);

                ex.printStackTrace(pw);

                tr.trace(COMPONENTE, Q70TraceLevel.ERROR, this.getClass().getName() + TRACE_NAME + sw.getBuffer ().toString());

                throw new Q02bDAOException(ex);

           }finally{

        	   try{

        		   rs.close();

        		   prepStmt.close();

        		   conn.close();

        	   }catch(Exception ex){}

        	   if (tr.isTraceActive()){

        		    tr.trace(COMPONENTE, Q70TraceLevel.INFO, this.getClass().getName() + TRACE_NAME + " saliendo");                

               }          

           }

      }

  */    

      /**

	 	* Devuelve un ArrayList con los objetos que no tienen repetido el código

	 	* 

	 	* @param lista 				- Lista con los resultados de la query

	 	* @param codColumNameSelect	- Nombre de la columna

	 	* 

	 	* @return ArrayList

	 	*/

      private ArrayList obtenerListaDistinct(ArrayList lista, String codColumNameSelect)

      {

    	  // Variable donde se guardarán los códigos y de este modo conocer los que ya han salido

          ArrayList codigos 		= new ArrayList();

          //Variable donde se guardarán los componentes de la lista

          ArrayList resultados 	= new ArrayList();

          //Se recorre cada uno de los elementos de la lista

          for (int i=0; i < lista.size();i++){

        	//Código

        	String codigo ="";

          	//Se obtiene el código del elemento

        	Object codColumNameSelectDynaBean = ((BasicDynaBean)lista.get(i)).get(codColumNameSelect);

          	//En función del tipo de datos que se recoge se realiza el parse

        	if(codColumNameSelectDynaBean instanceof Integer){

          		codigo = ((Integer)((BasicDynaBean)lista.get(i)).get(codColumNameSelect)).toString();

          	} else if(codColumNameSelectDynaBean instanceof Long){

          		codigo = ((Long)((BasicDynaBean)lista.get(i)).get(codColumNameSelect)).toString();

          	} else if(codColumNameSelectDynaBean instanceof BigDecimal){

          		codigo = ((BigDecimal)((BasicDynaBean)lista.get(i)).get(codColumNameSelect)).toString();

          	} else if(codColumNameSelectDynaBean instanceof String){

          		codigo = ((BasicDynaBean)lista.get(i)).get(codColumNameSelect).toString();

          	}

          	//Si el arrayList de códigos no tiene el código obtenido quiere decir que es la primera vez que aparece

          	if (!codigos.contains(codigo)){

          		//Se añade a la lista de resultados el objeto

          		resultados.add(lista.get(i));

          		//Se añade a la lista de códigos el código para que no se vuelva a repetir

          		codigos.add(codigo);

          	}

          }

         //Se redefine la lista con los resultados

         lista = resultados;

         //Se devuelve el arrayList

         return lista;

      }

      

      /**

	    * Método que obtiene un número variable de columnas 

	    * @return 

	    * @throws Exception

	    */

	   public Q02bGenericDataTransferProtocol getListaVariasColumnas() throws Exception {

//		 Se declaran las variables que no se van a modificar

     		//final String TRACE_NAME	= "getListaVariasColumnas:";

     		final String RESULT_1 	= "RESULT_1";

     		//final String TRUE	 	= "true";

	    	if (tr.isTraceActive()){

				tr.trace(COMPONENTE, Q70TraceLevel.INFO, this.getClass().getName() + ":getListaVariasColumnas: entrando");

			}

//	    	Variables necesarias

       	Vector v = new Vector();

       	//Resultado que se devolverá

       	Q02bGenericDataTransferProtocol result = new Q02bGenericDataTransferProtocol();         

       	try{

  			 	//Se obtiene el nombre de la tabla, el nombre de la columna que contiene los valores

          	 	//de los códigos y el nombre de las columnas que contienen las descripciones que se 

          	 	//quieren visualizar

   			 String tableNameSelect 		= (String)getMapaDatos().get("TABLE");

  			 String columnasNameSelect		= (String)getMapaDatos().get("LISTA_COLUM_NAME_SELECT");

  			 String optionalWhere  			= (String)getMapaDatos().get("OPTIONAL_WHERE");

   			 String idioma 		 		= (String)getMapaDatos().get("IDIOMA");

   			 

   			if(Q02bFormatData.esVacio(optionalWhere)){

  				 optionalWhere = null;

  			 } 

   			

   			 //Se asignan al vector las columnas recuperadas

   			 String [] arrColumnas = columnasNameSelect.split("#");

   			 for(int i=0;i<arrColumnas.length;i++){

   				 v.add(arrColumnas[i]);

   			 }

           	 //Se añade un grupo al result

   			 result.addGroup(RESULT_1);

   			 result.addProperty(RESULT_1,"RESULT","OK");

   			 //Se crea la where

           	 //Se obtiene el ArrayList con los datos

   			 ArrayList lista = Q70GestorTablasCodigos.getSingleton().selectRecordsFromTable(tableNameSelect,optionalWhere,idioma,v);

 

   			 String listaColumnas = "";

   			 //Se recorren los objetos devueltos

   			 for (int i=0; i < lista.size();i++){

   				 //Se añaden las columnas de los objetos seleccionados

   				 listaColumnas += ((listaColumnas.equals(""))?"":"#");

   				 for (int j=0;j<arrColumnas.length;j++)

   				 {

   					 listaColumnas += ((listaColumnas.equals(""))?"":",");

	   				 String columna 	= null;

	   				 //se trata el código teniendo en cueta que puede ser de diversos tipos de datos

	   				 if ((((BasicDynaBean) lista.get(i)).get(arrColumnas[j])) instanceof Integer) {    				

		   				columna 		= ((Integer)((BasicDynaBean)lista.get(i)).get(arrColumnas[j])).toString();

							}else if((((BasicDynaBean) lista.get(i)).get(arrColumnas[j])) instanceof BigDecimal)

							{	

								columna 		= ((BigDecimal)((BasicDynaBean)lista.get(i)).get(arrColumnas[j])).toString();

							}else if((((BasicDynaBean) lista.get(i)).get(arrColumnas[j])) instanceof Date)

							{	

								columna 		= Q02bFormatData.formatearFecha(((BasicDynaBean)lista.get(i)).get(arrColumnas[j]).toString(),"1",null);

							}else

							{

								columna 		= (((BasicDynaBean)lista.get(i)).get(arrColumnas[j])).toString();

							}

	   				listaColumnas +=columna; 

	   			 }

   			 }

   			 result.addProperty(RESULT_1,"RESULTADO",listaColumnas);

   			 //Se devuelve el resultado

   			 return result;   	

	       }catch(Exception ex){

	    	    result.addProperty("RESULT_1","RESULT","NOOK");

	            java.io.StringWriter sw = new java.io.StringWriter();

	            java.io.PrintWriter pw = new java.io.PrintWriter(sw);

	            ex.printStackTrace(pw);

	            tr.trace(COMPONENTE, Q70TraceLevel.ERROR, this.getClass().getName() + ":getListaVariasColumnas: " + sw.getBuffer ().toString());

	            throw new Q02bDAOException(ex);

	       }finally{

	    	   

	    	   if (tr.isTraceActive()){

	    		    tr.trace(COMPONENTE, Q70TraceLevel.INFO, this.getClass().getName() + ":getListaVariasColumnas: saliendo");                

	           }

	           

	       }

	       

	   }

	   

	   /**

	    * Método que devuelve el ni de un objeto de tabla de tablas a partir de la tabla y el código

	    * @return

	    * @throws Exception

	    */

	   public Q02bGenericDataTransferProtocol getNI() throws Exception {

	    	

	    	if (tr.isTraceActive()){

				tr.trace(COMPONENTE, Q70TraceLevel.INFO, this.getClass().getName() + ":getNI: entrando");

			}

	    	Q02bGenericDataTransferProtocol result = new Q02bGenericDataTransferProtocol(); 

	  

	        try{ 



	            String idTabla = (String)getMapaDatos().get("idTabla");

	            String clave = (String)getMapaDatos().get("clave");

	        	

	        	String niObjeto = Q02bNILocator.getNI(idTabla,clave);

	        	

	        	result.addGroup("RESULT_1"); 			

	 			

	 			result.addProperty("RESULT_1","RESULT","OK");

	 			result.addProperty("RESULT_1","niObjeto", niObjeto);

	           

	 			return result;

	        

	       }catch(Exception ex){

	    	    result.addProperty("RESULT_1","RESULT","NOOK");

	            java.io.StringWriter sw = new java.io.StringWriter();

	            java.io.PrintWriter pw = new java.io.PrintWriter(sw);

	            ex.printStackTrace(pw);

	            tr.trace(COMPONENTE, Q70TraceLevel.ERROR, this.getClass().getName() + ":getNI: " + sw.getBuffer ().toString());

	            throw new Q02bDAOException(ex);

	       }finally{ 

	    	   if (tr.isTraceActive()){

	    		    tr.trace(COMPONENTE, Q70TraceLevel.INFO, this.getClass().getName() + ":getNI: saliendo");                

	           }    

	       } 

	    }

	   

	   /**

	    * Método que devuelve el código de un objeto de tabla de tablas a partir de la tabla y el ni

	    * @return

	    * @throws Exception

	    */

	   public Q02bGenericDataTransferProtocol getCOD() throws Exception {

	    	

	    	if (tr.isTraceActive()){

				tr.trace(COMPONENTE, Q70TraceLevel.INFO, this.getClass().getName() + ":getCod: entrando");

			}

	    	Q02bGenericDataTransferProtocol result = new Q02bGenericDataTransferProtocol(); 

	  

	        try{ 



	            String niObjeto = (String)getMapaDatos().get("niObjeto");



	        	String codObjeto = Q02bCODLocator.getCOD(niObjeto);

	        	

	        	result.addGroup("RESULT_1"); 			

	 			

	 			result.addProperty("RESULT_1","RESULT","OK");

	 			result.addProperty("RESULT_1","codObjeto", codObjeto);

	           

	 			return result;

	        

	       }catch(Exception ex){

	    	    result.addProperty("RESULT_1","RESULT","NOOK");

	            java.io.StringWriter sw = new java.io.StringWriter();

	            java.io.PrintWriter pw = new java.io.PrintWriter(sw);

	            ex.printStackTrace(pw);

	            tr.trace(COMPONENTE, Q70TraceLevel.ERROR, this.getClass().getName() + ":getCod: " + sw.getBuffer ().toString());

	            throw new Q02bDAOException(ex);

	       }finally{ 

	    	   if (tr.isTraceActive()){

	    		    tr.trace(COMPONENTE, Q70TraceLevel.INFO, this.getClass().getName() + ":getCod: saliendo");                

	           }    

	       } 

	    }

	   

	   /**

	    * Método que devuelve el número de cuestionarios realizados de Suelo Municipal 

	    * @return

	    * @throws Exception

	    */

	   public Q02bGenericDataTransferProtocol getNumCuestionariosPortada() throws Exception {

	    	

		   Q02bGenericDataTransferProtocol result = null; 

		   Q02bCuestionariosSMBean beanCuestionarioSMAnu= null;

		   Q02bCuestionariosVTMAnuBean beanCuestionariosVTMAnu = null;

		   Q02bCuestionarioVAPMBean beanCuestionarioVAPM = null;

		   

		   int numCuestionariosSM=0;

	       int numCuestionariosOM=0;

	       int numCuestionariosVA=0;

	       

	       String prevSueloInicial="";

	       String concedidoLicenInicial="";

	       String concedidoLicenVAPM="";

           String niGrupoCuesSMAnu = "";

           String niGrupoCuesVTMAnu = "";

		   if (tr.isTraceActive()){

				tr.trace(COMPONENTE, Q70TraceLevel.INFO, this.getClass().getName() + ":getNumCuestionariosPortada: entrando");

		   }

		   try{ 

	        	String mesReferencia = (String)getMapaDatos().get("mesReferencia");

	            String anyoReferencia = (String)getMapaDatos().get("anyoReferencia");

	            String territorio = (String)getMapaDatos().get("territorio");

	            String municipio = (String)getMapaDatos().get("municipio");

	        	

	            beanCuestionarioSMAnu= new Q02bCuestionariosSMBean();

	            beanCuestionariosVTMAnu = new Q02bCuestionariosVTMAnuBean();

	            beanCuestionarioVAPM = new Q02bCuestionarioVAPMBean();

	            result = new Q02bGenericDataTransferProtocol();

	            

	            numCuestionariosSM = beanCuestionarioSMAnu.getNumCuestionariosPortada(territorio, municipio, anyoReferencia, mesReferencia);

	            numCuestionariosOM = beanCuestionariosVTMAnu.getNumCuestionariosPortada(territorio, municipio, anyoReferencia, mesReferencia);

	            numCuestionariosVA = beanCuestionarioVAPM.getNumCuestionariosPortada(territorio, municipio, anyoReferencia, mesReferencia);

	            

	            prevSueloInicial = beanCuestionarioSMAnu.getPrevisionGrupoCuesSM(territorio, municipio, anyoReferencia, mesReferencia);

	            concedidoLicenInicial = beanCuestionariosVTMAnu.getConcedidoGrupoCuesVTM(territorio, municipio, anyoReferencia, mesReferencia);

	            concedidoLicenVAPM = beanCuestionarioVAPM.getConcedidoLicenGrupoCuesVAPM(territorio, municipio, anyoReferencia, mesReferencia);

	            

	            niGrupoCuesSMAnu = beanCuestionarioSMAnu.getNiGrupoCuesSM(territorio, municipio, anyoReferencia, mesReferencia);

	            niGrupoCuesVTMAnu = beanCuestionariosVTMAnu.getNiGrupoCuesVTM(territorio, municipio, anyoReferencia, mesReferencia);

	            //Se obtiene la conexión a la base de datos

       	 		conn = Q70ConectorJDBC.getSingleton().getConnection(Q02_JNDI_DATASOURCE);

       	 		

	       	 	result.addGroup("RESULT_1"); 			

	 			result.addProperty("RESULT_1","RESULT","OK");

	 			result.addProperty("RESULT_1","numCuestionariosSM", Integer.toString(numCuestionariosSM));

	 			result.addProperty("RESULT_1","numCuestionariosOM", Integer.toString(numCuestionariosOM));

	 			result.addProperty("RESULT_1","numCuestionariosVA", Integer.toString(numCuestionariosVA));

	           	result.addProperty("RESULT_1","prevSueloInicial", prevSueloInicial);

	           	result.addProperty("RESULT_1","concedidoLicenInicial", concedidoLicenInicial);

	           	result.addProperty("RESULT_1","concedidoLicenVAPM", concedidoLicenVAPM);

	        	result.addProperty("RESULT_1","niGrupoCuesSMAnu", niGrupoCuesSMAnu);

	        	result.addProperty("RESULT_1","niGrupoCuesVTMAnu", niGrupoCuesVTMAnu);

       	 		

       	 		if (tr.isTraceActive()){

       	 			tr.trace(COMPONENTE, Q70TraceLevel.INFO, this.getClass().getName() + ":getNumCuestionariosPortada: saliendo");                

       	 		} 

       	 		return result;

	       }catch(Exception ex){

	    	    result.addProperty("RESULT_1","RESULT","NOOK");

	            java.io.StringWriter sw = new java.io.StringWriter();

	            java.io.PrintWriter pw = new java.io.PrintWriter(sw);

	            ex.printStackTrace(pw);

	            tr.trace(COMPONENTE, Q70TraceLevel.ERROR, this.getClass().getName() + ":getNumCuestionariosPortada: " + sw.getBuffer ().toString());

	            throw new Q02bDAOException(ex);

	       }

       } 

  



	   /**

	    * Método que devuelve el número de cuestionarios realizados de Suelo Municipal 

	    * @return

	    * @throws Exception

	    */

	   public Q02bGenericDataTransferProtocol getNumCuestionariosPortadaSM() throws Exception {

	    	

		   Q02bGenericDataTransferProtocol result = null; 

		   Q02bCuestionariosSMBean beanCuestionarioSMAnu= null;

		   

		   int numCuestionariosSM=0;

	       

	       String prevSueloInicial="";

	       String niGrupoCuesSMAnu = "";

           if (tr.isTraceActive()){

				tr.trace(COMPONENTE, Q70TraceLevel.INFO, this.getClass().getName() + ":getNumCuestionariosPortadaSM: entrando");

		   }

		   try{ 

	        	String mesReferencia = (String)getMapaDatos().get("mesReferencia");

	            String anyoReferencia = (String)getMapaDatos().get("anyoReferencia");

	            String territorio = (String)getMapaDatos().get("territorio");

	            String municipio = (String)getMapaDatos().get("municipio");

	        	

	            beanCuestionarioSMAnu= new Q02bCuestionariosSMBean();

	            result = new Q02bGenericDataTransferProtocol();

	            

	            numCuestionariosSM = beanCuestionarioSMAnu.getNumCuestionariosPortada(territorio, municipio, anyoReferencia, mesReferencia);

	            prevSueloInicial = beanCuestionarioSMAnu.getPrevisionGrupoCuesSM(territorio, municipio, anyoReferencia, mesReferencia);

	            niGrupoCuesSMAnu = beanCuestionarioSMAnu.getNiGrupoCuesSM(territorio, municipio, anyoReferencia, mesReferencia);

	            //Se obtiene la conexión a la base de datos

       	 		conn = Q70ConectorJDBC.getSingleton().getConnection(Q02_JNDI_DATASOURCE);

       	 		

	       	 	result.addGroup("RESULT_1"); 			

	 			result.addProperty("RESULT_1","RESULT","OK");

	 			result.addProperty("RESULT_1","numCuestionariosSM", Integer.toString(numCuestionariosSM));

	 		   	result.addProperty("RESULT_1","prevSueloInicial", prevSueloInicial);

	        	result.addProperty("RESULT_1","niGrupoCuesSMAnu", niGrupoCuesSMAnu);

	        	

       	 		if (tr.isTraceActive()){

       	 			tr.trace(COMPONENTE, Q70TraceLevel.INFO, this.getClass().getName() + ":getNumCuestionariosPortadaSM: saliendo");                

       	 		} 

       	 		return result;

	       }catch(Exception ex){

	    	    result.addProperty("RESULT_1","RESULT","NOOK");

	            java.io.StringWriter sw = new java.io.StringWriter();

	            java.io.PrintWriter pw = new java.io.PrintWriter(sw);

	            ex.printStackTrace(pw);

	            tr.trace(COMPONENTE, Q70TraceLevel.ERROR, this.getClass().getName() + ":getNumCuestionariosPortadaSM: " + sw.getBuffer ().toString());

	            throw new Q02bDAOException(ex);

	       }

       } 







}

	   

	   

