jueves, 18 de febrero de 2016

Carga de datos mediante un archivo Excel

En algunas ocasiones es necesario hacer una carga de datos desde un archivo Excel, extensión "XLS", para hacer más ágil el trabajo de nuestros usuarios, en esta entrada vamos a ver como hacerla y ver que tipo de inconvenientes se me presentaron al hacer la Webform.

Lo primero será arrastrar un elemento de tipo FileUpload, uno de tipo Button y otro de tipo Label para ahí colocar cualquier mensaje que pueda presentarnos nuestra Webform.



Una vez teniendo estos 3 elementos, vamos a teclear código, para eso le daremos doble click a nuestro elemento Button para ir al evento del mismo. Cabe mencionar que en nuestra solución manejamos varios proyectos, uno donde tenemos nuestras entidades, otro donde tenemos el acceso a datos, otro donde vienen las reglas de negocio y el sitio web, que es nuestra interfaz de usuario.

Dentro del evento Click de nuestro botón vamos a poner el siguiente código:

try
{
  if (FileUpload1.HasFile)
  {
     FileInfo info = new FileInfo(FileUpload1.PostedFile.FileName); // System.IO
     if (info.Extension.ToString() != ".xls")
         {
        Label10.Text = "El archivo Seleccionado no es correcto";
          }
      else     
      {
       ///// CargaExcel es la tabla donde se almacenaran los datos que se van a cargar en nuestra base de datos
         AdminCargaExcel Administra = new AdminCargaExcel();
         CargaExcel Datos = new CargaExcel();
        
         FileUpload1.SaveAs(@"C:\temp\" + FileUpload1.FileName);

        string CadenaConexion = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                                "Data Source=C:\\temp\\"+FileUpload1.FileName+
                                ";Extended Properties=\"Excel 8.0;HDR=NO\"";
        OleDbConnection con = new OleDbConnection(CadenaConexion);
        string strSQL = "SELECT * FROM [Hoja1$]";
        OleDbDataAdapter da = new OleDbDataAdapter(strSQL, con);
        DataSet ds = new DataSet();
        da.Fill(ds);
      
        try
        {     
         if (ds.Tables.Count > 0)
             foreach (DataRow row in ds.Tables[0].Rows)
             {
                 Datos.DatoCargado = Convert.ToString(row[0].ToString().ToUpper());
                 Administra.Guardar(Datos);
             }  
        }
        catch (Exception ex)
        {
            Label10.Text = ex.Message;
        }
      }
    }
   else
   {
        Label10.Text = "NO CARGO EL ARCHIVO";
   }
}
catch (Exception ex)
{
     Label10.Text = ex.Message;
}


Ese será el código que necesitaremos, con esto se hace la carga. Aquí esta el archivo Excel

 
 
Así luce mi Webform



Le doy click a examinar



Selecciono el archivo y le doy click al botón


Y listo, ya se hizo la carga en la base de datos



En modo desarrollo todo jalaba de maravilla, seleccionaba el archivo, hacia las validaciones y cargaba la información, ya era momento de ponerlo en producción, y ZAZ!!!


"El proveedor 'Microsoft.Jet.OLEDB.4.0' no está registrado en el equipo local."

Algo que no me esperaba y entré un poco en pánico, pensé que seria necesario instalar algo, busqué en algunos foros y leía que tenia que instalar "AccessDatabaseEngine", yo no quería instalar nada en nuestro servidor, eso no estaba en los planes, pero hubo una luz al final del túnel y aparecía ante mi la respuesta, todo estaba en el Administrador del IIS.

Dentro del Administrador del IIS, en "Conexiones", seleccionamos "Grupo de aplicaciones"

 


Seleccionamos el grupo de aplicaciones al cual pertenece nuestra aplicación, en mi caso es "DefaultAppPool", le damos un click derecho y nos vamos a "Configuración Avanzada..."

 Ahí nos mostrará la siguiente pantalla



Y lo único que hay que hacer es, en la parte de "(General)", ubicamos "Habilitar aplicaciones de 32 bits" y modificamos de "False" a "True"



LISTO!!!! con esto quedará resuelto este pequeño inconveniente!!!

Espero y les sirva de algo mi experiencia, les dejo a su disposición mi correo para cualquier duda, aclaración o sugerencia, ricegamo@hotmail.com

Saludos

miércoles, 10 de febrero de 2016

Mantener Menú TreeView Expandido

Cuando empezamos nuestro sistema utilizábamos este Menú:

 
A nuestro usuario no le gustó y nos pidió que utilizáramos un menú parecido al explorador de Windows, TreeView. El cambio realmente fue fácil, solo se cambio un poco el código y ya teníamos el menú de Árbol, parecía que todo estaba resuelto con eso. Así se veía
 
 
El cliente estaba satisfecho con ese menú, pero había un problema, cada vez que entraban a una WebForm seleccionada desde el menú, este se contraía y quedaba así
 
 
Realmente nunca nos hizo algún comentario el cliente acerca de este comportamiento, el comentario acerca de esta situación fu por parte de personal de la misma empresa.
 
Decidimos buscar alguna solución pero no encontrábamos nada en la red, por lo que lo mas fácil fue decir que no se podía, y ahí quedó todo. A mi, esa respuesta no me convenció, todos los que nos dedicamos a esto sabemos que tenemos las herramientas para hacer casi todo, nosotros trabajamos con Visual Studio, y Microsoft nos da la facilidad para hacer lo que se nos ocurra.
 
Lo primero que se me ocurrió fue poner el menú en  un UpdatePanel, pero no funcionó, pasaba exactamente lo mismo, el menú se contraía, luego pensé en dividir en paneles la Masterpage para que así solo moviera el panel central, donde se ubican las paginas, pues nada, seguía sin funcionar.
 
Entonces decidí ver el funcionamiento del TreeView, y como es que respondía al  click para mandar a llamar la WebForm.
 
 
Opté por obtener el nombre de la pantalla para poder localizarla en el menú, lo hice así:

    public string NombrePagina()
    {
     string direccion = System.Web.HttpContext.Current.Request.Url.AbsolutePath;
     System.IO.FileInfo info = new System.IO.FileInfo(direccion);
     string valor = info.Name;
     return valor;
    }

 
Con esto ya obtenía el nombre de la WebForm
 
 
Al tener ya el nombre de la WebForm lo demás fue un poco de sentido común, tenía que recuperar el título con el que aparecía en el menú, y ya obteniéndolo solo quedaba ubicarlo en el menú y expandir el TreeView, el código fue el siguiente:

     private void expandirMenu(object sender, string nombre)
    {
     TreeView1.CollapseAll();
     var tree = (TreeView)sender;
     int i = 0, rea = 0, apl = 0;

     foreach (TreeNode node in tree.Nodes)
     {
      int nodo = TreeView1.Nodes.Count - 1;
      i = node.ChildNodes.Count - 1;
      node.DataPath.ToString();
       for (int aplicaciones = 0; aplicaciones <= i; )
       {
         rea = node.ChildNodes[aplicaciones].ChildNodes.Count - 1;
            for (int modulos = 0; modulos <= rea; )
            {
             apl = node.ChildNodes[aplicaciones].ChildNodes[modulos].ChildNodes.Count - 1;
               for (int submodulos = 0; submodulos <= apl; )
               {
                if (nombre.Trim() == node.ChildNodes[aplicaciones].ChildNodes
                [modulos].ChildNodes[submodulos].Value.ToString().Trim())
                 {
                    node.Expanded = true;
                    node.ChildNodes[aplicaciones].Expanded = true;
                    node.ChildNodes[aplicaciones].ChildNodes[modulos].Expanded = true;
                    node.ChildNodes[aplicaciones].ChildNodes[modulos].ChildNodes
                    [submodulos].ImageUrl = "~//Pictures//RArrow.gif";
                 }
                 submodulos++;
              }
               modulos++;
          }
            aplicaciones++;
       }

     }

 }
 
"sender": Es el nombre de nuestro TreeView, en mi caso: TreeView1.
"nombre": Es el nombre que se muestra en el menú y que nosotros recuperamos de la base de datos.
 
Y el resultado fue el siguiente:
 
Ya mantenía el menú extendido. Es la manera en que yo solucione esto, quizá exista alguna otra manera o mas fácil o "correcta", pero como un amigo dice, "La manera correcta es como lo haces, siempre y cuando no afecte el rendimiento".
 
Saludos
Dejo a su disposición mi correo: ricegamo@hotmail.com.
 
 


jueves, 4 de febrero de 2016

Al intentar generar un reporte aparece el mensaje : Error: 'bobj' no está definido



Una vez al empezar mi día laboral hice una pequeña revisión del sistema en el que trabajamos, y me lleve la sorpresa que al intentar ver un reporte en modo de ejecución me aparecía el mensaje :

Error: 'bobj' no está definido
 
No sabía que es lo que había pasado o cual era la razón por la cual me aparecía ese mensaje, obviamente quise solucionarlo rápido y lo mas "fácil" era buscar en google alguna respuesta que me lo solucionara, perdí mas de medio día y lo único que encontraba era lo siguiente
 
"para resolver este problema copia la carpeta aspnet_client que esta en C:\inetpub\wwwroot a la carpeta donde esta tu solución"
 
Buscaba en mi proyecto y allí estaba
 
 
La borraba, la ponía otra vez y nada pasaba, seguía sin mostrar el reporte, decidí hacer lo que tenía que hacer desde el principio, revisar el error dándole click al SI!!!!
 

Obviamente tuve que checar la página de depuración para ver donde estaba el error, algo que normalmente me da mucha flojera, y lo encontré!!!!, si, había que copiar la carpeta a la aplicación, pero como no dicen para que y yo no me tome la molestia de investigar para que se hacia, me tuve que dar cuenta a la mala, teniendo el error presente, cabe mencionar que un día antes había instalado una actualización y era ahí donde estaba el error.



La aplicación buscaba la carpeta "4_6_1055" que debía estar dentro de la carpeta "aspnet_client". Entonces lo único que hice fue crear una carpeta con ese nombre y copiar el contenido de la carpeta "4_0_30319" a la que había creado e hice la prueba.

La prueba fue satisfactoria, funciono!!!
Espero les sirva mi experiencia con este errorcito que se me presentó!!

Saludos