Translate

martes, 24 de diciembre de 2013

Week #3 (09/12/13 - 15/12/13)



I´ve forgot to post the numbers for the last week. Here they are.

Total Time: 10:50:08
  • Swim: 1:59:24
  • Bike: 5:40:13
  • Run: 3:00:31
Total Distance: 182,90 km
  • Swim: 5,10km 
  • Bike: 143,50km 
  •  Run: 34,30km

ASP.Net Entity Framework Add, Insert, Edit, Delete and Select



Here you can see how to work with ADO.NET Entity Framework and hand-coded access to data.

This code is implemented in the code-behind of the page, and associated to the buttons added to create a new element, edit n existing, save, cancel and delete.

For simplicity I am supposing that data entered in text boxes is correct, otherwise you can control using validation controls associated to the text boxes.

Saving a New or Edited existing: (Associated to Save Button)

         using (TheClubBDEntities myEntities = new TheClubBDEntities())
        {
            RaceType aRaceType;
            if (_Id == -1) //Save new
            {
                aRaceType = new RaceType();
                myEntities.RaceTypes.AddObject(aRaceType);
            }
            else
            { //Update existing
                aRaceType = (from r in myEntities.RaceTypes
                                       where r.Id == _Id
                                       select r).Single();             
            }
            aRaceType.Name = txbxNombre.Text;
            aRaceType.PuntosPart = Int32.Parse(txbxPuntos.Text);
            aRaceType.Memo = txbxMemo.Text;
            LastPos = _Id;  // Used to control position in the data base.
            myEntities.SaveChanges();

            GridView1.DataBind();  // To refresh data into GridView

            setNormalMode();  //Disable save button and put textboxes in readonly mode.
        }

Deleting existing:

        using (TheClubBDEntities myEntities = new TheClubBDEntities())
        {
            var aRaceType = (from r in myEntities.RaceTypes
                             where r.Id == _Id
                             select r).Single();


            myEntities.RaceTypes.DeleteObject(aRaceType);
            myEntities.SaveChanges();
        }
        GridView1.DataBind();
        setNormalMode();

Cancel editing or adding a new:

        using (TheClubBDEntities myEnt = new TheClubBDEntities())
        {
            var aRaceType = (from rt in myEnt.RaceTypes
                                         orderby rt.Name ascending
                                        where rt.Id == LastPos
                                        select rt).SingleOrDefault();

            if (aRaceType == null)
            {
                _Id = -1;
                LastPos = -1;
            }
            else
            {
                _Id = aRaceType.Id;
                txbxNombre.Text = aRaceType.Name;
                txbxPuntos.Text = aRaceType.PuntosPart.ToString();
                txbxMemo.Text = aRaceType.Memo;
            }
            setNormalMode();
        }

Selecting from the GridView and putting data into textboxes:

        _Id = Int32.Parse(GridView1.SelectedRow.Cells[1].Text);
        LastPos = _Id;
        txbxNombre.Text = GridView1.SelectedRow.Cells[2].Text;
        txbxPuntos.Text = GridView1.SelectedRow.Cells[3].Text;
        txbxMemo.Text = GridView1.SelectedRow.Cells[4].Text;
        setNormalMode();

Moving to first:

        using (TheClubBDEntities myEnt = new TheClubBDEntities())
        {

            var aRaceType = (from rt in myEnt.RaceTypes
                                         orderby rt.Name ascending
                                         select rt).FirstOrDefault();

            if (aRaceType == null)
                _Id = -1;
            else
            {               
                _Id = aRaceType.Id;
                LastPos = _Id;
                txbxNombre.Text = aRaceType.Name;
                txbxPuntos.Text = aRaceType.PuntosPart.ToString();
                txbxMemo.Text = aRaceType.Memo;
            }
        }

Loading the page:

        using (TheClubBDEntities myEnt = new TheClubBDEntities())
        {
            if (!Page.IsPostBack)
            {
                var aRaceType = (from rt in myEnt.RaceTypes
                                             select rt).FirstOrDefault();

                if (aRaceType == null)
                {
                    _Id = -1;
                    LastPos = -1;
                }
                else
                {
                    _Id = aRaceType.Id;
                    LastPos = _Id;
                    txbxNombre.Text = aRaceType.Name;
                    txbxPuntos.Text = aRaceType.PuntosPart.ToString();
                    txbxMemo.Text = aRaceType.Memo;
                }
            }
        }



viernes, 13 de diciembre de 2013

JQuery over a Table

Shows a table with alternate colors, and putting in yellow color the field which has the cursor on it. Also when you click over the first title it grows and one second later back to its original size.




jueves, 12 de diciembre de 2013

Week Number 2 (2/12/13 to 8/12/13)


Second week completed. Starting to feel well in the water, but there´s steel a lot of work to do. Very nice feeling over the bike,and also during running sessions, feeling faster and stronger. Need to improve in my swimming sessions.

Numbers are:

Total Time: 10:58:38
  • Swim: 1:38:59 
  • Bike: 6:54:39 
  • Run: 2:25:00 
Total Distance: 202,43km
  • Swim: 4,05km 
  • Bike: 168,88km 
  •  Run: 29,50km

