sábado, 22 de noviembre de 2014

ANDROID

Conceptos básicos de programación en Android:



LinearLayout:
Es uno de los diseños más simples y más empleado. Simplemente establece los componentes visuales uno junto al otro, ya sea horizontal o verticalmente.

TableLayout:

Agrupa componentes en filas y columnas. Un TableLayout contiene un conjunto de componentes de tipo TableRow que es el que agrupa componentes visuales por cada fila (cada fila puede tener distinta cantidad de componentes visuales)
Cuando disponemos un control de Layouts de tipo TableLayout automáticamente crea cuatro componentes de tipo TableRow que los podemos ver en la ventana "Outline". Podemos borrar o agregar componentes de tipo TableRow según las necesidades de nuestro TableLayout.

RelativeLayout: 
es el que dispone el ADT por defecto cuando creamos un proyecto en Android. Hay varias posibilidades cuando empleamos el RelativeLayout. Primero podemos alinear un control con respecto al Layout que lo contiene.

FrameLayout:
Dispone dentro del contenedor todos los controles visuales alineados al vértice superior izquierdo. Es decir si disponemos dos o más controles los mismos se apilan.
Por ejemplo si disponemos dentro de un FrameLayout un ImageView y un Button luego el botón se superpone a la imagen.

ScrollView y LinearLayout:
El ScrollView junto con un LinearLayout nos permite disponer una cantidad de componentes visuales que superan la cantidad de espacio del visor del celular o tablet. Luego el usuario puede desplazar con el dedo la interfaz creada


OTROS CONTROLES

AutoCompeleteTextView:
Es un control EditText que te lanza una sugerencia al ingresar un texto.

MultiAutoCompleteTextView:
Es un control EditText que lanza sugerencias al escribir cada palabra separada por algun caracter, como la coma.

Button, ImageButton, CheckBox, ToggleButton y Switch:

IMAGENES

El tamaño de las imagenes (png), para cada resolución es la siguiente:
HDPI: 72x72 (32-bit) 9.17 Kb
MDPI: 48x48 (32-bit) 5.11 Kb
XHDPI: 96x96 (32-bit) 14.04 Kb
XXHDPI: 144X144 (32-bit) 18.93Kb

lunes, 25 de agosto de 2014

Consejos

  • Has lo que mas amas
  • Deja una marca en el universo
  • Has Conexiones
  • Dile no a miles de cosas
  • Crea experiencias intensamente diferentes
  • Perfecciona el mensaje
  • Vende sueños, no productos

sábado, 23 de agosto de 2014

Comandos en Gestores de Bases de Datos

  • SQL SERVER
Para modificar el nombre de una tabla se ejecuta la siguiente consulta:
EXEC sp_rename 'nom_tabla_antiguo', 'nom_tabla_nueva'
 
Para modificar el nombre de una columna de una tabla, se ejecuta la siguiente consulta:
EXEC sp_rename 'nom_tabla.nom_columna_antigua', 'nom_columna_nueva'
 
Para consultar los nombres de las columnas en una tabla:
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME= "Nombre Tabla" 
  • ORACLE 
Para consultar los nombres de las columnas en una tabla:
DESC "Nombre Tabla"
  • INFORMIX
Para consultar los nombres de las columnas en una tabla: 
DESC "Nombre Tabla"

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;
        }

jueves, 27 de febrero de 2014

StopWatch en C#

Una instancia de Stopwatch puede medir el tiempo transcurrido para un intervalo o el total de tiempo transcurrido entre varios intervalos. En un escenario de Stopwatch habitual, se llama al método Start, en otro momento se llama al método Stop y, por último, se comprueba el tiempo transcurrido mediante la propiedad Elapsed.
Una instancia de Stopwatch se está ejecutando o está detenida; utilice IsRunning para determinar el estado actual de Stopwatch. Utilice Start para empezar a medir el tiempo transcurrido; utilice Stop para detener la medida del tiempo transcurrido. Consulte el valor de tiempo transcurrido a través de las propiedades Elapsed, ElapsedMilliseconds o ElapsedTicks. Puede consultar las propiedades de tiempo transcurrido mientras la instancia se está ejecutando o mientras está detenida. Las propiedades de tiempo transcurrido aumentan continuamente mientras se ejecuta Stopwatch; permanecen constantes cuando la instancia está detenida.
De manera predeterminada, el valor de tiempo transcurrido de una instancia de Stopwatch es igual al total de todos los intervalos de tiempo medidos. Cada llamada a Start inicia la cuenta del tiempo transcurrido acumulado; cada llamada a Stop finaliza la medición del intervalo actual y bloquea el valor de tiempo transcurrido acumulado. Utilice el método Reset para borrar el tiempo transcurrido acumulado en una instancia de Stopwatch existente.
Stopwatch mide el tiempo transcurrido contando pasos del temporizador en el mecanismo de temporización subyacente. Si el hardware instalado y el sistema operativo admiten un contador de rendimiento de alta resolución, la clase Stopwatch utiliza ese contador para medir el tiempo transcurrido. De lo contrario, la clase Stopwatch utiliza el temporizador del sistema para medir el tiempo transcurrido. Utilice los campos Frequency y IsHighResolution para determinar la precisión y la resolución de la implementación de control de tiempo de Stopwatch.
La clase Stopwatch ayuda en la manipulación de contadores de rendimiento relacionados con el control de tiempo dentro del código administrado. Específicamente, el campo Frequency y el método GetTimestamp pueden utilizarse en lugar de QueryPerformanceFrequency y QueryPerformanceCounter de las API Win32 no administradas. Ejemplo sencillo:
 
Stopwatch sw = new Stopwatch();
            sw.Start();
            sw.Stop();
 
Fuente 

miércoles, 26 de febrero de 2014

Manejo de Secuencias


  • Consultamos la secuencia de una tabla de oracle

long? sequenceOracle = db.GetAutonumeric("sq_nombreTabla_sec", transaction);


  • Cuando el campo ID es autonumérico, y en uno de los ejemplos, se utiliza la variable @@Identity de SQL Server para saber cuál ese el valor de ese campo al añadir un nuevo dato.

long sequence = long.Parse(db.ExecuteScalar("SELECT @@Identity").ToStringValue());

lunes, 17 de febrero de 2014

Redimensionar Disco Duro VirtualBox

Para redimensionar el tamaño del disco duro de una máquina virtual en VirtualBox, se ejecuta el siguiente comando desde la carpeta del VirtualBox.

C:\Program Files\Oracle\VirtualBox>vboxmanage modifyhd "E:\VMServerEstudio\WIN SERVER\WIN SERVER.vdi" --resize 25000

Suponiendo que la ruta del disco duro de la máquina virtual, existe en esa ruta. El parámetro "--resize 25000"  quiere decir que vamos a redimensionar a 25 GB o 25000 MB.

domingo, 2 de febrero de 2014

Controles WPF

  • ComboBox 
Este control, muestra una fuente de datos en un componente desplegable tipo ItemsControl. Para tener un correcto funcionamiento cuando la fuente de datos, por ejemplo una entidad, se debe tener en cuenta lo siguiente:
    • ItemsSource = puede ser un Binding a una clase.
    • DisplayMemberPath="Description" 
    • SelectedValuePath="Code"
    • SelectedValue = un Binding a una propiedad de la clase.
 Cuando necesitamos crear un ComboBox de multiple selección con Devexpress:
<dxe:ComboBoxEdit x:Name="checkedComboBox" ItemsSource="{Binding FiltersMV.Shifts}" ShowSizeGrip="False" IsTextEditable="False" ShowCustomItems="True" MinWidth="100">
    <dxe:ComboBoxEdit.StyleSettings>
        <dxe:CheckedComboBoxStyleSettings />
    </dxe:ComboBoxEdit.StyleSettings>
</dxe:ComboBoxEdit>


  • TimeSpan
Para trabajar con horas y validar si una hora esta en un rango de horas de varias fechas, podemos utilizar este control y realizar dichas validaciones:

//Fecha actual
DateTime currentDate = Servinte.Clinic.Core.Reads.ProxyHelper.CurrentDate();               
////Horario actual
TimeSpan CurrentShift = new TimeSpan(currentDate.Hour, currentDate.Minute, currentDate.Second);
//Configuracion del turno de la Mañana
TimeSpan ShiftMornig = new TimeSpan(Convert.ToInt32(VariablesKardex.VariablesConfiguration.NursingShiftStartTimeMorning.Value.ConfigValue.Substring(0, 2)), Convert.ToInt32(VariablesKardex.VariablesConfiguration.NursingShiftStartTimeMorning.Value.ConfigValue.Substring(3, 2)), 0);
//Configuracion del turno de la tarde
TimeSpan ShiftAfternoon = new TimeSpan(Convert.ToInt32(VariablesKardex.VariablesConfiguration.NursingShiftStartTimeAfternoon.Value.ConfigValue.Substring(0, 2)), Convert.ToInt32(VariablesKardex.VariablesConfiguration.NursingShiftStartTimeMorning.Value.ConfigValue.Substring(3, 2)), 0);
//Configuracion del turno de la noche
TimeSpan ShiftNight = new TimeSpan(Convert.ToInt32(VariablesKardex.VariablesConfiguration.NursingShiftStartTimeNight.Value.ConfigValue.Substring(0, 2)), Convert.ToInt32(VariablesKardex.VariablesConfiguration.NursingShiftStartTimeMorning.Value.ConfigValue.Substring(3, 2)), 0);

//Turno que seleccionaremos por defecto
ShiftDefaul = TimeSpan.Compare(CurrentShift, ShiftMornig) >= 0 && TimeSpan.Compare(CurrentShift, ShiftAfternoon) < 0 ? ShiftDefaul = FiltersMV.Shifts.Where(w => w.Code.Equals("MA")).FirstOrDefault() :
    TimeSpan.Compare(CurrentShift, ShiftAfternoon) >= 0 && TimeSpan.Compare(CurrentShift, ShiftNight) < 0 ? FiltersMV.Shifts.Where(w => w.Code.Equals("TA")).FirstOrDefault() :
    ShiftDefaul = FiltersMV.Shifts.Where(w => w.Code.Equals("NO")).FirstOrDefault();

  •  Comando de MVVM para un evento
Para bindear un comando de una ViewModel, a un evento de un control de la vista, realizamos lo siguiente:

<ListBox Name="employeeListBox" ItemsSource="{Binding empList}" Grid.Row="0" SelectedItem="{Binding SelectedIndex}">
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
      <i:InvokeCommandAction Command="{Binding MyCommand}" CommandParameter="{Binding ElementName=employeeListBox, Path=SelectedValue}"/>
    </i:EventTrigger>
  </i:Interaction.Triggers>
</ListBox>


  •  Binding de una propiedad MVVM a un DataTemplate
Para bindear una propiedad de la ViewModel a un DataTemplate, realizamos lo siguiente:
<DataTemplate>
    <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}, Path=DataContext.ErrorMessageDate }"/>
</DataTemplate>


  •  Realizar bloqueo en tabla
Para guardar información en la base de datos y requerimos primero bloquear la tabla, realizamos lo siguiente:
try
{
   transaction = database.BeginTransaction();               
   if(!database.LockTable(transaction, "HHACTPRO", "ACTPROSUO", string.Format(" actprosuo = {0} and actprospo = {1}", param["1"], param["2"], param["3"]), true))
         throw new ApplicationException("La reprogramación del registro esta siendo modificada por otro usuario. En el momento no se puede procesar esta acción");
                
   int detailResult = database.ExecuteNonQuery(sql, transaction, parameters);
   transaction.Commit();

}
catch(Exception ex)
{
    transaction.Rollback();
    throw;
 }


  •  Obtener la secuencia de una tabla
Para consulta la última secuencia de una tabla para realizar un insert, realizamos lo siguiente:

//Consultamos la siguiente secuencia del registro que vamos a insertar, para eso utilizamos la funcion GetAutonumeric(). ESto solo para ORACLE
if (BaseRuntime.ProviderName.Equals("Oracle"))
{
    sequence = db.GetAutonumeric("sq_hfrevord_sec", transaction);
    param.Add(sequence, DbType.Int64);                                       
}

//Consultamos la última secuencia del registro insertado en la tabla, para esto utilizamos la función. Esto para cualquier motor menos ORACLE
if (!BaseRuntime.ProviderName.Equals("Oracle"))
{
    sequence =  db.GetLastSerial("hfrevord", transaction);                                       
    param.Add(sequence, DbType.Int64);
}


  •  Generar un evento de doble clic en un control con MVVM
