Manipulando DataTable (Ajuda)
Atualmente possuo um DataTable com uma coluna 'Valor', onde esta possuem os valores de cada atividade executada em um projeto. Preciso que estes valores sejam somados de acordo com cada projeto independente da atividade. Utilizando group by com LINQ a função SUM faz a soma de acordo com a atividade, ou seja, possui 3 valores de uma determinada atividade a aplicação soma somente esses 3 valores. Segue uma imagem de como seria o que preciso:
[img:descricao=Exemplo_Soma]http://arquivo.devmedia.com.br/forum/imagem/302406-20140909-155438.jpg[/img]
Como podem observar na imagem(garrancho, rs), preciso somar também a quantidade de uma mesma atividade executada em cada medição. A repetição de registro será de acordo com a diferença dos códigos das atividades.
Se possível poderiam me ajudar por favor? Agradecido.
[img:descricao=Exemplo_Soma]http://arquivo.devmedia.com.br/forum/imagem/302406-20140909-155438.jpg[/img]
Como podem observar na imagem(garrancho, rs), preciso somar também a quantidade de uma mesma atividade executada em cada medição. A repetição de registro será de acordo com a diferença dos códigos das atividades.
Se possível poderiam me ajudar por favor? Agradecido.
Renato Pereira
Curtidas 1
Respostas
Joel Rodrigues
09/09/2014
Neste caso, creio que você precise de uma subquery para somar essa coluna e exibí-la em todos os registros.
GOSTEI 0
Renato Pereira
09/09/2014
Dei uma olhada em algumas informações a respeito de subquery, porém não tenho tanto conhecimento em LINQ, assim ficou meio complicado de executar. Poderia me ajudar com essa subquery se possível? Segue em anexo o código que vinha utilizando:
DataTable servico = ds.Tables[0]; DataTable ata = ds.Tables[1]; DataTable medicao = ds.Tables[2]; var results = (from Servico in servico.AsEnumerable() join Ata in ata.AsEnumerable() on new { num_contrato = Servico["num_contrato"].ToString(), num_ordem = Servico["num_servico"].ToString() } equals new { num_contrato = Ata["num_contrato"].ToString(), num_ordem = Ata["num_servico"].ToString() } join Medicao in medicao.AsEnumerable() on new { num_contrato = Servico["num_contrato"].ToString(), num_ordem = Servico["num_servico"].ToString() } equals new { num_contrato = Medicao["num_contrato"].ToString(), num_ordem = Medicao["num_servico"].ToString() } group new { Servico, Ata, Medicao } by new { num_contrato = Servico["num_contrato"].ToString(), num_servico = Servico["num_servico"].ToString(), escritorio = Servico["escritorio"] == DBNull.Value ? null : Servico["escritorio"].ToString(), area_telefonica = Servico["area_telefonica"] == DBNull.Value ? null : Servico["area_telefonica"].ToString(), servico_tipo = Servico["servico_tipo"] == DBNull.Value ? null : Servico["servico_tipo"].ToString(), servico_subtipo = Servico["servico_subtipo"] == DBNull.Value ? null : Servico["servico_subtipo"].ToString(), data_geracao = Servico["data_geracao"] == DBNull.Value ? null : Convert.ToDateTime(Servico["data_geracao"]).ToString("dd/MM/yyyy"), ordem_interna = Servico["ordem_interna"] == DBNull.Value ? null : Servico["ordem_interna"].ToString(), boletim_anormalidade = Servico["boletim_anormalidade"] == DBNull.Value ? null : Servico["boletim_anormalidade"].ToString(), plano_trabalho = Servico["plano_trabalho"] == DBNull.Value ? null : Servico["plano_trabalho"].ToString(), aep_num = Ata["ata_estudo_num"] == DBNull.Value ? null : Ata["ata_estudo_num"].ToString(), aep_inicio = Ata["ata_estudo_inicio"] == DBNull.Value ? null : Convert.ToDateTime(Ata["ata_estudo_inicio"]).ToString("dd/MM/yyyy"), aep_fim = Ata["ata_estudo_fim"] == DBNull.Value ? null : Convert.ToDateTime(Ata["ata_estudo_fim"]).ToString("dd/MM/yyyy"), aep_comeco = Ata["ata_estudo_comeco"] == DBNull.Value ? null : Convert.ToDateTime(Ata["ata_estudo_comeco"]).ToString("dd/MM/yyyy"), aep_conclusao = Ata["ata_estudo_conclusao"] == DBNull.Value ? null : Convert.ToDateTime(Ata["ata_estudo_conclusao"]).ToString("dd/MM/yyyy"), medicao_num = Medicao["medicao_num"] == DBNull.Value ? null : Medicao["medicao_num"].ToString(), medicao_data_criacao = Medicao["medicao_data_criacao"] == DBNull.Value ? null : Convert.ToDateTime(Medicao["medicao_data_criacao"]).ToString("dd/MM/yyyy"), medicao_acesso_atividade = Medicao["medicao_acesso_atividade"] == DBNull.Value ? null : Medicao["medicao_acesso_atividade"].ToString(), medicao_data_classificacao = Medicao["medicao_data_classificacao"] == DBNull.Value ? null : Convert.ToDateTime(Medicao["medicao_data_classificacao"]).ToString("dd/MM/yyyy"), cod_atividade = Medicao["atividade"] == DBNull.Value ? null : Medicao["atividade"].ToString() } into GM select new { num_contrato = GM.Key.num_contrato, num_servico = GM.Key.num_servico, escritorio = GM.Key.escritorio == null ? null : GM.Key.escritorio, area_telefonica = GM.Key.area_telefonica == null ? null : GM.Key.area_telefonica, serivo_tipo = GM.Key.servico_tipo == null ? null : GM.Key.servico_tipo, serivo_subtipo = GM.Key.servico_subtipo == null ? null : GM.Key.servico_subtipo, data_geracao = GM.Key.data_geracao == null ? null : GM.Key.data_geracao, ordem_interna = GM.Key.ordem_interna == null ? null : GM.Key.ordem_interna, boletim_anormalidade = GM.Key.boletim_anormalidade == null ? null : GM.Key.boletim_anormalidade, plano_trabalho = GM.Key.plano_trabalho == null ? null : GM.Key.plano_trabalho, aep_num = GM.Key.aep_num == null ? null : GM.Key.aep_num, aep_inicio = GM.Key.aep_inicio == null ? null : GM.Key.aep_inicio, aep_fim = GM.Key.aep_fim == null ? null : GM.Key.aep_fim, aep_comeco = GM.Key.aep_comeco == null ? null : GM.Key.aep_comeco, aep_conclusao = GM.Key.aep_conclusao == null ? null : GM.Key.aep_conclusao, medicao_num = GM.Key.medicao_num == null ? null : GM.Key.medicao_num, medicao_data_criacao = GM.Key.medicao_data_criacao == null ? null : GM.Key.medicao_data_criacao, medicao_valor = GM.Sum(valor => Convert.ToDecimal(valor.Medicao["medicao_valor_pagar"])).ToString("###,##0.00") == null ? null : GM.Sum(valor => Convert.ToDecimal(valor.Medicao["medicao_valor_pagar"])).ToString("###,##0.00"), medicao_acesso_atividade = GM.Key.medicao_acesso_atividade == null ? null : GM.Key.medicao_acesso_atividade, medicao_data_classificacao = GM.Key.medicao_data_classificacao == null ? null : GM.Key.medicao_data_classificacao, cod_atividade = GM.Key.cod_atividade == null ? null : GM.Key.cod_atividade, atividade_quant_medida = GM.Sum(quantidade => Convert.ToInt32(quantidade.Medicao["quantidade"])).ToString() == null ? null : GM.Sum(quantidade => Convert.ToInt32(quantidade.Medicao["quantidade"])).ToString() } ).Distinct();
GOSTEI 0
Renato Pereira
09/09/2014
Eu preciso percorrer as colunas de 'atividade', 'mat_or' e 'mat_med' em um datatable que tem valores duplicados e verificar quais destas colunas têm o maior número de registros diferentes referentes a 'num_servico'. Veja um exemplo de como é a minha tabela de dados:
contrato | servico | Medição | atividade| quant_at | mat_or | quant_or | mat_med | quant_med
4100003268OP | 14040001253 | 1526 | 227544 | 2 | 0252-0017-8 | 74 | 0060-0004-5 | 404
4100003268OP | 14040001253 | 1526 | 227544 | 2 | 0252-0017-8 | 74 | 0219-0028-0 | 0653
4100003268OP | 14040001253 | 1526 | 227544 | 2 | 0252-0017-8 | 74 | 0223-0010-4 | 34
4100003268OP | 14040001253 | 1526 | 227544 | 2 | 0252-0017-8 | 74 | 0252-0017-8 | 74
4100003268OP | 14040001253 | 1526 | 220515 | 68 | 0252-0017-8 | 74 | 0060-0004-5 | 404
4100003268OP | 14040001253 | 1526 | 220515 | 68 | 0252-0017-8 | 74 | 0219-0028-0 | 0653
4100003268OP | 14040001253 | 1526 | 220515 | 68 | 0252-0017-8 | 74 | 0223-0010-4 | 34
4100003268OP | 14040001253 | 1526 | 220515 | 68 | 0252-0017-8 | 74 | 0252-0017-8 | 74
4100003268OP | 14040001253 | 1526 | 225011 | 404 | 0252-0017-8 | 74 | 0060-0004-5 | 404
4100003268OP | 14040001253 | 1526 | 225011 | 404 | 0252-0017-8 | 74 | 0219-0028-0 | 0653
4100003268OP | 14040001253 | 1526 | 225011 | 404 | 0252-0017-8 | 74 | 0223-0010-4 | 34
4100003268OP | 14040001253 | 1526 | 225011 | 404 | 0252-0017-8 | 74 | 0252-0017-8 | 74
Feito isso, eu preciso adicionar os dados em um outro datatable, onde as colunas de 'contrato', 'serviço' e 'medição' é repetida de acordo com a quantidade obtida nas colunas percorridas. Veja como preciso que o DataTable fique:
contrato | servico | Medição | atividade| quant_at | mat_or | quant_or | mat_med | quant_med
4100003268OP | 14040001253 | 1526 | 227544 | 2 | 0252-0017-8 | 74 | 0060-0004-5 | 404
4100003268OP | 14040001253 | 1526 | 220515 | 68 | | | 0219-0028-0 | 0653
4100003268OP | 14040001253 | 1526 | 225011 | 404 | | | 0223-0010-4 | 34
4100003268OP | 14040001253 | 1526 | | | | | 0252-0017-8 | 74
Observem que foi repetido as colunas de acordo com a coluna 'mat_met' que resultou em um maior número de registros diferentes.
Com isso, peço a ajuda para fazer essa manipulação de dados.
Meu datatable está sendo gerado através de uma consulta LINQ, veja a consulta:
contrato | servico | Medição | atividade| quant_at | mat_or | quant_or | mat_med | quant_med
4100003268OP | 14040001253 | 1526 | 227544 | 2 | 0252-0017-8 | 74 | 0060-0004-5 | 404
4100003268OP | 14040001253 | 1526 | 227544 | 2 | 0252-0017-8 | 74 | 0219-0028-0 | 0653
4100003268OP | 14040001253 | 1526 | 227544 | 2 | 0252-0017-8 | 74 | 0223-0010-4 | 34
4100003268OP | 14040001253 | 1526 | 227544 | 2 | 0252-0017-8 | 74 | 0252-0017-8 | 74
4100003268OP | 14040001253 | 1526 | 220515 | 68 | 0252-0017-8 | 74 | 0060-0004-5 | 404
4100003268OP | 14040001253 | 1526 | 220515 | 68 | 0252-0017-8 | 74 | 0219-0028-0 | 0653
4100003268OP | 14040001253 | 1526 | 220515 | 68 | 0252-0017-8 | 74 | 0223-0010-4 | 34
4100003268OP | 14040001253 | 1526 | 220515 | 68 | 0252-0017-8 | 74 | 0252-0017-8 | 74
4100003268OP | 14040001253 | 1526 | 225011 | 404 | 0252-0017-8 | 74 | 0060-0004-5 | 404
4100003268OP | 14040001253 | 1526 | 225011 | 404 | 0252-0017-8 | 74 | 0219-0028-0 | 0653
4100003268OP | 14040001253 | 1526 | 225011 | 404 | 0252-0017-8 | 74 | 0223-0010-4 | 34
4100003268OP | 14040001253 | 1526 | 225011 | 404 | 0252-0017-8 | 74 | 0252-0017-8 | 74
Feito isso, eu preciso adicionar os dados em um outro datatable, onde as colunas de 'contrato', 'serviço' e 'medição' é repetida de acordo com a quantidade obtida nas colunas percorridas. Veja como preciso que o DataTable fique:
contrato | servico | Medição | atividade| quant_at | mat_or | quant_or | mat_med | quant_med
4100003268OP | 14040001253 | 1526 | 227544 | 2 | 0252-0017-8 | 74 | 0060-0004-5 | 404
4100003268OP | 14040001253 | 1526 | 220515 | 68 | | | 0219-0028-0 | 0653
4100003268OP | 14040001253 | 1526 | 225011 | 404 | | | 0223-0010-4 | 34
4100003268OP | 14040001253 | 1526 | | | | | 0252-0017-8 | 74
Observem que foi repetido as colunas de acordo com a coluna 'mat_met' que resultou em um maior número de registros diferentes.
Com isso, peço a ajuda para fazer essa manipulação de dados.
Meu datatable está sendo gerado através de uma consulta LINQ, veja a consulta:
var ativ = ( from Servico in servico . AsEnumerable () join Medicao in medicao . AsEnumerable () on new { num_contrato = Servico [ "num_contrato" ], num_ordem = Servico [ "num_servico" ] } equals new { num_contrato = Medicao [ "num_contrato" ], num_ordem = Medicao [ "num_servico" ] } join MOrcado in material_orcado . AsEnumerable () on new { num_contrato = Servico [ "num_ contrato" ], num_servico = Servico [ "num_servico" ] } equals new { num_contrato = MOrcado [ "num_contrato" ], num_servico = MOrcado [ "num_servico" ] } into MaterialOrcado from MO in MaterialOrcado . DefaultIfEmpty () join MMedido in material_medido . AsEnumerable () on new { num_contrato = Servico [ "num_ contrato" ], num_servico = Servico [ "num_servico" ] } equals new { num_contrato = MMedido ["num_contrato" ], num_servico = MMedido [ "num_servico" ] } into MaterialMedido from MM in MaterialMedido . DefaultIfEmpty () group new { Servico , Medicao , MO , MM } by new { num_contrato = Servico [ "num_contrato" ], num_servico = Servico [ "num_servico" ], medicao_num = Medicao ["medicao_num"]==DBNull.Value ? null:Medicao["medicao_num"].ToString(), cod_atividade = Medicao ["atividade"]==DBNull.Value ? null:Medicao["atividade"].ToString (), material_orcado = ( MO == null ) ? "" : MO [ "material_orcado" ]. ToString (), quantidade_orcado = ( MO == null ) ? "" : MO [ "quant_material_orcado" ]. ToString (), material_medido = ( MM == null ) ? "" : MM [ "material_medido" ]. ToString (), quantidade_medido = ( MM == null ) ? "" : MM [ "quant_material_medido" ]. ToString () } into AMOM select new { num_contrato = AMOM . Key . num_contrato , num_servico = AMOM . Key . num_servico , medicao_num = AMOM . Key . medicao_num , cod_atividade = AMOM . Key . cod_atividade , atividade_quant_medida = AMOM.Sum (valor => Convert.ToInt32 (valor.Medicao["quantidade"])), material_orcado = AMOM . Key . material_orcado , quantidade_orcado = AMOM . Key . quantidade_orcado , material_medido = AMOM . Key . material_medido , quantidade_medido = AMOM . Key . quantidade_medido }). Distinct (); DataTable dtAtiv = ativ . ToDataTable (); dtAtiv . TableName = "ATIVIDADE" ;
GOSTEI 0
Renato Pereira
09/09/2014
Resolvido.
GOSTEI 0