martes, 10 de diciembre de 2013

ASP.Net: Validation

There are six components in Visual Studio you can use for user validation:

This first four are used to validate data in the client side:

  • RequiredFieldValidator: verify if any given field is present or not.
  • Rangevalidator: verify if data is between a given range.
  • RegularExpressionValidator: verify data from a mask string, for example, to verify if a strinf is a correct email.
  • Comparevalidator: used to compares two fields.
The last two are valids also to validate data in the server side in adittion to client side, which is more important, because users can disable javascript in their browsers disabling then the client side validation. So is important not to rely only in client side validation adding also server side validation.


  • CustomValidator: enables to write javaScript code associated to a validation action over a component.
  • ValidationSummary: show the errors that validator component raises.

This could be an example of a form showing a form to leave a commet in our site:


Here we have a few text boxes for we can add validator. For example, for the first one, then text box for the name I had added a RequiredFieldValidator, to avoid a missing name. The most important properties you must set for this control are:


  • ControlToValidate: The name of the control you are going to validate , the name of the text box.
  • CssClass: Class on the CSS file that define for example the color of the text when an error raises.
  • ErrorMessage: The string that shows the error.



For the second one I have added to Validation controls, a RequiredFieldValidator, configured similarliy to previous one, and also a RegularExpressionValidator. For this one is important to set the property ValidationExpression choosing between the different Expressions Visual Studio offers. In this case email expression.



For the third one, I have added another two control validations, a RequireFieldValidator, an also a CompareValidator, to compare if both eMails are equal.


For the last field, the comment I have added only a RequireFieldValidator.

And finally at the end of the form I have added a ValidationSummary  to shows all the errors made by the users during the form filling:




I have added also a CustomValidator for the telephone number, which calls a javaScript function used to verify that the telephone numer is not missing. is the same task as a RequireFieldValidator, but this time this validation is on the server side. For this you have to write a javaScript function, for the client Side, an also a C# function for the server Side. The first one is implemented in the same html file, while the C# code is implemented in the code behind file associated to the form, and into the Server_Validate event.

This is the code into the HTML with the CustomValidator, which references the two functions needed, validatePhoneNumber and CustomValidator1_ServerValidate:


This is the code also into the HTML with the javaScript function validatePhoneNumber:


This is the code behind with the function CustomValidator1_ServerValidate:


This is an example of the form showing a few errors:



jueves, 5 de diciembre de 2013

In the middle of the storm

Place/Lugar: Valdevaqueros, Tarifa, Spain.
Board & Sail / Tabla y vela: JP 84l / HotSails 3,7m
 
 
 Only a few seconds, and you would have your board completely buried in the sand.  

This day the wind was very strong, with my anemometer I could measure peaks of about 40 knots. A few people in the beach only, the sand was been strongly carried by the wind, and it was imposible to stand there for a minute. 

Nor in the water the situation was comfortable, the sea appeared to be boiling...but this is it, pure state windsurfing, ... Tarifa in my mind!!

lunes, 2 de diciembre de 2013

ASP.Net: Habilitar Temas en un web Site

Supongamos que tenemos un sitio web al que queremos dotar de varias plantillas de visualización que permita al usuario cambiar de uno a otra de manera dinámica.

Para ello necesitaremos varios elementos:

  • Una Master Page de la que todas nuestras páginas cargen la distribución de la página.
  • Un CSS file para cada una de las plantillas o temas que queramos crear. 
  • Una carpeta de estilos, APP_Themes donde meteremos a su vez una carpeta para cada uno de los temas creados. Igualmente en cada una de estas carpetas meteremos el CSS correspondiente así como aquellas imágenes que queramos usar con el tema.
  • Una BasePage, es decir una clase que crearemos nosotros, que derivará de la clase genérica System.Web.UI.Page, y que será la Parent class de todos los Web Forms que creemos, de esta manera podremos añadir control a los WebForms a lo largo de su Life Cycle, por ejemplo controlando eventos como PreRender, PreInit, etc... Esta BasePage, la almacenaremos en la carpeta App_Code del Site


Una vez creado esto necesitaremos un DropDownList que muestre nuestros temas disponibles, y que al seleccionar uno, cree una Cookie, que guardará en el ordenador del browser cliente el dato del tema seleccionado para posteriores accesos.

El DropDownList los colocaremos en este caso en un sideBar de la MasterPage, de forma que todas las páginas lo etngan disponible. Para ello arrastramos un DropDownList de la ToolBar a la master page en Design Mode, y configuraremos su propiedad AutoPostBack a Enable, e igualmente en la lista de items, añadiremos nuestros temas.


El siguiente paso sería asociar código al envento SelectedIndexChanged del DropDownList para que cree una Cookie en el ordenador cliente que almacene el nombre del tema escogido. Para ello hacemos doble click sobre el componente y en el evento creado añadimos el siguiente código:


 De esta manera se crea una Cóokie, que es enviada al Server cada vez que el browser del equipo cliente hace una petición. Si no se usa se borrará a los tres meses.

Igualmente tenemos que crear código, que lea la Cookie, y asigne el valor guardado al DropDownList, para ello usaremos el evento asociado con la carga de la Página, Page_Load, al que le añadiremos:


