sábado, 14 de abril de 2012

Reporting Services Error División Por Cero

5 comentarios:
Manejar la división por cero es un verdadero problema,  existen 2 formas de corregir este problema.

1.) Utilizar un IIF
2.) Hacer un función para evaluar.

1.)  Solución a medias que puede fallar (IIf)


Query:

SELECT detalle.productid,
       productos.productname,
       detalle.quantity,
       detalle.unitprice,
       discount
FROM   [Order Details] detalle
       INNER JOIN products productos
         ON detalle.productid = productos.productid 



Error en el reporte:
Formula:  =Fields!UnitPrice.Value/Fields!Discount.Value



En este caso en particular, donde el campo Discount la cual divide, puede llegar a ser cero, el error será infinity, la solución en este caso será hacer una pequeña corrección al la formula.

=iif(Fields!Discount.Value=0,0,Fields!UnitPrice.Value/Fields!Discount.Value)




Si hacemos un cambio al query, para el que cambio discount tenga valores nulos, esto con el objetivo de hacer mar real nuestro ejemplo.

SELECT detalle.productid,
       productos.productname,
       detalle.quantity,
       detalle.unitprice,
       CASE discount
         WHEN 0 THEN NULL
         ELSE discount
       END discount
FROM   [Order Details] detalle
       INNER JOIN products productos
         ON detalle.productid = productos.productid 




Aun que la formula tenga el iif siempre nos muestra en mensaje de error, esto por que primero se evalúa los valores globales antes de la parte falsa.

Vea el siguiente ejemplo para solventar este problema de raíz.

2.) Solventar la situación de  por medio de una función:

2.1) Seleccione el las propiedades del reporte, clic derecho sobre el reporte y seleccione report properties.



2.2)  En la pestaña de code agregue la siguiente función:

Public Shared Function Calcular(ByVal Valor1 As Decimal, ByVal Valor2 As Decimal) As Decimal
If Valor2= 0 Then
Return 0 
End If 
Return (Valor1/ Valor2) 
End Function




2.3) Por ultimo debemos de corregir nuestra formula por:

=code.Calcular(Fields!UnitPrice.Value,Fields!Discount.Value)


Con esto tendremos el resultado esperado:


Ver

sábado, 3 de marzo de 2012

Ejemplo Entity Framework con Oracle

3 comentarios:
En este post podremos ver un ejemplo practico de como funciona Entity Framework con Oracle, los objetivos a tratar serán:
  1. Crear un store Procedure en Oracle
  2. Configurar el Entity Framework
  3. Consumir una tabla de Oracle
  4. Consumir un store procedure de Oracle

Antes que nada debemos instalar el cliente de Oracle y las herramientas ODAC el cual podemos descargar del siguiente link:
http://www.oracle.com/technetwork/topics/dotnet/downloads/index.html


1.) En este paso vamos  crear las tablas con la que realizaremos el ejemplo , en este link podrán encontrar los script necesarios:
http://www.cjorellana.net/p/scriptoracle.html


2.) Crear un proyecto en Visual Studio .Net
    3.1) Archivo - Create web site






4.) Configurando Entity Framework
         4.1) Clic derecho sobre el solución explorer - add new item


         4.2) Seleccione Entity framework y deje el nombre predeterminado.


         4.3) El la primera pantalla del asistente debe seleccione "Generate from database"

         4.4) Presioné clic en el botón new Connection y configure su conexión a oracle.




         4.3) Ahora mostrara la pantalla seleccione la conexión que acaba de configurar, seleccione "yes" en incluir password.


         4.3) Ahora mostrara la pantalla para que seleccione los objetos a utilizar, seleccione la tabla Products y por ultimo presión clic en finish.
5.) Abra la pagina Default que fue creada automáticamente y agregue un Gridview y botón.



<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 

        <asp:Button ID="Button1" runat="server" Text="Button" /> 
        <asp:GridView ID="GridView1" runat="server"> 
        </asp:GridView> 
     
    </div> 
    </form> 
</body> 
</html> 





6.) Ahora realizaremos una consulta a la base de datos, presioné doble clic en el botón que acaba de crear.

protected void Button1_Click(object sender, EventArgs e)
    { 
        Model.Entitiesdbo db = new Model.Entitiesdbo(); 
        var query = from p in db.PRODUCTS 
                    select new { p.PRODUCTID, p.PRODUCTNAME, p.UNITPRICE };

        GridView1.DataSource = query; 
        GridView1.DataBind(); 
    }


