Gerar um alerta em C#

É bem simples, você já tem uma classe criada correto ?:slight_smile:
então, na classe criada, crie as seguintes variáveis globais:

public int qtdVencer;//será utilizada também na tela em que chamar o método da classe... Int32 segundos, minutos, milisegundos; DateTime dataHora;

não se esqueça de utilizar a refência using System.Data.SqlClient; na classe para poder utilizar os comandos de conexão…

agora, crie um método dentro da classe com um nome desejado.
criei um aqui com o nome VerificarBoletosVencer
e ficou assim:

public void VerificarBoletosVencer() { try { SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=CristalGlass;Persist Security Info=True;User ID=sa;Password=123456"); con.Open(); SqlCommand cmd = new SqlCommand("SELECT GETDATE()", con); DateTime DataServidor = Convert.ToDateTime(cmd.ExecuteScalar()); string novadata = DataServidor.AddDays(+10).ToShortDateString();

dataHora = DataServidor; minutos = dataHora.Minute; segundos = dataHora.Second; milisegundos = dataHora.Millisecond;
//TESTE PRA VER QUAIS DATAS TÁ PEGANDO. //label4.Text = novadata; //label5.Text = Convert.ToString(dataHora);
// sql anterior - SqlCommand command = new SqlCommand("Select COUNT(*) fROM Boletos Where data = @dataFuturo", con); SqlCommand command = new SqlCommand("Select COUNT(*) fROM BoletoVencer Where DataVencimento BETWEEN @DataServidor AND @dataFuturo", con);

command.Parameters.AddWithValue("@dataFuturo", novadata); command.Parameters.AddWithValue("@DataServidor", dataHora.ToShortDateString()); command.ExecuteNonQuery();

qtdVencer = Convert.ToInt32(command.ExecuteScalar()); con.Close(); } catch (Exception ex) { throw new Exception(ex.Message); } }

agora, na tela ( no evento Click de um botão por exemplo) em que você for querer executar o código para saber se tem ou não boletos vencidos, instancie a classe criada e chame o método
Class1 classe = new Class1(); classe.VerificarBoletosVencer();
e logo após, chame a variável qtdVencer da classe em um if, ficando assim:
if (classe.qtdVencer > 0) { MessageBox.Show("Tem " + classe.qtdVencer + " boletos pra vencer!"); Form1_Load(e, e); } else { MessageBox.Show("Não tem boletos para vencer!"); }

1 curtida

Eu tinha migrado até o int qtdVencer … na minha classe de Dados, no evento do Click que fiquei perdido…
Vou implementar dessa forma agora.
Lucas, você tá sendo demais cara! Eu pensei no sistema pra me ajudar aqui na empresa e você criou ele pra mim kk :confused: desculpa aí pelas burrices… Realmente preciso estudar MUITO e MUITO C#, não posso parar… :confused:

Obrigado demais, viu cara? Um grande abraço pra você.

Lucas, fiz todas as mudanças, mas olha essa imagem, tem algo errado:

Ação do Botão Verifica Boletos:
private void button1_Click(object sender, EventArgs e)
{
try
{
Dados dds = new Dados();
dds.VerificaBoleto();
label4.Text = Convert.ToString(dds.dataHora);
label5.Text = Convert.ToString(dds.novadata);
if (dds.qtdVencer > 0)
{
MessageBox.Show(“Tem " + dds.qtdVencer + " boletos para vencer!”);
}
else
{
MessageBox.Show(“Não há boletos que está pra vencer no prazo de 10 dias!”);
}
}
catch (Exception ex)
{
throw new Exception (ex.Message);
}
}