En este punto tenemos implementado el poder escoger uno de los temas, guardar el tema escogido en una Cookie en el equipo cliente, y al cargar la página, que el DropDownList tenga seleccionado el tema escogido la última vez. Todavía no hemos hecho que se aplique el tema escogido al cargar la página.

Esto lo haremos usando el evento PreInit que nos permitirá cargar el tema escogido en la Master Page durante el proceso de carga de la página. Crearemos el código en el evento PreInit de la página que asigna el tema escogido, y además tendremos que añadir el evento al constructor de la página.


Y listo. Una última precaución. Si has fijado el tema en el archivo web.config y además del tema has fijado el StyleSheetThemes, puede ocurrir que al elegir un tema se mezceln dos. En ese caso elimina el StyleSheetThemes del fichero Web.Config:





jueves, 28 de noviembre de 2013

Road bike in the Söderåsen: Ljungbyhed and Röstånga

Easy road bike route of about 50km in Skåne, Sweden. Starting in Ljunbyhed and passing throw the Söderåsen National Park heading to Röstånga. Partially hilly road with a first hard climb of about three kilometers.


miércoles, 27 de noviembre de 2013

CSS: Repetir imagen de fondo

Sirve por ejemplo para colocar una imagen de fondo que queramos que se repita. Posicionándola en la derecha y repitiéndola de arriba hacia abajo.

Este trozo de código habría que ponerlo en un fichero CSS que haga referencia al componente body, pero también puede integrarse en el HTML poniéndola entre tags del tipo "style"

body
{
background-image:url('gradient2.png');
background-repeat:repeat-y;
background-position:right top;
}


Con repeat-x la imagen se repetirá en sentido horizontal.

martes, 26 de noviembre de 2013

SQL Server: Manejar Time mayor de 24h con función escalar.

Este ejemplo resuelve el post Anterior pero ahora usando una función en vez de un procedimiento, lo que permite llamar a dicha función desde dentro del Select y así poder usar Group By:
CREATE FUNCTION dbo.floatToTimeChar
(
    – Add the parameters for the function here
    @timeAsFloat float
)
RETURNS varchar(14)
AS
BEGIN
    DECLARE @TotTimeVC varchar(14)
    declare @h int;
    declare @m int;
    declare @s int;
    set @h=CAST(@timeAsFloat/3600 as int);
    set @m=CAST( (CAST(@timeAsFloat as Int)%3600)/60 as int);
    set @s=(CAST(@timeAsFloat as Int)%3600)%60;
    declare @mVC varchar(2);
    declare @sVC varchar(2);
    set @mVC=Convert(varchar(2),@m);
    set @sVC=Convert(varchar(2),@s);
    if LEN(@mVC)=1
    begin
        set @mVC=’0′+@mVC;
    end;
    if LEN(@sVC)=1
    begin
        set @sVC=’0′+@sVC;
    end;
    set @totTimeVC=Convert(varchar(8),@h)+’:'+@mVC+’:'+@sVC;    
    – Return the result of the function
    RETURN @TotTimeVC
END
Para usar esa función usamos el siguiente Select:
select
       (Select ST.SportTypeName from SportTypes ST where ST.SportTypeID=Sessions.SportTypeID) as SportName,      
       COUNT(SessionID) as SesionsCant,       
       CAST(SUM(Distance)as decimal(7,2))as TotDist,
       CAST(AVG(Distance)as decimal(7,2)) as AvgDist,
       MAX(Distance) as MaxDist,
                    
       dbo.floatToTimeChar(SUM(CAST(Time As Float)*24*60*60)) As TotTimeCalc,
       dbo.floatToTimeChar(AVG(CAST(Time As Float)*24*60*60)) As AvgTimeCalc,                       
       dbo.floatToTimeChar(MAX(CAST(Time As Float)*24*60*60)) As MaxTimeCalc,                       
                           
       CAST(AVG(CAST(MedHR as float)) as decimal (7,2) )as AvgMedHR,
       MAX(MedHR) as MaxMedHR,
       CAST(AVG(CAST(MaxHR as float)) as decimal (7,2) )as AvgMaxHR,
       MAX(MaxHR) as MaxMaxHR,
       CAST(AVG(CAST(Value as float)) as decimal (7,2) )as AvgValue,
       MAX(Value) as MaxValue,
       
       CONVERT(varchar,MIN(Date),106) as firstDate,
       CONVERT(varchar,MAX(Date),106) as lastDate,
       DATEDIFF (day, CONVERT(varchar,MIN(Date),106), CONVERT(varchar,MAX(Date),106))+1 as days
       
from Sessions
where UserID=@userID
group by SportTypeID;

SQL Server: Manejar time mayores de 24horas

La idea es, tengo un programa donde controlo las sesiones de entrenamiento de una persona. Necesito obtener el total de distancia y tiempo recorrido por el atleta.