El resultado sera:




Ahora vamos hacer la consulta por medio de un Store Procedure que retorne un conjunto de datos.


El primer paso es crear el store procedure:


7.) Como ustedes ya sabes, los store procedure en oracle son muy rápidos, por lo que es un importante utilizar un  Store procedure que obtenga una conjunto de resultados. en este paso vamos crear un store procedure:

7.1.) Vamos a crear un Store Procedure que retorne un conjunto de datos, abra cualquier cliente oracle y ejecute lo siguiente.

CREATE OR replace PROCEDURE ObtenerCat(tabla OUT SYS_REFCURSOR)
IS
BEGIN
  OPEN tabla FOR
    SELECT categoryid,
           categoryname,
           description
    FROM   dbo.categories;
END;

/ 

7.1) Ahora tenemos que configurar nuestro web Config para que entity framework pueda crear su tabla, esta es la parte fea de este cliente oracle ya que tenemos que configurar como se llama el store procedure y cada valor que retorne con su respectivo tipo de datos, 


7.1.1) Abra su web config y agregue esto.


<oracle.dataaccess.client> 
    <settings> 
      <add name="DBO.obtenercat.RefCursor.tabla" value="implicitRefCursor bindinfo='mode=Output'" /> 
      <add name="DBO.obtenercat.RefCursorMetaData.tabla.Column.0" value="implicitRefCursor metadata='ColumnName=CATEGORYID;BaseColumnName=CATEGORYID;BaseSchemaName=DBO;BaseTableName=categories;NATIVEDATATYPE=NUMBER;ProviderType=decimal'" /> 
      <add name="DBO.obtenercat.RefCursorMetaData.tabla.Column.1" value="implicitRefCursor metadata='ColumnName=CATEGORYNAME;BaseColumnName=CATEGORYNAME;BaseSchemaName=DBO;BaseTableName=categories;NATIVEDATATYPE=Varchar2;ProviderType=Varchar2'" /> 
      <add name="DBO.obtenercat.RefCursorMetaData.tabla.Column.2" value="implicitRefCursor metadata='ColumnName=DESCRIPTION;BaseColumnName=DESCRIPTION;BaseSchemaName=DBO;BaseTableName=categories;NATIVEDATATYPE=Varchar2;ProviderType=Varchar2'" />       
    </settings> 
  </oracle.dataaccess.client>






8.) Abramos en Model del entity Framework para llamar a nuestro store procedure
8.1) Precie clic derecho "update Model from DataBase"




9.) En la pantalla el asistente, bajo Store Procedure seleccione el store procedure




10.) Tenemos que crear una función para poder usar el store procedure.
       10.1) Presione clic derecho sobre Model y Add y por ultimo "Funtion Import..." llene con la siguiente información.




       10.2) En la pantalla de importación, podrá notar que no hay ningún Complex, presione clic "Get Column Information"  para que genere la información con los datos del Store Procedure, luego precione Crete New Complex Type, por ultimo OK.








11.) Ahora vamos Agregar a nuestra pagina un Dropdown List para jugar con nuestro store procedure, este de debe agregar antes del Boton.


<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
        <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True"> 
        </asp:DropDownList> 
        <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" /> 
        <asp:GridView ID="GridView1" runat="server"> 
        </asp:GridView> 
     
    </div> 
    </form> 
</body> 
</html> 
12.a) Llenaremos nuestro dropdown list en el load de la pagina, precione clic derecho view code y agregue el siguiente código:
 protected void Page_Load(object sender, EventArgs e)
    { 
        if (!Page.IsPostBack) 
        { 
            Model.Entitiesdbo db = new Model.Entitiesdbo(); 
            var query = db.OBTENERCAT(); 
            DropDownList1.DataSource = query; 
            DropDownList1.DataTextField = "CATEGORYNAME"; 
            DropDownList1.DataValueField = "CATEGORYID"; 
            DropDownList1.DataBind(); 
        } 
    } 


