Updates from April, 2006 Toggle Comment Threads | Keyboard Shortcuts

  • montelof 12:01 pm on April 20, 2006 Permalink | Reply  

    User Input 

    Alguna vez se han preguntado, de cuantas formas diferentes un usuario puede codificar el numero de la semana y año en el nombre de un archivo???, aqui esta una funcion q siempre devolvera "WW YY" donde "w" es el numero de la semana y "Y" el numero del año.
     

    private string ParseFileWeek(string FileName)

    {

        //combinaciones

     

        //0406SBL_MEX.xls

        //042006SBL_MEX.xls

        //04_06SBL_MEX.xls

        //04_2006SBL_MEX.xls

        //406SBL_MEX.xls

        //42006SBL_MEX.xls

        //4_06SBL_MEX.xls

        //4_2006SBL_MEX.xls

     

        //0406SBL_MEX_02.xls

        //042006SBL_MEX_02.xls

        //04_06SBL_MEX_02.xls

        //04_2006SBL_MEX_02.xls

        //406SBL_MEX_02.xls

        //42006SBL_MEX_02.xls

        //4_06SBL_MEX_02.xls

        //4_2006SBL_MEX_02.xls

       

        //sin año

        //04SBL_MEX.xls

        //4SBL_MEX.xls

        //04SBL_MEX_02.xls

        //4SBL_MEX_02.xls

       

        //nombre sin owner

        string tmpfileName = FileName.Replace(this.GetOwner(FileName)+";","");           

        //toma la extencion sin importar la cantidad de puntos

        string ext = tmpfileName.Split(‘.’)[tmpfileName.Split(‘.’).Length – 1];

        //quitando la extension

        tmpfileName = tmpfileName.Replace("." + ext, "");

     

        string[] firstCompleteNum = this.GetCompleteNum(tmpfileName);

        //buscar el primero q contenga un cero

        //checar la long, si es de 3 es 706

       

        string weekYear = "";

        string wk = "";

        string year = "";

       

        int c = 0;

        foreach (string week in firstCompleteNum)

        {   //es la semana y el año, pero si esta dividido y ademas el año esta completo.

            if ((week.IndexOf(‘0’) >= 0) && (week.Length > 2) && (week.Length < 7))

            {

                if (c == 0)

                    weekYear = week;

                else

                {

                    weekYear = firstCompleteNum[c-1] + firstCompleteNum[c];

                }

                break;

            }

            c++;

        }

        //si no encontro nada, posiblemente la semana y el año se encuentran separados por algun caracter.

        c = 0;

        if (weekYear.Length == 0)

        {

            foreach (string yearItem in firstCompleteNum)

            {   //se busca el año  06 o 2006, para q sea el año no debe ser el primer elemento, y la semana es el elemento anterior

                if ((yearItem.IndexOf(‘0’) >= 0) && (yearItem.Length > 1) && (yearItem.Length < 5))

                {

                    if (c > 0)

                    {

                        year = yearItem;

                        wk = firstCompleteNum[c – 1];

                        break;

                    }

                }

                c++;

            }

            //aqui valido si se encontro algo para year y wk por separado.

            if (year.Length == 0)

            {

                //si no encontro nada para el año entonces solo contiene el numero de la semana

                //verificar si contiene almenos un elemento y q este sea menor a 53;

                foreach (string week in firstCompleteNum)

                {   //es la semana y el año

                    if ((week.Length > 0) && (week.Length < 3))

                    {

                        if ((int.Parse(week) > 0) && (int.Parse(week) < 53))

                        {

                            wk = week;

                            year = DateTime.Now.Year.ToString().Substring(2, 2);

                        }

                        break;

                    }

                }

            }

            if (wk.Length == 1)

                wk = "0" + wk;

            if (year.Length == 4)

                year = year.Substring(2, 2);

        }

        else

        {

            if (weekYear.Length == 3)//706

            {

                year = weekYear.Substring(1, 2);

                wk = "0" + weekYear.Substring(0, 1);

            }

            else if (weekYear.Length == 4)//0706

            {

                year = weekYear.Substring(2, 2);

                wk = weekYear.Substring(0, 2);

            }

            else if (weekYear.Length == 5)//72006

            {

                year = weekYear.Substring(3, 2);

                wk = "0" + weekYear.Substring(0, 1);

            }

            else if (weekYear.Length == 6)//072006

            {

                year = weekYear.Substring(4, 2);

                wk = weekYear.Substring(0, 2);

            }

        }

     

     

        if (year.Length > 0)

            return wk + " " + year;

       

        return "";

    }

     

     
  • montelof 7:52 am on April 7, 2006 Permalink | Reply  

    Ahora si terminado 

    Bueno ya tiene mucho tiempo q no escribia nada aqui… bueno en este tiempo ya pude al fin liberar el Query Builder, solo q a ultima hora le he agregado una q otra funcionalidad; y ademas ya estoy por terminar otro proyecto q me tomo solo una semana en hacer… mas adelante explicare un poco de codigo, ya q se me hizo una tecnologia muy interesante.
     
    En el QB utiliza una tecnica de programacion nueva para mi y es usando DELEGATES, la forma de accesar un control q esta en un diferente Thread, es un poco confuso, pero a continuacion esta el codigo.
     
     

    //Se declaran los Delegates

    delegate void SetElapsedTimeCallback(TimeSpan elapsedtime);

    //Se declaran una instancia de estos delegates

    SetElapsedTimeCallback Elapsedtimedelegate;

    //Se crea un thread para accesar el delegate

    private Thread ElaptimeThread;

     

    //aqui se asigna el Delegate a la funcion para cambiar la etiqueta del cronometro

    this.Elapsedtimedelegate = new SetElapsedTimeCallback(SetElapsedTime);

     

    //Esta funcion es llamada por el thread y es invocada por si misma por el delegate, si el control necesita ser invocado esde su propio thread

    private void SetElapsedTime(TimeSpan elapsedtime)

    {

    if (this.statusStrip1.InvokeRequired)

    this.Invoke(this.Elapsedtimedelegate, new object[] { elapsedtime });

    else

    this.toolStripStatusLabelTime.Text = elapsedtime.ToString().Substring(3,5);

    }

     

    //este es el thread q manda llamar la funcion de manera asincrona

    private void ProcSetElapsedTime()

    {

    this.SetElapsedTime(this.elapsedtime);

    }

     

     

     

    //Esta es una Propiedad atravez de la cual le paso el valor q debe tener el cronometro

    //manda llamar el thread q manda llamar la funcion q manda llamar el delegate q la manda llamar a si misma

    private TimeSpan ElapsedTime

    {

    get

    {

    return this.elapsedtime;

    }

    set

    {

    this.elapsedtime = value;

    this.ElaptimeThread = new Thread(new ThreadStart(this.ProcSetElapsedTime));

    this.ElaptimeThread.Start();

    }

    }

     

    Como se puede ver, es un poco enredado, pero segun Microsoft es una manera segura de cambiar las propiedades de un control q esta en diferente thread, lo q sucede es q cuando se manda cambiar un valor de un conrol en este caso, yo actualizo el valor de la etiqueta de un cronometro mientras incremento el numero de registros regresados por el QB, el thread se invoca asi mismo hasta q en determiando punto sea llamado por el mismo thread en q esta contenido, entonces si es llamado de diferente thread simplemente no se actualiza.

     

    Bueno esto sucedio debido a q para crear la tabla de registros uso un componente q es el

    backgroundWorker, y es muy sencillo de usar, estas son las funciones q ejecuto utilizando el componente:

     

     

    private void toolStripButtonCancel_Click(object sender, EventArgs e)

    {

    this.backgroundWorker1.CancelAsync();

    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)

    {

    this.Runquery();

    if (this.backgroundWorker1.CancellationPending)

    this.status = RunStatus.Cancelled;

    else

    {

    if (this.RowLimit <= this.RowCount)

    this.status = RunStatus.RowsLimited;

    else

    this.status = RunStatus.Stopped;

    }

    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

    {

    this.SetStatus(this.status);

    this.QueryBox = this.qbDataGrid1.WhereQuery;

    this.FormBorderStyle = FormBorderStyle.Sizable;

    this.statusStrip1.SizingGrip = true;

    this.excelControl1.ShowPopUp(true);

    }

    private void button1_Click(object sender, EventArgs e)

    {

    this.RowCount = 0;

    this.ElapsedTime = new TimeSpan(0);

    this.QueryStatus = RunStatus.Executing;

    this.statusStrip1.SizingGrip = false;

    if (!this.backgroundWorker1.IsBusy)

    this.backgroundWorker1.RunWorkerAsync();

    }

     

    Todos los eventos son declarados en las mismas propiedades del componente y lo unico q hay q hacer es escribir el codigo q se ejecutara en determinados eventos.

     

     

     
c
Compose new post
j
Next post/Next comment
k
Previous post/Previous comment
r
Reply
e
Edit
o
Show/Hide comments
t
Go to top
l
Go to login
h
Show/Hide help
shift + esc
Cancel