Con los datos de tipo time no puedo controlar más de 24horas. Si bién las sesiones son siempre muy inferoiores a 24horas, al sumarlas si se nos presenta el problema. Para resolverlo, ántes de sumar el tiempo de cada sesión los transformamos a float para sumarlos todos. Obtenemos un float que tiene la suma total, y luego con un procedimiento que crearemos en la BD podremos transformar a formato hhhh:mm:ss de manera que así ya podamos mostrarlo.

El procedure sería así:
@timeAsFloat es el float de entrada que contiene la suma de tiempos, y @totTimeVC será el resultado en formato varchar conteniendo el tiempo total.

create procedure [dbo].[floatToTime] @timeAsFloat float, @totTimeVC varchar(14) output 
as
   declare @h int;
   declare @m int;
   declare @s int;
   set @h=CAST(@timeAsFloat/3600 as int);
   set @m=CAST( (CAST(@timeAsFloat as Int)%3600)/60 as int);
   set @s=(CAST(@timeAsFloat as Int)%3600)%60;
   declare @mVC varchar(2);
   declare @sVC varchar(2);
   set @mVC=Convert(varchar(2),@m);
   set @sVC=Convert(varchar(2),@s);
   if LEN(@mVC)=1
   begin
      set @mVC=’0′+@mVC;
   end;
   if LEN(@sVC)=1
   begin
      set @sVC=’0′+@sVC;
   end;
   set @totTimeVC=Convert(varchar(8),@h)+’:'+@mVC+’:'+@sVC;

La consulta necesaria y que usa el procedimiento anterior sería:

use TrainIT;
declare @userID bigInt;
set @userID=85;
       declare @totTime float;
       set @totTime=(select SUM(CAST(Time As Float)*24*60*60) from Sessions where       UserID=@userID);
       declare @totTimeVC varchar(14);

execute floatToTime @totTime,@totTimeVC output;
select COUNT(SessionID) as SesionsCant,
           SUM(Distance) as TotDist,
           CAST(AVG(Distance)as decimal(7,2)) as AvgDist,
           MAX(Distance) as MaxDist,                                                
           @totTimeVC As TotTimeCalc,              
from Sessions
where UserID=@userID;

domingo, 24 de noviembre de 2013

SQL Server: Primer y último día del mes

Consulta para calcular el número de sesiones, así como la suma de las distancia y tiempo en las sesiones realizadas en el mes en curso para el usuario dado (este se pasa por parámetro a la consulta en @userID)

Declare @firstDayOfMonth varchar;
Set @firstDayOfMonth=Convert(varchar,DATEADD(d,-day(GetDate())+1,GetDate()),105);


Declare @LastDayOfMonth varchar;
Set@LastDayOfMonth = Convert(varchar,DATEADD(d,-day(GetDate()),DATEADD(m,1,GetDate())),105);


select COUNT(SessionID) As SesionsCant,
          SUM(Distance) as TotDist,
          CONVERT(char(8),CAST(SUM(CAST(Time As Float)*24 )AS DateTime),108 )As TotTime
from Sessions
where UserID=@userID 

           AND (  (CONVERT(varchar,Sessions.Date,105)>=@firstDayOfMonth )         
          AND     (CONVERT(varchar,Sessions.Date,105)<=@LastDayOfMonth )   );

C#: float to String with two decimal digits only


string aString="";
float aFloat=32,78654F;
aString= String.Format (“{0:0.00}”,Convert.ToDecimal(aFloat));

viernes, 22 de noviembre de 2013

Java: Control Frame closing

Sometimes you need to control the closing of a given frame, for example, the main frame. You would need to do any special task before the closing, to save any king of data before the closing, do not permit the closing of the fame, etc...



Then you need to implement an interface for the given Frame. For windows you have the WindowsListener, which includes controls for the following actions:

  • WindowClosing
  • WindowOpened
  • WindowClosed
  • WindowIconified
  • WindowDeiconified
  • WindowActivated
  • WindowDeactivated.
To control the closing we are going to use the first one, and for this task we need to perform the following steps:

  1. Add implements WindowListener to de definition of the class.
  2. Implements all the methods (mandatory) defined before, even if you are going to use only the first one. You can do it mannually or using the options given by Eclipse and indicated with an error in the name of the class. In this case, put the cursor over the error indicated and a message will appear given the option to create automatically all the methods.
  3. In the constructor for the class add: addWindowListener(this)
  4.  Add the code for the method, in our case WindowClosing
The code wil be as shown



import java.awt.BorderLayout;


public class FMain extends JFrame implements WindowListener{