Ação da minha classe que contém o método VerificaBoleto:
public void VerificaBoleto()
{
try
{
AbrirConexao();
cmd = new SqlCommand(“SELECT GETDATE()”, con);
DateTime DataServidor = Convert.ToDateTime(cmd.ExecuteScalar());
novadata = DataServidor.AddDays(+10).ToShortDateString();

            dataHora = DataServidor;
            minutos = dataHora.Minute;
            segundos = dataHora.Second;
            milisegundos = dataHora.Millisecond;

            cmd = new SqlCommand("Select COUNT(*) fROM Boletos Where data BETWEEN @DataServidor AND @dataFuturo", con);

            cmd.Parameters.AddWithValue("@dataFuturo", novadata);
            cmd.Parameters.AddWithValue("@DataServidor", dataHora);
            cmd.ExecuteNonQuery();

            qtdVencer = Convert.ToInt32(cmd.ExecuteScalar());
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            FecharConexao();
        }

O que tem de errado? ‘-’

1 curtida

E se eu coloco esta linha:

cmd.Parameters.AddWithValue("@DataServidor",dataHora.ToShortDateString());

Me dá o retorno: Não há boletos que está pra vencer no prazo de 10 dias!

1 curtida

Lucão e galera,

olha que coisa doida.

O primeiro label pega a data atual (variável dataServidor)
O segundo label faz label atual + 10 dias, que gera a novaData.
O terceiro label é uma linha de código que implementei pra ver se o que realmente quero tá acontecendo, no mais, tá sim, pois ele tá pegando a diferença da data atual e a dataFuturo que me dá 9 dias (o correto seria 10, me ajudem também).

Só que quando eu clico em verificar boletos, ele encontra somente 4 boletos.

que é o que tem a data 01/06/2016, 02/06/2016, 03/06/2016 e 04/06/2016, o resto também era pra ele contar pra mim…

Tem algo errado mas não tô conseguindo descobrir…

1 curtida

UP! Alguém? :frowning:

1 curtida

Ahá! Encontrei o problema.
No meu banco de dados, a minha coluna de data estava com o tipo de dados STRING. Alterei para Date e funcionou.
Agora pega desde a data atual até a dataFuturo.

Sensacional! :slight_smile:

Galera ou Lucas,

preciso de fazer um teste pra vê se vai me aparecer o balãozinho ao lado do relógio me avisando que tem boletos pendentes invés de clicar no botão verificar.
Mas quero fazer um teste de 10 segundos. Na propriedade Timer, preciso alterar o Interval?

No meu código, deve ficar assim?

if (dds.minutos == 00 && dds.segundos == 10 && dds.milisegundos == 00)

Me ajudem aí, por favor.

1 curtida

Resolvido os problemas! Só está confuso o meu evento de Timer.
Não sei qual valor colocar no Interval da propriedade Timer.
E não sei como faço a linha de código referente aos segundos que quero que esse alerta seja emitido (segundos por ser teste).

1 curtida

UP UP. Alguém?

1 curtida

Opa…
Então, a questão do tempo de disparo do alerta, é você quem decide, se quiser que ele fique de segundos em segundos, apenas deixe assim:

if (segundos == 10 && milisegundos >= 800)
então a cada 1 minuto ele irá disparar o alerta.

ou se for de hora em hora, deixe como estava antes…

mas de minuto em minuto o sistema notificando o usuário, você não acha que ficaria frustante para o usuário não ?

obs: não deixe o milissegundo igual a zero, se não ele não irá te alertar, pois por o milissegundo
ser rápido demais, é provável que quando ele for verificar, já tenha passado do valor 0 e
nunca vai te alertar por sempre ter passado do valor especificado…
a melhor maneira que encontrei, foi deixando ele para comparar se é maior ou igual a 800

para teste, altere apenas o valor do segundo ou do minuto se for deixar, para testar mesmo…
por exemplo, se for do minuto, sempre coloque 1 a mais do atual e mande rodar a aplicação…

então, em relação ao valor do intervalo do timer, ele por padrão vem 100, mas é bem simples a
lógica, quando maior for o valor do intervalo, maior ficará o tempo que ele irá disparar o evento e menor, irá disparar mais rápido…

Você usa o Interval propriedade para determinar a freqüência com que o Elapsed evento é disparado.Porque o Timer classe depende do relógio do sistema, ele tem a mesma resolução do relógio do sistema.Isso significa que o Elapsed evento será acionado em um intervalo definido pela resolução do relógio do sistema se o Interval propriedade for menor que a resolução do relógio do sistema.
Timer.Interval Propriedade

1 curtida

Opa Lucas!

O motivo de ser em 1 em 1 minuto é só para teste mesmo, pra ver se está sendo feito o que foi pedido.
Caso for em 1 em 1 hora posso colocar o Interval da propriedade Timer em 100 e substituir por este trecho: if (minutos == 57 && segundos == 10 && milisegundos >= 600)

Correto?

1 curtida

Correto, para disparar de hora em hora, é esta linha de código ai mesmo.
o Interval do timer é apenas para dizer o tempo em que ele irá demorar para disparar o evento…
por exemplo, com o interval com o valor de 100 segundos, ele demora aproximadamente 15 milissegundos para disparar o evento segundo o conteúdo do link postado anteriormente.
Deixe o intervalo com 100 mesmo, já que vem por padrão…

1 curtida

OK OK Lucas!
Vou fazer o teste e logo mais retorno aqui. Obrigadão cara!

Me explica uma coisa, porque não é simples assim? Se eu quero que a cada 15 segundos, então: if(dds.segundos == 15){
//lógica
}

?

Não consigo entender esses números de milisegundos e segundos…
Por exemplo, pra emitir o alerta a cada 1 hora: if (minutos == 57 && segundos == 10 && milisegundos >= 600)

No meu ponto de vista, ele iria disparar a cada 57 minutos, 10 segundos e 6 milisegundos.
Mas estou errado, né? Porque?

1 curtida

Sim, o seu ponto de vista de acordo com a condição da linha de código está correto, disparando de hora em hora…
if (minutos == 57 && segundos == 10 && milissegundos >= 600)

Então, se você tirar o milissegundos, ele irá ficar disparando o alerta, durante o segundo inteiro ou seja, durante os 1000 milissegundos do segundo vai ficar exibindo a mensagem :joy:
que é assim a linha de código, causando repetição:
if(Segundos == 10) { //ação a ser executada }
ele vai exibir o alerta durante 1 segundo inteiro…

por isso, o porque de colocar o milissegundos, para que ele não fique disparando o alerta n vezes dentro daquele intervalo atendido pelo critério, sendo assim, dispara uma única vez o alerta.:grin:

então para evitar a repetição, coloque os milissegundos, ficando assim:
if(Segundos == 57 && milissegundos >= 600) { //ação a ser executada }

Entendi Lucas, foi numas trocas que eu fiz que gerou loop então…

Vou fazer o teste e informo aqui se deu tudo certo. Obrigado mais uma vez!

1 curtida

Lucas, nada cara :confused:

Segue os códigos:

Evento Tick:

private void timer1_Tick(object sender, EventArgs e)
{
try
{
Dados dds = new Dados();

            dds.VerificaBoleto();

            if (dds.qtdVencer > 0)
            {
                if (dds.segundos == 10 && dds.milisegundos >= 800)
                {
                    notifyIcon1.Visible = true;
                    //texto a ser exibido da notificação
                    notifyIcon1.Text = "ATENÇÃO";   
                    //titulo da mensagem
                    notifyIcon1.BalloonTipTitle = "Boletos a Vencer!";
                    //texto da mensagem
                    if (dds.qtdVencer > 1)
                    {
                        notifyIcon1.BalloonTipText = "Daqui dez dias vence " + dds.qtdVencer.ToString() + " boletos!";
                    }
                    //o tempo em que ficara sendo exibido
                    notifyIcon1.ShowBalloonTip(6000);
                }
            }
            else
            {
                MessageBox.Show("Não há boletos que está pra vencer no prazo de 10 dias!");
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
    }

e

Função que verificaboletos:

public void VerificaBoleto()
{
try
{
AbrirConexao();
cmd = new SqlCommand(“SELECT GETDATE()”, con);
DateTime DataServidor = Convert.ToDateTime(cmd.ExecuteScalar());
novadata = DataServidor.AddDays(+11).ToShortDateString();

            //ME MOSTRA QUANTOS DIAS TEM DE INTERVALO ENTRE A DATA ATUAL E A DATA FUTURO.
            //TimeSpan dt = Convert.ToDateTime(novadata) - Convert.ToDateTime(DataServidor);
            //totalDias = dt.Days;

            dataHora = Convert.ToDateTime(DataServidor.ToShortDateString());
            minutos = dataHora.Minute;
            segundos = dataHora.Second;
            milisegundos = dataHora.Millisecond;

            cmd = new SqlCommand("SELECT COUNT(*) FROM Boletos WHERE data BETWEEN @DataServidor AND @dataFuturo", con);
            cmd.Parameters.AddWithValue("@DataServidor", dataHora);
            cmd.Parameters.AddWithValue("@dataFuturo", novadata);
            cmd.ExecuteNonQuery();

            qtdVencer = Convert.ToInt32(cmd.ExecuteScalar());

        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        finally
        {
            FecharConexao();
        }

    }

A função de verificar boletos está funcionando, pois tenho um botão manual que faz essa verificação e ele me retorna os boletos que está pra vencer.
Agora não entendo o porque que não está emitindo o System Tray :confused: me ajuda aí :confused:

1 curtida

Achei um erro.

Fiz um break point no evento Timer.

private void timer1_Tick(object sender, EventArgs e)
{
try
{
Dados dds = new Dados();
dds.VerificaBoleto();

            if (dds.qtdVencer > 0)
            {

Ele para logo aqui.
if(dds.segundos == 10 && dds.milisegundos >= 800)
{
//não executa nada aqui e cai pro else logo abaixo.
{

}else{
E cai aqui.
MessageBox.Show(“Não há boletos pendentes!”);
}

Erro nos segundos, minutos, milisegundos?

1 curtida

Pessoal, achei um erro e resolvi de uma forma que não sei se está correta.
Como eu tenho as variáveis globais e publicas de milisegundos, segundos e minutos eu resolvi criar um MessageBox assim que dou um debug no meu sistema, ao clicar na ação do botão de verificar (adicionei esse MessageBox neste botão com a declaração das variáveis milisegundos, segundos e minutos da forma: sec = DataHora.Second e etc…)
E quando clicava no botão ele pegava a hora atual, os segundos e os milisegundos ATUAL, por um lado está correto mas ele não atualiza, pois se eu clicasse novamente no botão ele continuava com as mesmas marcações de segundos, milisegundos e minutos. Então resolvi fazer dessa forma:

private void timer1_Tick(object sender, EventArgs e)
{
try
{
Dados dds = new Dados();
dds.VerificaBoleto();

            if (dds.qtdVencer > 0)
            {

adicionei essa linha abaixo
int i = 0;
i++;
if (i > 0 && i <= 9)
fim
{
notifyIcon1.Visible = true;
notifyIcon1.Text = “ATENCAO!”;
notifyIcon1.BalloonTipTitle = “Boletos a vencer.”;

                    if (dds.qtdVencer > 1)
                    {
                        notifyIcon1.BalloonTipText = "Possui " + dds.qtdVencer.ToString() + " boletos a vencer no prazo de dez dias!";

                    }
                    else
                    {
                        notifyIcon1.BalloonTipText = "Possui " + dds.qtdVencer.ToString() + " boletos a vencer no prazo de dez dias!";
                    }

                    notifyIcon1.ShowBalloonTip(1000);
                }
                else
                {
                    notifyIcon1.BalloonTipText = "Não há boletos pra vencer!";
                }
            }

        }
        catch (Exception ex)
        {
            throw new Exception (ex.Message);
        }
    }

E coloquei no meu Timer o valor: 10000.

A cada 10 segundos ele emite pra mim o alerta do SystemTray.
Tentei fazer com 1 minuto não consegui…

A ideia é do sistema alertar a cada 30min ou 1 hora mas pra mim ver se realmente está funcionando precisaria fazer com os segundos, que é no caso que eu fiz agora e funcionou.

Dessa forma que fiz está correto?
Eu precisaria agora é colocar pra funcionar em 30 em 30 minutos ou 1 em 1 hora. Podem me ajudar?

1 curtida

Meus amigos, consegui! :slight_smile:

Fiz essa lógica aqui e deu certo.

sec++;
                if (sec == 60)
                {
                    min++;
                    sec = 0;
                }
                else if (min == 29)
                {
                    min = 0;
                    sec = 0;
                }

//label pra verificar
                label8.Text = min.ToString();
                label4.Text = sec.ToString();

                if (dds.qtdVencer > 0)
                {
                    
                    if(min == 28 && sec == 59)
                    {

//faz o que eu quero.

Perfeitamente rapaziada! Ihá… Agora é os ultimos detalhes e colocar pra rodar essa budanga na empresa. Hahah. Valeu Lucas e galera!

2 curtidas