Foros del Web » Programación para mayores de 30 ;) » .NET »

Crear una tabla dinámicamente

Estas en el tema de Crear una tabla dinámicamente en el foro de .NET en Foros del Web. Hola a tod@s: Estoy progrmando una aplicación en C# Dentro de un página de inserción de albarán, se activa una tabla para insertar otros datos ...
  #1 (permalink)  
Antiguo 04/03/2008, 09:32
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años
Puntos: 3
Crear una tabla dinámicamente

Hola a tod@s:

Estoy progrmando una aplicación en C#

Dentro de un página de inserción de albarán, se activa una tabla para insertar otros datos relacionados con el nuevo registro a insertar.

Esta tabla se debe crear dinámicamente en relación a datos sacados de la base de datos de SQL Server de la tabla [RESIDUOS]

Los campos de la rejilla dinámica sería:

[Nombre_Residuo_1] | [Cantidad_1] | [Num_Personas_1]
[Nombre_Residuo_2] | [Cantidad_2] | [Num_Personas_2]
... ... ...
[Nombre_Residuo_n] | [Cantidad_n] | [Num_Personas_n]

Serían tantas filas como total de filas de la tabla [RESIDUOS]

Luego todos estos datos se insertarían en otra tabla de la base de datos [RESIDUOS_A], registros que se relacionarían con el inserto principal de albarán por el código de este.

Las estructuras de las tablas serían:

[RESIDUOS]
================