Para generar un evento de doble clic en un control lo realizamos con el siguiente código:

//Agregamos el namespace que necesitaremos en el trigger, y el DataContext es la VM
xmlns:spc="clr-namespace:Servinte.Presentation.Core;assembly=Servinte.Presentation.Core"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
 
<Grid>
<i:Interaction.Triggers>
    <spc:DoubleClickTrigger>
        <i:InvokeCommandAction Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}, Path=DataContext.ConsultOrderInformationCommand}" CommandParameter="{Binding OrderTreatment}"/>
    </spc:DoubleClickTrigger>
</i:Interaction.Triggers>
</Grid>


  • Mascara para un textedit devexpress
Para construir un control que solo permita ingresar números, con un determinado número de decimales, utilizamos la mascara. Este es el código de ejemplo:

//Agregamos la mascara con #,###,### para indicar que máximo puede ingresar 7 enteros y .## dos decimales
 
<dxe:TextEdit Name="txtPrice" Text="{Binding AmountRegister}" MinHeight="30" MaskType="Numeric" MaskUseAsDisplayFormat="True" Mask="#,###,###.##" HorizontalContentAlignment="Right" />

  • Validacion en un control devexpress
Para realizar una validación en un control de devexpress, realizamos lo siguiente:

//Agregamos la propiedad Validate y el método que va a realizar la validación de los datos. Las otras propiedades de validación es para permitir dejar el control con el error y validar al momento de digitar los datos.
 
<dxe:TextEdit Name="txtAmountRegister" Text="{Binding AmountRegister}" Validate="txtAmountRegister_Validate" InvalidValueBehavior="AllowLeaveEditor" ValidateOnTextInput="False" IsEnabled="{Binding IsEnableRegister, Converter={StaticResource boolToVisibilityConverter},ConverterParameter=AmountRegister}" MinHeight="30" MaskType="Numeric" MaskUseAsDisplayFormat="True" Mask="###,###.0" HorizontalContentAlignment="Right" MaskAutoComplete="Optimistic">

  • Line de separador
Para pintar una linea de separador en la interface de WPF, se realiza lo siguiente:

//Debemos asegurarnos que el namespace x, ya este invocado en el archivo con el siguiente código: 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Luego agregamos la siguiente línea en el código XAML:
 
<Separator Style="{StaticResource {x:Static ToolBar.SeparatorStyleKey}}" />

  • Rotar texto en un control
Para rotar el texto de un control, podemos realizar lo siguiente:

<TabControl TabStripPlacement="Left">
    <TabItem Header="Tab 1">
        <TabItem.LayoutTransform>
            <RotateTransform Angle="-90"></RotateTransform>    
        </TabItem.LayoutTransform>
        <TextBlock> Some Text for tab 1</TextBlock>
    </TabItem>
    <TabItem Header="Tab 2">
        <TabItem.LayoutTransform>
            <RotateTransform Angle="-90"></RotateTransform>
        </TabItem.LayoutTransform>
        <TextBlock> Some Text for tab 2</TextBlock>
    </TabItem>
</TabControl>


  • Bindear el evento load de un control
Para bindear el evento load de un control, a un método del ViewModel, realizamos lo siguiente:

//Debemos asegurarnos que el namespace x, ya este invocado en el archivo con el siguiente código: 
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
Luego agregamos el código XAML en el control:
 
<i:Interaction.Triggers>
    <i:EventTrigger EventName="Loaded">
        <i:InvokeCommandAction Command="{Binding MyICommandThatShouldHandleLoaded}" />
    </i:EventTrigger>
</i:Interaction.Triggers>


//En la viewModel debemos crear un ICommand, para enlazarlo a este.

  • Creación de tramas
Para crear tramas y pintarlas en un control, por ejemplo como background, realizamos lo siguiente:

//Primero debemos crear como recurso la trama de VisualBrush, para luego llamarla desde la propiedad del componente.
 
<VisualBrush x:Key="DiagonalLeftLines" TileMode="Tile" Viewport="0,0,20,1" ViewportUnits="Absolute" Viewbox="0,0,10,10" ViewboxUnits="Absolute">
    <VisualBrush.RelativeTransform>
        <RotateTransform Angle="-45" CenterY="0.5" CenterX="0.5"/>
    </VisualBrush.RelativeTransform>
    <VisualBrush.Visual>
        <Canvas>
            <Path Stroke="Red" Data="M 4 0 l 0 10" StrokeThickness="1"  />
        </Canvas>
    </VisualBrush.Visual>
</VisualBrush>
<VisualBrush x:Key="DiagonalRightLines" TileMode="Tile" Viewport="0,0,20,1" ViewportUnits="Absolute" Viewbox="0,0,10,10" ViewboxUnits="Absolute">
    <VisualBrush.RelativeTransform>
        <RotateTransform Angle="45" CenterY="0.5" CenterX="0.5"/>
    </VisualBrush.RelativeTransform>
    <VisualBrush.Visual>
        <Canvas >
            <Path Stroke="Red" Data="M 4 0 l 0 10" StrokeThickness="1"  />
        </Canvas>
    </VisualBrush.Visual>
</VisualBrush>


//En la interface gráfica, hacemos el enlace desde la propiedad al recurso de la trama: 
<TextBlock Text="{Binding}" Background="{StaticResource DiagonalLeftLines}" TextTrimming="CharacterEllipsis" TextWrapping="Wrap"/>

Interface INotifyPropertyChanged

  • Framework 4.5      
 public event PropertyChangedEventHandler PropertyChanged;

        private void SetProperty<T>(ref T field, T value, [CallerMemberName] string name = "")
        {
            if (!EqualityComparer<T>.Default.Equals(field, value))
            {
                field = value;
                var handler = PropertyChanged;
                if (handler != null)
                {
                    handler(this, new PropertyChangedEventArgs(name));
                }
            }
        }

  • Framework < 4.5
public event PropertyChangedEventHandler PropertyChanged;

private void RaisePropertyChanged(string propertyName)
        {
            // take a copy to prevent thread issues
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

sábado, 1 de febrero de 2014

Sentencias SQL

Con esta sentencia se puede conocer cuales instancias de base de datos se tiene en un servidor.

ORACLE 

select * from all_users;

Modificar una tabla (ALTER TABLE)

SQL SERVER
CREATE TABLE dbo.doc_exy (column_a INT ) ;
GO
INSERT INTO dbo.doc_exy (column_a) VALUES (10) ;
GO
ALTER TABLE dbo.doc_exy ALTER COLUMN column_a DECIMAL (5, 2) ;
GO
DROP TABLE dbo.doc_exy ;
GO

COMANDOS ORACLE

  • Consultar la fecha del servidor 
sysdate
  • Modificar una columna
ALTER TABLE NOMTABLE MODIFY NOMCOLUMN VARCHAR2(4000);
  • Todo sobre secuencias 
secuencias
  • Función ASCII()
ASCII() 
  • Creación de claves foraneas  
CREATE TABLE table_name ( column1 datatype null/not null, column2 datatype null/not null, ... CONSTRAINT fk_column FOREIGN KEY (column1, column2, ... column_n) REFERENCES parent_table (column1, column2, ... column_n) );
  • MAX()
Funcion Max  
  • Sensei

COMPRA Y VENTA DE VEHICULO

La transparencia es clave para vender el carro

Ofrecer el carro de manera directa es un proceso complejo que requiere tiempo. Estos son los pasos.
Por JOSÉ ALEJANDRO PÉREZ M. | Publicado el 1 de febrero de 2014
Con el desarrollo del mercado de vehículos, el crecimiento del número de marcas, las facilidades y opciones de crédito para la compra de carro, y los precios relativamente más asequibles que hace algunos años, se ha dinamizado el mercado de compra y venta de carros usados.

Muchos de quienes compran un carro nuevo han salido, previamente a vender su usado. Hay quienes lo hacen a través de los canales especializados al dejarlo como parte de su carro nuevo en el concesionario o a través de comercializadores expertos. Pero otros más buscan -dicen- maximizar el valor al que pueden vender su vehículo y lo hacen de manera directa.

Los clasificados en los periódicos, o en años más recientes, los sitios web dedicados a ofertar vehículos usados, se han convertido en vitrinas para quienes quieren poner su carro a la venta sin intermediarios.

Pero este no es un proceso tan sencillo, es más, señala el ingeniero mecánico y comercializador de vehículos por más de 25 años Jorge Enrique Pérez, que el proceso de la venta directa "se corren riesgos". Estos riesgos están asociados en la gran mayoría de los casos a no saber quién exactamente es el que quiere comprar el vehículo. Casos se han visto, explica, en los que el supuesto proceso de compra es solo una pantalla para cometer un delito o atentar contra la seguridad del vendedor que, desprevenido e ilusionado ofrece su vehículo.

1. ¿sabe usted quién quiere su carro?
Por eso, una primera recomendación que hace este experto es, en lo posible, indagar muy bien quién es el supuesto interesado en comprar el bien. Pedir referencias, averiguar si tiene procesos de infracciones pendientes por ejemplo (con su número de cédula), información que dé claridad sobre la persona con la que se plantea el potencial negocio.

Si este primer filtro lo satisface, y sigue con la idea de ofrecer y vender el carro usted mismo, debe tener en cuenta también una serie de trámites y documentos que harán que el negocio fluya de la mejor manera posible.

2. un carro sin pendientes judiciales
Uno de los factores que posibilitan la venta del carro es el estado de sus antecedentes. Estos se pueden verificar ante la Sijín de la Policía, con la conocida A-Z del carro, en la que se verifica si tiene algún tipo de problema o actuación de entes administrativos o judiciales que impidan que el carro pueda ser vendido, explica Orlando Pino, profesional universitario de la Secretaría de Transportes y Tránsito de Envigado.

A veces sucede que el carro está involucrado en un proceso de embargo y el nuevo dueño no lo conocía, y llega un momento en el que le pueden quitar el vehículo.

Agrega el funcionario que también es necesario garantizar en el proceso de la compra-venta, que se encuentre libre de pendientes de tránsito por multas y comparendos.

"Tanto el comprador como el vendedor tienen que estar a paz y salvo en el Simit, que es el sistema de información de multas e infracciones", explica el vocero de la Secretaría.

Además debe estar a paz y salvo por concepto de impuesto de vehículos y otros cargos como la semaforización.

En el caso del impuesto departamental, el estado de un vehículo puede consultarse a través del sitio web www.vehiculosantioquia.gov.co

3. inscribirse gratis en el runt
Y también ambas parte del negocio tienen que estar inscritas en el Registro Único Nacional de Tránsito (Runt). Esta inscripción es gratuita y puede hacerse en los organismos de tránsito o en algunos centros de atención especializados como CRC, por ejemplo.

4. todo respaldado en la compraventa
Como parte del proceso de compra venta, se deben sacar las improntas del carro para el proceso de traspaso. Estas son el número de chasís, el número de serie y el VIN como las más comunes. Estas improntas deben adicionarse al documento de compra venta original que, además, debe estar firmado por el vendedor y el comprador y sin enmendaduras.

En el también se precisa el valor de venta del vehículo. Además las partes deben diligenciar el formulario único nacional de tránsito que se baja de manera gratuita de la página web del Runt (www.runt.com.co) El carro debe contar también con el Seguro Obligatorio (Soat) y el certificado de la revisión técnico mecánica y de gases vigentes.

5. el traspaso no debe quedar abierto
Un proceso importante que significa evitar futuros dolores de cabeza, y en el que coinciden las fuentes consultadas, es que en el proceso de compra y venta no se deben dejar por ningún motivo los traspasos abiertos.

El diligenciar este documento garantiza que el carro tiene un nuevo propietario, y todo lo que suceda con él de ahí en adelante ya será responsabilidad de quien figure como el nuevo dueño.

¿CÓMO FUNCIONA?

EL PRECIO DEBE SER RACIONAL

Uno de los factores más complejos para vender un carro es fijar su precio. Jorge Enrique Pérez señala que la mejor manera de hacerlo es tomar varias referencias que den un indicador del rango en el que se encuentra el vehículo. Estas referencias están basadas en información de portales de compra y venta para ver carros similares y sus valores. Igualmente consultar los medios de información especializados con tablas de precios. Y una tercera fuente son los concesionarios a través de sus áreas de usados que también dan un punto de mira para fijar el valor. Agrega que el precio también depende del estado del carro, su kilometraje (en promedio entre 10 mil y 12 mil kilómetros por año) y el origen de las placas. "Y siempre pida un precio un poco más alto del que espera para que pueda hacer la rebaja que en el caso de Antioquia siempre piden los clientes".

EN DEFINITIVA

Si decide vender su actual carro por cuenta propia, sin acudir a ningún tipo de intermediario especializado, tenga en cuenta los pasos que se sugieren para que pueda tener éxito

jueves, 9 de enero de 2014

Tipos de datos Oracle 11g

El cuadro siguiente resume los tipos de datos en Oracle 11g, esta tabla también es valida para versiones anteriores como Oracle 10g.

Tabla resumen de tipos de datos.


Tipo Dato Descripción
VARCHAR2(size [BYTE | CHAR])
Cadena de caracteres de longitud variable que tiene como  tamaño máximo el valor de size en BYTE o CHAR. El tamaño máximo es de 4000 bytes o caracteres, y la mínima es de 1 byte o un carácter. Se debe especificar el tamaño de para VARCHAR2.
NVARCHAR2(size)
Cadena de caracteres Unicode de longitud variable con size como máximo tamaño de longitud. El número de bytes que pueden ser hasta dos veces el tamaño de codificación AL16UTF16 y tres veces el tamaño de la codificación UTF8. El tamaño máximo está determinado por la definición del juego de caracteres nacional, con un límite máximo de 4000 bytes. Se debe especificar el size de NVARCHAR2.
NUMBER [ (p [, s]) ]
Número con p precisión (parte entera) y s escala (parte decimal). La precisión p puede variar de 1 a 38. La s escala puede variar desde -84 hasta 127. Tanto la precisión y la escala se encuentran en dígitos decimales. Un valor numérico requiere 1 a 22 bytes.
FLOAT [(p)]
Un subtipo del tipo de datos NUMBER con precisión p. Un valor de coma flotante se representa internamente como un NUMBER. La precisión p puede variar desde 1 hasta 126 dígitos binarios. Un valor flotante requiere 1 a 22 bytes.
LONG
Tipo de datos de caracteres de longitud variable de hasta 2 gigabytes, o 231 -1 bytes. Permanece para compatibilidad con versiones anteriores de Oracle.

DATE
Intervalo de fechas válidas del 1 de enero de 4712 antes de Cristo a el 31 de diciembre de 9999. El formato por defecto se determina explícitamente por el parámetro NLS_DATE_FORMAT o implícitamente por el parámetro NLS_TERRITORY. El tamaño es de 7 bytes. Este tipo de datos contiene los campos de fecha y hora AÑO, MES, día, hora, minuto y segundo. No tiene fracciones de segundo o de una zona horaria.
BINARY_FLOAT
Número en coma flotante de 32 bits. Este tipo de datos requiere 4 bytes.
BINARY_DOUBLE
Número en coma flotante de 64 bits. Este tipo de datos se requieren de 8 bytes.
TIMESTAMP [(fractional_seconds_precision)] Año, mes y día como valores de la fecha, así como la hora, minutos y segundos como valores de tiempo, donde fractional_seconds_precision es el número de dígitos en la parte fraccionaria del segundo del campo datetime. Los valores aceptados de fractional_seconds_precision son del 0 al 9. El valor por defecto es 6. El formato por defecto se determina explícitamente por el parámetro NLS_TIMESTAMP_FORMAT o implícitamente por el parámetro NLS_TERRITORY. El tamaño es de 7 o 11 bytes, dependiendo de la precisión. Este tipo de datos contiene los campos datetime AÑO, MES, DIA, HORA, MINUTO y SEGUNDO. Contiene las fracciones de segundo, pero no tiene una zona horaria.
TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE
Todos los valores de TIMESTAMP, así como el valor de tiempo de desplazamiento de la zona, donde fractional_seconds_precision es el número de dígitos en la parte fraccionaria del segundo del campo datetime. Los valores aceptados son del 0 al 9. El valor por defecto es 6. El formato por defecto se determina explícitamente por el parámetro NLS_TIMESTAMP_FORMAT o implícitamente por el parámetro NLS_TERRITORY. El tamaño se fija en 13 bytes. Este tipo de datos contiene los campos datetime AÑO, MES, DIA, HORA, MINUTO, SEGUNDO, TIMEZONE_HOUR y TIMEZONE_MINUTE. Cuenta con las fracciones de segundo y una zona horaria explícita.
TIMESTAMP [(fractional_seconds)] WITH LOCAL TIME ZONE
Todos los valores de TIMESTAMP WITH TIME ZONE, con las siguientes excepciones:
* Los datos se normalizan con la zona horaria de base de datos cuando se almacenan en la base de datos.
* Cuando se recuperan los datos, los usuarios ven los datos en la zona de tiempo de la sesión.
El formato por defecto se determina explícitamente por el parámetro NLS_TIMESTAMP_FORMAT o implícitamente por el parámetro NLS_TERRITORY. El tamaño es de 7 o 11 bytes, dependiendo de la precisión.
INTERVAL YEAR [(year_precision)] TO MONTH
Almacena un período de tiempo en años y meses, donde year_precision es el número de dígitos en el campo datetime AÑO. Los valores aceptados son del 0 al 9. El valor predeterminado es 2. El tamaño se fija en 5 bytes.
INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds)]
Almacena un período de tiempo en días, horas, minutos y segundos, donde
* day_precision es el número máximo de dígitos en el campo datetime DÍA. Los valores aceptados son del 0 al 9. El valor predeterminado es 2.
* fractional_seconds_precision es el número de dígitos en la parte fraccionaria del campo SEGUNDO. Los valores aceptados son del 0 al 9. El valor por defecto es 6.

El tamaño se fija en 11 bytes.
RAW(size)
Datos binarios sin formato de longitud size. El tamaño máximo es de 2000 bytes. Se debe especificar el tamaño de un valor RAW.
LONG RAW
Datos binarios de tipo RAW de longitud variable hasta 2 gigabytes.
ROWID
Cadena en base 64 que representa la dirección única de una fila en la tabla. Este tipo de datos es principalmente para los valores devueltos por la pseudo columna ROWID.
UROWID [(size)]
Cadena en base 64 que representa la dirección lógica de una fila de una tabla de índice organizado. El tamaño opcional es el tamaño de una columna de tipo UROWID de Oracle. El tamaño máximo y por defecto es de 4000 bytes.
CHAR [(size [BYTE | CHAR])]
Cadena de caracteres de longitud fija de size bytes de tamaño o size de caracteres. El tamaño máximo es de 2000 bytes o caracteres, el tamaño predeterminado y mínimo es de 1 byte.
NCHAR[(size)]
Cadena de caracteres de longitud fija de size caracteres de tamaño de largo. El número de bytes pueden ser hasta dos veces el tamaño de codificación AL16UTF16 y tres veces el tamaño de la codificación UTF8. El tamaño máximo está determinado por la definición del juego de caracteres nacional, con un límite máximo de 2000 bytes. El tamaño predeterminado y mínimo es de un carácter.
CLOB
Un objeto de tipo LOB que contiene caracteres de un byte o multibyte. Son compatibles tanto de ancho fijo y conjuntos de ancho variable de caracteres, con el carácter de base de datos establecida. El tamaño máximo es (4 gigabytes - 1) * (tamaño del bloque de la base de datos).
NCLOB
Un objeto de tipo LOB que contiene caracteres Unicode. Son compatible tanto de ancho fijo y conjuntos de ancho variable de caracteres, con el conjunto base de datos de carácter nacional. El tamaño máximo es (4 gigabytes - 1) * (tamaño del bloque de la base de datos). Guarda los datos nacionales sobre el conjunto de caracteres.
BLOB
Un objeto de tipo LOB binario. El tamaño máximo es (4 gigabytes - 1) * (tamaño del bloque de la base de datos).
BFILE
Contiene un localizador a un archivo binario almacenado fuera de la base de datos. Permite flujo de bytes de E/S para el acceso a LOB externos que residen en el servidor de base de datos. El tamaño máximo es de 4 gigabytes.
Fuente