Gerar um alerta em C#

Olá pessoal, sou novo no forum e por este motivo se estiver fora do padrão, favor me orientar que irei refazer o tópico. Galera, é o seguinte: preciso criar uma aplicação de “vencimentos de boleto”.
O método de inserir, listar e tudo mais, eu consigo desenvolver, o que eu não estou conseguindo é: eu tenho um boleto que vence no dia 28/05/2016 mas eu quero que gere um alerta 10 dias antes que ele vença. Preciso ter um controle de boletos aqui na minha empresa, vocês poderiam me ajudar?

Vou começar a desenvolver isso em C# e com banco de dados SQL.

Pessoal, agradeço a boa vontade de vocês! Agradeço desde já.

1 curtida

Você pode criar um Windows Service pra ficar monitorando os boletos. Quando o boleto estiver pra vencer, ele envia
um e-mail automático informando…

1 curtida

Boa tarde, eu tenho alguns sistemas de monitoramento em C# onde jogo o sistema no system tray. Se estiver utilizando Windows Forms, coloque um timer e coloque algumas condições de ativação por exemplo a cada duas horas, jogue seu sistema no system tray SystemTray e dispare os avisos via email.

1 curtida

Galera, obrigado pelas dicas e vou sim ler elas pois achei bem interessante.
A minha maior dúvida é, como traduzo essa lógica para o C#?

Exemplo: Tenho um boleto que vence no dia 30/05/2016.
Eu quero que 10 dias antes me gera um alerta (pode ser pelo System Tray por exemplo).
Essa é minha maior dúvida.

Poderiam me ajudar neste sentido?
Agradeço mais uma vez esses links, vão me ajudar demais pessoal.

1 curtida

Alguém pra me ajudar? :confused:

1 curtida

Bom Dia Cristal_Glass!

Crie um formulário em branco e remova a borda do mesmo e coloque para iniciar minimizado.
Feito isto, adicione os seguintes componentes:
1 timer
1 notifyIcon e
1 contextMenuStrip

após adicionar os componentes acima, crie quatro variáveis globais com o seguinte nomes e tipo de prefência:
três variáveis do tipo Int
Int32 segundos, minutos, milisegundos;
e uma do tipo DateTime
DateTime dataHora;

Ainda no formulário, no evento Resize

