jueves, marzo 29, 2012

Establecer un fondo en tiempo de diseño a un formulario Windows en C#

para este ejemplo debemos tener dos formularios, uno se usará como plantilla en donde manipularemos el evento Paint y el otro heredará el diseño del formulario plantilla:

Pero en este ejemplo el efecto visual solo podrá ser apreciado en tiempo de diseño, es decir que cuando ejecutemos la aplicación solo mostrara un formulario normal.

En el evento Paint del del formulario plantilla colocamos el siguiente código:

   private void Form2_Paint(object sender, PaintEventArgs e)
        {
            if (this.DesignMode)
            {
                SolidBrush drawBrush = new SolidBrush(Color.LightSteelBlue);
                Point p = new Point(this.ClientRectangle.Width - 170, this.ClientRectangle.Height - 25);
                
                Pen pen = new Pen(drawBrush,1);
                Size rec = this.Size;
                rec.Width = rec.Width - 28;
                rec.Height = rec.Height - 50;
                Rectangle r = new Rectangle(new Point(5, 5), rec);
                e.Graphics.DrawRectangle(pen, r);

                e.Graphics.DrawString("Milton Baltazar Valenzuela", new Font("Arial", 10), drawBrush, p);
            }
        }


Y en el primer formulario modificamos la parte donde hereda de un control Form por el formulario plantilla


public partial class Form1 : Form2


vemos que cuando heredamos la parte visual del formulario cambia como se muestra en la imagen.



cuando ejecutamos vemos que el diseño se ha perdido porque en el formulario plantilla hemos establecido que solo se aplique en tiempo de diseño con DesignMode.

Crear un sinonimo publico en Oracle

En ocasiones resulta necesario acceder a información de una tabla que se encuentra en otro esquema, para ello  Oracle permite crear nombres públicos a las tablas para que cualquier usuario pueda acceder al contenido de la tabla.

Para poder crear un sinónimo primer debes loguearte con una cuenta sysdba, crear el sinónimo y acceder con otro usuario para verificar que se puede acceder a la tabla.

conn / as sysdba;
create public synonym dept  for scott.dept;
disconnect;

Luego de crear el sinónimo debes loguearte con una cuenta diferente para verificar el acceso a la tabla con la siguiente consulta:


select * from dept;


Ver transacciones pendientes de commit y rollback en Oracle

La vista dba_2pc_pending  guarda las transacciones pendientes de commit y rollback. Para poder ejecutarla debes loguearte con una cuenta de sysdba a la BD Oracle:

select * from dba_2pc_pending;

FM : Quitar espacios de las fechas en ORACLE

La siguiente instrucción obtiene la fecha

SELECT ename, to_char(hiredate,'day DD Month YYYY') AS
hiredate
FROM emp



y la siguiente añade 'fm' dentro del formato:


SELECT ename, to_char(hiredate,   'fmday DD Month YYYY') AS
hiredate
FROM emp





se nota la diferencia?

BULK COLLECT en ORACLE

Bulk Collect es la forma como Oracle maneja arreglos. puedes usarlo si quieres evitar el uso excesivo de cursores. la ventaja de Bulk Collect es que se maneja en memoria y evita la escritura a disco, por lo cual resulta optimo guardar datos con Bulk Collect.

Hay que tener en cuenta que no debemos utilizar grandes cantidades de información con Bulk Collect porque la memoria del servidor Oracle se puede ver afectado y a la vez tambien afectar otros procesos.

Este es un pequeño ejemplo donde se pasa toda la informacion de la tabla PRODUCTOS al arreglo PRODUCTOS_COLECCION


CREATE TABLE PRODUCTOS
(
  COD_PRODUCTO VARCHAR(10),
  DES_PRODUCTO VARCHAR2(50),
  FLG_ACTIVO CHAR(1)
);

INSERT INTO PRODUCTOS VALUES ('1','ARROZ','S');
INSERT INTO PRODUCTOS VALUES ('2','ACEITE','S');
INSERT INTO PRODUCTOS VALUES ('3','AZUCAR','S');

DECLARE 
  
  TYPE PRODUCTO_FILA IS RECORD (COD_PRODUCTO VARCHAR(10),
                                DES_PRODUCTO VARCHAR2(50),
                                FLG_ACTIVO CHAR(1));
  
  TYPE TYPE_TABLA_PRODUCTOS IS TABLE OF PRODUCTO_FILA; 
  PRODUCTOS_COLECCION TYPE_TABLA_PRODUCTOS; 
  
 BEGIN
 
    SELECT COD_PRODUCTO,DES_PRODUCTO,FLG_ACTIVO
    BULK COLLECT INTO PRODUCTOS_COLECCION 
    FROM PRODUCTOS;
    
    --OBTENER LA DESCRICPION DE LOS PRODUCTOS
    FOR  I IN 1 .. PRODUCTOS_COLECCION.COUNT 
    LOOP
       DBMS_OUTPUT.PUT_LINE(PRODUCTOS_COLECCION(I).DES_PRODUCTO);    
    END LOOP;
    
 END;