    private JPanel contentPane;
    private JTextField txtTo;


    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Frame frame = new FMain();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }


    public FMain() {
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
      
        txtTo = new JTextField();
        txtTo.setBounds(54, 6, 134, 28);
        contentPane.add(txtTo);
        txtTo.setColumns(10);
      
        JLabel lblNewLabel = new JLabel("To :");
        lblNewLabel.setHorizontalAlignment(SwingConstants.RIGHT);
        lblNewLabel.setLabelFor(txtTo);
        lblNewLabel.setBounds(6, 12, 45, 16);
        contentPane.add(lblNewLabel);
      
        JButton btnNewButton = new JButton("Borrar");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                txtTo.setText("");
            }
        });
        btnNewButton.setBounds(188, 7, 97, 29);
        contentPane.add(btnNewButton);
      
        addWindowListener(this);
    }
   
   
    public void windowClosing (WindowEvent e){
         JFrame frame = (JFrame)e.getSource(); //Gets The Form invoking the WindowClosing method
        String botonY = "SI";
        String botonN = "No";
        Object[] options={botonY,botonN};
        int n=JOptionPane.showOptionDialog(frame, "¿Desea cerrar la aplicación?", "Atención",            JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null,
                options, botonY);
        System.out.println("Option="+n);
        if (n==JOptionPane.YES_OPTION) //Exit
               frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        else frame.setVisible(true);
    }


    @Override
    public void windowOpened(WindowEvent e) {
        // TODO Auto-generated method stub
      
    }

    @Override
    public void windowClosed(WindowEvent e) {
        // TODO Auto-generated method stub
      
    }

    @Override
    public void windowIconified(WindowEvent e) {
        // TODO Auto-generated method stub
      
    }

    @Override
    public void windowDeiconified(WindowEvent e) {
        // TODO Auto-generated method stub
      
    }

    @Override
    public void windowActivated(WindowEvent e) {
        // TODO Auto-generated method stub
      
    }

    @Override
    public void windowDeactivated(WindowEvent e) {
        // TODO Auto-generated method stub
      
    }
   

}

jueves, 21 de noviembre de 2013

SQL Server: DateTime To Float

La idea sería calcular la velocidad a partir de dos campos en una tabla que contienen la distancia en km y el tiempo invertido. El cálculo es fácil, distancia/tiempo, pero ántes tendremos que convertir el tiempo a float.

La tabla posee por lo tanto dos campo, uno DateTime (time) y otro float(distance). Necesitaremos hacer un CAST del time para convertir a float, lo que nos da un número que multiplicado por 24 serán horas, por 24*60 serán minutos, y 24*60*60 serán segundos. Así para obtener un campo que contenga la velocidad en km/h haremos un select de la siguiente manera:

select distance,time, distance/(CAST(time AS float)*24) AS “Speed” from Table1 where CAST(time AS float)>’0′

 La columna Speed contendrá el dato de la velocidad. En el campo time hay que usar el tipo DateTime ya que permite el casting a float, no así con el tipo Time.
Un DateTime cuyo valor sea “1900/01/01 00:00:00.000″ al hacer el cast a float devolverá 0.

La clausula where evita que dividamos por cero, pero eliminará aquellos registros que no tengan el dato tiempo. Para evitar eso podemos cambiar la consulta a :

select distance,time,
       CASE
         WHEN CAST(time AS float)>’0′ THEN distance/(CAST(time AS float)*24)
         ELSE ’0′
       END AS “Speed”       
from Table1

De esta manera si encontramos un time menor o igual a cero pondremos automáticamente la velocidad a 0, en otro caso si haremos el cálculo.

Si queremos mostrar el dato de la velocidad con solo dos dígitos tendremos que dar la salida haciendo un casting a decimal, para ello la consulta quedaría así:

select distance,time,
       CASE
         WHEN CAST(time AS float)>’0′ THEN CAST (
                     distance/(CAST(time AS float)*24) AS decimal (7,2)     )
         ELSE ’0′
       END AS “Speed”       
from Table1

Por último y para evitar que el campo time, de tipo datetime, nos devuelva un dato del tipo “1900-01-01 00:00:00.000″, tenemos que hacer una conversión, para lo cual usaremos la función CONVERT con el valor 108, que devuelve la parte time del campo en formato hh:mm:ss. Quedará la consulta así:

select distance, CONVERT(Char(8),time,108) As “ShortTime”,
       CASE
         WHEN CAST(time AS float)>’0′ THEN CAST (
         distance/(CAST(time AS float)*24)
         AS decimal (7,2) )
         ELSE ’0′
       END AS “Speed”       
from Table1

SQL Server: Manejar datos tipo Money en Visual Studio y C#

Para usar el tipo de datos money de Sql en visual necesitaremos las siguientes referencias al framework:

Using System.Data.SqlTypes;
Using System.Xml;

Para definir un campo de este tipo en el código lo haremos así:

SqlMoney ammount;

Para asignar datos partiremos de un valor float, double o int que transformaremos a SqlMoney ántes de asignar a la variable:

Double aValue = 100.23F;
SqlMoney amount =(SqlMoney)aValue;

Si hemos usado un SQL reader para obtener los datos a través de una consulta usaremos el método GetSQqlMoney:

using (SqlConnection conn = new SqlConnection(connString))
{
     string query = “select * from Materials where MatID = @matID”;
     using (SqlCommand cmd = new SqlCommand(query, conn))
    {
           cmd.Parameters.Add(new SqlParameter(“@matID”,     SqlDbType.Int));
           cmd.Parameters["@matID"].Value = matID;
           conn.Open();
           SqlDataReader reader = cmd.ExecuteReader();
           while (reader.Read())
           {
                  matID = reader.GetInt32(0);
                  matCost = reader.GetSqlMoney(7);
                  matInitTime = reader.GetString(8);
                  matInitDist = reader.GetDecimal(9);
                  matRecTime = reader.GetString(10);
                  matRecDist = reader.GetDecimal(11);
                  matBuyMemo = reader.GetString(12);
                  userID = reader.GetInt32(13);
          }
         reader.Close();
     }
}  

