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
Sitio donde se podra encontrar información importante y de ayuda en temas de informática y tecnología, con énfasis en programación en .NET
sábado, 22 de noviembre de 2014
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
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
DESC "Nombre Tabla"
- INFORMIX
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:
En esta ocación, voy a instalar Virtualbox en OpenSuse. Para esto vamos a seguir los siguientes pasos:
- Descargamos el paquete rpm
- Vamos a la carpeta donde lo descargamos y con clic derecho le decimos que lo vamos a instalar con yast
- Descargamos el VirtualBox Oracle VM VirtualBox Extension Pack
desde la misma página anterior. - 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.
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;
}
* 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.
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
- ItemsSource = puede ser un Binding a una clase.
- DisplayMemberPath="Description"
- SelectedValuePath="Code"
- SelectedValue = un Binding a una propiedad de la clase.
<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
//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
<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
<DataTemplate>
<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}, Path=DataContext.ErrorMessageDate }"/>
</DataTemplate>
- Realizar bloqueo en tabla
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
//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
//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
//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
//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
//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
<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
//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
//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
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
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
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
- Modificar una columna
- Todo sobre secuencias
- Función ASCII()
- Creación de claves foraneas
- 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.
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
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.
Fuente
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.
|
Suscribirse a:
Entradas (Atom)