viernes, 30 de septiembre de 2016

Lexmark x644e: 208.02 falta el escaner cable desenchufado

En la oficina, la fotocopiadora regalona, una Multifuncional Lexmark x644e Type 7002-012, estaba con un error, el 208.02: Falta el escaner, cable desenchufado.

Segun el manual de servicio, habia que revisar las conexiones de la tapa ADF a la tarjeta de escaner que se encuentra en la parte trasera, resultado?, todo conectado, reconecte, encendi, y nada, mismo error.

Ingrese al menu de diagnostico a revisar funciones de scanner, cualquier intento de prueba terminaba en un abrupto 900.80, Service RIP Software.

"Vamos, no es mi trabajo reparar esta cosa", por desgracia ningun servicio tecnico en la zona quiso revisar el equipo y realmente se necesitaba mas o menos urgente, por lo que decidi aplicar mis conocimientos en Multifuncionales y ver si se podia reparar sin repuestos...

Resultado de imagen para 40X0485Revisando un poco el manual de servicio, habia que revisar (y reemplazar si era necesario) la tarjeta de interconexion del scanner (40X0485), para lo cual hay que desmontar el scanner casi por completo,me di el trabajo... limpieza, limpia contactos, limpieza del ensamble y espejos del ccd, montar, y!!!!... nada, el mismo error.

Resultado de imagen para 40x0487Finalmente como ultimo recurso, sin repuestos ni nada para hacer pruebas... a revisar las conexiones en la tarjeta lateral (mirado la maquina de frente, al lado izquierdo superior, sobre la Main Board) donde esta conectado el cable flat del ccd (40X0487), al ispeccionar ese extremo del cable me percate que los contactos del cable no tenian buen aspecto, tipico en este modelo, a limpiar con mucho cuidado y reconectar y magiaaaa, revivio el equipo, ahora.. esperando que en la oficina compren el dichoso cable que sale algo asi como 20USD + iva (aca en chile), por que no tiene buen aspecto y puede fallar en cualquier momento, pero por ahora... vive!!!...

Claro que no se por cuanto, por que ahora esta reclamando un 80.00, que es el codigo para acmbio de Kit de Mantenimiento (40X0101), el cual tiene un valor aprox de 295USD +iva (igualmente cotizado en chile), y al acabarse la vida util del kit, se detiene el equipo, ajauajajaua, pero al menos salimos del paso...


Qi: Sistema de carga Inalambrica en telefonos moviles

Qi (pronunciado "chi") es un estándar de interfaz desarrollada por el Wireless Power Consortium para la transferencia de energía eléctrica por inducción, a distancias de hasta 4 cm, esto segun la capacidad de los equipos claro esta....

El sistema de Qi comprende una plataforma de transmisión de potencia y un receptor compatible en un dispositivo portátil. Para utilizar el sistema, el dispositivo móvil se coloca en la parte superior de la base de transmisión de potencia, que lo carga a través de la inducción electromagnética.



 Basicamente, como se ve en la imagen:

La base cuenta con bobinas que emiten la energia, y los dispositivos moviles cuentan con otra bobina que recibe dicha energia, la cual es traspasada por induccion electromagnetica de bobina a bobina.

La definicion de Inducción Electromagnética nos dice:
Resultado de imagen para induccion electromagnetica
La inducción electromagnética es el fenómeno que origina la producción de una fuerza electromotriz (f.e.m. o tensión) en un medio o cuerpo expuesto a un campo magnético variable, o bien en un medio móvil respecto a un campo magnético estático no uniforme.




Actualmente existen varios equipos que vienen con esta tecnologia integrada para recibir carga, como por ejemplo:
-Google Nexus 4,5,6 y 7
-Microsoft Lumia 920,928, 929, 930, 950, 950XL, 1020, 1520
-Motorola Droid Maxx y Droid Mini
-Samsung S7, S7 Edge, Note 5, S6 Edge+, S6 Edge

Obviamente estos no son los unicos equipos, pero son los que recuerdo que lo traen de fabrica, sin embargo, en el mercado existen accesorios para hacer los moviles compatibles, como carcasas en algunos casos o bovinas que se conectan al usb del movil, es cosa de dar una vuelta por aliexpress (algo asi como Qi universal adapter) y encontraremos montones de bases de carga y adaptadores para nuestros telefonos moviles, personalmente he probado varios accesorios con buenos resultados...






viernes, 19 de agosto de 2016

Funciones en C Sharp (C#) para Conexion y Manejo Basico de Bases de Datos de MSSQL

En esta publicacion veremos una pequeña clase que escribi hoy en la mañana y que puede ser util para el manejo de consultas en bases de datos Microsoft Sql Server desde ASP.NET con C#, en realidad con unas pocas modificaciones es posible adaptarlo a C# "de escritorio".

En mi caso, hice una publica clase llamada MSSQL, que esta compuesta por 2 funciones:

1.- script(sentencia sql) -> Retorna un String con el resultado de la operacion
2.- query(sentencia sql) -> Retorna un DataTable con el resultado de la operacion

En el Archivo web.config esta definida la cadena de conexion a la Base de Datos, dentro de las eqtiquetas "<connectionStrings>"



<connectionStrings>
    <add name="DB" connectionString="Server=IP_SERVIDOR,1433;Initial Catalog=NOMBRE_DB;Persist Security Info=False;User ID=NOMBRE_USUARIO;Password=CONTRASEÑA;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" />
  </connectionStrings>


Usamos 2 librerias de referencia:
  • using System.Data;
  • using System.Data.SqlClient; 



En la construccion de la clase MSSQL declare la conexion fuera de las funciones, para que todas pudieran tener acceso a esta...

La variable CONEXION esta declarada como privada, ya que necesito que sea visible solo por las funciones que utilizaran la conexion, al inicializar el objeto le indique que lea la cadena de conexion almacenada en el archivo web.config







private SqlConnection CONEXION = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString);
 
La funcion QUERY(sentencia SQL) recibe como parametro un string con la sentencia sql que se desea ejecutar, y devuelve un DataTable.



 ///<summary>Devuelve un DataTable con el resultado de la consulta. </summary>
        ///<param name="QUERY">String de consulta SQL</param>
        public DataTable QUERY(string QUERY)
        {

            DataTable tabla = new DataTable(); //declara un DataTable nuevo que recibira el resultado de la Query
            try
            {

//Verifica si la conexion no esta abierta, si el estado es distinto a open, la abre.
                if (CONEXION.State != ConnectionState.Open)
                    CONEXION.Open();
//Se declara e inicializa el objeto SqlCommand que contiene la QUERY (que se paso por parametro a la funcion) y la CONEXION.
                SqlCommand SENTENCIA = new SqlCommand(QUERY,CONEXION);

//Se define que la propiedad Timeout de la sentencia seran 180 segundos, esta propiedad define cuantotiempo esperar antes de arrojar error.
                SENTENCIA.CommandTimeout = 180;

//se crea e inicializa un SqlDataAdapter y se le entrega como parametro el objeto SENTENCIA que contiene la sentencia sql.
                SqlDataAdapter ADAPTADOR = new SqlDataAdapter(SENTENCIA);

//Utilizo la funcion Fill(DataTable) del objeto ADAPTADOR, entregandole como parametro la tabla vacia que declaramos al principio, esta funcion se encarga de llenar la tabla con el resultado de la consulta sql.
                ADAPTADOR.Fill(tabla);

//realizamos una validacion verificando que vienen resultados en la consulta.
                if (tabla.Rows.Count == 0)
                {

//si no vienen resultados creamos una tabla y la inicializamos
                    DataTable tmptbl = new DataTable();

//le agregamos una columna llamada "Resultados"
                    tmptbl.Columns.Add("Resultados");

//creamos una nueva fila con la estructura de la tabla
                    DataRow tmp = tmptbl.NewRow();

//le asignamos el valor a la fila nueva en la columna 0 con un texto que indica que no hay resultados
                    tmp[0] = "No se encontraron resultados.";

//agregamos la fila a la table
                    tmptbl.Rows.Add(tmp);

//cerramos la conexion
                    CONEXION.Close();

//retornamos la tabla con el mensaje como resultado a la funcion
                    return tmptbl;
                }

//si por el contrario, SI hay resultados...
                else
                {

//cerramos la conexion
                    CONEXION.Close();

//devolvemos como resultado de la funcion la tabla con los resultados.
                    return tabla;
                }
            }

//en caso de error lo manejamos de la siguiente forma
            catch (Exception ERR)
            {

//creamos una tabla y la inicializamos
                DataTable tmptbl = new DataTable();

//se agrega una columna con el nombre ERROR
                tmptbl.Columns.Add("ERROR");

//agregamos una fila con la estrucutra de la tabla
                DataRow tmp = tmptbl.NewRow();

//agregamos un mensaje con el detalle del error
                tmp[0] = "Mensaje: " + ERR.Message;

//agregamos la fila a la tabla
                tmptbl.Rows.Add(tmp);

//cerramos la conexion al servidor
                CONEXION.Close();

//retornamos como resultado al servidor la tabla con el error que se produjo
                return tmptbl;
            }
        }




