Archive for the ‘Desarrollo’ Category

Ejemplos de uso de ADT para compilar AIR para Android

sábado, abril 16th, 2011

Luego de crear una aplicacion para AIR a para Android, existieron una serie de pasos que tuve que hacer para la instalación de la aplicación en el amulador del dispositivo, estos fueron:

Instalar el Runtime

adt -installRuntime -platform android -platformsdk path\android-sdk-windows -package path\Runtime.apk

Compilar la aplicacion cuando ya se tiene el SWF que se compila con flex

adt -package -target apk -storetype pkcs12 -keystore myKeystore.p12 aplicacion.apk aplicacion-app.xml aplicacion.swf

Instalar la aplicación a través de la línea de comando, esto presume que el Device está siendo ejecutado

adt -installApp -platform android -platformsdk path\android-sdk-windows -package aplicacion.apk

Diferencias entre Form.Activate y Form.GotFocus

miércoles, abril 6th, 2011

En .Net existe al menos una diferencia fundamental entre el evento Activate y el evento GotFocus, en el formulario Activate ocurre siempre antes de GotFocus, pero GotFocus sólo ocurre cuando todos los controles del formulario en cuestión han sido deshabilitados.

Bug de MySQL cuando se establece SET columna= null

miércoles, marzo 30th, 2011

Existe un error reportado a MySQL (https://bugs.mysql.com/bug.php?id=16494) que sucede en el momento que se establece una columna a NULL. En muchos de los casos sucede que envía el error que la columna no existe.

Dependiendo del tipo de dato se debe tener una forma de resolver el problema. Aun cuando no es lo mismo establecer NULL a una columna String que establecer » (vacío), pero debes considerarlo como solución cuando te aparezca el problema.

ROWNUM, select union e insert into

martes, marzo 29th, 2011

Un problema que me sucedio radicó en que requería hacer desde una vista ya existente un INSERT INTO hacia una tabla destino, esta vista tenía una columna que hacía de identificador, pero al ver la consulta me di cuenta que utilizaba un UNION, era más o menos así:

insert into tabla (id, col1)
select rownum id, xyz from t1
union
select rounum id, zyx from t2

El problema no era la consulta ya que esta arrojaba resultado, la problematica se encontraba que el id generado no era unico, ya que en ambos casos el rownum partía de 1, lo que provocaba un error en el insert into.

La solución fue, crear un trigger que incrementara una secuencia y el valor lo depositara en ID,

create or replace trigger TRG_tabla 
before insert on tabla
   for each row 
begin  
   if inserting then 
      if :NEW.ID is null then 
         select SQ_tabla.nextval into :NEW.ID from dual;
      end if
   end if
end;

eliminar del insret into la columna ID, y luego ejecutar el insert into, con esto se solución el error de clave duplicada.

insert into tabla (col1)
select xyz from t1
union
select  zyx from t2

CAST en Oracle

martes, marzo 29th, 2011

En oracle existe igual la posibilidad de hacer CAST de los tipos de datos en una consulta, por ejemplo:

select cast(12.2 as NUMBER(10,5)) FROM DUAL;
select cast('usuario' as VARCHAR2(100)) FROM DUAL;

Esto es util para cuando en algun resultado de una vista se esta esperando un tipo de datos especifico. Por ejemplo, si hacemos un select sobre una columna varchar2(100) la vista no será creada con una columna varchar2(100), sino que será creada con el maximo largo existente dentro de la columna que no necesariamente es 100, por lo mismo, para evitar posibles errores de conversión de tipos entre vistas o database link, es bueno uitlizar este tipo de solución.

Llamar a un Webservices Statefull de .Net desde Java con Metro

miércoles, marzo 23rd, 2011

Me ha tocado llamar a un Webservices .Net pero que contenía una situación muy particular, debía inicialmente llamar a un método inicializador, que preparaba al Webservices para poder llamar a los otros métodos que éste contenía.

Con Netbeans generamos el proxy para el webservices a través de las librerías de Metro, pero luego, al intentar llamar al primer método y luego al segundo, se generaba un error debido a que el webservices reclamaba porque no se había llamado al método inicializador, aun cuando las dos lineas estaban puestas consecutivamente en el código. Esto porque era un Webservices Satatefull, o sea, que debíamos conservar el estado de las llamadas consecutivas para poder ser utilizadas.

De esta forma el siguiente ejemplo muestra como llamar a uno de este tipo de Webservices, se presume que aqui existe un proxy a Objeto que tiene dos métodos llamados metodoInicializador y segundoMetodo:

public class Main {
    public static void main(String[] args) {
         try {
            QName sName = new QName("https://algunNamespace.cl", "Objeto");
            Objeto objeto= new Objeto(new URL("https://algunServidor.cl/Objeto?wsdl"), sName);
            BindingProvider bp = ((BindingProvider) objeto.getWSHttpBindingIObjeto());
            bp.getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true);
            bp.getRequestContext().put(BindingProvider.SOAPACTION_USE_PROPERTY, new Boolean(true));
            ((IObjeto)bp).metodoInicializador("abcd");
            Data data =((IObjeto)bp).segundoMetodo("xxyyzz");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}