Sistema de Controle de Comissão

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

CREATE DATABASE bdComissao

USE bdComissao

CREATE TABLE tbVendedor ( codigo INT IDENTITY(1,1) NOT NULL,
nome_Vendedor VARCHAR(40) NOT NULL,
percentual_Comissao FLOAT NOT NULL,
PRIMARY KEY(codigo)
)

CREATE TABLE tbComissao ( lancamento INT IDENTITY(1,1) NOT NULL,
codigo_Vendedor INT NOT NULL,
data DATE NOT NULL,
valor DECIMAL(10,2) NOT NULL,
total_Comissao DECIMAL(10,2) NOT NULL,
PRIMARY KEY(lancamento),
FOREIGN KEY(codigo_Vendedor) REFERENCES tbVendedor(codigo)
)

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

Name: ctrComissao
Nome do formulário: frmPrincipal.cs
Text: Controle de Comissão
StartPosition: CenterScreen
MaximizeBox: False
FormBorderStyle: Fixed3D

Crie o menu com os seguintes itens:

&Cadastro &Controle
&Vendedor &Comissão
Sai&r  
   

Form Principal

Classe para conexão com o banco

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

Deixe conforme exemplo abaixo:

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

namespace ctrComissao
{
public class Conexao
{
private static string conexao = @"Data Source=.\SQLEXPRESS;Initial Catalog=bdComissao;user id=sa;password=sa";
public static string stringConexao
{
get { return conexao; }
}
}
}

Foi criado o atributo conexao como nulo, e private, pois seu alcance será somente para esta classe. A seguir criado o método público stringConexao, que é o que vai retornar para todas as classes, formulários e relatórios que for solicitada a conexão com o banco de dados. Assim é retornado através do get a instância do sql (.\SQLEXPRESS); o nome do banco (Initial Catalog).

Vá até o Menu Projects e clique em Add Class. Coloque o nome: clsVendedor. Abaixo, foram definidos os métodos: salvar, alterar, pesquisarNome e pesquisarCodigo.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Windows.Forms;

namespace ctrComissao
{
public class clsvendedor
{
SqlCommand cmd = new SqlCommand();
StringBuilder sql = new StringBuilder();
DataTable dt = new DataTable();

public void salvar(string nome_vendedor, decimal percentual_comissao) {
using (SqlConnection conexao = new SqlConnection(Conexao.stringConexao))
try
{
{
conexao.Open();
sql.Append("INSERT INTO vendedor (nome_vendedor, percentual_comissao, situacao)");

sql.Append("VALUES (@nome_vendedor, @percentual_comissao, @situacao)");

cmd.Parameters.Add(new SqlParameter("@nome_vendedor", nome_vendedor));
cmd.Parameters.Add(new SqlParameter("@percentual_comissao", percentual_comissao));
cmd.CommandText = sql.ToString();
cmd.Connection = conexao;
cmd.ExecuteNonQuery();
}
}
catch (Exception erro)
{
throw new Exception(erro.Message);
}
finally
{
conexao.Close();
conexao.Dispose();
cmd.Dispose();
}
}

public void alterar(int codigo, string nome_vendedor, decimal percentual_comissao) {
using (SqlConnection conexao = new SqlConnection(Conexao.stringConexao))
try
{
{
conexao.Open();
sql.Append("UPDATE vendedor");
sql.Append(" SET nome_vendedor = @nome_vendedor, percentual_comissao = @percentual_comissao");
sql.Append(" WHERE (codigo = @codigo)");

cmd.Parameters.Add(new SqlParameter("@codigo", codigo));
cmd.Parameters.Add(new SqlParameter("@nome_vendedor", nome_vendedor));
cmd.Parameters.Add(new SqlParameter("@percentual_comissao", percentual_comissao));
cmd.CommandText = sql.ToString();
cmd.Connection = conexao;
cmd.ExecuteNonQuery();
}
}
catch (Exception erro)
{
throw new Exception(erro.Message);
}
finally
{
conexao.Close();
conexao.Dispose();
cmd.Dispose();
}
}

public DataTable pesquisarNome(string nomeVendedor) {
using (SqlConnection conexao = new SqlConnection(Conexao.stringConexao))
try
{
{
conexao.Open();
sql.Append("SELECT * FROM vendedor");
sql.Append(" WHERE nome_vendedor LIKE '%' + @nomeVendedor + '%'");
sql.Append(" ORDER by nome_vendedor");
cmd.Parameters.Add(new SqlParameter("@nomeVendedor", nomeVendedor));
cmd.CommandText = sql.ToString();
cmd.Connection = conexao;
dt.Load(cmd.ExecuteReader());
return dt;
}
}
catch (Exception)
{
throw new Exception(erro.Message);
}
finally
{
conexao.Close();
conexao.Dispose();
cmd.Dispose();
}
}

public DataTable pesquisarCodigo(int codigo) {
using (SqlConnection conexao = new SqlConnection(Conexao.stringConexao))
try
{
{
conexao.Open();
sql.Append("SELECT * FROM vendedor");
sql.Append(" WHERE codigo = @codigo");
sql.Append(" ORDER BY unidade");
cmd.Parameters.Add(new SqlParameter("@codigo", codigo));
cmd.CommandText = sql.ToString();
cmd.Connection = conexao;
dt.Load(cmd.ExecuteReader());
return dt;
}
}
catch (Exception)
{
throw;
}
finally
{
conexao.Close();
conexao.Dispose();
cmd.Dispose();
}
}
}
}