13.) Por ultimo vamos a cambiar el código de nuestro botón para el gridview1 se filtre en base al drowdownlist.
 protected void Button1_Click(object sender, EventArgs e)
    { 
        Model.Entitiesdbo db = new Model.Entitiesdbo(); 

        decimal codigo = Convert.ToDecimal(DropDownList1.SelectedValue);
        var query = from p in db.PRODUCTS 
                    where p.CATEGORYID== codigo 
                    select new { p.PRODUCTID, p.PRODUCTNAME, p.UNITPRICE };

        GridView1.DataSource = query; 
        GridView1.DataBind(); 
    }


EL RESULTADO FINAL SERA ASI:



Ver

sábado, 3 de diciembre de 2011

Cargar y guardar una imagen en la base de datos

8 comentarios:
Para este ejemplo utilizaremos la base de datos Nortwind con la tabla categories.



1.) Debemos crear el campo  MimeType para almacenar el tipo de datos del archivo.


ALTER TABLE dbo.Categories ADD
ImageMimeType varchar(50) NULL


Pero en este ejemplo no utilizaremos ya que lo realizaremos con Entity Framework.

2.) Crear el proyecto, File - New Proyect - ASP.NET MVC Web Applicaction



3.)Le mostrara la pantalla de que tipo de aplicación (Internet o intranet), que tipo de motor quiere utilizar ASPX o Razor. Seleccione Internet Application y Use HTML 5 semantic Markup.



4.) En el Solucion explorer, presione clic derecho sobre la carpeta Models y luego en la ventana seleccione Ado Entity Data Model, con el nombre: NorthwindModel.edmx

Seleccione las tablas: Orders, Customers, Employees





5.) Agregaremos el controlador de Categorias.


5.1) Presione Clic derecho sobre la carpeta de Controllers, luego add y por ultimo Controller....




4.2) Se mostrara la pantalla para que seleccione el tipo de Controller.




Nombre: CategoriasController
Template: Adding a controller with read/write actions and views, using Entity Framework 
Model Data Class: Categories (Nombre proyecto.Models)
Data Context class: NortwindEntities (Nombre proyecto.Models)
Views: Razor (cshtml)


5.) Explorado las Vistas.


Luego del ultimo paso nos creo 5 archivos en la carpeta view, estos archivos nos ayudaran a manejar nuestro controlador.


Create.cshtml
Delete.cshtml
Details.cshtml
Edit.cshtml
Index.cshtml



6.) Abra el controlador : CategoriasController

6.1)Agregue el siguiente método

 public FileContentResult GetImage(Int32 CategoryID) 
        { 
            Category cat = db.Categories.FirstOrDefault(c => c.CategoryID == CategoryID); 
            if (cat != null)
            { 
                 
                string type = string.Empty;
                if (!string.IsNullOrEmpty(cat.ImageMimeType)) 
                { 
                    type = cat.ImageMimeType; 
                } 
                else 
                { 
                    type = "image/jpeg"; 
                } 

                return File(cat.Picture, type); 
            } 
            else 
            { 
                return null;
            } 
        }

6.2) Edite el metodo Create de la siguiente manera.

  [HttpPost] 
        public ActionResult Create(Category category, HttpPostedFileBase image)
        { 
            if (ModelState.IsValid) 
            { 
                if (image != null)
                {                 
                    category.ImageMimeType = image.ContentType; 
                    int length = image.ContentLength; 
                    byte[] buffer = new byte[length]; 
                    image.InputStream.Read(buffer, 0, length);
                    category.Picture = buffer; 
                } 

                db.Categories.AddObject(category); 
                db.SaveChanges(); 
                return RedirectToAction("Index");   
            } 

            return View(category); 
        }

7.) Editando vistas
7.1) Abra la vista index.cshtml ubicada en la carpeta view, agregue el siguiente código, después del td del campo descripción.

<td> 
@if (item.Picture != null)
{ 
<div style="float:left;margin-right:20px"> 
<img width="75" height="75" src="@Url.Action("GetImage", "Categorias", new { item.CategoryID })" /> 
</div> 
} 
</td>