private void Form1_Resize(object sender, EventArgs e) { //verifica se o formulario esta minimizado if (this.WindowState == FormWindowState.Minimized) { //esconde o formulário this.Hide(); //deixa o aviso visivel notifyIcon1.Visible = true; } }

agora no componente contextMenuStrip

adicione um menu no mesmo com o nome desejado e dê duplo clique no menu para ativar um evento, no meu caso, ficou assim:
private void abrirToolStripMenuItem_Click(object sender, EventArgs e) { //para abrir o formulário form1 mesmo, no seu caso, para você seria a tela de login ou o principal, ou outra tela mesmo new Form1().Show(); }

agora no componente notifyIcon

no notifyIcon, vá na propriedade ContextMenuStript e selecione o contextMenuStrip criado anteriormente.

vá na propriedade BallonTipIcon e selecione a que melhor se adequar (Info,Warning ou Error).
e na propriedade Icone do notify, coloque um icone desejado.
vá em Eventos do notifyIcon e dê duplo click sobre o evento MouseDoubleClick

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { //irá exibir o formulário (neste caso o form1) em seu caso, pode ser a tela de login ou o principal, não sei como está a aplicação ai... this.Show(); //o formulario irá iniciar maximizado this.WindowState = FormWindowState.Maximized; //oculta o aviso notifyIcon1.Visible = false; }

Agora no componente timer, vá na propriedade enable e altere para true e depois em evento, dê duplo click sobre o evento Tick ou se preferir, dê duplo click sobre o timer.

No evento Tick do timer, ficou assim:

`private void timer1_Tick(object sender, EventArgs e)
{
//data e a hora do sistema. é possivel pegar a data do servidor para evitar possiveis conflitos,
//pois a data da maquina local, pode estar alterada e tals…
//para buscar a data do sistema, faça uma consulta do tipo:
//select GETDATE() mais detalhes no tópico da msdn, link abaixo…
dataHora = DateTime.Now;
//variavel recebe o minuto do sistema
minutos = dataHora.Minute;
//variavel recebe o segundo do sistema
segundos = dataHora.Second;
//variavel recebe o milisegundo do sistema
milisegundos = dataHora.Millisecond;

        //Para ficar melhor ainda, e mostrar para o usuário, quantos boletos tem para vencer, faça uma consulta 
        //do tipo Count para contar quantos boletos tem para vencer dentro de 10 dias e é claro, para não ficar mostrando a mensagem 
        //toda vez que atender o critério mesmo não tendo boleto a vencer!.
        //a consulta abaixo, utilizei o BETWEEN, entre datas, para comparar datas... neste caso a atual e a daqui a dez dias...
        //Select COUNT(*) fROM BoletoVencer Where DataVencimento BETWEEN @DataAtual AND @DataDezMais
        int qtdVencer = Convert.ToInt32(this.boletoVencerTableAdapter.ContarBoletoVencer(dataHora.Date,dataHora.AddDays(+10)));
        //verifica se tem boletos a vencer
        if (qtdVencer > 0)
        {
            if (minutos == 57 && segundos == 10 && milisegundos >= 600)
            {
                //exibe o icone
                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 (qtdVencer > 1)
                {
                    notifyIcon1.BalloonTipText = "Possui " + qtdVencer.ToString() + "  boletos à vencer dentro de Dez Dias";
                }
                else
                {
                    notifyIcon1.BalloonTipText = "Possui " + qtdVencer.ToString() + " boleto à vencer dentro de Dez Dias";
                }
                
                //o tempo em que ficara sendo exibido
                notifyIcon1.ShowBalloonTip(1000);
            }
        }
    }`

GetDate

:slight_smile:

1 curtida

Bem complicado a parte do select ali, mas vou chegar em casa e tentar fazer.

Obrigado pela ajuda!

1 curtida

Qual parte do select é complicado ?
que tipo de DataSet você utiliza ? DataSet Tipado ?

1 curtida

Eu crio o banco de dados no SQL SERVER.
Migro ele pro Visual Studio por meio do SQLCLIENT, coloco a instância, meu usuário do do SQL SERVER e busco o meu banco de dados e dou OK.
Ele fica visivel pra mim pelo Server Explorer logo após esse processo.

Eu quero que 10 dias antes de qualquer boleto, me gera um alerta e que seja sinalizado de tal forma no sistema, seja por meio de DataGridView, por meio de algo… Depois eu com mais tempo, implemento coisas mais complexas.

1 curtida

Foi alterado apenas o código do evento do timer, portanto os outros eventos permanecem do mesmo modo que citei anteriormente…
e agora a consulta apenas irá contar os boletos que vencerão dez dias a partir da data atual pois no código anterior, contaria tudo dentro do intervalo de dez dias…

Fiz adaptando ao método de conexão que você utiliza e ficou assim segundo oque entendi sobre oque você quer:
`
private void timer1_Tick(object sender, EventArgs e)
{
//string de conexão com o banco
SqlConnection conn = new SqlConnection(@“Data Source=.\sqlexpress;Initial Catalog=Boleto;User ID=sa; Password=SuaSenha”);
//abre a conexão com o banco
conn.Open();

        //consulta para buscar a data do servidor, pois a do sistema pode estar adiantada ou atrasada...
        SqlCommand cmdDataServ = new SqlCommand("Select GETDATE()",conn);
        //variavel do tipo data, recebe a data do servidor...
        DateTime DataServidor = Convert.ToDateTime(cmdDataServ.ExecuteScalar());            
        // a data é convertida para 'String' para pegar apenas a data, senão ele trárá com a hora e na pesquisa e
        //não atendera o criterio e sempre trará 0 no resultado da contagem mesmo se tiver boletos a vencer na data...
        string novadata = DataServidor.AddDays(+10).ToShortDateString();

        //variaveis recebem os respectivos valores do servidor
        dataHora = DataServidor;
        //variavel recebe o minuto do sistema
        minutos = dataHora.Minute;
        //variavel recebe o segundo do sistema
        segundos = dataHora.Second;
        //variavel recebe o milisegundo do sistema
        milisegundos = dataHora.Millisecond;

        //Para ficar melhor ainda, e mostrar para o usuário, quantos boletos tem para vencer, faça uma consulta 
        //do tipo Count para contar quantos boletos tem para vencer dentro de 10 dias e é claro, para não ficar mostrando a mensagem 
        //toda vez que atender o critério mesmo não tendo boleto a vencer!.
        SqlCommand cmd = new SqlCommand("Select COUNT(*) fROM BoletoVencer Where DataVencimento  =  @DataFuturo",conn);
        cmd.Parameters.Add(new SqlParameter("@DataFuturo", novadata));
        //executa a consulta
        cmd.ExecuteNonQuery();
        //variavel recebe o resultado da consulta
        int qtdVencer = Convert.ToInt32(cmd.ExecuteScalar());

        //fecha a conexão com o banco
        conn.Close();
        
        //verifica se tem boletos a vencer
        if (qtdVencer > 0)
        {
            if (minutos == 57 && segundos == 10 && milisegundos >= 600)
            {
                //exibe o icone
                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 (qtdVencer > 1)
                {
                    notifyIcon1.BalloonTipText = "Possui " + qtdVencer.ToString() + "  boletos à vencer dentro de Dez Dias";
                }
                else
                {
                    notifyIcon1.BalloonTipText = "Possui " + qtdVencer.ToString() + " boleto à vencer dentro de Dez Dias";
                }
                
                //o tempo em que ficara sendo exibido
                notifyIcon1.ShowBalloonTip(1000);
            }
        }
    }`
1 curtida

Simplesmente você é DEMAIS! hahahaha
Lucas, consegui gerar o alerta de quando eu clicar no botão “Verificar Boletos” ele me alerta “Você tem um boleto para pagar”.
OK! Mas eu gerei um DataGridView para listar todos boletos cadastrados.
Eu precisaria que me mostrasse em label ou em cores vermelhas quais são esses boletos, poderia me ajudar?

O foda que ficou meio bagunçado meu sistema kkkk, pois eu tava fazendo em orientação a objetos e agora com seu ultimo post, eu inclui isso tudo no meu botão de “Verificar Boletos” mas isso eu dou uma quebrada de cabeça e tento organizar…

1 curtida
    private void button1_Click(object sender, EventArgs e)
    {
        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;

            label4.Text = novadata;

            SqlCommand command = new SqlCommand("Select COUNT(*) fROM Boletos Where data  =  @dataFuturo", con);
            command.Parameters.AddWithValue("@dataFuturo", novadata);
            command.ExecuteNonQuery();

            int qtdVencer = Convert.ToInt32(command.ExecuteScalar());
            con.Close();

            if (qtdVencer > 0)
            {
                MessageBox.Show("Tem "+qtdVencer+" boletos pra vencer!");
                Form1_Load(e,e);
            }
            else
            {
                MessageBox.Show("Não tem boletos para vencer!");
            }
        }
        catch (Exception ex)
        {
            throw new Exception (ex.Message);
        }
    }

Galera, até então tá assim… Consigo ver que tem “x” boletos que está pra vencer mas encontrei um “erro”. Ele me mostra quantos boletos tem pra vencer SOMENTE na condição: data + 10 dias.
Eu queria que ele me mostrasse o número x de boletos que estão pra vencer em 10 dias, seria tipo uma “varredura” e me mostrar quantos estão pra vencer. Poderiam me ajudar?

1 curtida

Aah, você quer que ele te diga quantos boletos tem para vencer de hoje até a data daqui há dez dias.
é simples, é só colocar a consulta com o BETWEEN que ficará assim:
Select COUNT(*) fROM BoletoVencer Where DataVencimento BETWEEN @dataServidor AND @dataFuturo
no lugar do "Select COUNT(*) fROM BoletoVencer Where DataVencimento = @DataFuturo"

enquanto a questão de pintar, tentarei fazer aqui e te informarei…

em questão ao botão, fica meio desproporcional o usuário ficar clicando rsrs
não deu certo fazer pelo passo a passo que te disse, criando um formulário adicionando os componentes e etc… ?

1 curtida

Lucas, vou implementar do jeito que você me mandou… Eu fiz esse botão porque veio na cabeça só pra ver se tá dando certo e deu.
Cara, você tá sendo demais kkk. Preciso voltar a estudar, porque tá foda a lógica viu, puts :s.

Eu vou fazer os testes aqui e te falo amigão. Tô no trabalho agora mas vou acessar meu pc daqui e vou puxar os arquivos e fazer essas alterações e te falo.
Obrigadão Lucas!

1 curtida

Lucas, nessa linha:

Select COUNT(*) fROM BoletoVencer Where DataVencimento BETWEEN @dataServidor AND @dataFuturo

O dataServidor eu declaro por qual variável?

a DataFuturo é a novadata.
Mas e a DataServidor?

1 curtida

private void button1_Click(object sender, EventArgs e)
{
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 Boletos Where data BETWEEN @DataServidor AND @dataFuturo", con);

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

            int qtdVencer = Convert.ToInt32(command.ExecuteScalar());
            con.Close();

            if (qtdVencer > 0)
            {
                MessageBox.Show("Tem "+qtdVencer+" boletos pra vencer!");
                Form1_Load(e,e);
            }
            else
            {
                MessageBox.Show("Não tem boletos para vencer!");
            }
        }

Ele tá pegando agora, tudo que tem entre a data cadastrada no sistema e o prazo de 10 dias.
Tá correto no código?

1 curtida

Blz hehe!
A Data do Servidor é a variavel que é declarada lá em cima no código, lembra ?
que traz a data do servidor onde está instalado o banco…
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=CristalGlass;Persist Security Info=True;User ID=sa;Password=123456"); con.Open(); DateTime DataServidor = Convert.ToDateTime(cmdDataServ.ExecuteScalar()); // a data é convertida para 'String' para pegar apenas a data, senão ele trárá com a hora e na pesquisa e //não atendera o criterio e sempre trará 0 no resultado da contagem mesmo se tiver boletos a vencer na data... string novadata = DataServidor.AddDays(+10).ToShortDateString();
que no caso, você informa a variável DataServidor convertendo a mesma para ToShortDateString();
ou se preferir, crie uma nova variável do tipo ‘String’ recebendo a data do servidor.
Exemplo:
string DataServ = DataServidor.ToShortDateString();
e você informa a DataServ como parâmetro da data do servidor…

1 curtida

Entendi Lucas! Verifica se está OK:

private void button1_Click(object sender, EventArgs e)
{
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 Boletos Where data BETWEEN @DataServidor AND @dataFuturo", con);

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

            int qtdVencer = Convert.ToInt32(command.ExecuteScalar());
            con.Close();

            if (qtdVencer > 0)
            {
                MessageBox.Show("Tem "+qtdVencer+" boletos pra vencer!");
                Form1_Load(e,e);
            }
            else
            {
                MessageBox.Show("Não tem boletos para vencer!");
            }
        }
        catch (Exception ex)
        {
            throw new Exception (ex.Message);
        }
    }
1 curtida

Funcionando Blz, só tem um porém
quando você passa o parâmetro da data do servidor, converta para ToShortDateString()
pois se houver algum boleto com a data de vencimento atual (que é a do servidor) ele não irá
contar porque está indo com a data com hora do jeito atual…
ficará assim convertendo ele para ToShortDateString() :
command.Parameters.AddWithValue("@DataServidor", dataHora.ToShortDateString());
assim, irá apenas a data e te trará boletos com a data atual caso tenha…

:confused: Uma dúvida … você remove desta tabela quando o boleto é “pago” ou altera algum Status ?
porque se alterar o status, deve alterar a sua consulta para buscar apenas quando o status não for pago…
exemplo:
SqlCommand command = new SqlCommand("Select COUNT(*) fROM Boletos Where data BETWEEN @DataServidor AND @dataFuturo AND Status = 'Pago' ", con);
que dai trará apenas os não pagos

1 curtida

Então Lucas, implementei mais uma coluna no meu banco de dados com o nome de Status e agora eu alimento o boleto que está pendente e boleto que já foi pago. Depois vou criar um menu e nesse novo form, vou fazer um select somente dos que já foi pago, aí fica mais organizado.

Valeu pelo toque do .ToShortDateString(); vou fazer isso sim…

Cara, me ajuda num negócio agora (tô te enchendo demais) kkk.

Todo esse código que agente fez:

private void button1_Click(object sender, EventArgs e)
{
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 Boletos Where data BETWEEN @DataServidor AND @dataFuturo", con);

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

        int qtdVencer = Convert.ToInt32(command.ExecuteScalar());
        con.Close();

        if (qtdVencer > 0)
        {
            MessageBox.Show("Tem "+qtdVencer+" boletos pra vencer!");
            Form1_Load(e,e);
        }
        else
        {
            MessageBox.Show("Não tem boletos para vencer!");
        }
    }
    catch (Exception ex)
    {
        throw new Exception (ex.Message);
    }
}

Eu gostaria de implementar ele na classe que tenho só de Cadastro, Atualizar, Deletar e etc…
Como eu me organizo nesse sentido? Poderia dar uma “clareada na minha cabeça”?

1 curtida