47
https://onedrive.live.com/?cid=3619ca7a3d74929a&id=3619CA7A3D74929A %21330 El GridView y sus eventos: El evento PageIndexChanging En este post, vamos a ver el evento PageIndexChanging del GridView. Vamos a ver cuando se ejecuta, cual es su finalidad y lo que nos aporta. El GridView es un control que nos proporciona ASP.NET cuya funcionalidad es “trabajar” con información tabular. Seguramente es uno de los controles más usados y a lo lardo de las distintas versiones de Visual Estudio, ha cambiado el nombre, pero siempre se ha mantenido. Este control, es muy pesado y consume gran cantidad de memoria pero aporta mucha funcionalidad que muchas veces no llegamos a aprovechar porque generalmente lo usamos para mostrar información (entendamos que hablo de aplicaciones Web). Este post forma parte de una serie de post llamada El GridView y sus Eventos. Los post que forman esta serie y que si has llegado aquí te pueden interesar son: El GridView y sus eventos: El evento RowDataBound . El GridView y sus eventos: El evento PageIndexChanging . Ordenando un GridView mediante el evento Sorting (El GridView y sus eventos: El evento Sorting) . El evento PageIndexChanging. El GridView, nos aporta la posibilidad de poder paginar los resultadospudiendo así mostrar cada vez un conjunto de registros. Esto lo conseguimos, si le seteamos a true la propiedad AllowPaging, y también podemos indicarle el número de registros que queremos mostrar cada vez (por defecto, si no recuerdo mal es 10) por medio de la propiedad PageSize. El código necesario sería el siguiente:

Inner Join

Embed Size (px)

Citation preview

Page 1: Inner Join

https://onedrive.live.com/?cid=3619ca7a3d74929a&id=3619CA7A3D74929A%21330

El GridView y sus eventos: El evento PageIndexChanging

En este post, vamos a ver el evento PageIndexChanging del GridView.

Vamos a ver cuando se ejecuta, cual es su finalidad y lo que nos aporta.

El GridView es un control que nos proporciona ASP.NET cuya

funcionalidad es “trabajar” con información tabular. Seguramente es uno

de los controles más usados y a lo lardo de las distintas versiones de

Visual Estudio, ha cambiado el nombre, pero siempre se ha mantenido.

Este control, es muy pesado y consume gran cantidad de memoria pero

aporta mucha funcionalidad que muchas veces no llegamos a

aprovechar porque generalmente lo usamos para mostrar información

(entendamos que hablo de aplicaciones Web).

Este post forma parte de una serie de post llamada El GridView y sus

Eventos. Los post que forman esta serie y que si has llegado aquí te

pueden interesar son:

El GridView y sus eventos: El evento RowDataBound .

El GridView y sus eventos: El evento PageIndexChanging .

Ordenando un GridView mediante el evento Sorting (El GridView y

sus eventos: El evento Sorting).

El evento PageIndexChanging.

El GridView, nos aporta la posibilidad de poder paginar los

resultadospudiendo así mostrar cada vez un conjunto de registros. Esto

lo conseguimos, si le seteamos a true la propiedad AllowPaging, y

también podemos indicarle el número de registros que queremos

mostrar cada vez (por defecto, si no recuerdo mal es 10) por medio de la

propiedad PageSize.

El código necesario sería el siguiente:

Page 2: Inner Join

<asp:GridView

ID="gvCities"

runat="server"

DataKeyNames="CityCode"

CssClass="cssTableGrid"

AutoGenerateColumns="False"

AllowPaging="true"

PageSize="15"

OnPageIndexChanging="GvCities_PageIndexChanging"> </asp:GridView>

Cuando seteamos la propiedad AllowPaging a true, además de

mostrar los resultados de forma paginada, nos muestra en la

parte inferior del control un control de paginación (que no cumple

las guidelines que vimos anteriormente, pero menos da una piedra   ;-) ).

El evento PageIndexChanging, se levanta cada vez que pulsamos

en uno de los links del control de paginación. La implementación

sería algo así:

protected void GvCities_PageIndexChanging(object sender,

GridViewPageEventArgs e)

{

GridView gv = (GridView)sender;

gv.PageIndex = e.NewPageIndex;

bindCitiesGrid();

}

En los argumentos del evento (del tipo GridViewPageEventArgs),

recibimos el nuevo indice de página, este, unicamente tenemos que

asignarselo a la propiedad PageIndex del GridView y ya esta todo hecho,

la proxima que hagamos el binding del control nos mostrara el conjunto

que esperamos.

Sencillo verdad, pues esto es todo. Podeis probar a poner el GridView

(como en el código de ejemplo :-D) dentro de UpdatePanel y vereis como

el resultado es bastante aparente (costando muy poco trabajo).

Post relacionados.

 protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)        {            GridView1.PageIndex = e.NewPageIndex;            LLenarDatos();        }

Page 3: Inner Join

hola tengo este codigo que me busca registros segun el codigo que ingreso

 if (TEXTO1.Text.Length == 0)            {                Label3.Text = "NO HAY CAMPOS INGRESADOS INTENTELO OTRA VEZ";            }            

            else            {                DataTable dt = new DataTable();                using (SqlConnection conn = new SqlConnection("Data Source=LABINF201B13;Initial Catalog=REGISTRO;Integrated Security=True"))                {

                    SqlCommand cmd = new SqlCommand("BUSCARCODIGO", conn);                    cmd.CommandType = CommandType.StoredProcedure;

                    cmd.Parameters.AddWithValue("@codigo", this.TEXTO1.Text);

                    SqlDataAdapter da = new SqlDataAdapter(cmd);                    da.Fill(dt);                }

                GridView1.DataSource = dt;                GridView1.DataBind();                Label3.Text = "BUSQUEDA REALIZADA CON EXITO";            }

agregar columna de checkbox a un datagridEstas en el tema de agregar columna de checkbox a un datagrid en el foro de ASPX (.net) en Foros del Web. Hola . Que tal espero que alguien me pueda ayudar, estoy haciendo un sistema de inventario en web y tengo una coneccion a una base ...

  #1 (permalink) 04/07/2008, 13:28

Manuelon79Fecha de Ingreso: julio-2008Mensajes: 2Antigüedad: 5 años, 8 mesesPuntos: 0

Page 4: Inner Join

 agregar columna de checkbox a un datagrid

Hola .

Que tal espero que alguien me pueda ayudar, estoy haciendo un sistema de inventario en web y tengo una coneccion a una base de datos en Oracle, hago una consulta y me muestra un datagrid con la informacion que pido en la consulta.  

A ese datagrid le quiero poner un campo con checkbox para elegir uno o varios registros del datagrid, pero cuando me meto a "Editar columnas..." agrego el "Campo CheckBox" y se ve la columna pero no los checkbox ni a la hoda de correrlo.  Que puedo hacer para que se vean, y para poder modificar los registros que seleccione y mandarlos a un reporte en CrystalReport ??

Les agradeceria que me ayudaran estoy en Visual Studio 2005 con ASP.netgracias .

Avisos Google

  #2 (permalink) 04/07/2008, 13:46

juantuxFecha de Ingreso: marzo-2005Mensajes: 59Antigüedad: 9 añosPuntos: 1

Respuesta: agregar columna de checkbox a un datagrid

Estimado, 