Visual Studio: Moverse por un DataGridView de manera manual

Si, ya lo se, existe un componente llamado Binding Navigator que implementa todo esto sin necesidad de escribir una sola línea de código, pero … algunas veces puede resultar útil saber como hacerlo de manera manual (programáticamente)

Para ello usaremos las propiedades del Datagrid:

CurrentRow.Index devuelve la fila actual.

CurrentCell sirve para obtener o fijar la posición en una celda dada. y se pasa de la forma [columna, fila]

RowCount devuelve el número de filas mostradas en el Datagrid.

De esta manera implementar los método First, Previous, Next y Last sería tan fácil como:

moveoverdatagrid

10 Lessons Running Teaches You About Life

Copied from : http://thedailyrunnerpage.com

 

1. When things get tough, just keep going.

When most people encounter a rough patch, they quit.  The truly successful people in the world keep going no matter what.  Never let your setbacks win.

2. Consistency creates habit.

To incorporate anything into your life, you have to make it a habit.  To make something a habit, you have to be consistent.  Whatever it is you’re aiming for, make it a part of your life.

3. You’ll have to get through hell before you get to heaven.

Like all things worth pursuing, you are going to get knocked down, stepped on, and rejected along the way.  Consider this to be part of the path to your goals.  Sometimes it’s more about the journey than the destination.

4. Reaching your goals will take a lot of work.

If it doesn’t, it’s either not a goal, not worth pursuing, or will not have any fulfillment.  Never expect to not put in work and get somewhere.

5. Every aspect of life is mental.

It’s not about what you do or what happens to you, it’s about how to respond to it.  It’s how you decide to carry on.  Your power comes from inside your head.

6.  You do have time– you just have to make it.

If something is important to you, you’ll make time for it.  If not, you’ll make excuses.

7. You define your own limits.

Your limits aren’t put unto you by your parents, other people, or the universe.  You are in total control of it.  You decide whether or not to shoot for the moon or stay right where you are.

8. If you wait for the right conditions, you’ll never get anything done.

Don’t wait for anything or anybody.  You know what you have to do to reach your goals and get things done. Just go do them!

9. Go beyond your limits every day and watch the magic happen.

You’ll be amazed at what you can achieve if you just push yourself a little further.

10. There is peace even in the most chaotic times.

No matter now grueling, stressful, sorrowful, or painful your situation is, there is always a silver lining and something positive to be found.  Seek it out, learn from it, and keep moving on.

miércoles, 20 de noviembre de 2013

SQL Server: Almacenar un campo encriptado

La idea es encriptar un campo de una tabla para poder almacenar un password. Para ello usaremos el tipo de datos varBinary y los comandos pwdencrypt y pwdcompare de SQL.

La idea es al usar el insert encriptar el campo de manera que no se podrá volver a desencriptar. Para poder comparar si una entrada pasada corresponde con una clave usaremos un select con el comando pwdcompare.

Supondremos una tabla que contendrá a los Usuarios, llamada Users de la siguiente manera:

tabla

Para grabar el dato usaremos el código:

save new user 

Mientras que para comprobar una clave dado un nombre de usuario usaremos:

checkLogin
pwdencrypt encripta usando una clave hash aleatoria y que no se guarda, lo que evita que podamos desenciptar la clave para verla. No podremos editarla, tendremos que establecer algún mecanismo para que cuando una clave se olvide haya que generar una clave nueva.

Orbea Gredos revival….Parte I


El pasado verano encontré buscando por ahí una Orbea Gredos que mas o menos debe ser del año 1982-83. El estado general no era malo salvo en las ruedas, donde faltaban varios radios y además tenía el piñon (de cinco velocidades) completamente atrancado.

17 Juntas
18 Sola

19 Sola
20 Sola

Los componentes de esta bici eran para la época, digámoslo de una manera suave, “de marca”, sin ser tope de gama, pero si de aceptable calidad para lo que se estilaba. Curiosamente la mayoría de ellos provenientes de Francia. El despiece era de la siguiente manera:
  • Cuadro de acero fabricado en Francia para Orbea por la marca, Brifont. Es una talla para 1,70 – 1,80.
  • Potencia, muy bonita, cromada de la marca durbic.
  • El manillar cromado de la marca fracesa Belleri.
  • Manetas y puentes de freno Weinnmann
  • Platos y bielas Rigida con desarrollo 46,52
  • Llantas Weinnmann con piñon trasero de 5 velocidades
  • Desviadores delantero y trasero de la marca Simplex.
La idea es desmontar todo, revisar rodamientos y sustituir, pintar de nuevo, buscar las pegatinas originales y volver a montar cambiando algunos componentes, en especial las ruedas, para dejar la bicicleta totalmente operativa.

Comenzamos para ello desmontamos la rueda trasera y la subimos al caballete. Comenzamos quitando los pedales, el sillín, los frenos, y el cableado tanto de los frenos como de los cambios, todo de la misma manera que en una bici actual. Por ahora no hay problemas, todo está suave y fácil de salir.

