Sistema de Folha de Pagamento

No SQL Server, crie o Banco de Dados e as tabelas abaixo:

CREATE DATABASE bdFolha

Criar Banco e Tabela

Store Procedure

Banco e Tabelas

No Visual Studio, crie uma nova solução.

Name: ctrFolha
Nome do formulário: frmPrincipal.cs
Text: Folha de Pagamento
StartPosition: CenterScreen
MaximizeBox: False
FormBorderStyle: Fixed3D

Formulário Principal

Crie o menu com os seguintes itens:

&Cadastro &Folha
&Funcionários &Manutenção
Sai&r  
   

Form Principal

Clique no menu Cadastro e na opção Funcionários acima, digite o código abaixo:
frmFuncionarios formFuncionarios = new frmFuncionarios();
formFuncionarios.ShowDialog();

No menu Cadastro e na opção Sair e digite o código: Application.Exit();

Na janela do Solution Explorer, duplo clique no arquivo App.Config, e deixe como abaixo:
App.config

Este arquivo é responsável por conectar ao banco de dados.

App.config

Vá até o Menu Projects e clique em Add Class. Coloque o nome: clsGlobal
Deixe como abaixo:
Classe clsGlobal
Esta classe é responsável pela passagem de valores as variáveis criadas na mesma, no qual o seu valor poderá ser visualizado em qualquer form, classe, já que static permite utiliza-las como variável global.

Classe para acesso a banco de dados

Quando você adiciona uma classe, são inseridas as bibliotecas básicas, como abaixo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ctrFolha
{
class Class1
{
}
}

Como precisamos utilizar banco de dados, é necessário declarar as bibliotecas.

Vá até o Menu Projects e clique em Add Class. Coloque o nome: clsFuncionarios

Para recuperar do arquivo app.config, a conexão com o banco, faça os procedimentos abaixo:
- Clique com o botão direito sobre References na janela do Solution Explorer;
- Na janela que abriu, na opção Framework, selecione na janela no lado direito: System Configuration;
Deixe o código da classe como abaixo:

Observe que ConfigurationManager, SqlConnection e SqlCommand estão sublinhados em vermelho.
E necessário inserir as bibliotecas:
- System.Configuration --> para ConfigurationManager;
- System.Data.SqlClient -->
para utilizar as classes: SqlConnection e SqlCommand;
- System.Data -->
para utilizar as classes: DataReader, DataRow
Vá até as declarações using na parte superior e digite:
using System.Configuration;
using System.Data.SqlClient;

using System.Data;

Criação do método inserir, editar e pesquisar
Para inserir, editar e pesquisar na tabela de funcionarios, é necessário criar os métodos, conforme abaixo:

Método Inserir

Método Editar

Métodos Pesquisa - Nome e CTPS

Método Pesquisa por Nome

Método id

Criação do formulário de funcionários
Vá até o Menu Projects / Add Windows Form. No Name digite: frmFuncionarios.
Monte o formulário conforme abaixo:

Form de Funcionários

Controle Name Text Maxlength Enabled
GroupBox gbOpcoes Opções    
Button btnNovo &Novo    
Button btnEditar &Editar    
Button btnCancelar &Cancelar    
Button btnPesquisar &Pesquisar    
Button btnSair Sai&r    
GroupBox gbDados Dados    
Label lblCodigo Código:    
TextBox txtCodigo   5 False
Label lblFuncionario Nome do Funcionário    
TextBox txtFuncionario   50  
Label lbldtAdmissao Dt Admissão    
DateTimePicker dtpdataAdmissao      
Label lblCTPS CTPS    
TextBox txtCTPS   30  
CheckBox chkSituacao Situação    

 

Codificando o formulário

Duplo clique no botão cancelar:

botão Cancelar

A subrotina limpar ficará grifada em vermelho, pois ainda não foi criada. Clique abaixo da chave de fechamento acima, para cria-la:

subrotina_Limpar

Vá até o evento load do formulário, e deixe como abaixo:
private void frmMunicipios_Load(object sender, EventArgs e)
{
btnCancelar_Click(sender, e);
}

Vá até o evento click do botão Novo, e deixe como abaixo:
botão Novo

A linha: opcao =1 e incluir_editar ficarão sublinhadas, já que a primeira precisa declarar a variável e a segunda criar a subrotina.

Vá até o início do form e deixe como abaixo:
int opcao = 0;

Ela deverá ficar antes da linha: public frmFuncionarios()

A seguir, crie a subrotina abaixo:

Funcionário_incluir

Criação do formulário de pesquisa de funcionários

Controle Name Text
GroupBox gbOpcoes Opções
RadioButton rbNome Nome
RadioButton rbCTPS CTPS
TextBox txtPesquisa  
Button btnPesquisar Pesquisar
Button btnSair Sai&r
DataGridView dgvFuncionarios  