hazlo con un Template del gridview. Edita las columnas del gridview, agregas una columna itemTemplate, luego te vas a la edicion de la plantilla, y en la seccion itemTemplate arrastras un control checkbox a la sección.

Deberia quedarte algo asi:

Código:<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="reg" DataSourceID="SqlDataSource1" Style="position: static"> <Columns> <asp:BoundField DataField="reg" HeaderText="reg" ReadOnly="True" SortExpression="reg" /> <asp:BoundField DataField="agricultor" HeaderText="agricultor" SortExpression="agricultor" />

Page 5: Inner Join

<asp:BoundField DataField="rut" HeaderText="rut" SortExpression="rut" /> <asp:BoundField DataField="mail" HeaderText="mail" SortExpression="mail" /> <asp:TemplateField HeaderText="Seleccion"> <ItemTemplate> <asp:CheckBox ID="CheckBox1" runat="server" Style="position: static" /> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>

Despues solo te faltaría programar el checkbox, recorriendo la grilla y utlizando findcontrol para obtener los elementos seleccionados. 

Espero haberte apoyado un poco.

Suerte,

JuantuxAvisos Google

Simple Project ManagementYes. It's easy. Nothing to install. Try it Free! www.smartsheet.com

  #3 (permalink) 22/07/2008, 12:19

oscarfmtFecha de Ingreso: julio-2008Mensajes: 1Antigüedad: 5 años, 8 mesesPuntos: 0

Respuesta: agregar columna de checkbox a un datagrid

Buen dia Juantux!

Qusiera saber una cosa con respecto a la solución q propones....viendo q se define un "ID" para el checkbox...

<ItemTemplate><asp:CheckBox ID="CheckBox1" runat="server" Style="position: static" /></ItemTemplate>

Cómo puedo identificar el checkbox de una fila con el de otra dentro del GridView?, o cómo puedo asignar ID's distintos a estos?, puedo hacerlos en tiempo de ejecucion?

Lo intente hacer recorriendo la grilla y refiriendome al control asi:

GridView1.Rows(index).Cell(index1).Controls(0)

pero no consigo obtener el cotrol...

De antemano agradezco cualquier ayuda

  #4 (permalink) 23/07/2008, 01:16

guillermoestebanFecha de Ingreso: mayo-2006Mensajes: 178Antigüedad: 7 años, 10 mesesPuntos: 3

Page 6: Inner Join

Respuesta: agregar columna de checkbox a un datagrid

Depende donde necesites acceder a ese checkbox. Si es en un metodo itemdatabound, itemcommand o es desde fuera.

Para acceder desde fuera, p.e, al pulsar un botón:

For Each item As DataGridItem In Datagrid1.ItemsDim MiCheck1 As CheckBox = CType(item.FindControl("CheckBox1"), CheckBox)If Not (MiCheck1 Is Nothing) ThenIf MiCheck1.Checked = True Thenresponse.write ("<BR> Seleccionado fila con ID: " & Datagrid1.DataKeys(item.DataSetIndex))End IfEnd IfNext

  #5 (permalink) 24/08/2010, 09:06

keyhidalgobFecha de Ingreso: agosto-2010Mensajes: 3Antigüedad: 3 años, 7 mesesPuntos: 0

 Gracias Amigo

Muchas gracias amigo, después de mucho buscar en la web no encontré mejor respuesta que la tuya. Te

lo agradezco 

Cita:

Iniciado por juantux Estimado, 

hazlo con un Template del gridview. Edita las columnas del gridview, agregas una columna itemTemplate, luego te vas a la edicion de la plantilla, y en la seccion itemTemplate arrastras un control checkbox a la sección.

Deberia quedarte algo asi:

Código:<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="reg" DataSourceID="SqlDataSource1" Style="position: static"> <Columns> <asp:BoundField DataField="reg" HeaderText="reg" ReadOnly="True" SortExpression="reg" /> <asp:BoundField DataField="agricultor" HeaderText="agricultor" SortExpression="agricultor" /> <asp:BoundField DataField="rut" HeaderText="rut" SortExpression="rut" /> <asp:BoundField DataField="mail" HeaderText="mail" SortExpression="mail" />

Page 7: Inner Join

<asp:TemplateField HeaderText="Seleccion"> <ItemTemplate> <asp:CheckBox ID="CheckBox1" runat="server" Style="position: static" /> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>

Despues solo te faltaría programar el checkbox, recorriendo la grilla y utlizando findcontrol para obtener los elementos seleccionados. 

Espero haberte apoyado un poco.

Suerte,

Juantux

Formular una pregunta

Acceso rápido

Buscar conversaciones relacionadas

Principales respuestas

ablanco

1.270 Puntos1010

Page 8: Inner Join

Conversaciones de ablanco Ver perfil

Conversaciones relacionadas importantes Mostrar valor booleano de un gridview en checkbox ASP.NET C# GridView y Checkbox C# asp.net Ayuda con checkbox en gridview paginado asp.net y c# en visual studio 2010 CheckBox en GridView C# aspx Ayuda con checkbox en gridview asp.net

Checkbox en Gridview ASP.Net C# Foros de Desarrollo

 > 

ASP.NET

Pregunta

0

Inicie sesión para votar

Actualmente estoy haciendo un Gridview en asp.net C#, mi problema es que dentro

de mi gridview necesito tener 2 checkbox, uno para "Aceptar" una requisicion y el

otro para "Rechazar" la verdad es que me he quedado hasta este punto y necesito

entregar este proyecto pronto, agradeceria su ayuda muchisimo.

Gracias.

PD Esta es la forma en la que he creado mi GridView en ASP.Net

<td>

                <asp:GridView ID="GridView1" runat="server"

AutoGenerateColumns="False"

                    CellPadding="4" GridLines="Horizontal" BackColor="White"

                    BorderColor="#336666" BorderStyle="Double" BorderWidth="3px"

                    onpageindexchanged="GridView1_PageIndexChanged"

                    onpageindexchanging="GridView1_PageIndexChanging">

                <Columns>

                <asp:TemplateField HeaderText="ID">

                     <ItemTemplate>

                        <asp:Label ID="lblID" runat="server" Text='<%# Eval("ID")

%>'></asp:Label>

                     </ItemTemplate>

                </asp:TemplateField>

                <asp:TemplateField HeaderText="Part">

Page 9: Inner Join

                     <ItemTemplate>

                        <asp:Label ID="lblPart" runat="server" Text='<%# Eval("Part")

%>'></asp:Label>

                     </ItemTemplate>

                </asp:TemplateField>

                <asp:TemplateField HeaderText="Scrapfactor">

                     <ItemTemplate>

                        <asp:Label ID="lblScrapfactor" runat="server" Text='<%#

Eval("Scrapfactor") %>'></asp:Label>

                     </ItemTemplate>

                </asp:TemplateField>

                <asp:TemplateField HeaderText="Converfactor">

                     <ItemTemplate>

                        <asp:Label ID="lblConverfactor" runat="server" Text='<%#

Eval("Converfactor") %>'></asp:Label>

                     </ItemTemplate>

                </asp:TemplateField>

                <asp:TemplateField HeaderText="BOMQPA">

                     <ItemTemplate>

                        <asp:Label ID="lblBOMQPA" runat="server" Text='<%#

Eval("Bomqpa") %>'></asp:Label>

                     </ItemTemplate>

                </asp:TemplateField>

                <asp:TemplateField HeaderText="Routing">

                     <ItemTemplate>

                        <asp:Label ID="lblRouting" runat="server" Text='<%#

