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