ORA-01000: número máximo de cursores abiertos excedido

Este error se debe a que la sesión alcanzó el límite máximo permitido de cursores abiertos.

para solucionar este problema existen una serie de recomendaciones que van desde la manipulación de los parametros de la base de datos Oracle para que soporte mas cursores o la mejora de la aplicacion donde se originó el error.


Puedes obtener el número de cursores permitidos con la siguiente consulta:

SELECT VALUE FROM V$PARAMETER WHERE NAME='open_cursors';

para modificar este valor lo puedes hacer con la siguiente instrucción:


ALTER SYSTEM SET OPEN_CURSORS = 1000;

donde el numero 1000 será el máximo de cursores permitidos.

Hay que tener en cuenta que a pesar de elevar el número máximo de cursores permitidos esto va a depender del Sistema Operativo y del hardware.

Si este error te sucedió al ejecutar un procedimientos o script desde un programa enVisual Studio .NET, entonces hay una serie de mejores que debes tener en cuenta: 

la primera de ellas es hacer Dispose a los objetos que usas al momento ejecutar  la sentencia Oracle, cerrar el componente OracleDataReader.

A continuación dejo una tabla que indica a que objetos se puede hacer dispose y close.


Clase
Método close
Método Dispose
OracleConnection
si
si
OracleDataReader
si
si
OracleBFile
si
si
OracleBlob
si
si
OracleClob
si
si
OracleXmlStream
si
si
OracleCommand

si
OracleDataAdapter

si
OracleRefCursor

si
OracleParameter

si
OracleCommandBuilder

si
OracleTransaction

si
OracleXmlType

si
OracleGlobalization

si

miércoles, marzo 28, 2012

Crear un limpia pantalla en COBOL

El siguiente código debe ponerse debajo del WORKING-STORAGE SECTION.


SCREEN SECTION.
*--------------------------
01 MENU-SCREEN BLANK SCREEN  FOREGROUND-COLOR 7 BACKGROUND-COLOR 1.

y se debe imprimir en cualquier parrafo del PROCEDURE DIVISION. donde se desea comenzar nuevamente con la pantalla limpia. la forma como se imprime es:


DISPLAY MENU-SCREEN







Ejecutar una función JavaScript y luego el evento al hacer click en un Boton ASP.Net

En ocasiones es necesario validar información por el lado del cliente con JavaScript y luego ejecutar el evento del boton ASP.Net.

Para lograr esto el control Button cuenta con  las propieades OnClick y OnClientClick.

En el siguiente ejemplo se usa OnClientClick para ejecutar una función Javascript que valide datos, el cual devoverá true cuando todo sea correcto y false cuando haya algo que validar. Si la funcion JavaScript devuelve false el evento OnClick no se ejecutara.

En el siguiente ejemplo he agregado un formulario web llamado WebForm1.aspx, en donde he añadido 3 cajas de texto, un boton y un control literal para el mensaje de confirmación.

el usuario solo podrá grabar cuando todas las cajas de texto tengan algun valor. si alguna d las cajas de texto esta vacia entonces mostrará un mensaje diciendo que falta datos por validar, en caso de que todas las cajas de texto contengan algun valor entonces mostrará un mensaje preguntando si se desea realizar la transaccion, en caso de que el usuario acepte mostrará un mensaje en el control literal indicando que los datos fueron grabados.

Para este ejemplo existen dos momentos al hacer click en el boton Grabar, el primer momento es cuando se realiza la validacion de los datos con javascript, en el cual se mostraran los mensajes de pregunta o alerta segun el caso. una vez que se ha pasado todas las valdiaciones la función Validar() de javascript retornará un valor booleano. cuando es true automáticamente pasa a ejecutar el evento OnClick del boton que se ha programado del lado del servidor.