7.2)Abra la vista Create.cshtml ubicada en la carpeta view, reemplace con el siguiente código:

 @model MVCentity.Models.Category 

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Html.BeginForm("Create", "Categorias", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset> 
        <legend>Category</legend> 

        <div class="editor-label"> 
            @Html.LabelFor(model => model.CategoryName) 
        </div> 
        <div class="editor-field"> 
            @Html.EditorFor(model => model.CategoryName) 
            @Html.ValidationMessageFor(model => model.CategoryName) 
        </div> 

        <div class="editor-label"> 
            @Html.LabelFor(model => model.Description) 
        </div> 
        <div class="editor-field"> 
            @Html.EditorFor(model => model.Description) 
            @Html.ValidationMessageFor(model => model.Description) 
        </div> 
        <div class="editor-label"> 
            Imagen 
        </div> 
        <div class="editor-field"> 
            <input type="file" name="image" /> 
        </div> 
        <p> 
            <input type="submit" value="Create" /> 
        </p> 
    </fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div>
Ver

sábado, 26 de noviembre de 2011

Datepicker con MVC 3 (Razor)

1 comentario:
El ejemplo final será:



El ejemplo aplicara a todos los tipos de datos de fecha: Ejemplo


[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }


Pero en este ejemplo no utilizaremos ya que lo realizaremos con Entity Framework.

1.) Crear el proyecto, File - New Proyect - ASP.NET MVC Web Applicaction



2.)Le mostrara la pantalla de que tipo de aplicación (Internet o intranet), que tipo de motor quiere utilizar ASPX o Razor. Seleccione Internet Application y Use HTML 5 semantic Markup.



3.) En el Solucion explorer, presione clic derecho sobre la carpeta Models y luego en la ventana seleccione Ado Entity Data Model, con el nombre: NorthwindModel.edmx

Seleccione las tablas: Orders, Customers, Employees







Antes de continuar compile el proyecto.

4.) Presione Clic derecho sobre la carpeta de Controllers, luego add y por ultimo Controller....




Nombre: PedidosController
Template: Adding a controller with read/write actions and views, using Entity Framework 
Model Data Class: Orders (Nombre proyecto.Models)
Data Context class: NortwindEntities (Nombre proyecto.Models)
Views: Razor (cshtml)

5.) Agregando templates: 
5.1) Cree las siguientes carpetas,  View , shared 

DisplayTemplates
EditorTemplates
5.2) Cree el archivo display en la carpeta DisplayTemplates con el nombre DateTime


Agregue el siguiente código:

@model Nullable<DateTime> 
@(Model != null ? string.Format("{0:d}", Model) : string.Empty)

5.3) Cree el archivo Editor en la carpeta EditorTemplates con el nombre DateTime (ver paso 5.2)

Agregue el siguiente código:

@model Nullable<DateTime> 

 @{ 
    DateTime dt = DateTime.Now; 
    if (Model != null) 
    { 
       dt  = (System.DateTime) Model; 
    
    } 
    @Html.TextBox("", String.Format("{0:d}", dt.ToShortDateString()), 
     new { @class = "datefield", type = "date"  }) 
} 

6.) En Visual Studio clic en Tools, Library Package Manager, Manager NuGet Packages.

Busque online: jquery.ui
Seleccione jQuery.UI.Widgets.Datepicker 



Esto agregar los siguientes archivos:


  • jquery.ui.core.js
  • jquery.ui.core.min.js
  • jquery.ui.datepicker.js
  • jquery.ui.datepicker.min.js


7.) Por ultimo agregue el archivo DatePickerReady.js en la carpeta Script


$(function () {
    $(".datefield").datepicker();
});


8.) Agregue las referencias a los jquery, en el archivo layout.cshtml localizada en view, share.

  <link href="@Url.Content("~/Content/themes/base/jquery.ui.core.css")"  
        rel="stylesheet" type="text/css" /> 
    <link href="@Url.Content("~/Content/themes/base/jquery.ui.datepicker.css")"  
        rel="stylesheet"  type="text/css" /> 
    <link href="@Url.Content("~/Content/themes/base/jquery.ui.theme.css")"  
        rel="stylesheet" type="text/css" /> 

    <script src="@Url.Content("~/Scripts/jquery.ui.core.min.js")"  
        type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.ui.datepicker.min.js")"  
        type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/DatePickerReady.js")"  
        type="text/javascript"></script>



Si quieren que el picker este en español tienen que descargar de http://jqueryui.com/ las librerías de jquery y luego agregar el layourt.cshtml

 <script src="@Url.Content("~/Scripts/jquery.ui.datepicker-es.js")"  
        type="text/javascript"></script>

Luego cambiar la función DatePickerReady.js por:


$(function () {
    $(".datefield").datepicker($.datepicker.regional[ "es" ] );
});


Para cambiar los colores de su control ingrese a:
http://jqueryui.com/



Ver