00 Inicio

Quitamos la cadena, de la misma manera que con una bici actual, esto es usando el tronchacadenas.

02 Cadena

Quitamos los dos desviadores, y aquí encontramos la primera diferencia. El cambio trasero no va roscado a la patilla, sinó que rosca sobre un tornillo que pasa a través del orificio de la patilla que no tiene estriado alguno. Hay que usar por lo tanto dos llaves allen, una para cada lado.

03 Cambio
04 Cambio

Lo siguiente serán las bielas y el eje, para lo que necesitamos un extractor de bielas de cuadradillo. Quitamos previamente unas tapas de goma que van roscadas con un destornillador plano grande.

05 Tapon bielas

Queda visible la tuerca que sujeta a las bielas en su sitio que quitaremos mediante una llave de vaso.

06 Tornillo bielas

Por último roscamos el extractor en la biela y apretamos el extractor para que extraiga la biela. Repetimos la operación con la otra biela.

07 Extractor
08 Extractor

Pasamos ahora a quitar el eje del pedalier, usando para ello una llave de vaso grande para desenroscar uno de los laterales, el izquierdo,  y asi poder extraer la cazoleta con su rodamiento. Sacamos el eje, y repetimos la operación para el otro lado.

09 Eje
10 Soltar tapa eje
11 Eje izqdo

Por último retiramos la cinta del manillar, las palancas de freno quitando previamente las fundas de goma de los escaladores, el manillar y finalmente la tija del manillar.
Queda por desmontar la dirección quitando la tuerca superior con una llave, la arandela intermedia, y la tuerca inferior que rosca a mano. Queda la horquilla suelta.

12 Direccion

13 Direccion
14 Direccion
15 Direccion

De esta manera ya está el cuadro listo para quitar la pintura y pintar.

16 Despiece final

Visual Studio: GetSchemaTable para obtener el schema de una tabla

GetSchemaTable, devuelve el schema de una tabla dada, pero para sacar la información interesante del resto que sobra tendremos que interpretar los datos que se nos devuelven en forma de tabla.
Pongo aquí abajo el código de una forma de hacerlo que se me ha ocurrido, la idea es que al final se nos devuelva en un listBox algo parecido a esto:

Captura

El primer método devuelve el Schema según lo hace la función GetSchemaTable, y el segundo descompone la información:

     public DataTable readSchemaFromTable(string conString, string queryString)
        {
            using (SqlConnection connection = new SqlConnection(conString))
            {
                using (SqlCommand command = new SqlCommand(queryString, connection))
                {
                    connection.Open();
                    using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo))
                    {
                        DataTable table = reader.GetSchemaTable();
                        return table;
                    }
                }
            }            
        }
        private void readTableDataMenuItem_Click(object sender, EventArgs e)
        {
            //Leo datos de la tabla
            string conn = @”Integrated Security = true;
                            Initial catalog = ” + tBxCatalog.Text + @”;
                            Data Source = ” + tBxServer.Text + @”;”;
            string query = @”SELECT * FROM ” + tBxTable.Text;
            using (DataTable table = readDataToTable(conn, query))
            {
                //Conectamos al grid
                dBSrcSQL.DataSource = table;
                dGVTable.DataSource = dBSrcSQL;
            }
            //Leo el schema de la tabla
            using (DataTable schema = readSchemaFromTable(conn, query))
            {
                
                string cadena = “”;                
                string name =”";
                string dataType =”";
                string sizeData=”";
                string isKey=”";
                string isAuto = “”;
                //Pasamos los datos al list Box
                foreach (DataRow row in schema.Rows)
                {
                    foreach (DataColumn column in schema.Columns)
                    {
                        if (column.ColumnName == “ColumnName”)  
                            name = row[column].ToString();
                        else if (column.ColumnName == “DataTypeName”)
                                dataType = row[column].ToString();
                             else if (column.ColumnName == “ColumnSize”)
                                     sizeData=row[column].ToString();
                                  else if (column.ColumnName == “IsKey”)
                                        {
                                            if (row[column].ToString()==”True”) isKey = “isKey”;
                                            else isKey = “”;
                                            //isKey = row[column].ToString();
                                        }
                                        else if (column.ColumnName == “IsAutoIncrement”)
                                        {
                                            if (row[column].ToString()==”True”) isAuto = “isAutoIncrement”;
                                            else isAuto = “”;
                                        }
                            
                    }
                    cadena = name + ” ” + dataType + “(” + sizeData + “) ” + isKey + ” ” + isAuto;
                    lBxFields.Items.Add(cadena);
                    cadena = “”;
                }
            }
        }

martes, 19 de noviembre de 2013