CREATE TABLE [dbo].[RESIDUOS](
[codigo] [int] IDENTITY(1,1) NOT NULL,
[nombreC] [nvarchar](50) COLLATE Modern_Spanish_CI_AS NOT NULL,
[nombreE] [nvarchar](50) COLLATE Modern_Spanish_CI_AS NOT NULL,
[CER1] [nvarchar](50) COLLATE Modern_Spanish_CI_AS NOT NULL,
[CER2] [nvarchar](50) COLLATE Modern_Spanish_CI_AS NOT NULL,
[CER3] [nvarchar](50) COLLATE Modern_Spanish_CI_AS NOT NULL,
[historico] [bit] NOT NULL,
CONSTRAINT [PK_RESIDUOS] PRIMARY KEY CLUSTERED
(
[codigo] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]



[RESIDUOS_A]
================

CREATE TABLE [dbo].[RESIDUOS_A](
[codigo] [int] IDENTITY(1,1) NOT NULL,
[albaran] [int] NOT NULL,
[residuo] [int] NOT NULL,
[cantidad] [int] NOT NULL,
[personas] [int] NOT NULL,
CONSTRAINT [PK_RESIDUOS_A] PRIMARY KEY CLUSTERED
(
[codigo] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]


Los datos tecleados en cada fila de tabla dinámica a crear se insertarán finalmente en esta tabla de [RESIDUOS_A]. El campo [albaran] será el ID del albarán insertado relacionado con la lista de Residuos recogida.

La cosa es como hacer para crear la susodicha tabla con tantas filas como Residuos existan.
Cada fila de esa tabla estará formada por tres columnas:
- [Nombre_Residuo] en un Label
- TextBox para recoger el dato de [Cantidad] para ese residuo
- TextBox para recoger el dato de [Num_Personas] para ese residuo

Supongo que algo como una consulta que dé el ID y Nombre de residuo y luego por cada fila crear TextBox que lleven en su ID de TextBox el ID del Residuo al que se refieren, es decir
Residuo_1 ... TextBox ID="cantidad_1" ... TextBox ID="npersonas_1"
...

Y luego habría que recoger los datos tecleados en cada una de las cajas mencionadas para crear por cada fila un registro en la tabla [RESIDUOS_A]

Espero que se me haya entendido ...

Si, por ejemplo, la tabla esa a crear dinámicamente estuviera dentro de un Panel, con un for ó algo se crearía los TextBox cómo

TextBox cantidad_txt = new TextBox();
Panel1.Controls.Add(cantidad_txt);

ó algo así???

No tengo una idea clara de cómo hacer todo esto ... ¿alguna ayudita?
__________________
Saludos,

zacktagnan.
=================================================
  #2 (permalink)  
Antiguo 06/03/2008, 13:37
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años
Puntos: 3
Re: Crear una tabla dinámicamente

Luego, ¿nadie tiene sugerencia ó idea alguna?

¿Ó es que no se entiende lo que demando?

¿Los expertos del Foro tampoco?
__________________
Saludos,

zacktagnan.
=================================================
  #3 (permalink)  
Antiguo 06/03/2008, 15:33
Avatar de jlbautista  
Fecha de Ingreso: enero-2007
Ubicación: Durango, Méx.
Mensajes: 175
Antigüedad: 17 años, 3 meses
Puntos: 1
Re: Crear una tabla dinámicamente

Veamos si entiendo:

1. Haces la consulta a la BD y obtienes la tabla RESIDUOS.
2. Ese resultado quieres meterlo en filas de 3 textBox (id, Cantidad, Personas)
3. Capturar esos resultados o incluso modificarlos para luego guardarlos a RESIDUOS_A?

Es asi como funcionaria?

Otra: ALBARAN es UN ID de cada REGISTRO obtenido de la consulta a RESIDUOS???

A ver si vamos bien... de todos modos te voy diciendo q para generar tablas dinámicas es mucho mejor usar GRID's q hacer arreglos de textBox, pero espero q respondas pa' checar como vamos...
  #4 (permalink)  
Antiguo 07/03/2008, 06:06
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años
Puntos: 3
Re: Crear una tabla dinámicamente

Hola jlbautista:

Te explico más detalladamente.

Todo se trata de hacer un inserto de un Albaran en el que aparte de los datos de la empresa/cliente al que se le realiza el albarán, consta por ejemplo los Residuos que se le recogen, entre otras cosas.

Para todo esto, entran en juego tres tablas de la Base de la Datos:
- ALBARANES (datos generales del Albarán)
- RESIDUOS (lista de Residuos disponibles)
- RESIDUOS_A (registros de Residuos recogidos referidos a un Albarán)


Estos serían los campos que interesan para lo que pido por cada tabla:

[ALBARANES]

CREATE TABLE [dbo].[ALBARANES](
[codigo] [int] IDENTITY(1,1) NOT NULL
...


[RESIDUOS]

CREATE TABLE [dbo].[RESIDUOS](
[codigo] [int] IDENTITY(1,1) NOT NULL,
[nombreC] [nvarchar](50) COLLATE Modern_Spanish_CI_AS NOT NULL
...


[RESIDUOS_A]

CREATE TABLE [dbo].[RESIDUOS_A](
[codigo] [int] IDENTITY(1,1) NOT NULL,
[albaran] [int] NOT NULL,
[residuo] [int] NOT NULL,
[cantidad] [int] NOT NULL,
[personas] [int] NOT NULL
...


Los datos de la tabla dinámica que me interesa crear recoge los datos que finalmente se van a insertar en la tabla [RESIDUOS_A].
Por cada Residuo recogido, se creará un nuevo registro en la mencionada tabla con el código del Albarán al que se refiere
Es decir, cuando se inserta el Albarán en su tabla correspondiente, si éste albarán lleva consigo Residuos recogidos, por cada residuo se insertará una línea en la tabla [RESIDUOS_A] con el código del Albarán al que hace referencia (campo [albaran]), el código del residuo (campo [residuo]), la cantidad, y un número de personas.
Luego la tabla [ALBARANES] se relaciona por el campo [albaran] con la tabla [RESIDUOS_A] y ésta por el campo [residuo] con la tabla [RESIDUOS].


A ver imagínate que estás en la web y vas al apartado de insertar un albarán.
Tienes los típicos campos/listas de insertar/elegir datos de cliente y tal y tal. Y luego un apartado para lo de los Residuos que se activará ó se mostrará a través de un link ó chequeando una casilla de verificación.
Es decir, igual, chequear una casilla y se mostrará un Panel con una tabla que lista los Residuos que se pueden recoger.
Entonces, por cada Residuo, si se recoge algo de él, aparte del Nombre que ya sale como indicativo, habrá un TextBox para teclear la Cantidad recogida y el Nº de Personas qu suministraron el Residuo:

Nombre_Residuo_1 | Cantidad_Residuo_1 | NºPersonas_Residuo_1
-----------------------------------------------------------------------------------------------
Nombre_Residuo_2 | Cantidad_Residuo_2 | NºPersonas_Residuo_2
-----------------------------------------------------------------------------------------------
... | ... | ...
-----------------------------------------------------------------------------------------------
Nombre_Residuo_N | Cantidad_Residuo_N | NºPersonas_Residuo_N



Cita:
1. Haces la consulta a la BD y obtienes la tabla RESIDUOS.
2. Ese resultado quieres meterlo en filas de 3 textBox (id, Cantidad, Personas)
3. Capturar esos resultados o incluso modificarlos para luego guardarlos a RESIDUOS_A?
1. Si, claro tendrá que haber una consulta sobre la tabla Residuos para que me saque la lista de Residuos
2. Si también, aunque se mostrará:
[NombreResiduo, TextBox para indicar Cantidad, TextBox para indicar Personas]
3. También es como dices, en el inserto se capturarán para insertarlos en RESIDUOS_A cómo he indicado antes. Y luego, cuando se vaya al apartado de edición del Albarán, sacando la tabla con los datos de Residuos recogidos se podrán modificar y finalmente volverlos a guardar en [RESIDUOS_A]

Cita:
Otra: ALBARAN es UN ID de cada REGISTRO obtenido de la consulta a RESIDUOS???
Como he explicado antes el ID del Albarán a insertar ó cuando sea modificado es el dato que se guarda en el campo [albaran] de la tabla [RESIDUOS_A]

Cita:
de todos modos te voy diciendo q para generar tablas dinámicas es mucho mejor usar GRID's
Lo del GridView ya he hecho una prueba vinculándolo con un SqlDataSource que lleva esta SELECT:

Código:
SELECT
	codigo, nombreC AS Residuo,
	 '' AS Cantidad, '' AS Personas
FROM
	RESIDUOS
WHERE
	historico = 0
ORDER BY
	nombreC
Así me sale un GridView y en modo Mostrar, por cada una de sus filas, se ve el Nombre del Residuo, la columna de Cantidad en blanco, y la de Personas también en blanco.
Y cuando doy a Editar fila, en las columnas de Cantidad y Personas aparecen sendos TextBox para insertar los números correspondientes.
Pero luego no puedo conservar lo que se teclea por cada fila ó si cambio de fila para insertar las cantidades de otro Residuo si no es guardando los datos. Si nisiquiera tengo aún el ID del Albarán que se va a insertar

Quiero decir que acepto los cambios de la fila modificada estos se tienen que modificar ya en la tabla de la base de datos aún antes de insertar el Albarán al que van a hacer referencia (Antes de hacer el inserto de Albarán no dispongo del ID de éste)

Luego, lo del Grid en principio no me serviría a no ser que haya otra forma.
Tampoco he visto que un GridView sirva para Insertar sino más bien para modificar ó eliminar registros de una tabla...Bueno, igual tu tienes otra idea de hacerlo ...

Resumiendo:
Yo lo que quiero es presentar como el típico formulario de Residuos Recogidos y dar la opción de rellenar todas las casillas necesarias de una vez y luego cuando se pulse el botón de Insertar el albarán, una vez obtenido el ID del Albarán insertado, por cada residuo recogido se guarde/modifique un registro en la tabla RESIDUOS_A, con el ID del albarán, el ID del residuo, la cantidad, y el nºPersonas.

Espero que ahora se entienda mejor ... Sino sigo explicándolo ... A ver si obtengo alguna ayudita al final de cómo obtener lo que pretendo.
__________________
Saludos,

zacktagnan.
=================================================
  #5 (permalink)  
Antiguo 07/03/2008, 15:36
Avatar de jlbautista  
Fecha de Ingreso: enero-2007
Ubicación: Durango, Méx.
Mensajes: 175
Antigüedad: 17 años, 3 meses
Puntos: 1
Re: Crear una tabla dinámicamente

Si, entiendo...
- ALBARANES solo te guarda un catálogo de todas las órdenes q recibas.
- RESIDUOS es un catálogo con todos los posibles residuos q tienes listados (con capacidad para agregar o borrar, me imagino)
- RESIDUOS_A es una tabla donde se guardará una relación de todos los RESIDUOS recogidos para un determinado ALBARAN, con sus datos (cantidad y personas q emiten el residuo). Por cada residuo q pertenezca a un ALBARAN, se insertará un nuevo registro en RESIDUOS_A.

Te recomiendo q busques la forma de generar el ID del ALBARAN al entrar a AGREGAR una nueva orden. Si es numerico, con la función
MAX(idDeLosAlbaranes) puedas tener el máximo y ese pasarlo a tu form, con el fin de tenerlo identificado antes de, pq a partir de la integridad q estás manejando en RESIDUOS_A, el campo ALBARAN no puede ir NULL en ningun momento, ni al agregar, ni al editar.

El GridView trae varias funciones, puedes buscar sobre EDICION EN 2 VIAS, cuestión q las checaras a ver si te sirven.

Del modo q tu lo intentas, sería:
* Poner un Panel vacio,
* Leer la tabla Residuos y por cada registro [ foreach(DataRow drRow in dtResiduos){} ] generar LiteralControl's (instrucciones en HTML, en este caso) pa' q te agregue el LABEL con el nombre del Residuo, el TEXTBOX de Cantidad y el TEXTBOX de Personas, el cambio de linea, agregar Este al Panel y luego regresar a leer el sig registro y generar esto mismo... asi hasta q no tengas mas registros.
* Lo complicado viene al intentar guardar, pq tendrás q recorrer TODOS los controles TextBox q tengas y crear tu query pa' almacenar estos valores e irlos agregando a RESIDUOS_A

Creo q algo asi sería lo q intentas...
  #6 (permalink)  
Antiguo 09/03/2008, 18:01
Avatar de zacktagnan  
Fecha de Ingreso: abril-2005
Mensajes: 501
Antigüedad: 19 años
Puntos: 3
Re: Crear una tabla dinámicamente

Cita:
Te recomiendo q busques la forma de generar el ID del ALBARAN al entrar a AGREGAR una nueva orden
La manera que tengo de sacar el ID del Albaran insertado sería que me lo devolviera el Procedimiento de Inserción del Albarán a través de un parámetro de tipo OUTPUT, que llevaría el SqlDataSource vinculado a este Procedimiento

Código:
CREATE PROCEDURE [dbo].[spIns_Albaran]
	@codigo INT OUTPUT,
	...

	INSERT INTO ALBARANES (campo1, campo2,...)
	VALUES (...)

	-- RECOGIENDO EL ID DEL ALBARÁN INSERTADO
	SELECT @codigo = @@IDENTITY
Y luego con el evento de [OnInserted] del SqlDataSource de inserción recogería ese ID de Albarán Insertado que se incluiría como campo [albaran] en cada uno de los registros de la tabla [RESIDUOS_A].


Cita:
El GridView trae varias funciones, puedes buscar sobre EDICION EN 2 VIAS, cuestión q las checaras a ver si te sirven.
¿A qué te refieres exactamente, qué es eso de EDICIÓN EN 2 VÍAS?

Cita:
Del modo q tu lo intentas, sería:
* Poner un Panel vacio
Si la idea es poner un Panel que será el que contenga la consabida tabla par insertar las cantidades de los Residuos recogidos. Solamente un panel, no uno por cada lía de la tabla.


Cita:
* Leer la tabla Residuos y por cada registro [ foreach(DataRow drRow in dtResiduos){} ] generar LiteralControl's (instrucciones en HTML, en este caso) pa' q te agregue el LABEL con el nombre del Residuo, el TEXTBOX de Cantidad y el TEXTBOX de Personas, el cambio de linea, agregar Este al Panel y luego regresar a leer el sig registro y generar esto mismo... asi hasta q no tengas mas registros.
Si la idea es usar un foreach para generar la lista de Residuos y lo demás.
Lo de los LiteralControl, ¿cómo es exactamente, me puede detallar más ó poner un ejemplo de cómo sería para este caso?

Yo estaba tratando de crear algo como así:

Código:
    TextBox cantidad_txt = new TextBox();
    TextBox personas_txt = new TextBox();
for (int i = 0; i <= totResiduos; i++)
        {
            cantidad_txt.ID = "cantidad_" + i;
            personas_txt.ID = "personas_" + i;
            Panel1.Controls.Add(cantidad_txt);
            Panel1.Controls.Add(personas_txt);
        }
Aunque tampoco me resulta porque solo me crea el último ciclo del for (es decir si el totResiduos fuese 10, solamente me crea los TextBox cantidad_10 y personas_10)


Cita:
* Lo complicado viene al intentar guardar, pq tendrás q recorrer TODOS los controles TextBox q tengas y crear tu query pa' almacenar estos valores e irlos agregando a RESIDUOS_A
Eso también no tengo claro cómo hacerlo ¿ninguna idea de cómo realizarlo?


Al final lo que haces es sólo una apreciación de entendimiento de lo que quiero conseguir, ó puedes sugerirme algo más concreto de como conseguir lo que quiero.
¿Sigues con la idea de que lo mejor es usar un GridView para todo esto?

¿Se puede poner de primeras un GridView en estado de Edición nada mas sacarlo?
¿Cuando se confirme la Edición de una de las filas en vez de modificar determinado registro en una tabla se podría insertar los datos de esa fila del GridView en un ListBox aparte?
Se me estaba ocurriendo, como posible solución, usar un GridView y que toda fila que se modificara al Aceptar su edición, se incluyera en un ListBox. Y luego tras insertar el Albarán, los posibles registros de la tabla RESIDUOS_A vinieran de la lectura del contenido del ListBox.

Sino insisto en que si tienes una forma de cómo hacerlo, me lo cuentes más detalladamente.

Lo mismo que comunico a cualquier otra persona que puede sugerir lo que crea conveniente ... Gracias de nuevo.
__________________
Saludos,

zacktagnan.
=================================================
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:39.