Eval("Routing") %>'></asp:Label>

                     </ItemTemplate>

                </asp:TemplateField>

                <asp:TemplateField HeaderText="Design">

                     <ItemTemplate>

                        <asp:Label ID="lblDesign" runat="server" Text='<%#

Eval("Design") %>'></asp:Label>

                     </ItemTemplate>

                </asp:TemplateField>

                <asp:TemplateField HeaderText="Plannercode">

                     <ItemTemplate>

                        <asp:Label ID="lblPlannercode" runat="server" Text='<%#

Eval("Plannercode") %>'></asp:Label>

                     </ItemTemplate>

                </asp:TemplateField>

                <asp:TemplateField HeaderText="EngRecords">

                     <ItemTemplate>

                        <asp:Label ID="lblEngrecord" runat="server" Text='<%#

Eval("Engrecord") %>'></asp:Label>

                     </ItemTemplate>

Page 10: Inner Join

                </asp:TemplateField>

                <asp:TemplateField HeaderText="Inslevel">

                     <ItemTemplate>

                        <asp:Label ID="lblInslevel" runat="server" Text='<%#

Eval("Inslevel") %>'></asp:Label>

                     </ItemTemplate>

                </asp:TemplateField>

                <asp:TemplateField HeaderText="Status">

                     <ItemTemplate>

                        <asp:Label ID="lblStatus" runat="server" Text='<%# Eval("Status")

%>'></asp:Label>

                     </ItemTemplate>

                </asp:TemplateField>

                <asp:TemplateField HeaderText="Comments">

                     <ItemTemplate>

                        <asp:Label ID="lblComments" runat="server" Text='<%#

Eval("Comments") %>'></asp:Label>

                     </ItemTemplate>

                </asp:TemplateField>

                <asp:TemplateField HeaderText="Fecha">

                     <ItemTemplate>

                        <asp:Label ID="lblFecha" runat="server" Text='<%# Eval("Fecha")

%>'></asp:Label>

                     </ItemTemplate>

                </asp:TemplateField>

               <asp:TemplateField HeaderText="Accept">

                     <ItemTemplate>

                        <asp:CheckBox ID="chkAccept" runat="server"

EnableViewState="true" Checked='<%#Convert.ToBoolean(Eval("Accept")) %>' />

                     </ItemTemplate>

                </asp:TemplateField>

               

                </Columns>

martes, 10 de septiembre de 2013 18:23

Responder

|

Citar

|

Chuy Orozco

0 Puntos

Page 11: Inner Join

Respuestas

2

Inicie sesión para votar

Ola chuy, eso es facil, lo que tienes que hacer es recorrer tu gridview, encuentras

cuales son los chulos de aceptados y los de rechazados y realizas el codigo. seria

algo así

foreach (GridViewRow dtgItem in this.Gridview.Rows)

            {                

                CheckBox Sel =

((CheckBox)Gridview.Rows[dtgItem.RowIndex].FindControl("chkAccept"));  CheckBox SelRech =

((CheckBox)Gridview.Rows[dtgItem.RowIndex].FindControl("chkRechazar"));                bool valor = Sel.Checked;

                if (valor)

                {

//aqui realizas tu codigo que acepta las solicitudes

}

bool valorRech = SelRech.Checked;

if(valorRech )

{

// aqui rechazas las solicitudes

}

}

Salu2

o Marcado como respuesta Chuy Orozco martes, 10 de septiembre de 2013 20:08

martes, 10 de septiembre de 2013 19:59

Responder

|

Citar

|

ablanco

1.270 Puntos

Page 14: Inner Join

Inicie sesión para votar

hola

pero no veo el problema, asi como defines el

<asp:TemplateField HeaderText="Accept">

                     <ItemTemplate>

                        <asp:CheckBox ID="chkAccept" runat="server"

EnableViewState="true" Checked='<%#Convert.ToBoolean(Eval("Accept"))

%>' />

                     </ItemTemplate>

                </asp:TemplateField>

puedes definir otro que sea

<asp:TemplateField HeaderText="Rechazar">

<ItemTemplate>

    <asp:CheckBox ID="chkRechazar" runat="server" EnableViewState="true"   

Checked='<%#Convert.ToBoolean(Eval("Rechazar")) %>' />

     </ItemTemplate>

</asp:TemplateField>

con eso defines otra columna para ese tipo de dato

por supuesto vas a tener que agregar validaciones para que no se puedan marcar

ambas

saludos

Leandro Tuttini

Blog

Buenos Aires

Argentinao Marcado como respuesta Chuy Orozco martes, 17 de septiembre de 2013 17:01

o Desmarcado como respuesta Chuy Orozco martes, 17 de septiembre de 2013 17:09

martes, 10 de septiembre de 2013 18:51

Responder

|

Citar

|

Page 15: Inner Join

Leandro Tuttini

Baufest

(Partner, MVP)

594.260 Puntos

0

Inicie sesión para votar

Juan Carlos/Leandro :

De antemano gracias por su pronta respuesta, basicamente lo que necesito es

saber como puedo validarlo, en Teoria tengo ya mi estructura del GridView en la

parte de ASP.Net,necesito saber la parte de la validacion en C#,por ejemplo,

selecciono 5 checkbox de "accept" y doy click en un boton que me cambie el

campo status a "Aceptado" lo mismo para Reject podrian ayudarme con eso, de

antemano muchas muchas gracias por la atencion.

Saludos

o Editado Chuy Orozco martes, 10 de septiembre de 2013 19:34

martes, 10 de septiembre de 2013 19:29

Responder

|

Citar

|

Chuy Orozco

0 Puntos

0

Inicie sesión para votar

Page 16: Inner Join

pero entonces los checkbox son de solo lectura? o sea informativos

o es que el usuario marca los checkbox

porque segun veo hay un boton que realiza acciones y cambia el estado de la

entidad para pasarlo de estado, lo cual se reflejaria en los checkbox

es asi como lo planteo ?

saludos

Leandro Tuttini

Blog

Buenos Aires

Argentina

martes, 10 de septiembre de 2013 19:33

Responder

|

Citar

|

Leandro Tuttini

Baufest

(Partner, MVP)

594.260 Puntos

0

Inicie sesión para votar

Leandro:

Nuevamente gracias por la atencion, el usuario revisara las requisiciones, y

tendra la opcion de Aceptar o Rechazar los cambios segun la seleccion del

checkbox, el usuario sera quien seleccione que Checkbox marcara si "Aceptar" o

"Rechazar", una vez que el usuario marque los checkbox que necesite, dara click

en el boton que ejecutara que se guarde si se acepto o rechazo la requisicion.

Page 17: Inner Join

Gracias

martes, 10 de septiembre de 2013 19:41

Responder

|

Citar

|

Chuy Orozco

0 Puntos

2

Inicie sesión para votar

Ola chuy, eso es facil, lo que tienes que hacer es recorrer tu gridview, encuentras

cuales son los chulos de aceptados y los de rechazados y realizas el codigo. seria

algo así