First and Last Day of Week Month and Year

        //Calculates first day of year
        public static DateTime firstDayOfYear(DateTime dateTime)
        {
            DateTime result;
            result = dateTime.AddDays(-(dateTime.Day - 1));
            result = result.AddMonths(-(dateTime.Month - 1));
            return result;
        }

        //Calculates last day of year
        public static DateTime lastDayOfYear(DateTime dateTime)
        {
            DateTime result;
            result = dateTime.AddYears(1);
            result = result.AddMonths(-(dateTime.Month-1));
            result = result.AddDays(-(dateTime.Day));
            return result;
        }

        //Calculates first day of month
        public static DateTime firstDayOfMonth(DateTime dateTime)
        {
            DateTime result;
            result=dateTime.AddDays(-(dateTime.Day-1));
            return result;
        }

        //Calculates last day of month
        public static DateTime lastDayOfMonth(DateTime dateTime)
        {
            DateTime result;
            result = dateTime.AddMonths(1);
            result = result.AddDays(-(dateTime.Day));           
            return result;
        }

        //Calculates first day of week
        public static DateTime firstDayOfWeek(DateTime dateTime)
        {
            DateTime result;
            result = dateTime.AddDays(-(Convert.ToInt32(dateTime.DayOfWeek)-1));
            return result;
        }

        //Calculates last day of week
        public static DateTime lastDayOfWeek(DateTime dateTime)
        {
            DateTime result;
            result = dateTime.AddDays((7-Convert.ToInt32(dateTime.DayOfWeek)));
            return result;
        }

Visual Studio C#: Cargar un excel en un DataGridView

La idea sería cargar un fichero de excel que contiene datos en una tabla para que se muestren en un DataViewGrid y así poder pasar a una base de datos SQL.

Para ello vamos a hacer uso de OLE DB, (Object Linking and Embeding for Data Bases), que no es mas que una tecnología propia de Microsofot para permitir el acceso a datos. OLE DB forma parte de la tecnología MDAC (Microsoft Data Access Componentes) de microsoft, que divide OLE DB en dos componentes principales, consumidores, y proveedores en referencia a como tratan los datos.
Usaremos así los proveedores OLE DB para acceder a cualquier tipo de dato, desde una hoja de excell a una base de datos SQL, Oracle, etc…
Para hacer nuestro ejemplo crearemos un simple projecto del tipo WFA (Windows Form Application), al que añadiremos cuatro componentes:
  • Un Data GridView que llamaremos: dGVExcel
  • Un Binding Source que llamaremos: dBSource
  • Un Text Box que llamaremos: txBxPath, y que en la propiedad Text tendrá el nombre del excell que queremos abrir, incluyendo el path de búsqueda, en mi caso C:\Users\uge\Desktop\excell1.xlsx
  • Y un botón, que al hacer click sobre el abrira el excel indicado en el TextBox mostrando los datos en el DataGridView.
Para poder hacer uso de OLE DB tenemos que añadir a los using del fichero:

using System.Data.OleDb;

Una vez hecho esto hacemos doble click sobre el botón para escribir el código correspondiente, que será como sigue:
Primero necesitamos crear un string que contenga la siguiente info:

1- La configuración de nuestro OLE DB Provider. Existen muchos tipos de proveedores implementados, así que tenemos que tener claro cual vamos a usar. En nuestro caso es una hoja de excel creada con office 2010, así que usaremos como provider Microsoft.ACE.OLEDB.12.0;

En esta página http://www.connectionstrings.com/ podéis acceder a información relativa a conexiones, no solo para OLE DB, sinó también para otras formas de conexion. Para excel podeis encontrarlas en http://www.connectionstrings.com/excel

2 – El DataSource del que obtendremos los datos, esto es, nuestro fichero de excel, que sacaremos del campo Text del objeto txBxPatx.

3 – Propiedades del fichero a abrir, es decir las Extended properties. en nuestro caso usaremos Excel 12.0 XMml; HDR=YES. Esta última indica por ejemplo que se añada la primera fila con los títulos de las columnas.

Añadimos al código:

         string connectionString = @”Provider=Microsoft.ACE.OLEDB.12.0;
                                         Data Source=” + txBxPath.Text + @”;
                                         Extended Properties=”"Excel 12.0 Xml;HDR=YES”"”;

Lo siguiente será preparar una consulta que extraiga los datos del provider, la consulta se hace en SQL y el nombre que incluimos será el de la Hoja dentro del excel de la que sacar los datos, en mi caso es Hoja1, y se le añadirá $ por detrás:

string query = “SELECT * FROM [Hoja1$]“;

Una vez tenemos el string que configura al provider, y la consulta que extrae los datos vamos a crear la conexión y extraer los datos hacia una tabla que también crearemos en el código:

//Creamos el provider
OleDbConnection excelConnection = new OleDbConnection(connectionString);
//Lo abrimos
excelConnection.Open();
//Creamos un Data Adapter que extraiga los datos necesarios(todos) del provider
OleDbDataAdapter data = new OleDbDataAdapter(query, excelConnection);
//Creamos una tabla
DataTable dTable = new DataTable();
//Usando el Data Adapter que tiene los datos seleccionados, rellenamos la tabla.
data.Fill(dTable);
// Conectamos el BindingSource con la Tabla.
dBSource.DataSource = dTable;
// Conectamos el DataGridView con el BindingSource
dGVExcel.DataSource = dBSource;

Si compilamos y ejecutamos el proyecto deberíamos obtener una pantalla similar a esta:

Capture

A partir de aquí ya podemos trabajar con los datos en nuestra aplicación VS.