jueves, 10 de julio de 2014

Formatear un texto a XML

Para formatear un texto en el cual tengamos un archivo XML, para que quede con la estructura
del archivo XML, podemos implementar la siguiente clase que recibe como parámetro el texto:
 
public static String PrintXML(String XML)
{
   String Result = "";

   MemoryStream mStream = new MemoryStream();
   XmlTextWriter writer = new XmlTextWriter(mStream, Encoding.Unicode);
   XmlDocument document   = new XmlDocument();

try
{
   //Cargamos el XmlDocument con el XML que tenemos en DatosXml
   document.LoadXml(DatosXml);

   writer.Formatting = Formatting.Indented;

   //Formateamos el contenido del documento con el XmlTextWriter
   document.WriteContentTo(writer);
   writer.Flush();
   mStream.Flush();

   //Tengo que rebobinar la MemoryStream para leer su contenido.
   mStream.Position = 0;

   //Almacenamos en un StreamReader el contenido del MemoryStream
   StreamReader sReader = new StreamReader(mStream);

   //Extraemos el texto del StreamReader.
   Result = sReader.ReadToEnd();

   mStream.Close();
   writer.Close();
}
catch (XmlException)
{
}
return Result;
}

viernes, 13 de junio de 2014

Aumentar el tamaño de los discos VDI en VirtualBox

¿Te has quedado corto en el disco duro de esa máquina virtual que usas para evaluar las aplicaciones de Windows Server y ahora no te llega para instalar la última barbaridad de Giga y pico que ha lanzado Microsoft? Si usas VirtualBox puedes aumentar el tamaño de tus discos duros en formato VDI en segundos con un sencillo comando. Por ejemplo, si queremos que el disco duro que se guarda en el archivo w2008r2.vdi pase a tener 25 GBytes, escribimos lo siguiente:

VBoxManage modifyhd w2008r2.vdi --resize 25600
 
Este comando sólo sirve para aumentar el tamaño de los discos y no para reducirlos (aunque el mensaje de error que nos da hace suponer que se implementará en una versión futura). Además, la máquina debe de estar apagada y debes que tener en cuenta que estamos modificando el tamaño del disco pero no el de la partición que usa tu máquina virtual. El espacio adicional aparecerá como espacio libre a continuación de la partición o particiones que estés usando. Si vas a crear nuevas particiones para usar ese espacio no tendrás ninguna complicación. Pero si lo que quieres es aumentar el tamaño de alguna de las ya existentes y el sistema operativo que contiene la máquina no puede extenderlas en caliente (como hace el windows 2008 que tomamos como ejemplo), tendrás luego que arrancar la máquina con algún sistema externo y realizar estas operaciones (cualquier Live de Linux te proporcionará una herramienta válida para esto como, por ejemplo, gparted)

sábado, 7 de junio de 2014

Instalación Virtualbox OpenSuse

Buenas a todos.

En esta ocación, voy a instalar Virtualbox en OpenSuse. Para esto vamos a seguir los siguientes pasos:
  1. Descargamos el paquete rpm
  2. Vamos a la carpeta donde lo descargamos y con clic derecho le decimos que lo vamos a instalar con yast
  3. Descargamos el VirtualBox Oracle VM VirtualBox Extension Pack
    desde la misma página anterior.
  4. Ya deberia funcionar, pero si te sale el error que me salio a mi (Kernel Driver Not Installed (rc=-1908)), entonces vamos a seguir los siguientes pasos. Ejecutamos el siguiente comando como root:

    # /etc/init.d/vboxdrv setup

    Si te sigue presentando algun problema, es porque debes instalar los siguiente programas:

    # zypper in make gcc gcc-c++ kernel-source kernel-syms

    Vuelve y ejecuta el primer comando:

    # /etc/init.d/vboxdrv setup

    Lanza nuevamente Virtualbox y listo.

jueves, 29 de mayo de 2014

Filtrar Datos Por Hora en Oracle

Para filtrar datos de una tabla por la hora unicamente, sin tener en cuanta la fecha, entonces podemos utilizar la siguiente sentencia:

SELECT VISCAIHOR
FROM FAVISCAI
WHERE TO_CHAR(VISCAIHOR,'HH24:MI:SS') = TO_CHAR(?,'HH24:MI:SS')

SELECT VISCAIHOR
FROM FAVISCAI
WHERE TO_CHAR(VISCAIHOR,'HH24:MI:SS') = '17:53:04'

En la primera, el signo de interrogación se cambiaria por un DateTime que llegue como parámetro.
En la segunda, la hora se pasaria como un String, pero se corre el peligro que no se castee bien, por lo cual es mejor utilizar la primera opción.

viernes, 21 de marzo de 2014

Setear error en las filas de un grid Devexpress

Para validar la información de un registro y si no pasa dicha validación setear el icono del error en la fila y columna del registro, hacemos algo como lo estamos haciendo en el siguiente ejemplo:

* La clase que estamos utilizando como fuente de datos, la heredamos de IDXDataErrorInfo

public class Person : object, IDXDataErrorInfo {
        public Person(string firstName, string lastName, string address, string phoneNumber, string email) {
            this.FirstName = firstName;
            this.LastName = lastName;
            this.Address = address;
            this.PhoneNumber = phoneNumber;
            this.Email = email;
        }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Address { get; set; }
        public string PhoneNumber { get; set; }
        public string Email { get; set; }

        #region IDXDataErrorInfo Members
        void IDXDataErrorInfo.GetPropertyError(string propertyName, ErrorInfo info) {
            switch(propertyName) {
                case "FirstName":
                case "LastName":
                    if(IsStringEmpty(propertyName == "FirstName" ? FirstName : LastName)) {
                        SetErrorInfo(info, propertyName + " field can't be empty", ErrorType.Critical);
                    }
                    break;
                case "Address":
                    if(IsStringEmpty(Address)) {
                        SetErrorInfo(info, "Address hasn't been entered", ErrorType.Information);
                    }
                    break;
                case "Email":
                    if(IsStringEmpty(Email)) {
                        SetErrorInfo(info, "Email hasn't been entered", ErrorType.Information);
                    } else if(Email != "none" && !IsEmailCorrect(Email)) {
                        SetErrorInfo(info, "Wrong email address", ErrorType.Warning);
                    }
                    break;
            }
        }
        void IDXDataErrorInfo.GetError(ErrorInfo info) {
            if(IsStringEmpty(PhoneNumber) && (Email == "none" || !IsEmailCorrect(Email)))
                SetErrorInfo(info, "Either Phone Number or Email should be specified", ErrorType.Information);
        }
        #endregion
        bool IsStringEmpty(string str) {
            return str == null || str.Trim().Length == 0;
        }
        bool IsEmailCorrect(string email) {
            return email == null || (email.IndexOf("@") >= 1 && email.Length > email.IndexOf("@") + 1);
        }
        void SetErrorInfo(ErrorInfo info, string errorText, ErrorType errorType) {
            info.ErrorText = errorText;
            info.ErrorType = errorType;
        }