Este el código JavaScript que valida la información


 
        function Validar()
        {
            var error = 0;
            
            if (document.getElementById('<%=TextBox1.ClientID %>').value == '' )
            {
                error = 1;
            }
            if ( document.getElementById('<%=TextBox2.ClientID %>').value == '' )
            {
                error = 1;
            }
            if (document.getElementById('<%=TextBox3.ClientID %>').value == '' )
            {
                error = 1;
            }
          
            if(error == 0)
            {
                if (confirm("Esta seguro que desea grabar?"))
                {
                    return true;
                }
                else
                {
                    return false;                            
                }

            }
            else
            {
                alert('Valide los datos antes de grabar');
                return false;
            }
        } 

Codigo del boton Asp.Net que ejecuta primero la función JavaScript y luego el evento del mismo control Button.
 


Código del lado del servidor que se ejecuta cuando se haya validado todo y el usuario confirme que desea grabar
    protected void Button1_Click(object sender, EventArgs e)
        {
            Literal1.Text = "Datos grabados";
        }







pueden descargar el código de la ejemplo en la siguiente dirección: enlace

lunes, marzo 26, 2012

HAARP: ¿un arma climática?

HAARP ( High Frequency Active Auroral Research Program) o Programa de Investigación de Aurora Activa de Alta Frecuencia es un proyecto que estudia la ionosfera para aplicarlo en la Defensa Militar y mejorar las telecomunicaciones. Surgen diversas controversias en torno a HAARP porque existen teorías que aseguran que cuando se disparan miles de billones de watios a la ionosfera y al rebotar a la tierra estas pueden generar terremotos.


Segun el gobierno Ruso, Estado Unidos esta creando un arma geofísica capaz de alterar el clima y ocasionar desastres naturales.

Les dejo un vídeo que trata sobre este tema.

Obtener el PublicKeyToken de una dll en C#

Conocer el PublicKeyToken de una dll es necesario cuando queremos registrar una dll en el .config de nuestro proyecto o cuando queremos usarlo en la directiva  <%@ Page %> o <%@ Control %>  de nuestra aplicacion web.

Este es un código que te permite obtener el PublicKeyToken de una dll, para ello debemos importar la libreria  System.Reflection;  


       private void button1_Click(object sender, EventArgs e)
        {
        
            Assembly midll = System.Reflection.Assembly.LoadFile(textBox1.Text);
            Byte[] publickeytoken = midll.GetName().GetPublicKeyToken();
            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < publickeytoken.Length; i++)
            {
                sb.Append(publickeytoken[i].ToString("x"));
            }

             sb.ToString();
            richTextBox1.Text = sb.ToString();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog open= new OpenFileDialog())
            {
                open.ShowDialog();
                textBox1.Text = open.FileName;
            }
        }         


El diseño del formulario es el siguiente:


domingo, marzo 18, 2012

Cambiar el color del Background en controles Asp.Net cuando se obtiene o pierde el foco:

Este es mi primer post acerca de Asp.Net, así que quiero empezar con un ejemplo que usa 3 tecnologías web importantes: JQuery, CSS y Asp.Net.

Mi trabajo se ha orientado mas a desarrollar aplicaciones en Windows Form, manipulaciones y creación de controles para darles efectos personalizados, por eso quise hacer algo similar en web.

El controles windows form es sencillo crear una caja de texto que cambie su color de fondo cuando obtenga el foco y regrese a su color original cuando pierde el foco, sol hay que crear una clase que herede de TextBox, sobreescribir el evento OnFocus y programar el código que cambia de color de fondo.

Entonces quise hacer algo similar en Asp.Net, para lo cual tuve que usar CSS y JQuery.

Primero creamos un proyecto de Asp.Net, quitamos las paginas aspx que traep or defecto y agregamos una nueva pagina que es donde realizaremos nuestro ejemplo.




 quitamos las paginas aspx que trae por defecto y los estilos

agregamos una nueva página aspx


creamos una tabla html con 3 filas donde agregaremos 3 controles textbox de Asp.Net


El siguiente código establecemos las 3 cajas de texto con la propieades cssclass="ControlOffFocus":
    
 
  nombre  
  apellido paterno  
  apellido materno  


Al ejecutar podemos visualizar nuestro diseño con las 3 cajas de texto pero sin ningun efecto de cambio de color cuando se establece el foco.

ahora creamos una hoja css llamada Controls.css con el siguiente código:
.ControlOnFocus
{
    background: #C3CDFF;
    color: Black; 
    border: 1px outset #05293F;
}

.ControlOffFocus
{
    background: #FEEDA8;
    color: Black; 
    border: 1px outset #FFA100;
}




y por último referenciamos el archivo jQuery q trae por defecto el proyecto de visual studio o descargas la ultima versión y lo añadimos a la carpeta scripts del proyecto y escribimos el codigo de jquery que va a permitir que se cambie de color cuando se obtiene el foco en los textbox:
   
     
    
     




ejecutamos y vemos que se cambia el color de fondo cuando se obtiene el foco y vuelve a su color original al perderlo.

domingo, marzo 11, 2012

Update con join en ORACLE: /*+BYPASS_UJVC*/

El hint  /*+BYPASS_UJVC*/  se usa cuando queremos hacer un update utiliazando join. Si despues de la intruccion ON asociamos columnas que no son primary key entonces debemos colocar el hint inmediatamente despues del comando UPDATE:



UPDATE /*+ BYPASS_UJVC */
 ( SELECT ori.ID ori_ID,
                  ori.Descripcion ori_Descripcion,
                  dest.ID dest_ID,
                  dest.Descripcion dest_Descripcion
    FROM TABLA_ORIGEN ori, TABLA_DESTINO dest
    WHERE ori.ID = dest.ID)
SET dest_Descripcion = ori_Descripcion;

sábado, marzo 10, 2012

Diferencia entre Ensamblador y Compilador

Aunque un ensamblador y un compilador están escritos en lenguaje de maquina para traducir las instrucciones de lenguaje simbólico a instrucciones de lenguaje de maquina, la principal diferencia radica en que un compilador realiza procesos mas complejos que un ensamblador.

Un ensamblador traduce una instrucción de lenguaje simbólico a otra instrucción en lenguaje de máquina, la traducción es de 1 a 1.

Un compilador traduce un programa fuente en un lenguaje de máquina. Una instrucción de alto nivel puede ser el equivalente varias instrucciones a nivel de máquina, la traducción es de 1 a muchos.

Add-Ins Visual Studio .NET: Como crear un plug-in para Visual Studio .Net 2008

En este post comentaré un poco acerca de los proyectos Visual Studio .NET Add-in. Este tipo de proyectos añade funcionalidades personalizadas al IDE de Visual Studio, por ejemplo se le puede incorporar una opción que descargue archivos via FTP o cualquier funcionalidad que no venga en el IDE de visual Studio. Voy a realizar un sencillo ejemplo que incorpora un menú que abre un formulario. Debemos añadir un proyecto tipo Add-in, para ello se debe seguir la secuencia de las siguientes pantallas












por defecto se incorpora una clase llamada Connect.cs, el cual incorpora métodos que interactuan con la IDE de Visual Studio.

Al ejecutar presionando F5, veremos se abre una IDE de visual Studio y se le añad un submenu dentro del menu  Tools


Esto se debe a que la clase Connect.cs incorpora un método llamado OnConnection el cual tiene el código que permite manipular las opciones estandar de Visual Studio.

Para abrir un formulario cuando se haga click en el submenu MyAddin3 debemos programar el evento Exec, por defecto vienen asi:
 

  public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
  {
   handled = false;
   if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
   {
    if(commandName == "MyAddin3.Connect.MyAddin3")
    {
     handled = true;
     return;
    }
   }
  }
Debemos añadir el código que abre el formulario, quedaria de esta manera:

 

  public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
  {
   handled = false;
   if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
   {
    if(commandName == "MyAddin3.Connect.MyAddin3")
    {
                                      Form1 frm = new Form1();
                                      frm.ShowDialog();
          return;
    }
   }
  }
Por último, al ejecutar el programa y dar click en el submenu MyAddin3 vemos que se abre el formulario.


martes, marzo 06, 2012

Redireccionar la versión de un ensamblado a otro con BindingRedirect

 En ocasiones es necesario usar una versión mas reciente o antigua de una dll, para esto debes configurar en el App.config o Web.config de tu proyecto en .NET para que realice la redireccion de tu componente automáticamente.
 


    
    
      
        
        
        
      
    
  

miércoles, febrero 29, 2012

Evolus Pencil: Herramienta para maquetar capa de presentación

Evolus Pencil es una útil herramienta que te permite diseñar formularios. puedes descargarlo gratuitamente en la siguiente direción:  http://pencil.evolus.vn/en-US/Home.aspx

Es ideal para diseñar la infraestructura de presentación de cualquier aplicación.


miércoles, febrero 15, 2012

Reducir tamaño de la Base de Datos en SQL Server

El siguiente código reduce el tamaño del archivo .ldf de la base de datos.

BD : Base de datos donde se reducirá espacio.


USE [master]
GO
ALTER DATABASE [BD] SET RECOVERY SIMPLE WITH NO_WAIT
GO

use [BD]
GO
DBCC SHRINKFILE (BD_log, 0)
GO
USE [master]
GO
ALTER DATABASE BD SET RECOVERY FULL WITH NO_WAIT
GO