en

Tecnologia

agosto 2007 - Artículos

  • Conexion a SQLServer desde ASPNET en Windows 2003 Server

    En mi clase ASPNET en el diplomado trate de montar una Solución Web que hace parte de las presentaciones que Microsoft libero en su página http://www.tutorialparaprofesores.com y me encontré con  una sorpresa!!!, la cuenta que utiliza Windows 2003 Server desde ASP para acceder a una base de datos es: "NT AUTHORITY\Servicio de red"… ya no es la cuenta ASPNET!, lógicamente después de realizar todo el proceso correspondiente al despliegue la aplicación no funcionaba! Debido a que esta cuenta no tenia permisos de conexión a la base de datos... así que me puse en la tarea de solucionar el problema.... lo único que hay que hacer es adicionar la cuenta "NT AUTHORITY\Servicio de red" al las cuenta de inicio de sesión de SQL y otorgarle los permisos adecuados para nuestra Base de datos y listo!... pero después de haber arreglado el problema me surge una duda...... porque cambiaron la cuenta????.... ah claro . Por cuestiones de seguridad. La cuenta de SERVICIO DE RED, es mucho más limitada que la cuenta ASPNET, todo se resume a que se mejora la seguridad porque se supone que estamos en un Servidor

    Att. Jaime Lopez

  • Un buscador exclusivo para .NET

    Dando vueltas por Internet encontré algo muy interesante un señor llamado Dan Appleman creó un sitio para búsquedas específicas de temas de .Net y a diferencia de los buscadores normales, éste sitio agrupa fuentes confiables, filtrando sitios de dudosa reputación, también te da la posibilidad de filtrar tus búsquedas por temas generales de la tecnología .NET o buscar componentes o libros espero lo visiten!.

    Site: http://www.searchdotnet.com/

    Att. Carlos Muñoz

    Enviado ago 28 2007, 11:18 por admin con no comments
    Archivado en:
  • Estripando Crystal Reports desde el Código

    Hola amigos y amigas

    Hoy les traigo un código muy útil cuando trabajen con crystal.

    Primero que todo CR trae una caracteristica llamada SubReportes, simplemente es que en un reporte principal ustedes pueden insertar lo que se llaman subreportes, que no son más que reportes comunes y normales.

    El siguiente código les muestra como manipular un subreporte que se encuentra dentro de un reporte principal.

    Recuerden que es código mio y pues si lo usan deben ajustar los valores a sus proyectos.

    SubreportObject sbrObjetoContadorCierre = null;
    
    ReportDocument rdOficinasCierre    = new ReporteCierreOficinas();
    
    string strSubReporteNombre = "";
    
    ReportDocument rdContadoresCierre = new ReportDocument();
    
    //Obtener el ReportObject por nombre como un SubreportObject para Contadores de Cierre
         sbrObjetoContadorCierre = 
          rdOficinasCierre.ReportDefinition.ReportObjects[5] as SubreportObject;
         //Obtiene el nombre del subreporte
         strSubReporteNombre = sbrObjetoContadorCierre.SubreportName;
         //Abre el subreporte como un ReportDocument.
         rdContadoresCierre = rdOficinasCierre.OpenSubreport(strSubReporteNombre);
         //Fija la fuente de datos del subreporte de Oficinas Pendientes     
         rdContadoresCierre.SetDataSource(dtReporteContadoresCierre);  
    
         return(rdOficinasCierre);

    Arriba entonces defino los objetos que necesito, y la aprte de abajo va má o menos así:

    En sbrObjetoContadorCierre por casteo normal y corriente se obtiene de la colección

    ReportObjects el objeto tipo  SubreportObject que está incrustado en el reporte principal que está identificado por rdOficinasCierre.

    Luego strSubReporteNombre almacena el nombre del subreporte, nombre que ustedes pueden manipular a través de la ventana de propiedades del subreporte en la propiedad SubreportName.

    Luego fijense que con el nombre almacenado en strSubReporteNombre se obtiene el objeto SubReporte que al final es un ReportDocument como les dije anteriormente, es un reporte comun y corriente.

    Luego para rdContadoresCierre se fija la fuente de datos que puede ser DataTable, DatSet, en fin una fuente de datos, pero finalmente se retorna el rdOficinasCierre que es el reporte principal que contiene al subreporte.

    recuerden que  pueden tener varios subreportes dentro del principal, obviamente hasta que el diseño y su necesidad lo permita.

    Un abrazo

    Att. Andres Ortiz

  • Jerarquia de grupos en Crystal Reports

    Hola, saludos amigos

    Esta ves vamos a hablar de los grupos en reportes de crystal, pero de manera jerarquica.

    Hace unos dias se me presentaba el siguiente problema:

    Tenía que mostrar un reporte, donde por página mostrar los datos para cada registro principal, y adicionalmente agrupar por un tipo específico esos registros.

    Para entender mejor veamos este ejemplo:

    Supongamos que tenemos una tabla de ciudades, por cada ciudad debo generar una página del reporte. En una entrada anterior les conté como hacer eso. Ahora, supongamos que por cada ciudad necesito mostrar información de mujeres y hombres. Pero entonces necesito agrupar los hombres y las mujeres por aparte en la misma página para esa ciudad. Cómo se hace esto?

    Se necesita adicionar un grupo, al cual se le asigna por el ejemplo el código de la Ciudad. Luego crean otro grupo al cual se le asigna el tipo (hombre  y mujer). Con el primer grupo logramos que por cada ciudad se cree una página en el reporte, y con el segundo grupo se agrupa la información por hombres y mujeres.

    Aparentemente una tarea que resultaría ser algo compleja o tomarnos algo de tiempo en resolver, es verdaderamente sencilla, con los grupos jerarquicos en Crystal Reports.

    Felices lineas de código.

    Att. Andres Ortiz

  • Actualizar XSD asociado tú reporte

    Hola

    Algo que a veces causa algo de problema, es el tema de cambiar el XSD (llamese DataSet) asociado a un reporte de Crystal. El problema rádica en que al cambiarse el XSD, cuando intentamos actualizar estos cambios en el reporte, estos no se ven reflejados, y muchos terminamos desasociando el XSD del reporte, y lo que Crystal hace por nosotros es eliminar todos los campos que fueron arrastarados en diseño. Grave problema.

    Ahora bien, dado esto, debería haber una forma de que el XSD sea actualizado y la cache sea reinicializada para que los cambios se reflejen en nuestro reporte. Aqui les presento un link muy bueno sobre este tema, y se ahorren tiempo de diseño de sus rpts.

    http://aspadvice.com/blogs/rjdudley/archive/2005/05/27/2606.aspx

    Felices lineas de código

    Att. Andres Ortiz

  • Programando Crystal Reports New Page After

    Hola

    Hace unos dias se me pedia que por cada registro diferente de mi consulta se mostraran los mismos en diferentes páginas. Por ejemplo, tenemos n registros, donde podemos hacer un agrupamiento por Pais. Entonces cada grupo se debe mostrar en una página diferente. Estoy admirando mucho las posibilidades que brinda crystal en este sentido. La idea es capturar ciertos eventos que ocurren en las diferentes secciones de un reporte y cuando eso suceda programar al estilo Visual Basic, para que suceda lo que necesitamos con el reporte.

    Para el caso que les describo se debe hacer lo siguiente:

    1. Cuando se agrega un grupo al reporte se crea una sección Group Header. Sobre esta sección hacemos click derecho y en la ventana emergente selecionamos Section Expert. Se despliega un ventana con diferentes eventos. El que necesitamos es New Page After. Lo amrcamos y hacemos click en el botón asociado y en la ventana de edición que aparece, agregane ste código:

    if(NOT ONLASTRECORD AND {FUENTE.PAIS} = NEXT({FUENTE.PAIS}))THEN
        false

    Primero recuerden, esto es un ejemplo y deberan cambiar el campo PAIS por el que les corresponda, además de la fuente que aqui la he llamado FUENTE, pero para suc aso ha de cambiar.

    Fijense que el IF es muy senciilo, primero verifica que no se alcance la ultima fila y adicionalmente con la función NEXT , se chequea que el país del registro actual corresponda al del siguiente registro, para mostrar todos los registros del país actual en la misma página del reporte.

    Entonces fijense que false, le indica al reporte que no ocurrira un evento New Page After, es decir no creará una nueva página hasta que encuentre un nuevo país.

    2. El siguiente código es la solución a un problema que se presenta cuando usamos esta técnica. Si lo siguiente no se hace, crystal genera la primera página del reporte en blanco, y de ahi en adelante muestra la información. No recuerdo bien, pero creo que en mi reporte, solo mostraba a página en blanco y las demás no salian. Entonces aqui lespresento la solución a esto. Básicamente en la sección Group Footer, igualmente capturamos el evento New Page After y colocan lo siguiente:

    Not(OnLastRecord)

    Fácil? yo creo que sip, para conseguir un resultado que a primera vista pareciera algo del otro mundo.

    En conclusión Crystal nos brinda una amplia gama de tareas programables. Lo único que le hace falta es que se pueda programar en C#, ya que a veces para determinadas acciones, toca conocer un poco de Visual Basic.

    Felices lineas de código.

    Att. Andres Ortiz

  • Ahora los charts de Crystal

    Hola

    Se habia presentado un problema con un reporte que despliega un gráfico de barras, para el cual la opción Show Legend está chequeda.

    El gráfico tiene algo particular y es que en la sección Data del Chart Expert, se asocian dos campos de la base de datos en el campo Show Values.

    El problema es que en la leyenda asociada al gráfico se despliega por ejmplo: Sum tabla.campo, es decir la operación que el Crystal asocia sobre ese campo que se está graficando, pero no lo que se espera, por ejemplo Campo sin el resto de cosas que salen en la leyenda.

    Cómo podemos entonces editar la leyenda de un reporte?

    1. No pierdan el tiempo tratando de editar esto desde Visual Studio, no se puede.

    2. Consiganse el Crystal por aparte y ahi sise puede editar la leyenda.

    3. La edición de  la leyenda no es para nada buena, a mucho las fuentes y una que otra cosa, pero no soluciona este problema.

    4. Quieten la opción Show Legend de su gráfico y creen su propia leyenda, según sus necesidades.

    Me parece barbaro esto, pero hasta el momento es la única solución.

    Felices líneas de código.

    Att. Andres Ortiz

  • Problema Exportando a Excel en CrystalReports

    Hola

    Esto si es muy corto, pero sustancioso.

    En el mundo real, suceden cosas que quitan bastante tiempo, y aveces suelen ser tan sencillas como esto:

    Se quiere exportar a Excel un reporte de Crystal que esta siendo generado en una aplicación asp.net. Cuando se ejecuta la exportación, se carga en una nueva ventana el reporte exportado en Excel, pero la información que deberia mostrarse no se despliega adecuadamente, en mi caso, solo se exporta de manera desordenada los filtros usados para generar el reporte, filtros que no tenían porque mostrarse, y la información del reporte no aparece por ningun lado.

    Esto ocurre con un cliente que utiliza Office 2000.

    Buscando por ahi, encontré que es un bug del office 2000, detectado para MIME TYPES apuntados a Excel. El pobre Office no entiende este tipo y lo que hace es exportar, en este caso a Excel, el archivo físico, en este caso la página aspx, pero no el contenido. La gente de MS hizo pruebas con Javascript embebido en una simple página asp, y efectivamente, no muestra el contenido en Excel de la página, o a veces muestra el código de javascript en el Excel.

    Solución? muy pero muy sencillo, correr el  Service Release (SR1a) para Office 2000 o service pack que le llaman.

    Un abrazo,  felices lineas de código!!

    Att. Andres Ortiz

  • Formato de fecha según la "cultura" del servidor

    Hola a todos

    Vamos con una entrada muy corta pero creanme, le spuede costar o más bien evitar tiempo perdido cuando trabajan ya en el mundo real.

    En tan solo una linea de código pueden obtener el formato de fecha según la "cultura" del computador o servidor donde reside su aplicación.

    CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;

    La propiedad ShortDatePattern les devuelve un string, y con esto tienen la cadena del formato adecuado según la cultura. El caso está en que muchas veces nuestro ambiente de desarrollo está en una cultura totalmente diferente a la máquina servidora donde va residir la aplicación, para que nuestros clientes la utilicen, así que es mejor curarse en salud y usar ese tipo de cosas que dejan la cosa genérica.

    Ejemplos de culturas son: Estados Unidos (en-US), España (es-ES), y así muchas más según el lenguaje y el país.

    Cabe destacar también este trozo de código que nos permite determinar si la cultura actual de la máquina correspodne a determinada cultura:

    if (System.Globalization.CultureInfo.CurrentCulture.Name.Equals("en-US"))

    Felices líneas de código

    Att. Andres Ortiz

    Enviado ago 27 2007, 09:29 por admin con no comments
    Archivado en: ,,
  • Qué pasa cuando mi fecha no habla inglés

    Hola

    Como siempre ocurre, en desarrollo la fecha utilizando ToDateLongString(), aparace en español, pero claro mi sistema está en español. Luego se lleva al cliente, y la fecha aparace en inglés, pero claro el servidor está en inglés. Cómo solucionar eso de manera sencilla, aparace la globalización y lo siguiente a nivel de página:

    Entonces en la directiva @Page colocar lo siguiente:

    <%@ Page UICulture="es" Culture="es-ES" %>

    Bueno, en la cultura si pueden poner el país que ustedes quiran, pero la idea es que el lenguaje sea español.

    Esto también puede colocarse a nivel de toda la aplicación en una sección del archivo web.config.

    Felices lineas de código!!

    Att. Andres Ortiz

  • Opacidad

    Si han visto por ahi el Microsoft ScoreBoard, se habran dado cuenta de que podemos opacar la ventana. Esta es una simple aplicación lectora de RSS para mantenernos al tanto de los resultados del mundial.

    Bien pero este no es el tema central de esta entrada. La idea es mostrarles como pueden jugar con la opacidad de una forma windows para que vean lo fácil que es hacer un efecto de Fade o desvanecimiento, sin necesidad de escribir mucho código.

    Primero que todo, creamos un proyecto Windows Forms. Luego en el evento Load de la forma cargamos esta línea:

    this.Opacity = 0; //Hace que se muestre la forma totalmente opaca
    timer1.Enabled = true; //Activa el timer

    Si señores eso significa que deben añadir un control Timer a su proyecto windows, simplemente arrastrandolo desde el ToolBox a su ventana de diseño.

    Ahora con el Timer, configuran su propiedad Interval por ejemplo con un valor de 50.

    El Timer no ofrece el evento Tick que se ejecuta por cada pasada del intervalo, es decir ya que el intervalo es un valor en milisegundos, el tick esta ves se ejecutará cada 50 ms, lo cual es bastante rápido, pero suficiente para dar ele efecto con la opacidad del formulario.

    Capturamos entonces el evento Tick del timer, dando doble click sobre el timer, y escriben ahi estas lineas:

    this.Opacity += 0.005;
    
    if(this.Opacity >= 0.99)
    {
      this.Opacity = 1;
      timer1.Enabled = false;
    }

    El código nterior simplemente le dice que la propiedad opacity de la forma se irá incrementando en 0.005 por cada pasada del timer.

    Por cada 50ms, se va preguntando si ya se llego al límite de la opcidad, es decir si la ventana ya es visible completamente, si es así, asigna 1 a la opacidad, con lo cual deja la ventana totalmente visible. Y finalmente desactiva el timer para parar su ejecución.

    Muchas gracias, espero lo prueben para que se diviertan y lo usen en sus proyecto.

    Un abrazo

    Att. Andres Ortiz

    Enviado ago 27 2007, 09:24 por admin con no comments
    Archivado en: ,,
  • RadioButton en DataGrid para ASP.NET

    Hola

    Necesitaba adicionar RadioButtons en un DataGrid y ocurrió lo siguiente. La funcionalidad en una página .aspx es correcta, pero cuando la colocan sobre una .ascx y luego montan su control de usuario sobre su .aspx, el evento CheckedChanged disparado por los RadioButton supuestamente se dispara pero no se obtiene nada. Qué se de hacer? muy sencillo, no escribir el vento CheckedChanged dentro del .ascx sino escribir un método y desde la definición del radiobutton dentro de los tags del DataGrid llamar a ese método por medio del evento así:

    <ItemTemplate>
           <center>
            <asp:RadioButton id="rbnSeleccionar" AutoPostBack="True" OnCheckedChanged="SSeleccionar" runat="server" />
           </center>
          </ItemTemplate>

    Se dan cuenta SSeleccionar es un método dentro de nuestra .ascx, y asunto arreglado

    Subí esto por si alguien lo necesita alguna vez.

    Un abrazo

    Att. Andres Ortiz

    Enviado ago 27 2007, 09:19 por admin con no comments
    Archivado en: ,,,
  • Crystal Reports, más programatico que nunca

    Hola

    Esta ves veamos primero un link a un personaje, algo así como un gurú en el tema de Crystal, que tiene enlaces por todos lados cada ves que se busca algo sobre el tema de reportes en Crystal.

    Si nosotros tenemos nuestro esquema XML, creado a través de un Datset, que usaremos como fuente de datos para nuestro reporte, se debe tener cuidado, que a la hora de escribir código se tengan en cuenta als recomendaciones de este personaje, para evitarse un error típico en nuestras aplicaciones Web, que muestran reportes de Crystal:

    http://aspadvice.com/blogs/rjdudley/archive/2005/05/13/2589.aspx

    Ahora bien, quiero compartirles un par de lineas de código que les van servir en el siguiente contexto.

    Supongan que tienen su reporte principal, y este está configurado como Portrait, es decir está vertical la hoja del reporte. Ahora bien, este reporte contiene diferentes subreportes pegados a el, los cuales se encuentran en diferentes secciones del principal, secciones de tipo Details, lo típico. Pero que ocurre cuando uno de los subreportes está configurado como LandScape, es decir la hoja se debe mostrar horizontal, ya que contiene gran volumen de columnas y neecsita esta configuración.

    En un principio pensé que la solución era más compleja pero no, llega al rescate un evento disparado por el CrystalReportViewer. Este es el control que arrastramos a nuestras páginas aspx, para mostrar los reportes.

    Ahora si aqui está el código.

    private void CrystalReportViewer1_DrillDownSubreport(object source, CrystalDecisions.Web.DrillSubreportEventArgs e)
      {
       if(e.NewSubreportName == "Subreport1")
       {
        CustomerOrders.PrintOptions.PaperOrientation = CrystalDecisions.Shared.PaperOrientation.Landscape;
       }
      }

    La idea entonces es capturar el evento DrillDownSubreport, del CrystalReportViewer, y fijense entonces que es simplemente utilizar el objeto CustomerOrders, que es una instancia de tipo ReportDocument, que es básicamente el representante en código de nuestro subreporte.

    "Subreport1" es básicamente el nombre asignado al Reporte que hace las veces de subreporte, no es sino que miren las propiedades del reporte y busquen la propiedad Name, ahi está asignado un nombre por defecto, o el que ustedes le quieran poner.

    Como no gano indulgencias con camandulas ajenas, aqui está link a los dueños de Crystal, quienes dieron la solución. Eso si la explicación es muy mala, y toco recurrira algo más para poner a funcionar la cosa, pero fue buena guia.

    http://technicalsupport.businessobjects.com/KanisaSupportSite/search.do?cmd=displayKC&docType=kc&externalId=c2012989&sliceId=&dialogID=6892327&stateId=1%200%206890766

    Si señores así de sencillo, un abrazo, y felices lineas de código!!

    Att. Andres Ortiz

  • Delphi .NET

    Hola a todos

    Hoy mi mensaje va más halla de hablar de alguna tecnología Microsoft, pero al fin de cuentas si tiene que ver con el .NET Framework.

    Son ya tantos los lenguajes que se han acogido a la especificacion del Framework, quiza por moda? no, yo creería que si no lo hacen quedan obsoletos.

    Por ejemplo Delphi como IDE de desarrollo ahora en su versión 8, ha incluido su propio compilador al estilo Object Pascal .NET.

    He estado mirando la cosa, y pues ustedes saben, el Framework es uno solo, y la cosa fluye para los que venimos, o dedicamos el dia a dia a C#, pero toca tener en cuenta ciertos detalles del propio Object Pascal usado en Delphi, para no tener demoras.

    Para que vean lo fácil que es por ejemplo usar esta cosa de GDI+ en object Pascal .NET usando Delphi 8, aqui un pequeño sample:

    Omitire las declaraciones de los eventos, porque, joder, no tengo aqui el IDE y quien se va aprender eso.

    //En esta sección se declaran los namespaces

    uses System.Drawing;

    //Esta sección var, se declaran las variables locales dentro del evento

    //Esto lo pueden incluir en el evento onPaint de la Forma Windows

    //para un proyecto WindowsForms

    var

      objGrafico : Graphics;

    BEGIN

      //Esto le dice que el área de dibujado es la propia Forma

      objGrafico := Self.CreateGraphics(); //En C# this.CreateGraphics()

      //Si quieren pueden usar el objecto de tipo PaintEventArgs que se define en el

      //evento onPaint

      //objGrafico := e.Graphics; Esto queda comentado porque usan la una o la otra

      //Además fijense que el objeto e yua tiene es una propiedad Graphics

      //que retorna el engendro tipo Graphics

      //Haganlo como se les antoje muchachones!!

      //Dibuja una linea con coordenadas (100,100) y (400,100)

      objGrafico.DrawLine(Pen(Color.Red),100,100,400,100);

      //Dibuja un cuadrado de 100x100

      objGrafico.DrawRectangle(Pen(Color.Blue),200,200,100,100);

    END;

    Además de cosas como el var, el BEGIN, que parecen de Visual Basic, fijense que el terminador de cada línea es un punto y coma como en C#, el paso de parémtros a los métodos es muy transparente, etc etc. La cosa fluye.

    A mí me parece bien que exista Delphi.NET, desafortunadamente, cuando ustedes instalan el Delphi Studio for .NET, la cosa usa Framework 1.1, cosa grave porque ya vamos en la V2, y los cambios han sido bastantes.

    Pero bueno, para los que quieran migrar sus escritos en C# a Delphi.NET, aqui hay un link a algo que está haciendo Borland, para convertir la cosa, y pues que sea más rápida la exportación a su engendro Delphi.NET.

    http://dotnet.borland.com/babelclient/BabelClient.aspx

    Att. Andres Ortiz

    Enviado ago 27 2007, 09:11 por admin con no comments
    Archivado en:
  • Determinar IP

    Bueno ahora si, un poco de código:

    using System;
    using System.Net;
    
    class Workstation
    {
        static Workstation()
        {
            IPAddress ipAddress =
                Dns.GetHostEntry(HostName).AddressList[0];
            IPAddressString = ipAddress.ToString();
        }
    
        public const string HostName = "orion";
        public static readonly string IPAddressString;
    }
    
    class GetIpAddress2
    {
        public static void Main()
        {
            //Workstation workstation = new Workstation();
            Console.WriteLine("The IP address for '{0}' is {1}", 
                Workstation.HostName, Workstation.IPAddressString);
    
        }
    }

    Un sencillo ejemplo que permite determinar la IP dado el nombre de la máquina para la cual queremos averigiar dicha IP.

    El objetivo es mostrarles el uso de campos de solo lectura, como el definido como:

    public static readonly string IPAddressString;

    Definir un campo como solo lectura, se diferencia de una constante, en que el solo lectura puede definir su valor en tiempo de ejecución, y seguir teniendo su caracterísrica inmutable (sin cambios durante la vida de la app). Esto los hace más versatiles que las contsnates, ya que estas fijan su valor en tiempo de compilación, no permitiendo asignar un valor durante su ejecución.

    Adicionalmente vean el constructor static Workstation(), sip señores, es estático, lo que significa que no hay necesidad de instanciar la clase para acceder a sus diferentes campos. Recuerden que por definición, un cosntructor estático es público y que una constante por default es estática.

    Un abrazo.

    Att. Andres Ortiz

    Enviado ago 27 2007, 09:06 por admin con no comments
    Archivado en: ,
Más artículos Página siguiente >
Copyright © 2003 - 2007 Célula Unicauca.NET.
Ofrecido por Community Server (Non-Commercial Edition)