Ir para conteúdo
Elnata COsta

Somar valores do TimeSpan no Foreach [C#]

Recommended Posts

Olá pessoal, estou pegando os valores do meu SQLite [Que estão no formato string (No banco de dados) e estou convertendo eles em TimeSpan com C#] meu objetivo é somar as horas. Tenho o seguinte código:


            var queryCountHours = conn.Table<RelatorioDB.RelatorioTableCreate>();
            string resultHours = String.Empty;  
            if(queryCountHours != null)
            {
                foreach (var item in queryCountHours)
                {
                    resultHours = String.Format("{0}", item.Horas);
                    TimeSpan tsSun = TimeSpan.Parse(item.Horas); 
                    
                    //Aqui eu consigo obter todas as linhas do SQLite na coluna 'Horas',
                    //porém não consigo somar as horas, elas aparecem da seguinte maneira:
                    //1:20:00
                    //1:40:00 
                    //Eu quero somar os valores acima
                    Debug.WriteLine(tsSun);
                    //Saída do Debug:
                    //1:20:00
                    //1:40:00 

                }
            }

E o fato de estar em um foreach eu não consigo somar as linhas do SQLite. Já tente usar o comando SUM do SQLite porém não funciona, pois está no formato de string no Banco de Dados.

 

Então como eu posso somar esses valores dentro do foreach?? :( :(

Compartilhar este post


Link para o post
Compartilhar em outros sites
var queryCountHours = conn.Table<RelatorioDB.RelatorioTableCreate>();
string resultHours = String.Empty;
if (queryCountHours != null)
{
foreach (var item in queryCountHours)
{
resultHours = String.Format("{0}", item.Horas);
TimeSpan tsSun = TimeSpan.Parse(item.Horas);

//Aqui cada vez que ele passar pelo foreach a variavel totalHoras irá somar
TimeSpan totalHoras = totalHoras + tsSun;

//Aqui eu consigo obter todas as linhas do SQLite na coluna 'Horas',
//porém não consigo somar as horas, elas aparecem da seguinte maneira:
//1:20:00
//1:40:00
//Eu quero somar os valores acima
Debug.WriteLine(totalHoras);
//Saída do Debug:
//1:20:00
//1:40:00

}
}

eu acredito que sejá só adicionar um contador que irá somando as horas cada vez que passar pelo foreach

Compartilhar este post


Link para o post
Compartilhar em outros sites
var queryCountHours = conn.Table<RelatorioDB.RelatorioTableCreate>();
string resultHours = String.Empty;
if (queryCountHours != null)
{
foreach (var item in queryCountHours)
{
resultHours = String.Format("{0}", item.Horas);
TimeSpan tsSun = TimeSpan.Parse(item.Horas);

//Aqui cada vez que ele passar pelo foreach a variavel totalHoras irá somar
TimeSpan totalHoras = totalHoras + tsSun;

//Aqui eu consigo obter todas as linhas do SQLite na coluna 'Horas',
//porém não consigo somar as horas, elas aparecem da seguinte maneira:
//1:20:00
//1:40:00
//Eu quero somar os valores acima
Debug.WriteLine(totalHoras);
//Saída do Debug:
//1:20:00
//1:40:00

}
}

eu acredito que sejá só adicionar um contador que irá somando as horas cada vez que passar pelo foreach

 

 

 

Não funcionou muito bem. :( mas eu estou tentando outra solução, ao salvar no SQLite eu converto as horas em segundos:

 string hoursFormated = this.StopwatchText.Text = string.Format("{0}:{1}:{2}", hours, minutes, seconds).ToString();
            string hoursToSecondsFormated = hoursFormated.ToString();
            double hoursInSeconds = TimeSpan.Parse(hoursToSecondsFormated).TotalSeconds;
            string hoursInSecondsDoubleToString = hoursInSeconds.ToString();
            //Com isso o meu timer irá salvar no SQLite em segundos
            Debug.WriteLine(hoursInSecondsDoubleToString);

Após salvar no SQLite em segundos eu uso o código abaixo pra retornar o valor em segundos, porém somados:

public RelatorioTableCreate SomaHoras()
        {
            var sqlPath = System.IO.Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "dbRelatorio.sqlite");

            using (SQLite.Net.SQLiteConnection conn = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), sqlPath))
            {
                var somaDasHoras = conn.Query<RelatorioTableCreate>("SELECT sum(Horas) FROM RelatorioTableCreate").FirstOrDefault();
                return somaDasHoras;
            }

        }

Mas quando eu uso o código abaixo pra retornar esse valor:

RelatorioDB relDB = new RelatorioDB();      
Debug.WriteLine(relDB.SomaHoras().ToString());

Ele me retorna o seguinte:

My_App.Models.RelatorioDB+RelatorioTableCreate

E não me retorna o resultado, o código do RelatorioTableCreate é:

public class RelatorioTableCreate
        {
            [PrimaryKey, AutoIncrement]
            public int Id { get; set; } 
            
            public string Horas { get; set; }
            
            public RelatorioTableCreate()
            {

            }

            public RelatorioTableCreate(string horas)
            {
                Horas = horas;                

            }
        }

A classe RelatorioTableCreate fica dentro da Classe RelatorioDB

Compartilhar este post


Link para o post
Compartilhar em outros sites

estranho não ter dado certo o código acima.

 

Já tentou em vez de usar TimeSpan usar DateTime

DateTime totalHoras = totalHoras.AddHours(tsSun);

o que você fez pode ser uma solução, porém acredito eu que seja muito mais trabalhoso

 

da uma olhada nesse link aqui, fala sobre como trabalhar com datas e afins

https://ultrago.wordpress.com/2010/06/07/trabalhando-com-datas-no-c/

Compartilhar este post


Link para o post
Compartilhar em outros sites

estranho não ter dado certo o código acima.

 

Já tentou em vez de usar TimeSpan usar DateTime

DateTime totalHoras = totalHoras.AddHours(tsSun);

o que você fez pode ser uma solução, porém acredito eu que seja muito mais trabalhoso

 

da uma olhada nesse link aqui, fala sobre como trabalhar com datas e afins

https://ultrago.wordpress.com/2010/06/07/trabalhando-com-datas-no-c/

 

O seu código me retornou o seguinte: :(

13200.00:00:00
28950.00:00:00
46930.00:00:00
Vou dar uma olhada, mas você sabe dizer por que o código não me retorna o valor do SQLite??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você verificou se o timespan está convertendo para horas corretas?

 

Sim, está tudo certinho, quando eu passo pelo foreach os valores com o código abaixo ele me retorna as horas corretamente:

             var queryCountHours = conn.Table<RelatorioDB.RelatorioTableCreate>();             
             if(queryCountHours != null)
             {
                 foreach (var item in queryCountHours)
                 {
                    
                    var ts = TimeSpan.FromSeconds(Convert.ToDouble(item.Horas));
                     string hourConverted = string.Format("H: {0} M:{1} S:{2}", ts.Hours, ts.Minutes, ts.Seconds);
                    Debug.WriteLine(hourConverted);
                    //A saída dele é normal. Converte os segundos para Horas

                 }

             }

Porém eu não consigo utilizar isso fora do foreach. Nem consigo somar as horas que o foreach me retorna do SQLite.

 

Nem mesmo usando o Comando SQLite funciona:

SELECT SUM([Horas]) AS TOTAL FROM RelatorioTableCreate

Que creio eu que pra recuperar o valor com o código acima não seria necessário passar por um foreach. Mas nada [do que eu tento] funciona :(

Compartilhar este post


Link para o post
Compartilhar em outros sites
var queryCountHours = conn.Table<RelatorioDB.RelatorioTableCreate>();
string resultHours = String.Empty;
if (queryCountHours != null)
{
foreach (var item in queryCountHours)
{
resultHours = String.Format("{0}", item.Horas);
TimeSpan tsSun = TimeSpan.Parse(item.Horas);

//Aqui cada vez que ele passar pelo foreach a variavel totalHoras irá somar
TimeSpan totalHoras = totalHoras + tsSun;

//Aqui eu consigo obter todas as linhas do SQLite na coluna 'Horas',
//porém não consigo somar as horas, elas aparecem da seguinte maneira:
//1:20:00
//1:40:00
//Eu quero somar os valores acima
Debug.WriteLine(totalHoras);
//Saída do Debug:
//1:20:00
//1:40:00

}
}

eu acredito que sejá só adicionar um contador que irá somando as horas cada vez que passar pelo foreach

 

 

 

srsrs Realmente seu código funcionou. Eu estava errando em não passar os valores formatados pra somar, agora deu certinho. :D :D :D :D Vou abrir um novo tópico com outra dúvida do mesmo assunto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por RENAN KAWAMOTO FAGUNDES
      !

      Olá, boa tarde!
      Estou precisando de uma ajuda em um SCRIPT (SQL).
      Preciso agrupar o resultado por tipo de convênio (CONVENIO).

      Exemplo Acima:
       

       
      Total por tipo de convênio.
      SET DATEFORMAT DMY -- RTM declare @DTINI datetime, @DTFIM datetime set @DTINI = '01/01/2019' set @DTFIM = '01/04/2019' SELECT CASE WHEN CONV_SUS = 'T' THEN 'SUS' WHEN CONV_PARTICULAR = 'T' THEN 'PARTICULAR' WHEN CONV_DS IS NOT NULL THEN 'CONVENIO' END CONVENIO, CONSUMO2.INSU_DS INSUMO, replace(CONSUMO2.EMI_QTDE_COMERCIAL,'.',',') QTDE_COMERCIAL, replace(CONSUMO2.VAL_TOTAL,'.',',') VALOR_TOTAL FROM ( SELECT CONSUMO.* FROM ( SELECT CONV_DS, CONV_SUS, CONV_PARTICULAR, INSU_DS, SUM(ISNULL(EMI_QTDE_COMERCIAL,0)) EMI_QTDE_COMERCIAL, ISNULL(SUM(ISNULL(EMI_QTDE_COMERCIAL,0) * ISNULL(PM,0)),0) VAL_TOTAL FROM ( SELECT CUREMI.*, (SELECT PCONV_DS FROM PLANO_CONVENIO PCONV WHERE PCONV.PCONV_ID = CUREMI.PCONV_ID) PCONV_DS, (SELECT CONV_DS FROM CONVENIO CONV WHERE CONV.CONV_ID = (SELECT CONV_ID FROM PLANO_CONVENIO PCONV WHERE PCONV.PCONV_ID = CUREMI.PCONV_ID) ) CONV_DS, (SELECT CONV_SUS FROM CONVENIO CONV WHERE CONV.CONV_ID = (SELECT CONV_ID FROM PLANO_CONVENIO PCONV WHERE PCONV.PCONV_ID = CUREMI.PCONV_ID) ) CONV_SUS, (SELECT CONV_PARTICULAR FROM CONVENIO CONV WHERE CONV.CONV_ID = (SELECT CONV_ID FROM PLANO_CONVENIO PCONV WHERE PCONV.PCONV_ID = CUREMI.PCONV_ID) ) CONV_PARTICULAR FROM( SELECT INSU_DS, EMI.PCONV_ID, EMI_QTDE_COMERCIAL, EMI.INSU_PRECO_MEDIO_FISCAL PM FROM EMISSAO EMI JOIN SERVICO SERV ON SERV.SERV_ID = EMI.SERV_ID JOIN INSUMO INSU ON INSU.SERV_ID = EMI.SERV_ID LEFT JOIN TIPO_EMISSAO TEMI ON EMI.TEMI_ID = TEMI.TEMI_ID LEFT JOIN ESTOQUE_LOTE ELOTE ON EMI.ELOTE_ID = ELOTE.ELOTE_ID WHERE EMI.ENTI_ID = 1 AND EMI_DT_DISPENSA >= @DTINI AND EMI_DT_DISPENSA < @DTFIM AND INSU.INSU_ID IN (255651, 243116, 243116, 246708, 562, 250466, 413, 808) UNION ALL SELECT INSU_DS, EMI.PCONV_ID, EMI_QTDE_COMERCIAL, EMI.INSU_PRECO_MEDIO_FISCAL PM FROM ITENS_EMISSAO IEMI JOIN EMISSAO EMI ON EMI.EMI_ID = IEMI.EMI_ID JOIN SERVICO SERV ON SERV.SERV_ID = IEMI.SERV_ID JOIN INSUMO INSU ON INSU.SERV_ID = IEMI.SERV_ID LEFT JOIN TIPO_EMISSAO TEMI ON EMI.TEMI_ID = TEMI.TEMI_ID LEFT JOIN ESTOQUE_LOTE ELOTE ON IEMI.ELOTE_ID = ELOTE.ELOTE_ID WHERE EMI.ENTI_ID = 1 AND EMI_DT_DISPENSA >= @DTINI AND EMI_DT_DISPENSA < @DTFIM AND INSU.INSU_ID IN (255651, 243116, 243116, 246708, 562, 250466, 413, 808) UNION ALL SELECT INSU_DS, EMI.PCONV_ID, EMI_QTDE_COMERCIAL, EMI.INSU_PRECO_MEDIO_FISCAL PM FROM ESTORNO_EMISSAO EEMI JOIN ESTORNO EST ON EEMI.EST_ID = EST.EST_ID JOIN EMISSAO EMI ON EMI.EMI_ID = EEMI.EMI_ID JOIN SERVICO SERV ON SERV.SERV_ID = EMI.SERV_ID JOIN INSUMO INSU ON INSU.SERV_ID = EMI.SERV_ID LEFT JOIN TIPO_EMISSAO TEMI ON EMI.TEMI_ID = TEMI.TEMI_ID LEFT JOIN ESTOQUE_LOTE ELOTE ON EEMI.ELOTE_ID = ELOTE.ELOTE_ID WHERE EMI.ENTI_ID = 1 AND EMI_DT_DISPENSA >= @DTINI AND EMI_DT_DISPENSA < @DTFIM AND INSU.INSU_ID IN (255651, 243116, 243116, 246708, 562, 250466, 413, 808) UNION ALL SELECT INSU_DS, EMI.PCONV_ID, EMI_QTDE_COMERCIAL, EMI.INSU_PRECO_MEDIO_FISCAL PM FROM ESTORNO_ITENS_EMISSAO ESTI JOIN ESTORNO EST ON ESTI.EST_ID = EST.EST_ID JOIN ITENS_EMISSAO IEMI ON IEMI.IEMI_ID = ESTI.IEMI_ID JOIN EMISSAO EMI ON EMI.EMI_ID = IEMI.EMI_ID JOIN SERVICO SERV ON SERV.SERV_ID = IEMI.SERV_ID JOIN INSUMO INSU ON INSU.SERV_ID = IEMI.SERV_ID LEFT JOIN TIPO_EMISSAO TEMI ON EMI.TEMI_ID = TEMI.TEMI_ID LEFT JOIN ESTOQUE_LOTE ELOTE ON ESTI.ELOTE_ID = ELOTE.ELOTE_ID WHERE EMI.ENTI_ID = 1 AND EMI_DT_DISPENSA >= @DTINI AND EMI_DT_DISPENSA < @DTFIM AND INSU.INSU_ID IN (255651, 243116, 243116, 246708, 562, 250466, 413, 808)) CUREMI ) CURCC GROUP BY INSU_DS, CONV_DS, CONV_SUS, CONV_PARTICULAR ) CONSUMO ) CONSUMO2 ORDER BY 2, 1  
    • Por Caio_Lourençon
      Olá estou desenvolvendo um projeto utilizando a extensão MySQLi, e nisso aproveitando para utilizar algumas funções orientada a objeto! Gostaria de tirar umas dúvidas em relação a listagem de dados, são duas perguntas:   1) Utilizar a função foreach() ao invés de um while() com a função fetch_array() dentro, tem uma listagem mais rápida ou mais lenta? Pois com ambas consigo trazer os dados, No momento estou utilizando a foreach por ser mais rápida de se digitar.
      2) Utilizo muitas listagens de tabelas diferentes na mesma página sempre chamando um novo SELECT, seria melhor criar uma função com um SELECT dentro para eu sempre reutiliza-lá ou não iria mudar muita coisa em questão de desempenho?
       
      Agradeço qualquer informação.
    • Por laumello12
      Galera ajudinha
      Como faço para consumir um web service pronto em um projeto. Preciso só que ele busque no web service e traga na web 
      HELP
    • Por calves_oliveira
      Pessoal, não tenho conhecimento em Thread e em Timer mas consegui criar esses dois métodos porém está com um erro e não consigo resolver, a idéia é o seguinte: um classe manda uma jlabel para o método mostraLabel e ele chama o outro método desizaLabel os dois metodos abaixo vai apresentar a mensagem durante 3 segundos e dois deslizar para sair da tela.
      Sei que tem um erro no loop do metodo deslizaLabel pois ele esta com loop infinito mas não consigo tirar… quero que ao jlabel deslizar até o fim do form ele finalize o Thread.
      e também se alguém tiver alguma sugestão de como otimizar esse processo será bem vindo.
      public void mostraLabel(JLabel lbl) { ActionListener action = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { tempo.stop(); deslizaLabel(lbl); } }; tempo = new Timer(3000, action); tempo.start(); } private void deslizaLabel(JLabel lbl){ new Thread(){ @Override public void run(){ int x = 0; int y = lbl.getLocation().y; while(true){ x++; if(x > lbl.getWidth()){ this.stop(); } lbl.setLocation(x,y); try { sleep(10); } catch (InterruptedException ex) { } } } }.start();}  
    • Por stewartcintra@
      Tenho um sistema de contas em php mysql, preciso exibir todas as contas do mes agrupadas por categoria e o campo valorR$ para saber o total em reais de cada categoria.
      Não estou conseguindo, como posso fazer isso?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.