Selecione o datagridview e na seta para desmarcar as opções: Enable Adding, Enable Editing, Enable Deleting

Form Pesquisa Fun

Codificação do botão pesquisar:

private void btnPesquisar_Click(object sender, EventArgs e)
{
if (rbNome.Checked) // Se a opção selecionada for pelas iniciais do nome do funcionário
{
clsFuncionarios objFuncionarios = new clsFuncionarios();
dgvFuncionarios.DataSource= objFuncionarios.pesquisaFuncionariosNome(txtPesquisa.Text);
}

if (rbCTPS.Checked) // Se a opção selecionada for pelas iniciais da carteira de trabalho
{
clsFuncionarios objFuncionarios = new clsFuncionarios();
dgvFuncionarios.DataSource = objFuncionarios.pesquisaFuncionariosCTPS(txtPesquisa.Text);
}
cabecalho(); // Chama esta subrotina para mudar o nome de cada coluna referente a cada coluna da tabela e a largura
}

Logo abaixo da chave de fechamento acima, crie a subrotina:
private void cabecalho()
{
dgvFuncionarios.Columns[0].HeaderText = "Código";
dgvFuncionarios.Columns[0].Width = 60;
dgvFuncionarios.Columns[1].HeaderText = "Nome do Funcionário";
dgvFuncionarios.Columns[1].Width = 150;
dgvFuncionarios.Columns[2].HeaderText = "Dt.Admissão";
dgvFuncionarios.Columns[2].Width = 90;
dgvFuncionarios.Columns[3].HeaderText = "CTPS";
dgvFuncionarios.Columns[3].Width = 90;
dgvFuncionarios.Columns[4].HeaderText = "Situação";
dgvFuncionarios.Columns[4].Width = 90;
}

Codificação do botão sair:

private void btnSair_Click(object sender, EventArgs e)
{
this.Close();
}

Codificação do botão pesquisar do formulário de cadastro de funcionários
private void btnPesquisar_Click(object sender, EventArgs e)
{
frmPFuncionarios objPesquisa = new frmPFuncionarios();
objPesquisa.ShowDialog();

if (clsGlobal.IdFuncionario == 0) return; // Senão pesquisou, não executa as linhas abaixo

txtCodigo.Text = clsGlobal.IdFuncionario.ToString(); // Armazena o conteúdo que veio do formulário de pesquisa de funcionários da variável idFuncionario para a caixa de textos txtCodigo

clsFuncionarios objFuncionarios = new clsFuncionarios(); // Cria a instancia objFuncionarios da classe clsFuncionarios

DataRow row = objFuncionarios.pesquisaFuncionariosId(clsGlobal.IdFuncionario).Rows[0]; // Cria a instancia row, utilizando a pesquisa pelo idFuncionario
txtNome.Text = row["nome"].ToString(); // Armazena o nome do funcionario na caixa de textos txtNome
dtpdataAdmissao.Value = Convert.ToDateTime(row["dataAdmissao"]);
txtCTPS.Text = row["ctps"].ToString();

bool situacao = bool.Parse(row["situacao"].ToString()); // Cria a variável tipo bool, já que a coluna situacao é do tipo bit, ou seja: verdadeiro ou falso
if (situacao == true)
{
chkSituacao.Checked = true;
chkSituacao.Text = "Ativo";
}

else
{
chkSituacao.Checked = false;
chkSituacao.Text = "Inativo";
}

gbDados.Enabled = true;
btnEditar.Enabled = true;
btnNovo.Enabled = false;
btnNovo.Text = "&Novo";
btnEditar.Text = "&Salvar";
txtNome.Focus();
}

Codificação do botão editar
private void btnEditar_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Deseja Salvar ?", "Salvar", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
if (txtCodigo.Text == "")
{
MessageBox.Show("Informe o Código do Funcionário!", "Funcionário", MessageBoxButtons.OK);
txtCodigo.Focus();
return;
}

if (txtNome.Text == "")
{
MessageBox.Show("Informe o Nome do Funcionário!", "Funcionário", MessageBoxButtons.OK);
txtNome.Focus();
return;
}
opcao = 2;
incluirEditar();
btnCancelar_Click(sender, e);
}
}

Adicione o formulário abaixo:

Folha

Controle Name Text Maxlength Enabled Mask
GroupBox gbOpcoes Opções      
Button btnNovo &Novo      
Button btnEditar &Editar      
Button btnCancelar &Cancelar      
Button btnPesquisar &Pesquisar      
Button btnSair Sai&r      
GroupBox gbDados Dados      
Label lblmesAno Mes/Ano:      
MaskedTextBox mskmesAno       ##/####
Label lblFuncionario Funcionário      
ComboBox cmbFuncionario        
Label lbldtSalario Salário      
TextBox txtSalario   12    
Label lblpercentualINSS % INSS      
TextBox txtpercentualINSS   5    
Label lblValorINSS Vl. INSS      
TextBox txtValorINSS   12    

