COMO SOMAR HH:MM:SS NO REPORT VIEWER E NO DATAGRI?

KHARUF 23/05/2013 22:07:56
#423962
Pessoal,
Peço ajuda em duas situações que não estou conseguindo resolver. São elas:

Tenho 03(três) campos: Hora inicial, Hora final e Tempo gasto (nenhum campo tem data, pois trabalho com variáveis no Banco de Dados (SQL) como TIME ).

Faço a diferença entre hora final e hora inicial para achar o tempo gasto.

Bom, nos DatagridViewer e Report Viewer tenho além de outros campos, os campos em questão sendo que preciso somar por empresa a coluna do tempo gasto (hh:mm:ss) que o funcionário gastou dando suporte por telefone a tal empresa.

é uma coluna só (hh:mm:ss) e não consigo achar nenhuma função que some tal dado, pois trabalhar com hora: minuto:segundo para mim está sendo difícil.

No Excel é muito fácil, usando a função =SOMA(CL:CL), mas no VB.NET não estou conseguindo! :(

Uso o Group By por empresa + funcionário.

Agradeço a quem puder me ajudar, pois já tentei de tudo e não obtive exito!

Kharuf
PROFESSOR 26/05/2013 19:26:35
#424052
Bom, primeiramente, mesmo que você trabalhe com tipos de dados Time ou ShortTime o campo armazena, sim, Data e Hora, independente de você querer ou não.

O que ocorre é que apenas a representação e a precisão mudam desde um DateTime para um ShortTime, por exemplo.

SQL, por sua vez, é uma linguagem de consultas e não um serviço de dados.
SQL Server é um serviço de dados, que usa a linguagem TSQL, que é uma variação da SQL.

Agora, voltando ao assunto, você possui dois campos, um com o início e outro com o término da jornada (expediente, período etc.), e precisa calcular a diferença entre esses dois campos, o que sempre retornará um inteiro.

Ou seja, a diferença entre duas datas ou entre duas horas é sempre um inteiro, e não outra data ou hora. Para exemplificar, a diferença entre sua data de nascimento e a data de hoje é a quantidade de anos que representa a sua idade, e não uma outra data. Não faz sentido que possa ser uma data, mas sim uma quantidade.

Da mesma forma, sua jornada de trabalho talvez seja 8 horas / dia, ou seja, é a diferença entre o horário da entrada e o da saída, que é um valor inteiro representando o total de minutos que você trabalhou. Para chegar ao valor de 8 horas, você então divide o total por 60, que é a quantidade de minutos contido em uma hora.

Assim, esse terceiro campo, que é do tipo Int (Integer, BigInt etc), é também um campo calculado, ou seja, nenhum usuário vai informar esses dados manualmente, o próprio mecanismo de dados é quem o define, e, caso você esteja utilizando um SQL Server ou um SQL Server Compact, ele pode ser atualizado com o resultado de uma consulta TSQL como UPDATE [minhaTabela] SET [Tempo gasto] = DATEDIFF(minute, [Hora inicial], [Hora final]), ou, como é o mais comum, ele aceitará valores nulos e terá como valor padrão o resultado dessa função (DATEDIFF(minute, [Hora inicial], [Hora final])).

Demonstrar esse valor inteiro como anos, semestres, meses, dias, horas, minutos etc., seja em grades de dados, em relatórios ou outras saídas de dados, depende de você criar as funções que calculem o resultado conforme o desejado, como mais acima foi feito com a jornada de trabalho.

Por outro lado, há, tanto no Crystal Reports quanto no DataReport e em vários outros componentes de terceiros, funções que calculam a diferença entre datas, de modo que esse campo na verdade nem precisa existir na base de dados, uma vez que os outros dois (início e fim) já existem. Mesmo que não existissem essas funções, o VB dispõe delas nativamente, e o modelo Datatable da ADO.Net permite a inclusão desses campos manualmente, mesmo quando não existem fisicamente.

Nesse ponto, então, caímos na questão da normatização das estruturas de dados, o que leva á crer que você talvez precise um pouco mais de experiência nesse aspecto.

Assim, eu recomendaria á você que, antes de se preocupar com o problema de como apresentar os dados, focasse um pouco mais no SQL, por exemplo usando o SSMS ou o MS-Access, [Ô]fuçando[Ô] funções e diretivas de consultas, para entender melhor o quê de fato é necessário armazenar, o que é supérfluo (que acaba deixando a base mais pesada e lenta) e ainda o quê esperar de retornos das consultas que faça ao serviço de dados.
KHARUF 27/05/2013 22:13:55
#424119
Professor,

Primeiramente, agradeço muito ter-me respondido!

Tudo que me explicou já sei, conheço e concordo plenamente contigo. Admito que errei quanto a normalização em ter criado um campo desnecessário como resultado de uma diferença de dois valores, mas agora já foi feito e no futuro irei arrumar.

O meu problema não é a diferença entre datas, pois já utilizo de todos os recursos que foram explicados por você.

Ocorre que não estou conseguindo resolver a soma de uma única coluna (coluna essa que será retirada posteriormente do BD), por exemplo:

Empresa A....... 10:03:20
........10:05:10
........10:10:11
Total emp A.......30:18:41

Empresa B......09:10:12
.....09:15:22
Total emp B... 18:25:34
....

Talvez seja porque não tenho tanto conhecimento e experiência com o Crystal Report e o Report Viewer, pois nunca precisei utilizar cálculos com [Ô]datas[Ô] e/ou [Ô]horas[Ô] em aplicações que desenvolvi.

A questão é que além de eu não estar conseguindo achar a função correta, não sei como aplicá-la no Crystal Report ou no Report Viewer.

é nesse sentido que preciso de ajuda e se puder perder mais um tempinho para me ajudar, ficarei muito grato...

Kharuf
Faça seu login para responder