Empece este blog para guardar los descubrimientos en programacion que hago cuando tengo un error y por mas que busco en san Google, no encuentro nada hasta despues de horas de andar buscando y horas de prueba y error. Si a alguien algun dia le sirve, que bueno. En general es para mi porque se me olvidan muchos de estos descubrimientos.

Friday, May 31, 2013

Error Rosetta Stone v3

Se que esto no es de programacion, pero necesitare acordarme de esto y los marcadores siempre se me pierden.

El Rosetta Stone V3 esta dando un error cuando no se actualizo correctamente.
El link de la solucion esta aqui.

Instrucciones en español:
  • Encuentra el siguiente archivo (Para Windows 7 esta en C:\programData\Rosetta Stone\tracking.db3 (Carpetas ocultas) y renombralo a  tracking.db3.bak
    1. Reinicia la maquina.
    2. Inicia el Rosetta Stone (tu progreso se habra perdido. Lo siento)
    3. Cierra el Rosetta.
    4. Renombra el tracking.db3.bak otra vez a tracking.db3 (A mi me habia salido un nuevo tracking.db3. Borre este y renombre el viejo)
    5. Vuelve abrir el Rosetta y disfruta poder usarlo nuevamente. 
    :)

    Errores comunes en Clientes de Webservices generados con Axis

    Generar un cliente para consumir un servicio, debería de ser tan fácil como generarlo.. consumirlo... me funciona y ya.
    Pero a todos los que nos ha tocado, consumir servicios, nos hemos dado cuenta que no siempre es así. Se nos pueden generar muchos problemas, que muchas veces son muy sencillos de solucionar, y en los que nos ha tocado googlear por largas horas y a prueba y error logramos resolver. Aquí van algunos de esos problemas y como resolverlos:

    1. The message must be an instance of: {http://www.w3.org/2003/05/soap-envelope}Envelope

      Este error lo que nos indica es que la versión de soap que se está usando es distinta, o sea que debemos cambiarlo a la 1.2
      Solución:
      Luego que crean los métodos en su provider, y en el método que consumen deben de agregar lo siguiente en el serviceStub que se les generó:
      Cuando se realiza el Envelope, en el parámetro que se le pasa al getFactory:
             env = toEnvelope(getFactory(_operationClient.getOptions().getSoapVersionURI())
      sustituir el_operationClient.getOptions().getSoapVersionURI() por http://www.w3.org/2003/05/soap-envelope
      Con esto ya se actualiza la versión.

    2. The MessageContext does not have an associated SOAPFault.

      Este error lo que nos indica es que el contexto no tiene un fault asociado, es decir que el servicio está devolviendo un error y el cliente que se nos generó espera que el error venga en un fault; sin embargo el servicio no devuelve un fault.
      Solución:
      En el serviceStub que genero nuestro cliente hay una opción que setea si se devuelve o no un fault, esta se encuentra antes de crear el messageContext, antes del envelope:
             _operationClient.getOptions().setExceptionToBeThrownOnSOAPFault(true);
      Esta debe setearse en false para que ni genere fault, o si nuestro error es al revés, debemos setearla en true.


    3. Nuestro Servicio no tiene Seguridad

      Normalmente los servicios que consumimos tendrán un usuario y password; sin embargo si nos entregan uno sin seguridad.
      Solución:
      No utilizar el rampart que normalmente usamos y comentar esta linea:
               sc.engageModule("rampart");

      Además dentro del serviceStub que se nos generó debemos agregar después de realizar el envelope, del método toEnvelope, estas líneas:
          String url = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
          OMNamespace xsi = getFactory(_operationClient.getOptions().getSoapVersionURI()).createOMNamespace(url, "wsse"); 
          SOAPHeaderBlock soapHeaderBlock =env.getHeader().addHeaderBlock("Security",xsi);                                                  
          soapHeaderBlock.setMustUnderstand("1"); 
          Iterator it = env.getHeader().examineAllHeaderBlocks(); while(it.hasNext()) { SOAPHeaderBlock headerBlock= (SOAPHeaderBlock)it.next();
                        headerBlock.setRole("http://www.w3.org/2003/05/soapenvelope/role/next");

      Estas lo que hacen es agregar un header de seguridad que necesita el servicio para que funcione correctamente.

    Thursday, May 9, 2013

    Haciendo un Case en un Count SQL

    Odio hacer un query que me costo hacer y luego no acordarme como hacerlo.
    Por alguna razon el haber pasado de SQL Server a Oracle me volvio perezosa con los queries. 
    Odio que Oracle no tenga Top! Amaba mi top!

    La vez pasada necesitaba hacer un query con unos counts especiales y google fue de muy poca ayuda. Eso me sorprendio considerando la cantidad de ejemplos de queries en la red. 
    Este query sirve para cuando quieres hacer where distintos para cada count en una misma tabla. 
    Los ejemplos que me daban eran Unions o joins pero yo queria algo simple y limpio.
    He aqui el query que mi compañero me ayudo a sacar:

    Supongamos que tengo un tabla en donde se almacenan diferentes estados. Digamos el estado de un producto donde estado = B es en bodega, T= en tienda, P=pendiente de ingresar a bodega. etc. Yo quiero saber el total de productos por cada estado. 
            select 
                   idproducto, descripcionProducto,
                   count(1) as totalProductos,
                   count(case
                           when (estado != 'B') then
                            1
                         end) as bodega,
                   count(case
                           when (estado != 'T') then
                            1
                         end) as enTienda,
                   count(case
                           when (estado = 'P') then
                            1
                         end) as pendiente
              from productos
             group by Idproducto


    Sencillo, rapido y bonito. 
    Vi ejemplos de If en los parenthesis del count pero no les entendi mucho. Este case es lo mismo y mas comprensible. 
    Bueno, al menos no se me va olvidar para la proxima!