Adicione a classe: clsFolha e crie os métodos abaixo:

Classe Folha
Classe Folha2
Classe Folha3

Classe Folha5

Classe Folha7

Classe Folha8

Codificação do botão sair:
private void btnSair_Click(object sender, EventArgs e)
{
this.Close();
}

Codificação do botão cancelar:
botão_cancelar

Crie a subrotina limpar abaixo:
subrotina_Limpar

Codificação do evento load do formulário:
Evento Load - Folha

Codificação do botão novo:
Botão Novo - Folha

A linha sublinhada: opcao = 1 indica que é necessário declarar esta variável. Vá até o início do form:
Var Opção

Também é necessário criar a subrotina incluirEditar:

Método InserirEditar_Folha

Permitir somente números, vírgula nas caixas: salario, percentualINSS, valorINSS:
Selecione a caixa de textos txtSalario. Vá até o evento KeyPress, duplo clique sobre o mesmo e deixe como abaixo onde está destacado em vermelho:
Botão Events - KeyPress

Evento KeyPress

Crie o método abaixo, que faz o cálculo do valor do INSS e do salário líquido:
SubRotina INSS

Este método passa o conteúdo das caixas de textos para as variáveis;
Faz o cálculo do valor do inss e do salário líquido;
Se algum valor não for informado, o botão Novo ficará desabilitado, e será exibida a mensagem de erro.

Selecione a caixa txtvalorINSS. No evento onEnter, será chamada esta subrotina:
private void txtvalorINSS_Enter(object sender, EventArgs e)
{
calculo_valorINSS();
}

Insira também a chamada desta subrotina no botão Novo.
Crie o formulário de pesquisa da folha, conforme abaixo:

Form Pesquisa Folha

Controle Name Text Mask
GroupBox gbOpcoes Opções  
RadioButton rbMesAno Mês/Ano  
RadioButton rbFuncionario Funcionário  
Label lblMesAno Mês/Ano:  
MaskedTextBox mskmesAno   ##/####
Label lblFuncionario Funcionário  
ComboBox cmbFuncionario    
DataGridView dgvFolha    

No DataGridView, clique na seta ao lado direito e desmarque as opções: Enable Adding, Enable Editing, Enable Deleting.

Codificação deste formulário:

No evento load, deixe como abaixo:

Evento Load Pesquisa Folha

O código acima, já foi explicado no formulário frmFolha.

Crie a subrotina cabecalho, conforme abaixo:
private void cabecalho()
{
dgvFolha.Columns[0].HeaderText = "Mes/Ano";
dgvFolha.Columns[0].Width = 60;
dgvFolha.Columns[1].HeaderText = "Nome do Funcionário";
dgvFolha.Columns[1].Width = 150;
dgvFolha.Columns[2].HeaderText = "Dt.Admissão";
dgvFolha.Columns[2].Width = 90;
dgvFolha.Columns[3].HeaderText = "Salário";
dgvFolha.Columns[3].Width = 90;
dgvFolha.Columns["salario"].DefaultCellStyle.Format = "c2"; // Formata com estilo moeda
dgvFolha.Columns[6].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight; // Alinha à direita horizontalmente, e ao centro verticalmente
dgvFolha.Columns[4].HeaderText = "% INSS";
dgvFolha.Columns[4].Width = 60;
dgvFolha.Columns["percentualINSS"].DefaultCellStyle.Format = "c2";
dgvFolha.Columns[4].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
dgvFolha.Columns[5].HeaderText = "Vl.INSS";
dgvFolha.Columns[5].Width = 90;
dgvFolha.Columns[6].HeaderText = "Salário a receber";
dgvFolha.Columns[6].Width = 120;
dgvFolha.Columns[6].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
dgvFolha.Columns["Salário a Receber"].DefaultCellStyle.Format = "c2";
}

No evento doubleclick do datagrid, insira o código abaixo:
private void dgvFolha_DoubleClick(object sender, EventArgs e)
{
clsGlobal.Ano_Mes = dgvFolha.CurrentRow.Cells[0].Value.ToString(); // Armazena na variável global Ano_Mes o conteúdo da linha atual da coluna 1. (Cells[0]) é a primeira coluna.
this.Close(); // Fecha este formulário
}

Volte ao formulário frmFolha e no botão pesquisar deixe como abaixo:

Botão Pesquisar - Folha

Controle ReportViewer
Este controle permite a criação de relatórios.

Vá até o formulário frmPrincipal, e crie o menu conforme abaixo:

Menu Prin - Rel

Name: mnuRelatórios        Text: &Relatórios
Name: mnuitemRelatorios Text: &Funcionários