foreach (GridViewRow dtgItem in this.Gridview.Rows)

            {                

                CheckBox Sel =

((CheckBox)Gridview.Rows[dtgItem.RowIndex].FindControl("chkAccept"));  CheckBox SelRech =

((CheckBox)Gridview.Rows[dtgItem.RowIndex].FindControl("chkRechazar"));                bool valor = Sel.Checked;

                if (valor)

                {

//aqui realizas tu codigo que acepta las solicitudes

}

bool valorRech = SelRech.Checked;

if(valorRech )

{

// aqui rechazas las solicitudes

}

}

Salu2

Page 18: Inner Join

o Marcado como respuesta Chuy Orozco martes, 10 de septiembre de 2013 20:08

martes, 10 de septiembre de 2013 19:59

Responder

|

Citar

|

ablanco

1.270 Puntos

0

Inicie sesión para votar

aBlanco buenos dias:

Me ha surgido un nuevo problema, y es que una vez que he resuelto lo del

checkbox con tu valiosa ayuda, necesito saber como colocar que cada una de las

filas que tienen el checkbox.checked cambien su campo status a "Accepted o

Rejected segun el checkbox", disculpa por tanta pregunta pero mi novates me

gana.

Gracias de antemano.

martes, 17 de septiembre de 2013 17:09

Responder

|

Citar

|

Chuy Orozco

0 Puntos

Page 19: Inner Join

Como obtener datos de un gridview y guardarlos en una variable Session para llevarlos a otra pàgina?? Foros de Desarrollo

 > 

ASP.NET

Pregunta

0

Inicie sesión para votar

Hola amigos pasa que tengo un Gridview el cual tiene mis siguientes campos (este

gridview solo està lleno con una fila nada mas):

nombre  editorial autor edicion precio

lo que quiero es almacenar los datos de esa fila en variables las cuales con

variables Session que me permitan llevarlas a otra pagina y mostrarlas en una