Crie o formulário de vendedor

Nome do formulário: frmVendedor.cs
Text: Cadastro de Vendedor
StartPosition: CenterScreen
MaximizeBox: False
FormBorderStyle: Fixed3D
Controle Name Text Maxlength Enabled
GroupBox gbOpcoes Opções    
Button btnNovo &Novo btnNovo  
Button btnSalvar &Salvar    
Button btnCancelar &Cancelar btnCancelar  
GroupBox gbDados Dados    
Label lblCodigo Código:    
TextBox txtCodigo     False
Label lblnomeVendedor Vendedor:    
TextBox txtnomeVendedor   50  
Label lblpercentualComissao % Comissão:    
TextBox txtpercentualComissao   30  

Codificação do botão cancelar:
Duplo clique no botão Cancelar e entre as { } deixe como abaixo:

private void btnCancelar_Click(object sender, EventArgs e)
{
gpbDados.Enabled = false;
btnSalvar.Enabled = false;
btnNovo.Enabled = true;
limpar();
}

Como a subrotina limpar não criada, observe que ficou sublinhado na cor vermelha, sendo apresentado erro. Logo abaixo da chave do fechamento do código que você inseriu do botão cancelar, digite o código abaixo:

private void limpar()
{
foreach (Control ctl in gpbDados.Controls)
{
if (ctl is TextBox) ctl.Text = "";
if (ctl is MaskedTextBox) ctl.Text = "";
if (ctl is ComboBox) ctl.Text = "";
if (ctl is CheckBox) (ctl as CheckBox).Checked = false;
}
}

Codificação do botão novo:
Duplo clique no botão Novo e entre as { } deixe como abaixo:

private void btnNovo_Click(object sender, EventArgs e)
{
btnSalvar.Enabled = true; // Habilita o botão
btnNovo.Enabled = false; // Desabilita o botão
gpbDados.Enabled = true;
btnNovo.Tag = "Incluir";
txtnomeVendedor.Focus();
}

Codificação do botão salvar:
Duplo clique no botão Salvar e entre as { } deixe como abaixo:

private void btnSalvar_Click(object sender, EventArgs e) {
if (MessageBox.Show("Deseja Salvar ?", "Salvar", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
try // Tenta incluir o vendedor na tabela
{
clsvendedor classeVendedor = new clsvendedor();
if (btnNovo.Tag.ToString() == "Incluir") // Se clicou no botão Novo
{
classeVendedor.salvar(txtnomeVendedor.Text, Convert.ToDecimal(txtpercentualComissao.Text)); // Passa os parâmetros: nome do vendedor, percentual de comissão para o método salvar que está na classe clsVendedor
MessageBox.Show("Vendedor incluído com sucesso!", "Salvar", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
classeVendedor.alterar(Convert.ToInt32(txtCodigo.Text), txtnomeVendedor.Text, Convert.ToDecimal(txtpercentualComissao.Text));
MessageBox.Show("Vendedor salvo com sucesso!", "Salvar", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex) // Caso não consiga incluir o vendedor, o catch gera excessão (erro) que fica armazenada no ex.
{
MessageBox.Show(ex.Message, "Erro:", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally // O finally é importante, já que no try acima, se deu tudo certo e salvou o vendedor, ou no catch apresentou erro, é fechada a conexão com o banco.
{
btnCancelar_Click(sender, e);
exibirGrid();
btnNovo.Tag = "";
}
}
}

A subrotina exibirGrid também apresenta o sublinhado em vermelho, pois ainda não foi criada. Faça a criação da mesma, conforme abaixo:

private void exibirGrid() {
clsvendedor classeVendedor = new clsvendedor();
dgvVendedor.DataSource = classeVendedor.pesquisarNome("");
cabecalho();
}

A subrotina cabecaho também apresenta o sublinhado em vermelho, pois ainda não foi criada. Faça a criação da mesma, conforme abaixo:

private void cabecalho() {
dgvVendedor.Columns[0].HeaderText = "Código"; // Título da coluna
dgvVendedor.Columns[0].Width = 60; // Largura da coluna
dgvVendedor.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight; // Alinha à direita e na vertical
dgvVendedor.Columns[1].HeaderText = "Nome do vendedor";
dgvVendedor.Columns[1].Width = 160;
dgvVendedor.Columns[2].HeaderText = "% Com.";
dgvVendedor.Columns[2].Width = 50;
dgvVendedor.Columns[2].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
}

A seguir, vamos utilizar o evento DoubleClick do controle DataGrid para exibir em cada caixa de textos do formulário, o conteúdo referente a caixa coluna da tabela de vendedor. Selecione o DataGridView e vá até o evento DoubleClick. Quando encontra-lo, duplo clique. Veja imagem abaixo:

private void dgvVendedor_DoubleClick(object sender, EventArgs e) {
txtCodigo.Text = dgvVendedor.CurrentRow.Cells[0].Value.ToString(); // CurrentRow é a linha onde foi efetuado o duplo clique. Cells[0] refere-se a primeira coluna do DataGrid - Value obtém o valor armazenado ali.
txtnomeVendedor.Text = dgvVendedor.CurrentRow.Cells[1].Value.ToString();
txtpercentualComissao.Text = dgvVendedor.CurrentRow.Cells[2].Value.ToString();
gpbDados.Enabled = true;
btnNovo.Enabled = false;
btnSalvar.Enabled = true;

btnNovo.Tag = "Editar";
txtnomeVendedor.Focus();
}

A seguir, vamos codificar a caixa de textos Pesquisar, ou seja: quando digitarmos as iniciais do vendedor, ou até mesmo um conteúdo que pode estar no início, no meio ou no final do nome do mesmo, será exibido no DataGrid.

Duplo clique na caixa de textos txtPesquisar. Entre as { } digite o código abaixo:

private void txtPesquisa_TextChanged(object sender, EventArgs e) {
clsvendedor classeVendedor = new clsvendedor();
dgvVendedor.DataSource = classeVendedor.pesquisarNome(txtPesquisa.Text);
}

A seguir, selecione a caixa de textos txtpercentualComissao. No evento KeyPress, vamos inserir o código abaixo para só permitir a digitação de números e a vírgula:

Form Vendedor - Evento KeyPress

private void txtpercentualComissao_KeyPress(object sender, KeyPressEventArgs e) {
if (!char.IsDigit(e.KeyChar)) //se não for número
{
if (e.KeyChar != ',') //se for vírgula
e.Handled = true;
else if (txtpercentualComissao.Text.IndexOf(',') > 0)
e.Handled = true;
}
}

Para finalizar, vamos inserir o código do evento load do formulário, ou seja: Quando o formulário de vendedor foi inicializado, será carregado o código do botão cancelar e os dados salvos na tabela no DataGridView. Selecione o formulário (de preferência na barra de título, para ter perigo de selecionar outro controle). Você também pode efetuar duplo clique na barra de título, pois o evento padrão do formulário é o Load.

private void frmVendedor_Load(object sender, EventArgs e) {
btnCancelar_Click(sender, e); // Executa a codificação do botão cancelar
exibirGrid();
}

Crie a classe de comissão: clsComissao.cs

Classe Comissão - Using

A seguir, declare as classes para manipular os dados da tabela de comissão, conforme abaixo

Classe Comissão - Classes para manipulação com os dados

A seguir, declare o método inserir, conforme abaixo

Classe Comissão - Método Inserir

Abaixo do método inserir, declare o método editar:

Classe Comissão - Método Editar

Abaixo do método editar, declare o método pesquisarLancamento:

Classe Comissão - Método Pesquisar Lançamento

A seguir crie o método pesquisacodigoVendedor:

Classe Comissão - Método Pesquisar Código do Vendedor

A seguir crie o método pesquisacodigoData:

Classe Comissão - Método Pesquisar Data

Formulário de comissão:

Crie o formulário abaixo:

Form Comissão

Controle Name Text Maxlength Enabled
GroupBox gbOpcoes Opções    
Button btnNovo &Novo btnNovo  
Button btnSalvar &Salvar    
Button btnCancelar &Cancelar    
Button btnPesquisar &Pesquisar    
GroupBox gbDados Dados    
Label lblLancamento Lançamento:    
TextBox txtLancamento     False
Label lblVendedor Vendedor:    
ComboBox cmbVendedor      
TextBox txtcodigoVendedor    
Label lblData Data:    
MaskedTextBox mskData   Mask: 00/00/0000
Label lblValor Valor:    
TextBox txtValor   10  
Label lblpercentualComissao % da Comissão:    
TextBox txtpercentualComissao   5  
Label lbltotalComissao Total da Comissão:    
TextBox txttotalComissao   10  

Duplo clique no botão btnCancelar e insira o código conforme abaixo

Form Comissão

Como a subrotina limpar não criada, observe que ficou sublinhado na cor vermelha, sendo apresentado erro. Logo abaixo da chave do fechamento do código que você inseriu do botão cancelar, digite o código abaixo:

Form Comissão

Volte ao Design do Form. Duplo clique na barra de título, para ter acesso ao evento Load e insira o código conforme abaixo:

Form Comissão - Evento Load

Duplo clique no combo do vendedor:

Form Comissão - Evento Load

Codificação do botão Novo:

Form Comissão - Botão Novo

Codificação do botão Salvar:

Form Comissão - Botão Salvar

Form Comissão - Botão Salvar

Observe que a subrotina calcula_Comissao, precisa ser criada já que está sublinhada na cor vermelha. Logo abaixo do botão salvar, crie a mesma conforme abaixo:

Form Comissão - Total da Comissão

Crie o formulário para pesquisar a comissão dos vendedores, conforme abaixo:

Form Pesquisa de Comissão

 

Controle Name Text    
GroupBox gbOpcoes Opções    
RadioButton rbLancamento Lançamento    
RadioButton rbVendedor Vendedor    
RadioButton rbData Data    
RadioButton rbTodos Todos    
Fora do groupbox opções:
Label lblLancamento Informe o Lançamento:
TextBox txtLancamento  
Label lblVendedor Vendedor:
ComboBox cmbVendedor  
Label lbldataInicial Data Inicial:
MaskedTextBox mskdataInicial Mask: 00/00/0000
Label lbldataFinal Data Final:
MaskedTextBox mskdataFinal Mask: 00/00/0000
GroupBox gbExibir Exibir
Button btnExibir &Exibir
Button btnSair Sai&r

Duplo clique na barra de título e insira o código abaixo:

Form Pesquisa Comissão - Evento  Load

Codificação do botão Sair:

Form Pesquisa de Comissão - Botão Sair

Codificação do botão Exibir:

Form Pesquisa Comissão - Botão Exibir

Form Pesquisa Comissão - Botão Exibir

Crie a subrotina cabecalho:

Form Pesquisa Comissão - Subrotina Cabecalho

Adicionando máscara nas caixas de textos data. Será utilizado o evento Enter para as duas caixas maskedttextbox: mskdataInicial e mskdataFinal, conforme abaixo:

Form Pesquisa de comissão - Evento Enter

Codificação do radiobutton rbTodos:

Form Pesquisa Comissão - RaddioButton Todos

Codificação do radiobutton rbData:

Form Pesquisa Comissão - RaddioButton Data

Codificação do radiobutton rbVendedor:

Form Pesquisa Comissão - RaddioButton Vendedor

Codificação do radiobutton rbLancamento:

Form Pesquisa Comissão - RaddioButton Lançamento

Form Pesquisa Comissão -  Subrotina Limpar

Vá até a classe clsComissão, e crie a variável lancamento. Ela será responsável por armazenar o lançamento da comissão dentro da pesquisa de comissão e a seguir, utilizar no lançamento da comissão no formulário de controle da comissão.

Form Pesquisa Comissão -  Variável Lancamento

Selecione o DataGridView. No evento DoubleClick, insira o código conforme abaixo:

Form Pesquisa Comissão -  DoubleClick DataGridView

Volte ao formulário de lançamento da comissão (frmComissao.cs). No botão Pesquisar, insira o código conforme abaixo:

Form Comissão -  Botão Pesquisar