La funcion SCRIPT(sentencia SQL), recibe como parametro un string con la sentencia sql que se desea ejecutar, y devuelve un string que indica el resultado de la ejecucion de la sentencia SQL indicada.


La explicacion de las partes de esta funcion son casi las mismas de la anterior, excepto por unos pequeños detalles....
 
public string SCRIPT(string T_SQL)
        {
            try
            {
                if (CONEXION.State != ConnectionState.Open)
                    CONEXION.Open();
                SqlCommand SENTENCIA = new SqlCommand(T_SQL, CONEXION);

//la funcion ExecuteNonQuery() devuelve un numero entero que indica el numero de filas afectadas ó -1 si es que es otro tipo de sentencia como un create table por ejemplo...
                int AFECTADAS = SENTENCIA.ExecuteNonQuery();
                CONEXION.Close();

//si el resultado es -1 se ejecuto una sentencia, y devolvemos un mensaje indicando esto.
                if (AFECTADAS == -1)
                    return "Sentencia Ejecutada.";
                else

//si el resultado era >= 0 devolvemos un mensaje indicando cuantos registros fueron afectados
                    return AFECTADAS.ToString() + " Registros afectados.";
            }

En caso de error devolvemos string con el mensaje de error.
            catch (Exception ERR)
            {
                CONEXION.Close();
                return ERR.Message;
            }
        }




Finalmente aca abajo, les dejo el codigo completo de la clase.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace DAL
{
    ///<summary>Clase para manejo de consultas Microsoft Sql Server</summary>
    public class MSSQL
    {
        private SqlConnection CONEXION = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString);
       
        ///<summary>Devuelve un texto con el resultado de la operacion. </summary>
        ///<param name="T_SQL">String de consulta SQL</param>
        public string SCRIPT(string T_SQL)
        {
            try
            {
                if (CONEXION.State != ConnectionState.Open)
                    CONEXION.Open();
                SqlCommand SENTENCIA = new SqlCommand(T_SQL, CONEXION);
                int AFECTADAS = SENTENCIA.ExecuteNonQuery();
                CONEXION.Close();
                if (AFECTADAS == -1)
                    return "Sentencia Ejecutada.";
                else
                    return AFECTADAS.ToString() + " Registros afectados.";

            }
            catch (Exception ERR)
            {
                CONEXION.Close();
                return ERR.Message;
            }
        }

        ///<summary>Devuelve un DataTable con el resultado de la consulta. </summary>
        ///<param name="QUERY">String de consulta SQL</param>
        public DataTable QUERY(string QUERY)
        {

            DataTable tabla = new DataTable();
            try
            {
                if (CONEXION.State != ConnectionState.Open)
                    CONEXION.Open();

                SqlCommand SENTENCIA = new SqlCommand(QUERY,CONEXION);
                SENTENCIA.CommandTimeout = 180;
                SqlDataAdapter ADAPTADOR = new SqlDataAdapter(SENTENCIA);
                ADAPTADOR.Fill(tabla);
                if (tabla.Rows.Count == 0)
                {
                    DataTable tmptbl = new DataTable();
                    tmptbl.Columns.Add("Resultados");
                    DataRow tmp = tmptbl.NewRow();
                    tmp[0] = "No se encontraron resultados.";
                    tmptbl.Rows.Add(tmp);
                    CONEXION.Close();
                    return tmptbl;
                }
                else
                {
                    CONEXION.Close();
                    return tabla;
                }
            }
            catch (Exception ERR)
            {
                DataTable tmptbl = new DataTable();
                tmptbl.Columns.Add("ERROR");
                DataRow tmp = tmptbl.NewRow();
                tmp[0] = "Mensaje: " + ERR.Message;
                tmptbl.Rows.Add(tmp);
                CONEXION.Close();
                return tmptbl;
            }
        }

}

En Mas adelante veremos como pasar un DataTable a HTML o a Excel (.xls), espero les sea util, comentarios de como mejorar esto son bienvenidos...