tabla. Lo que he hecho hasta ahora es lo siguente:

  protected void GridView1_DataBound(object sender, EventArgs e)

    {

        string nombre = GridView1.Rows[0].Cells[0].ToString();

        string editorial = GridView1.Rows[1].Cells[1].ToString();

        string autor = GridView1.Rows[2].Cells[2].ToString();

        string edicion = GridView1.Rows[3].Cells[3].ToString();

        int precio = Convert.ToInt32(GridView1.Rows[4].Cells[4].ToString());

        Session["nombre"] = nombre;

        Session["editorial"] = editorial;

        Session["autor"] = autor;

Page 20: Inner Join

        Session["edicion"] = edicion;

        Session["precio"] = precio;

Quiero decirles que he tratado incluso cambiando ToString por Text pero  sin

resultado alguna pues obtengo en ambas el mismo error: "El index estaba fuera del

intervalo. Debe ser un valor no negativo e inferior al tamaño de la coleccion"

De antemano muchas gracias amigo

viernes, 23 de noviembre de 2012 22:59

Responder

|

Citar

|

Alejo_Blue

0 Puntos

Todas las respuestas

0

Inicie sesión para votar

porque usas el evento DataBound, ese no es correcto, debes usar el

SelectedIndexChanged

y en este tomar los datos

[ASP.NET] GridView – Edición Empleados

alli muestro como tomar el id para editar la entidad, veras como suar el evento

que menciono para redireccionar a la pagina de edicion

saludos

Leandro Tuttini

Page 21: Inner Join

Adjuntar el checkBox a un GridView: Aunque esto se puede hacer por la opcion de editar template de la vista de diseño, yo lo hare en la vista de codigo por medio de html. Este fragmento de codigo va dentro de la etiqueta <colums> que se agrega automaticamente cuando arrastramos un gridview a nuestra pagina. 

<asp:TemplateField HeaderText = "Agregar"> <ItemTemplate> <asp:CheckBox ID="CheckBoxPurchase"runat="server" Enabled="true"OnCheckedChanged="CheckBox... AutoPostBack="true"/> </ItemTemplate> <ControlStyle CssClass="TextoPublicacion" /> <HeaderStyle CssClass="Subtitulos" /> <ItemStyle HorizontalAlign="Center" Width="10%" /> </asp:TemplateField> 

2. Guardar las casillas seleccionadas en el evento disparado al hacer click en una casilla. Este fragmento va dentro del archivo cs del respectivo formulario web. Este evento hay que hacerlo manulamente. No lo genera .net 

protected void CheckBox1_CheckedChanged1(object sender, EventArgs e){ int Pos = 0; foreach (GridViewRow Fila in GvFunciones.Rows){ CheckBox Aux = (CheckBox)Fila.FindControl("CheckBoxPurc... if (Aux.Checked){ VectorDeFuncionesSeleccionadas.SetValu... Pos + (GvFunciones.PageSize*GvFunciones.PageIn... } else{ VectorDeFuncionesSeleccionadas.SetValu... Pos + GvFunciones.PageSize * GvFunciones.PageIndex); } Pos++; } } 

3. Crear el evento PageIndexChanged. y pintar los checkBox en ese momento. Este evento si lo genera .net de la siguiente forma: Seleccionan el gridview; En la ventana de propiedades seleccionan los eventos (icono de rayito) y dan doble clik en en la casilla contigua que dice PageIndexChanged. En ese momento en el archivo cs se crea el metodo que se desencadenara cuando cambien de pagina en el grid view (que se debe activar poniendo en true la propiedad allowpaging del grid view). 

protected void GvFunciones_PageIndexChanged(object sender, EventArgs e) { int Aux = GvFunciones.PageIndex * GvFunciones.PageSize; int i = 0; foreach (GridViewRow Fila in GvFunciones.Rows) { if (VectorDeFuncionesSeleccionadas.GetValue... + Aux).ToString() == "1") { ((CheckBox)Fila.FindControl("CheckBoxP... = true; } 

Page 22: Inner Join

else ((CheckBox)Fila.FindControl("CheckBoxPur... = false; i++; } } Y listo, espero haber sido claro. Nos vemos

RE: problema con gridview y checkbox

 

Es la opción por la que he optado, aunque en vez de utilziar una lista genérica he construído una cadena concatenando los ID, para luego volcar el esos valores en un campo texto oculto. Cómo podría utilzar las listas genéricas en este caso, porque he probado y claro, no me deja pasarle al hiddentext la lista genérica como value. ¿Podría enviar esa lista genérica a otra página?

Adjunto el código creado

protected void Button1_Click(object sender, EventArgs e)

{

string valores = "";

DataKey key;

foreach (GridViewRow fila in resultados.Rows)

{

bool result = ((CheckBox)fila.FindControl("CheckBox1")).Checked;

if (result)

{

key = resultados.DataKeys[fila.RowIndex];

valores = valores + key.Value.ToString() + ",";

}

}

Page 23: Inner Join

if (valores != "")

{

   valores = valores.Remove(valores.Length - 1);

}

idsH.Value = valores;

}

Un saludo!

Volver arriba#10 - 25/10/2006 14:18:35 Reporta abuso | Link Permanente

subgurimFecha de registro: 01/12/20061 post en este tema242 posts en acceso y trabajo con datos1777 posts en todos los foros

RE: problema con gridview y checkbox

 

Curiosamente ayer me pidieron algo similar en una empresa.

El problema es que, como tú dices, al checkbox no se le puede asignar un valor específico. Simplemente se le da true o false (checked o !checked).

Para tu caso, una solución sería que al pulsar el botón, 1.- Se recorrieran todas las filas del gridview, 2.- Se accediera al valor del checkbox,     2.1- Si está seleccionado acceder al  Id de esa fila (que deberías haber definido como un DataKeyName del gridview), y guardarlo en un listado genérico3.- Al acabar de leer todas las filas, el listado genérico contendría todas las IDs que han sido checkeadas.

Seguro que hay otras soluciones, pero esta es la que se me ha

ocurrido al vuelo 

Volver arriba

hola Marian.decolores este es el codigo que utilise en el evento click el boton ,  no se si sea la forma mas correcta de hacerlo pero ps el resultado que estoy buscando me lo da  y como no encontre otra forma asi lo deje jejeje saludos espero que te sirva de ayuda 

SqlConnection cn = new SqlConnection("user id=sa;password=;database=corres_envia;server=(local)");

SqlCommand cmd = new SqlCommand();

Page 24: Inner Join

string[,] arreglo = new string[GridView1.Rows.Count, 7];

foreach (GridViewRow row in GridView1.Rows)

{

CheckBox chkbox1 = (CheckBox)row.FindControl("chkseleccion");

if (chkbox1.Checked)

{

arreglo[row.RowIndex, 0] = GridView1.Rows[row.RowIndex].Cells[1].Text;

arreglo[row.RowIndex, 1] = GridView1.Rows[row.RowIndex].Cells[2].Text;

arreglo[row.RowIndex, 2] = GridView1.Rows[row.RowIndex].Cells[3].Text;

arreglo[row.RowIndex, 3] = GridView1.Rows[row.RowIndex].Cells[4].Text;

arreglo[row.RowIndex, 4] = GridView1.Rows[row.RowIndex].Cells[5].Text;

arreglo[row.RowIndex, 5] = GridView1.Rows[row.RowIndex].Cells[6].Text;

arreglo[row.RowIndex, 6] = GridView1.Rows[row.RowIndex].Cells[7].Text;

try

{

cmd.CommandText = "delete datos_docto where nombre_usu='" + Session["usuarioelim"] + "'and noOficio_datos='" + arreglo[row.RowIndex, 1].ToString() + "' and envioA_docto='" + arreglo[row.RowIndex, 5].ToString() + "' and fecha_docto='" + arreglo[row.RowIndex, 6].ToString() + "'";

cmd.Connection = cn;

cn.Open();

cmd.ExecuteNonQuery();

cn.Close();

}

catch (Exception er)

{

Response.Write(er.Message);

}

}

Page 25: Inner Join

C# - [DataGridView] – Uso del CheckBox - DataGridViewCheckBoxColumn

 

Introducción

El articulo intentara mostrar las algunas forma en que se puede utilizar el checkbox

en un control DataGridView.

Detectar el cambio en la selección

Para realizar la tarea se hará uso de dos eventos que pueden ser igual de útiles, el

CellValueChange y el CellContentClick

De forma estándar el CellValueChange, se deparará a seleccionar el check de la

celda y quitar el foco de la misma, saliendo del modo de edición.

Pero este no ejecuta la acción en el mismo instante en que se origina, sino que hay

que salir de la edición de la celda para que el evento ocurra.

01.private void dataGridView1_CellValueChanged(object sender,

DataGridViewCellEventArgs e)

02.{

03.//

04.// Solo se trabaja ante los cambios en la columan de los checkbox

05.//

06.if (dataGridView1.Columns[e.ColumnIndex].Name == "Seleccion") {

07.//

08.// Se toma la fila seleccionada

09.//

10.DataGridViewRow row = dataGridView1.Rows[e.RowIndex];

11. 

12.//

13.// Se selecciona la celda del checkbox

14.//

Page 26: Inner Join

15.DataGridViewCheckBoxCell cellSelecion =

row.Cells["Seleccion"] as DataGridViewCheckBoxCell;

16. 

17.//

18.// Se valida si esta checkeada

19.//

20.if (Convert.ToBoolean(cellSelecion.Value)) {

21. 

22.string mensaje = string.Format("Evento CellValueChanged.\n\nSe ha

seccionado, \nDescripcion: '{0}', \nPrecio Unitario: '{1}', \nMedida:

'{2}'",

23.row.Cells["Descripcion"].Value,

24.row.Cells["PrecioUnitario"].Value,

25.row.Cells["UnidadMedida"].Value);

26. 

27.MessageBox.Show(mensaje, "", MessageBoxButtons.OK,

MessageBoxIcon.Information);

28. 

29.}

30. 

31.}

32. 

33.}

Con respecto al CellContentClick, que si ejecuta la acción en el mismo momento en

que el usuario marca, o desmarca, el checkbox, pero me encontré que solo devolvía

null en la propiedad Value de la celda.

01.private void dataGridView1_CellContentClick(object sender,

DataGridViewCellEventArgs e)

02.{

03.//

Page 27: Inner Join

04.// Detecta si se ha seleccionado el header de la grilla

05.//

06.if (e.RowIndex == -1)

07.return;

08. 

09.if (dataGridView1.Columns[e.ColumnIndex].Name == "Seleccion")

10.{

11. 

12.//

13.// Se toma la fila seleccionada

14.//

15.DataGridViewRow row = dataGridView1.Rows[e.RowIndex];

16. 

17.//

18.// Se selecciona la celda del checkbox

19.//

20.DataGridViewCheckBoxCell cellSelecion =

row.Cells["Seleccion"] as DataGridViewCheckBoxCell;

21. 

22. 

23.if (Convert.ToBoolean(cellSelecion.Value))

24.{

25. 

26.string mensaje = string.Format("Evento CellContentClick.\n\nSe ha

seccionado, \nDescripcion: '{0}', \nPrecio Unitario: '{1}', \nMedida:

'{2}'",

27.row.Cells["Descripcion"].Value,

28.row.Cells["PrecioUnitario"].Value,

Page 28: Inner Join

29.row.Cells["UnidadMedida"].Value);

30. 

31.MessageBox.Show(mensaje, "", MessageBoxButtons.OK,

MessageBoxIcon.Information);

32. 

33.}

34.else

35.{

36.string mensaje = string.Format("Evento CellContentClick.\n\nSe ha

quitado la seleccion, \nDescripcion: '{0}', \nPrecio Unitario:

'{1}', \nMedida: '{2}'",

37.row.Cells["Descripcion"].Value,

38.row.Cells["PrecioUnitario"].Value,

39.row.Cells["UnidadMedida"].Value);

40. 

41.MessageBox.Show(mensaje, "", MessageBoxButtons.OK,

MessageBoxIcon.Information);

42. 

43.}

44.}

45.}

También se ha intentado hacer uso del evento EditingControlShowing, el cual

permitiría detectar la selección en el mismo momento que el usuario realiza la

acción, pero esto no fue posible ya que este tipo de columna no provoca el evento

necesario para tomar el control CheckBox y asignar el evento

SelectedIndexChanged.

Ante este problema con los eventos, y notar que ninguno responde como debería,

se encontró un método que resolvió todos los problemas de un solo golpe, se trata

del CommitEdit

1.private void dataGridView1_CurrentCellDirtyStateChanged(object sender,

EventArgs e)

Page 29: Inner Join

2.{

3.if (dataGridView1.IsCurrentCellDirty)

4.{

5.dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);

6.}

7.}

En el evento CurrentCellDirtyStateChanged, se detecta si la grilla esta con algún

cambio pendiente, y en caso de estarlo se hace un Commit del mismo para reflejar

el valor en los eventos que lo usaran. Esto arregla los dos problemas detectados

anteriormente:

- se lanza el evento CellValueChanged, sin tener que quitar el foco de la celda

- ya no se recibe el null en el Value de la celda, en el evento CellContentClick

[C#]  [VB.NET] 

Aplicar formato a la selección

Teniendo en cuenta lo contado en la sección anterior, aplicar un formato a la fila

seleccionada no debería ser un misterio.

view source

print ?

01.private void dataGridView1_CellContentClick(object sender,

DataGridViewCellEventArgs e)

02.{

03.//

04.// Detecta si se ha seleccionado el header de la grilla

05.//

06.if (e.RowIndex == -1)

07.return;

08. 

Page 30: Inner Join

09.if (dataGridView1.Columns[e.ColumnIndex].Name == "Seleccion")

10.{

11. 

12.//

13.// Se toma la fila seleccionada

14.//

15.DataGridViewRow row = dataGridView1.Rows[e.RowIndex];

16. 

17.//

18.// Se selecciona la celda del checkbox

19.//

20.DataGridViewCheckBoxCell cellSelecion =

row.Cells["Seleccion"] as DataGridViewCheckBoxCell;

21. 

22.if (Convert.ToBoolean(cellSelecion.Value))

23.row.DefaultCellStyle.BackColor = Color.Green;   

24.else

25.row.DefaultCellStyle.BackColor = Color.White;

26. 

27.}

28.}

29. 

30.private void dataGridView1_CurrentCellDirtyStateChanged(object sender

, EventArgs e)

31.{

32.if (dataGridView1.IsCurrentCellDirty)

33.{

34.dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);

Page 31: Inner Join

35.}

36.}

Simplemente ante la detección de la selección del usuario se cambia el color de la

fila usando el DefaultCellStyle.BackColor.

[C#]  [VB.NET] 

Publicado por Leandro Tuttini   en 5:59 

Etiquetas: DataGridView, WinFo

Chequear todos los checkbox de un gridview con javascript

3112007

NOTA 16/06/2009: He publicado como hacer esta misma tarea con jQueryen este artículo, recomiendo utilizar esa alternativa por los motivos que comento en dicho artículo.

Muchas veces queremos chequear o deschequear todos los checkbox de un gridview de una sola vez, puede ser cuando el usuario realiza determinada acción en otro control, por ejemplo un botón para “seleccionar todo”, o que cuando se activa un CheckBox en la cabecera de la columna, cambie el estado de todos los checks al de la cabecera.

Si bien esto se puede hacer con código de servidor, normalmente no queremos que se realice un postback solo para esto, la solución es javascript.

(Nuevamente, si solo te interesa un código js que solucione el problema que acabo de describir, te recomiendo ir directamente a copiar los dos fragmentos de javascript al final del post.)

En su momento utilicé el código que Scott Mitchell publicó en este artículo, pero esta solución, si bien funciona y no genera un postback, requiere código de servidor, ya que en la creación de la página se registra mediante el método RegisterArrayDeclaration un array con los ids que tendrá cada checkbox en el cliente, lo que nos obliga a hacerlo en cada postback o a recargar el estado, ya sea ViewState o Session.

Buscando otra alternativa encontré este otro artículo de Mohammad Azam, el autor deGridViewGuy. Este si es un ejemplo totalmente sobre javascript, pero tiene un gran defecto: opera sobre todos los checkbox de la página, sin importar si están dentro de la grilla o no, ni hablar si tenemos dos grillas.

En este punto decidí escribir mi propia solución, o sea una totalmente en el cliente y que permita operar sobre los checkbox de una grilla en particular y, por que no, sobre una columna en particular, de manera que podamos tener más de una columna con checkbox y cambiar el estado de los checks de una de ellas sin afectar la otra.

Un poco de background que pueden saltarse si les parece:

Page 32: Inner Join

Como incluir CheckBox en una columna de un gridview

Antes que nada hay que generar una columna con los checkbox. Hay dos maneras de hacer esto como cuenta Scott Mitchell en el artículo nombrado, yo utilizo también un TemplateField (no encontré todavía utilidad para los CheckBoxField), de modo que colocando un checkbox en el ItemTemplate genero uno en cada celda del TemplateField:

<asp:TemplateField HeaderText="chk">

<ItemTemplate>

<asp:CheckBox ID="chkColumna1" runat="server" />

</ItemTemplate>

</asp:TemplateField>

Visualmente (en VisualStudio), agregamos un TemplateField al gridview y seleccionamosEditTemplate del menú contextual. Luego arrastramos un CheckBox a la zonaItemTemplate. Para finalizar: End Template Editing, en el menú contextual.

Como chequear todos CheckBox de un GridView

Esta rutina javascript cambia el estado de todos los checkbox de una grilla sin importar su ubicación:

function ChangeAllChecks(gridViewName,newState)

{

var tabla = document.getElementById(gridViewName);

celdas = tabla.cells;

for(i=0;i<celdas.length-1;i++)

{

if (celdas[i].firstChild.type=="checkbox"

&& celdas[i].firstChild.checked != newState)

{

celdas[i].firstChild.click();

}

}

}

Para llamarla utilizamos ChangeAllChecks(‘GridView1′,true); o false si es el caso

Como chequear una columna específica

Puede ocurrir que en un gridview tengamos más de un TemplateField con CheckBox, y que solo queramos chequear o deschequear una sola columna, para ello hice un nuevo método que toma como paramétro el índice de la columna (empezando por 0). (Actualizado 29/09/2008 según respuesta al comentario de Martín)

function ChangeChecksByColumn(gridViewName, newState, columnIndex){

var tabla = document.getElementById(gridViewName);

var columnas = tabla.cells.length / tabla.rows.length;

celdas = tabla.cells;

for (i = columnas + columnIndex; i < celdas.length; i += columnas){

if (celdas[i].firstChild.type == "checkbox"

&& celdas[i].firstChild.checked != newState

/* && agregar aquí otras condiciones */){

celdas[i].firstChild.click();

}

}

}

Page 33: Inner Join

Como chequear a partir de un CheckBox en la cabecera

El código anterior no es muy útil porque nos solicita el estado (true=checked/false=unchequed) en el que queremos dejar los checkbox, la solución es agregar un checkbox en la cabecera de la TemplateColumn:

y agregamos una rutina que permita identificar el estado del mismo y la columna en que se encuentra, luego llamamos al método anterior: ChangeChecksByColumn:

function CopyCheckStateByColumn(HeaderCheckBox, gridViewName)

{

var columnIndex = HeaderCheckBox.parentElement.cellIndex;

var newState = HeaderCheckBox.checked;

ChangeChecksByColumn(gridViewName, newState, columnIndex);

}

Para terminar, completamos el evento onclick del checkbox con una llamada aCopyCheckStateByColumn pasando como parámetro el propio checkbox y el nombre del gridview:(lo que sigue cambiado el 08/11 según la respuesta al comentario de Roger)

<asp:TemplateField HeaderText="chk">

<HeaderTemplate>

<asp:CheckBox ID="chkHeader" runat="server"

onclick="javascript:CopyCheckStateByColumn(this,this.offsetParent.offsetParent.id);"/>

</HeaderTemplate>

<ItemTemplate>

<asp:CheckBox ID="chkTest" runat="server" />

</ItemTemplate>

</asp:TemplateField>

Una precaución: Tener en cuenta que el código javascript consulta si el contenido es un CheckBox mediante la propiedad firstChild para cada objeto de la colección cells del objeto table, o sea: el contenido de cada TD. Si ponemos otro objeto en el ItemTemplate junto con el CheckBox, podemos tener problemas si nos descuidamos.

Un tip: Para llamar métodos javascript en el evento click de un control   Button , se debe utilizar el evento OnClientClick en vez de onclick.

Una desventaja: No funciona en Firefox.

<< Transformación del Modelo E/R al Modelo Relacional | Diseño Centrado en el Programador vs Diseño Centrado en el Usuario >>

Consultas SQL sobre multiples tablas 11. September 2010 01:21 by Oscar.SS in Desarrollo Empresarial  //  Tags: t-sql  //   Comments (6)

Continuando con el artículo anterior, veremos en este las consultas SELECT combinado columnas de distintas tablas. Este tipo de consultas nos permiten explotar nuestro almacén de negocio de forma más efectiva al relacionar datos de distintas tablas.  

Page 34: Inner Join

--------------------------------------------------------------------------------------------------------------------

--CONSULTAS DE VARIAS TABLAS (Producto cartesiano de filas)------------------------------------------------------------------------

----------------------------------------------

-- Si no se hacen coincidir los valores de las columnas relacionadas s

e obtiene gran duplicidad de filas. Tantas como-- el producto cartesiano de las filas de las tablas a las que se hace 

referencia. Ejemplo:

select * from dbo.Products, dbo.Orders

----------------------------------------------------------------------

----------------------------------------------

--UTILIZAR ALIAS EN UNA TABLA------------------------------------------------------------------------

----------------------------------------------

-- Cuando se relacionan varias tablas es normal que una misma columna forme parte de varias tablas. Para evitar -- errores de nombres duplicados podemos hacer dos cosas. Una es utili

zar la sintaxis de nombre completo:-- NombreTabla.NombreColumna.

select * from dbo.Products, dbo.Categorieswhere dbo.Products.CategoryID = dbo.Categories.CategoryID

-- La otra forma es dar un alias a cada tabla. Ejemplo:

select * from dbo.Products P, dbo.Categories Cwhere P.CategoryID = C.CategoryID

----------------------------------------------------------------------------------------------------------------------INSTRUCCIÓN JOIN ON(Coincidencia INTERNAS de columnas)--

----------------------------------------------------------------------

----------------------------------------------

--NOTA: La instrucción INNER JOIN  es exactamente lo mismo que JOIN, dado que es el valor predeterminado.

--TEORÍA--

-- La instrucción JOIN nos permite combinar varias tablas haciendo coi

ncidir los valores de las columas que nos -- interesen. Es decir, si tenemos dos tablas A y B que contienen una 

(o varias) columnas con el mismo nombre,-- podemos relacionar ambas tablas por la columna del mismo nombre.

Page 35: Inner Join

-- Por cada registro de la columna en la tabla A que también esté en l

a columna de la tabla B, obtendremos un-- una relación. Lo que quiere decir que se produce un producto cartes

iano de cada valor de la columna de la tabla A,

-- por todos los valores coincidentes de la columna en la tabla B.

--VOLVIENDO A LA BASE DE DATOS NORTHWIND--

-- 1. Por ejemplo, la tabla empleados nos facilita bastante información de los mismos. La más significativa es el

-- número de empleado, el nombre y la ciudad donde vive. Sin embargo, no nos dice nada de las ventas efectuadas por

-- cada empleado.

-- Si miramos la tabla de ventas veremos que además del número de vent

as, tenemos información del empleado que-- realizo estas ventas. Por lo tanto, por medio de la columna EmployeeID presente en las dos tablas podemos-- relacionar los empleados con el número de venta. Ejemplo:

select OrderID, LastName, FirstName, Cityfrom dbo.Orders O join dbo.Employees Eon  O.EmployeeID = E.EmployeeIDorder by OrderID

-- De este modo podemos concluir que la columna que pertenece a una tabla A y otra B sirve de nexo para relacionar-- los datos de otras columnas de la tabla A que no estan incluidos en la tabla B y viceversa.

--2. Otro caso es la tabla de productos que nos da mucha información s

obre los mismos pero apenas nos dice nada de -- la categoría a la que pertenece cada producto. Mostremos una tabla productos personal que muestre la información

-- más interesante de los productos, más el nombre de la categoría y u

na descripción de esta.

select ProductID, ProductName, C.CategoryID, CategoryName, Description, UnitPrice, UnitsInStock

from dbo.Products P join dbo.Categories C

on P.CategoryID = C.CategoryID

--3. COMBINACIÓN DE TRES TABLAS. Si nos fijamos en las tablas de emple

ados y de clientes nos damos cuenta que no hay-- forma de relacionar que empleado atendió (o vendió) a que cliente. 

Podemos hacerlo a través de la tabla de ventas-- que tiene los números de empleados y de clientes. 

Page 36: Inner Join

select E.EmployeeID, LastName, FirstName, OrderID, C.CustomerID, Compa

nyName, ContactNamefrom dbo.Orders O 

join dbo.Employees E on O.EmployeeID = E.EmployeeID 

join dbo.Customers C on O.CustomerID = C.CustomerIDorder by EmployeeID

--4. Puede darse el caso en que solo interese esta información para lo

s clientes de España.

select E.EmployeeID, LastName, FirstName, OrderID, C.CustomerID, Compa

nyName, ContactNamefrom dbo.Orders O 

join dbo.Employees E on O.EmployeeID = E.EmployeeID 

join dbo.Customers C on O.CustomerID = C.CustomerIDwhere C.Country = 'Spain'

order by EmployeeID

--5. La instrucción JOIN también podemos utilizarla para sustituir a las subconsultas. La forma de hacerlo es dando-- dos alias diferentes a una misma tabla. Ejemplo:

--    (Mostrar los empleados que son mayores que el empleado 5 (1955-03-04) ).

-- Técnica de subconsultas.select EmployeeID, LastName, FirstName, BirthDate from dbo.Employees

where BirthDate > (select BirthDate from dbo.Employees                    where EmployeeID = 5)

-- Instrucción JOIN.select E1.EmployeeID, E1.LastName, E1.FirstName, E1.BirthDate from dbo

.Employees E1 join dbo.Employees E2

on E1.BirthDate > E2.BirthDatewhere E2.EmployeeID = 5

----------------------------------------------------------------------

----------------------------------------------

--INSTRUCCIÓN OUTER JOIN (Coincidencias EXTERNAS de columnas)----------------------------------------------------------------------------------------------------------------------

-- Puede darse el caso que nos interese mostrar todos los valores de u

na columna (todas las filas) aunque no tengan -- correspondencia en la otra tabla. Así podemos tener 3 casos:

--1.Mostrar todos los valores de la tabla IZQ (LEFT), con NULL para la 

tabla DCH cuando no hay correspondenciaselect ProductID, ProductName, C.CategoryID, CategoryName, C

Page 37: Inner Join

.Description, UnitPrice, UnitsInStockfrom dbo.Products P left outer join dbo.Categories C

on P.CategoryID = C.CategoryID

--2.Mostrar todos los valores de la tabla DCH (RIGHT), con NULL para l

a tabla IZQ cuando no hay correspondencia.select ProductID, ProductName, C.CategoryID, CategoryName, C

.Description, UnitPrice, UnitsInStockfrom dbo.Products P right outer join dbo.Categories C

on P.CategoryID = C.CategoryID

--3.Mostrar todos los valores de ambas tablas (FULL) con NULL cuando n

o hay correspondencia.select ProductID, ProductName, C.CategoryID, CategoryName, C

.Description, UnitPrice, UnitsInStock

from dbo.Products P full outer join dbo.Categories Con P.CategoryID = C.CategoryID

--NOTA: La sentencia OUTER es opcional. Al incluir las sentencias LEFT, RIGHT Y FULL el sistema sabe que es una--        consulta de combinación externa. Ejemplo anterior:

select ProductID, ProductName, C.CategoryID, CategoryName, C.Description, UnitPrice, UnitsInStockfrom dbo.Products P full join dbo.Categories Con P.CategoryID = C.CategoryID

---------------------------------------------------------------------------------------------------------------------- INSTRUCCIÓN UNION (Unión de filas en distintas tablas)------------------------------------------------------------------------

----------------------------------------------

--1. Unir (UNION) todas (ALL) las filas de dos columnas de tablas diferentes.

select City from dbo.Employees

union all

select City from dbo.Customers -- Devuelve la suma de todas las filas en ambas columnas.

--2. Unir (UNION) las filas de dos columnas de tablas diferentes sin r

epetir ningún valor.

select City from dbo.Employeesunion

select City from dbo.Customers -- Devuelve la suma de todas las filas en ambas columnas pero con valores únicos.

--NOTA: Se debe cumplir que las columnas en ambas instruciones SELECT 

Page 38: Inner Join

coincidan en el tipo de datos.

-------------------------------------------------------------------------------------------------------------------- 

-- INSTRUCCIÓNES EXCEPT Y INTERSECT (Diferencia e Intersección de conj

untos)------------------------------------------------------------------------

----------------------------------------------

-- EXCEPT -- Devuelve los valores de la primera consulta que no se enc

uentran en la segunda.select City from dbo.Employees

exceptselect City from dbo.Customers

-- INTERSECT -- Devueleve una intersección de todos los valores, es decir, solo los que se encuentran ambas columnas.

select City from dbo.Employeesintersectselect City from dbo.Customers

 Combinación de más de dos tablas

Podemos hacer un "join" con más de dos tablas.

Cada join combina 2 tablas. Se pueden emplear varios join para enlazar varias tablas. Cada resultado de un join es una tabla que puede combinarse con otro join.

La librería almacena los datos de sus libros en tres tablas: libros, editoriales y autores.En la tabla "libros" un campo "codigoautor" hace referencia al autor y un campo "codigoeditorial" referencia la editorial.

Para recuperar todos los datos de los libros empleamos la siguiente consulta:

select titulo,a.nombre,e.nombre from autores as a join libros as l on codigoautor=a.codigo join editoriales as e on codigoeditorial=e.codigo;

Analicemos la consulta anterior. Indicamos el nombre de la tabla luego del "from" ("autores"), combinamos esa tabla con la tabla "libros" especificando con "on" el campo por el cual se combinarán; luego debemos hacer coincidir los valores para el enlace con la tabla "editoriales" enlazándolas por los campos correspondientes. Utilizamos alias para una sentencia más sencilla y comprensible.

Note que especificamos a qué tabla pertenecen los campos cuyo nombre se repiten en las tablas, esto es necesario para evitar confusiones y ambiguedades al momento de referenciar un campo.

Page 39: Inner Join

Note que no aparecen los libros cuyo código de autor no se encuentra en "autores" y cuya editorial no existe en "editoriales", esto es porque realizamos una combinación interna.

Podemos combinar varios tipos de join en una misma sentencia:

select titulo,a.nombre,e.nombre from autores as a right join libros as l on codigoautor=a.codigo left join editoriales as e on codigoeditorial=e.codigo;

En la consulta anterior solicitamos el título, autor y editorial de todos los libros que encuentren o no coincidencia con "autores" ("right join") y a ese resultado lo combinamos con "editoriales", encuentren o no coincidencia.

Es posible realizar varias combinaciones para obtener información de varias tablas. Las tablas deben tener claves externas relacionadas con las tablas a combinar.

En consultas en las cuales empleamos varios "join" es importante tener en cuenta el orden de las tablas y los tipos de "join"; recuerde que la tabla resultado del primer join es la que se combina con el segundo join, no la segunda tabla nombrada. En el ejemplo anterior, el "left join" no se realiza entre las tablas "libros" y "editoriales" sino entre el resultado del "right join" y la tabla "editoriales".

Consulta SQL a más de dos tablas con JOIN

Por Inyaka el 30 de Agosto de 2009 con 120,062 visitas 

PHP, MySQL y Servidor Otros tutoriales por Inyaka.

 

  

 

Muchas veces es necesario consultar a mas de una tabla y debemos aprender a poder obtener los resultados correctos de la manera mas eficiente y sencilla, para lo cual vamos a usar las siguientes tablas, sacadas de un sistema de gestión de bodegas que estamos preparando para la logística en islas claber

Page 40: Inner Join

Tablas que usaremos

Usaremos 3 tablas en este ejemplo donde la tabla us2bod nos servirá para relacionar las tablas bodegas y usuarios varios a varios 

Page 41: Inner Join

Creando las consultas

Conozco 2 formas de usar JOIN deben existir otras mas pero hasta ahora con estas me basta, uso INNER JOIN cuando quiero que solo lo resultados incluidos en el JOIN aparezcan en los resultados y LEFT JOIN cuando quiero que todos los resultados aparezcan independiente de si están o no incluidos en el JOIN, ahora vamos a hacernos algunas preguntas para poder poner en practica estos conceptos. 

Consejo importante :

El uso de * en el SELECT es muy practico a la hora de desarrollar una consulta, pero es fatal para el rendimiento de esta cuando esta en producción, por varios factores, entre ellos que el resultado que arroja la consulta es mucho mas grande de lo que realmente se necesita y que al no saber el nombre de los campos que usara, el motor (mysql en mi caso) debe previamente consultar el nombre de todos los campos de la tabla, en tablas grandes con mas de 60 campos esto es fatal, muy fatal 

Atento a la forma abreviada de poner alias a las tablas

Consulta con uso de INNER JOIN:

Primero vamos a ver quien tiene acceso a que bodega con el uso de INNER JOIN

Código :

SELECT

   u.us_nombre usuario,

   b.bod_nombre bodega 

FROM us2bod ub

INNER JOIN usuarios u ON ub.us_id =  u.us_id

INNER JOIN bodegas b ON ub.bod_id =  b.bod_id

Esto dará como resultado 

Page 42: Inner Join

Consulta con uso de LEFT JOIN:

Ahora vamos a ver a los usuarios que NO tienen bodegas asociadas, para lo cual preguntaremos que usuarios no se pudo asociar a alguna bodega

Código :

SELECT

   u.us_nombre usuario

FROM  usuarios u

LEFT JOIN us2bod ub ON u.us_id = ub.us_id

WHERE  ub.u2b_id IS NULL

Lo cual nos dará:

Espero que esto les sirva y les saque de mas un apuro (o lo metas en mas de uno si van a la bodega que tengo en casa).

Page 43: Inner Join