Crear DataTable con la suma de el contenido de las filas de otro DataTable.

10/06/2005 - 00:47 por Esparta Palma | Informe spam
Hola compañeros...


Deseo crear un DataTable en el que el resultado sea solo un registro con
la suma de cada uno de las columnas de otro DataTable, hasta ahora lo he
hecho con lo siguiente:


public DataTable CreateSuma(DataTable dtSuma)
{
//Creamos una copia del DataTable a procesar
DataTable dtResult = dtSuma.Clone();

DataRow drNewRow = dtResult.NewRow();

string cColumn = string.Empty;

//Recorremos todas las filas de el DataTable
foreach (DataRow drRows in dtSuma.Rows )
{
// Por cada una de las columnas del DataTable
for (int lnCounter=0; lnCounter < dtSuma.Columns.Count; lnCounter++)
{
cColumn = dtSuma.Columns[lnCounter].ColumnName;
// Realizar la suma, si no tiene valor nulo.
if (drRows[cColumn] != System.DBNull.Value )
drNewRow[cColumn] (drNewRow[cColumn] == System.DBNull.Value ? 0:
Convert.ToDouble(drNewRow[cColumn])+
Convert.ToDouble(drRows[cColumn]);

}
}

dtResult.Rows.Add(drNewRow);
return dtResult;
}

Funciona correctamente, pero me parece que no es la manera en que
debería hacerlo, ya que estoy haciendolo a "pie" y deberia existir algun
otro modo, o no?

He visto el método Compute() de los DataTable, pero no consigo hacer que
funcione como yo lo deseo, ya que el siguiente código me manda error:

for (lnCounter=0; lnCounter < dtSuma.Columns.Count; lnCounter++)
{
cColumn = dtSuma.Columns[lnCounter].ColumnName;
operation = "Sum("+cColumn.ToString()+")";
drNewRow[cColumn] dtSuma.Compute(operation,"1=1");
}

El error que me marca es el siguiente:

Uso no válido de la función de agregado Sum() y el tipo: String.

Realmente no se a que se deba ese error, si es que no puedo obtener la
suma de las columnas o es por el segundo parametro ("1=1"), ya que lo
que deseo es que sume todas las filas de el DataTable (sin condición).

Agradezco de antemano la ayuda que pudieran brindarme.
ž,ø€º°`°º€ø,žž,ø€º°`°º€ø,žž,ø€º°`°º€ø,žž,ø€º°`°º

Espartaco Palma Martínez
SysOp http://www.PortalFox.com
México D.F.
MoBlogs!
http://weblogs.golemproject.com/esparta/
http://www.espartha.com/blog/

Preguntas similare

Leer las respuestas

#1 Marcos Mellibovsky
12/06/2005 - 01:45 | Informe spam
poder hacerlo con la funcion Compute del datatable:
algo asi
for (int lnCounter=0; lnCounter < dtSuma.Columns.Count; lnCounter++)
{
cColumn = dtSuma.Columns[lnCounter].ColumnName;
drNewRow[cColumn] dtSuma.Compute(String.Format("SUM({0})",cColumn));
}


Saludos
Marcos Mellibovsky
MCAD - MCSD - MCSE - MCDBA
Cordoba - Argentina
"Esparta Palma" escribió en el
mensaje news:
Hola compañeros...


Deseo crear un DataTable en el que el resultado sea solo un registro con
la suma de cada uno de las columnas de otro DataTable, hasta ahora lo he
hecho con lo siguiente:


public DataTable CreateSuma(DataTable dtSuma)
{
//Creamos una copia del DataTable a procesar
DataTable dtResult = dtSuma.Clone();

DataRow drNewRow = dtResult.NewRow();

string cColumn = string.Empty;

//Recorremos todas las filas de el DataTable
foreach (DataRow drRows in dtSuma.Rows )
{
// Por cada una de las columnas del DataTable
for (int lnCounter=0; lnCounter < dtSuma.Columns.Count;


lnCounter++)
{
cColumn = dtSuma.Columns[lnCounter].ColumnName;
// Realizar la suma, si no tiene valor nulo.
if (drRows[cColumn] != System.DBNull.Value )
drNewRow[cColumn] > (drNewRow[cColumn] == System.DBNull.Value ? 0:
Convert.ToDouble(drNewRow[cColumn])+
Convert.ToDouble(drRows[cColumn]);

}
}

dtResult.Rows.Add(drNewRow);
return dtResult;
}

Funciona correctamente, pero me parece que no es la manera en que
debería hacerlo, ya que estoy haciendolo a "pie" y deberia existir algun
otro modo, o no?

He visto el método Compute() de los DataTable, pero no consigo hacer que
funcione como yo lo deseo, ya que el siguiente código me manda error:

for (lnCounter=0; lnCounter < dtSuma.Columns.Count; lnCounter++)
{
cColumn = dtSuma.Columns[lnCounter].ColumnName;
operation = "Sum("+cColumn.ToString()+")";
drNewRow[cColumn] dtSuma.Compute(operation,"1=1");
}

El error que me marca es el siguiente:

Uso no válido de la función de agregado Sum() y el tipo: String.

Realmente no se a que se deba ese error, si es que no puedo obtener la
suma de las columnas o es por el segundo parametro ("1=1"), ya que lo
que deseo es que sume todas las filas de el DataTable (sin condición).

Agradezco de antemano la ayuda que pudieran brindarme.
¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º

Espartaco Palma Martínez
SysOp http://www.PortalFox.com
México D.F.
MoBlogs!
http://weblogs.golemproject.com/esparta/
http://www.espartha.com/blog/
Respuesta Responder a este mensaje
#2 Esparta Palma
12/06/2005 - 22:49 | Informe spam
Gracias Marcos, ya había intentado con eso, así como lo pones me marca
el error siguiente:

Ninguna sobrecarga para el método 'Compute' adquiere '1' argumentos

Tal parece que mi problema sigue siendo el segundo parámetro, ya que si
pongo "1==1" marca lo siguiente:

Error de sintaxis: falta el operando antes del operador '='.

Poniendo como segundo parámetro "1=1" tengo el mismo problema indicado
en mi post inicial:

Uso no válido de la función de agregado Sum() y el tipo: String.


Lo anterior pasa tambien si pongo "true" como segundo parámetro. Alguna
otra idea?


ž,ø€º°`°º€ø,žž,ø€º°`°º€ø,žž,ø€º°`°º€ø,žž,ø€º°`°º

Espartaco Palma Martínez
SysOp http://www.PortalFox.com
México D.F.
MoBlogs!
http://weblogs.golemproject.com/esparta/ <- Tech
http://www.espartha.com/blog/ <- Personal
VFP Bookmarks http://del.icio.us/esparta/vfp

Marcos Mellibovsky wrote:
poder hacerlo con la funcion Compute del datatable:
algo asi
for (int lnCounter=0; lnCounter < dtSuma.Columns.Count; lnCounter++)
{
cColumn = dtSuma.Columns[lnCounter].ColumnName;
drNewRow[cColumn] > dtSuma.Compute(String.Format("SUM({0})",cColumn));
}


Respuesta Responder a este mensaje
#3 Bernardo Campos
15/06/2005 - 18:53 | Informe spam
Hola,

Intentaste dejarlo en blanco? ""

Saludos.



Sta Cruz, Bolivia

;) No hay nada como FoxPro

"Esparta Palma" wrote in message
news:
Gracias Marcos, ya había intentado con eso, así como lo pones me marca
el error siguiente:

Ninguna sobrecarga para el método 'Compute' adquiere '1' argumentos

Tal parece que mi problema sigue siendo el segundo parámetro, ya que si
pongo "1==1" marca lo siguiente:

Error de sintaxis: falta el operando antes del operador '='.

Poniendo como segundo parámetro "1=1" tengo el mismo problema indicado
en mi post inicial:

Uso no válido de la función de agregado Sum() y el tipo: String.


Lo anterior pasa tambien si pongo "true" como segundo parámetro. Alguna
otra idea?


¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º¤ø,¸¸,ø¤º°`°º

Espartaco Palma Martínez
SysOp http://www.PortalFox.com
México D.F.
MoBlogs!
http://weblogs.golemproject.com/esparta/ <- Tech
http://www.espartha.com/blog/ <- Personal
VFP Bookmarks http://del.icio.us/esparta/vfp

Marcos Mellibovsky wrote:
poder hacerlo con la funcion Compute del datatable:
algo asi
for (int lnCounter=0; lnCounter < dtSuma.Columns.Count;


lnCounter++)
{
cColumn = dtSuma.Columns[lnCounter].ColumnName;
drNewRow[cColumn] > dtSuma.Compute(String.Format("SUM({0})",cColumn));
}


Respuesta Responder a este mensaje
#4 Esparta Palma
16/06/2005 - 09:18 | Informe spam
Gracias Bernardo, ya he encontrado la causa del error y no era el
segundo parámetro.

Lo que sucede fué que yo genero el DataTable en tiempo de ejecución (de
la combinación de varias tablas), uno de los DataColumns que agregué le
había asignado como tipo de datos mismo tipo de datos de su fuente, en
ciertos casos el valor de la fuente era Nulo (System.DBNull), por lo que
al crearse se quedaba también su GetType() como nulo, lo unico que
tuve que hacer es asignarle como tipo de datos el necesario y problema
resuelto.

Gracias por tu tiempo y colaboración.

ž,ø€º°`°º€ø,žž,ø€º°`°º€ø,žž,ø€º°`°º€ø,žž,ø€º°`°º

Espartaco Palma Martínez
SysOp http://www.PortalFox.com
México D.F.
MoBlogs!
http://weblogs.golemproject.com/esparta/
http://www.espartha.com/blog/

Bernardo Campos wrote:
Hola,

Intentaste dejarlo en blanco? ""

Saludos.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida