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,
email VARCHAR(30) NOT NULL,
contato VARCHAR(15) NOT NULL,
percentual_Comissao DECIMAL(5,2) NOT NULL,
situacao CHAR(1) DEFAULT 'A',
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,
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; }
}
}
}

Observação: Caso o banco não possua usuário, a string de conexão, será essa:

private static string conexao = @"Data Source=.\SQLEXPRESS;Initial Catalog=bdComissao; Integrated Security=True";

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
{
public void incluir(string nomeVendedor, string email, string contato, decimal percentualComissao)
{
try
{
using (SqlConnection cn = new SqlConnection(clsConexao.stringConexao))
{
cn.Open();
string sql = @"INSERT INTO tbVendedor (nome_Vendedor, email, contato, percentual_Comissao)
VALUES (@nome_Vendedor, @email, @contato, @percentual_Comissao)";
using (SqlCommand cmd = new SqlCommand(sql, cn))
{
cmd.Parameters.AddWithValue("@nome_Vendedor", nomeVendedor);
cmd.Parameters.AddWithValue("@email", email);
cmd.Parameters.AddWithValue("@contato", contato);
cmd.Parameters.AddWithValue("@percentual_Comissao", percentualComissao);
cmd.ExecuteNonQuery();
}
}
}
catch (Exception)
{
throw;
}
}

public void editar(int codigo, string nomeVendedor, string email, string contato, decimal percentualComissao, string situacao)
{
try
{
using (SqlConnection cn = new SqlConnection(clsConexao.stringConexao))
{
string sql = @"UPDATE tbVendedor
SET nome_Vendedor = @nome_Vendedor,
email = @email,
contato = @contato,
percentual_Comissao = @percentual_Comissao,
situacao = @situacao
WHERE codigo = @codigo";

using (SqlCommand cmd = new SqlCommand(sql, cn))
{
cmd.Parameters.AddWithValue("@codigo", codigo);
cmd.Parameters.AddWithValue("@nome_Vendedor", nomeVendedor);
cmd.Parameters.AddWithValue("@email", email);
cmd.Parameters.AddWithValue("@contato", contato);
cmd.Parameters.AddWithValue("@percentual_Comissao", percentualComissao);

cn.Open();
cmd.ExecuteNonQuery();
}
}
}
catch (Exception)
{
throw;
}
}

public DataTable pesquisaCodigo(int codigo)
{
try
{
using (SqlConnection cn = new SqlConnection(clsConexao.stringConexao))
{
string sql = @"SELECT Codigo, Nome_Vendedor, Email, Contato, Percentual_Comissao, situacao FROM tbvendedor WHERE codigo = @codigo";
using (SqlCommand cmd = new SqlCommand(sql, cn))
{
cmd.Parameters.AddWithValue("@codigo", codigo);
cn.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
DataTable dt = new DataTable();
dt.Load(reader);
return dt;
}
}
}
}
catch (Exception)
{
throw;
}

public DataTable pesquisa_Vendedor(string nomeVendedor)
{
try
{
using (SqlConnection cn = new SqlConnection(clsConexao.stringConexao))
{
string sql = @"SELECT Codigo, Nome_Vendedor, Email, Contato, Percentual_Comissao, situacao
FROM tbvendedor WHERE nome_Vendedor LIKE '%' + @nomeVendedor + '%'";

using (SqlCommand cmd = new SqlCommand(sql, cn))
{
cmd.Parameters.Add("@nomeVendedor", SqlDbType.VarChar).Value = nomeVendedor;
cn.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
DataTable dt = new DataTable();
dt.Load(reader);
return dt;
}
}
}
}
catch (Exception)
{
throw;
}
}

public DataTable pesquisa_Vendedor_Rel(string nomeVendedor)
{
try
{
using (SqlConnection cn = new SqlConnection(clsConexao.stringConexao))
{
string sql = @"SELECT Codigo, Nome_Vendedor, Contato FROM tbvendedor WHERE nome_Vendedor LIKE '%' + @nomeVendedor + '%'";

using (SqlCommand cmd = new SqlCommand(sql, cn))
{
cmd.Parameters.Add("@nomeVendedor", SqlDbType.VarChar).Value = nomeVendedor;
cn.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
DataTable dt = new DataTable();
dt.Load(reader);
return dt;
}
}
}
}
catch (Exception)
{
throw;
}
}

O método abaixo, é para preparar os dados para imprimir, e gerar o relatório em html
public List ObterVendedores()
{
var vendedores = new List();
string query = "SELECT codigo, nome_vendedor, contato FROM tbVendedor";

using (SqlConnection conn = new SqlConnection(clsConexao.stringConexao))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(query, conn))
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
var vendedor = new clsVendedor
{
Codigo = (int)reader["codigo"],
NomeVendedor = reader["nome_vendedor"].ToString(),
Contato = reader["contato"].ToString()
};
vendedores.Add(vendedor);
}
}
}

return vendedores;
}

Crie o formulário de vendedor

Nome do formulário: frmVendedor.cs
Text: Cadastro de Vendedor
StartPosition: CenterScreen
MaximizeBox: False
FormBorderStyle: Fixed3D

Inserir o controle Panel

Name: pnlTitulo
Text: Cadastro de Vendedor

Inserir o controle ToolStrip

Controle Name Text Maxlength Enabled
GroupBox gbOpcoes Opções    
Button tlbNovo &Novo btnNovo  
Button tlbSalvar &Salvar    
Button tlbCancelar &Cancelar btnCancelar  
Button tlbSair &Cancelar btnCancelar  
GroupBox gbDados Dados    
Label lblCodigo Código:    
TextBox txtCodigo     False
Label lblnomeVendedor Vendedor:    
TextBox txtnomeVendedor   60  
Label lblEmail E-mail:    
TextBox txtEmail   30  
Label lblContato Contato:    
TextBox txtContato   15  
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 o que está em negrito:

private void tlbCancelar_Click(object sender, EventArgs e)
{
tlbSalvar.Enabled = false;
tlbNovo.Enabled = true;
gpbDados.Enabled = false;
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, onde está em negrito:

private void tlbNovo_Click(object sender, EventArgs e)
{
tlbSalvar.Enabled = true;
tlbNovo.Enabled = false;
gpbDados.Enabled = true;
chkSituacao.Checked = true;
chkSituacao.Enabled = false;
tlbNovo.Tag = "Novo";
txtnomeVendedor.Focus();
}
}

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

private void tlbSalvar_Click(object sender, EventArgs e)
{
if (txtnomeVendedor.Text == "")
{
MessageBox.Show("Informe o Nome do vendedor!");
txtnomeVendedor.Focus();
return;
}
if (txtpercentualComissao.Text == "")
{
MessageBox.Show("Informe o % da comissão!");
txtpercentualComissao.Focus();
return;
}
if (MessageBox.Show("Deseja Salvar ?", "Salvar", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
try
{
clsVendedor classeVendedor = new clsVendedor();
if (tlbNovo.Tag.ToString() == "Editar") // Se clicou duas vezes datagrid, o status altera para editar
{
string situacao = "";
if (chkSituacao.Checked)
{
situacao = "A";
}
else
{
situacao = "I";
}
classeVendedor.editar(Convert.ToInt32(txtCodigo.Text), txtnomeVendedor.Text, txtEmail.Text, mskContato.Text, Convert.ToDecimal(txtpercentualComissao.Text), situacao);
}
else
{
classeVendedor.incluir(txtnomeVendedor.Text, txtEmail.Text, mskContato.Text, Convert.ToDecimal(txtpercentualComissao.Text));
}
MessageBox.Show("Vendedor Salvo com sucesso ?", "Salvar", MessageBoxButtons.OK);
tlbCancelar_Click(sender, e);
exibirGrid();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}

private void tlbCancelar_Click(object sender, EventArgs e)
{
tlbSalvar.Enabled = false;
tlbNovo.Enabled = true;
gpbDados.Enabled = false;
limpar();
}

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 cabecalho 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";
dgvVendedor.Columns[0].Width = 45;
dgvVendedor.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
dgvVendedor.Columns[1].HeaderText = "Nome do vendedor";
dgvVendedor.Columns[1].Width = 160;
dgvVendedor.Columns[2].HeaderText = "E-mail";
dgvVendedor.Columns[2].Width = 130;
dgvVendedor.Columns[3].HeaderText = "Contato";
dgvVendedor.Columns[3].Width = 90;
dgvVendedor.Columns[4].HeaderText = "% Com.";
dgvVendedor.Columns[4].Width = 50;
dgvVendedor.Columns[4].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
dgvVendedor.Columns[5].HeaderText = "Situação";
dgvVendedor.Columns[5].Width = 50;
}

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();
txtVendedor.Text = dgvVendedor.CurrentRow.Cells[1].Value.ToString();
txtEmail.Text = dgvVendedor.CurrentRow.Cells[2].Value.ToString();
mskContato.Text = dgvVendedor.CurrentRow.Cells[3].Value.ToString();
numPercentualComissao.Value = Convert.ToDecimal(dgvVendedor.CurrentRow.Cells[4].Value.ToString());

string situacao;
situacao = dgvVendedor.CurrentRow.Cells[5].Value.ToString();
if (situacao == "A") // se a situação for igual a A, ou seja, ativo
{
chkSituacao.Text = "Ativo"; // Deixa o texto do checkbox como Ativo
chkSituacao.Checked = true; // Deixa o checkbox marcado
chkSituacao.Enabled = true; // Deixa o checkbox habilitado
}
else
{
chkSituacao.Text = "Inativo"; // Deixa o texto do checkbox como Inativo
chkSituacao.Checked = false; // Deixa o checkbox desmarcado
chkSituacao.Enabled = true; // Deixa o checkbox habilitado
}
tlbNovo.Tag = "Editar"; // Define a tag do botão Novo como Editar, pois quando clicar no botão Salvar, será executado o método Editar
grbDados.Enabled = true; // Habilita o grupo de dados
tlbNovo.Enabled = false; // Desabilita o botão Novo
tlbSalvar.Enabled = true; // Habilita o botão Salvar
txtVendedor.Focus(); // Foco na caixa de texto vendedor
}

A seguir, vamos utilizar o evento CheckedChanged do controle CheckBox para alterar o texto do mesmo, ou seja, se estiver marcado, o texto do checkbox será Ativo, caso contrário, o texto do checkbox será Inativo. Selecione o controle CheckBox e vá até o evento CheckedChanged. Dê duplo clique. Veja abaixo:
private void chkSituacao_CheckedChanged(object sender, EventArgs e)
{
if (chkSituacao.Checked)
{
chkSituacao.Checked = true;
chkSituacao.Text = "Ativo";
}
else
{
chkSituacao.Checked = false;
chkSituacao.Text = "Inativo";
}
}

Codificação do botão Pesquisar, que está ao lado da caixa de textos pesquisar

private void btnPesquisar_Click(object sender, EventArgs e)
{
clsVendedor classeVendedor = new clsVendedor();
dgvVendedor.DataSource = classeVendedor.pesquisa_Vendedor(txtPesquisa.Text);
}

A seguir, excluir o TextBox do percentual da comissão, e no lugar, inserir o controle NumericUpDown, para facilitar a digitação do percentual da comissão. Altere o nome do controle para numPercentualComissao, e a propriedade DecimalPlaces para 2, e a propriedade Maximum para 10. A seguir, altere o código do botão salvar, para pegar o valor do controle NumericUpDown, já que existem algumas linhas que tem que trocar o txtPercentualComissao, para numPercentualComissao

Veja agora como ficou a codificação do botão tlbSalvar:

Observação: Observe que as alterações no código do botão salvar, foram feitas e o valor do percentual da comissão está sendo obtido diretamente do controle NumericUpDown. Está circundado acima.

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 não 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) {
tlbCancelar_Click(sender, e); // Executa a codificação do botão cancelar
exibirGrid();
}

Crie a classe de comissão: clsComissao.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ctrComissao
{
public class clsComissao
{
private string sqlBase = @"SELECT tbComissao.lancamento,
tbComissao.codigoVendedor,
tbVendedor.nome_vendedor,
tbComissao.data,
tbComissao.valor,
tbVendedor.percentual_Comissao,
(tbComissao.valor * tbVendedor.Percentual_Comissao) / 100 AS 'Total Comissão' FROM tbComissao
INNER JOIN tbVendedor ON tbComissao.codigoVendedor = tbVendedor.codigo";

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

public void inserir(int codigo_vendedor, DateTime data, decimal valor)
{
try
{
using (SqlConnection cn = new SqlConnection(clsConexao.stringConexao))
using (SqlCommand cmd = new SqlCommand())
{
cn.Open();
string sql = "INSERT INTO tbComissao (codigoVendedor, data, valor) VALUES (@codigoVendedor, @data, @valor)";
cmd.CommandText = sql;
cmd.Connection = cn;

cmd.Parameters.AddWithValue("@codigoVendedor", codigo_vendedor);
cmd.Parameters.AddWithValue("@data", data);
cmd.Parameters.AddWithValue("@valor", valor);

cmd.ExecuteNonQuery();
}
}
catch (Exception)
{
throw;
}
}

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

public void editar(int lancamento, int codigoVendedor, DateTime data, decimal valor)
{

{
using (SqlConnection cn = new SqlConnection(clsConexao.stringConexao))
using (SqlCommand cmd = new SqlCommand())
{
cn.Open();
string sql = @"UPDATE tbComissao
SET codigoVendedor = @codigoVendedor, data = @data, valor = @valor WHERE lancamento = @lancamento";
cmd.CommandText = sql;
cmd.Connection = cn;

cmd.Parameters.AddWithValue("@lancamento", lancamento);
cmd.Parameters.AddWithValue("@codigoVendedor", codigoVendedor);
cmd.Parameters.AddWithValue("@data", data);
cmd.Parameters.AddWithValue("@valor", valor);

cmd.ExecuteNonQuery();
}
}
catch (Exception)
{
throw;
}
}

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

public DataTable pesquisaLancamento(int lancamento)
{
try
{
using (SqlConnection cn = new SqlConnection(clsConexao.stringConexao))
using (SqlCommand cmd = new SqlCommand())
{
cn.Open();
string sql = sqlBase + " WHERE tbComissao.lancamento = @lancamento ORDER BY tbComissao.lancamento";
cmd.CommandText = sql;
cmd.Connection = cn;
cmd.Parameters.AddWithValue("@lancamento", lancamento);

DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
return dt;
}
}
catch (Exception)
{
throw;
}
}

A seguir crie o método pesquisacodigoVendedor:

public DataTable pesquisacodigoVendedor(int codigoVendedor)
{
try
{
using (SqlConnection cn = new SqlConnection(clsConexao.stringConexao))
using (SqlCommand cmd = new SqlCommand())
{
cn.Open();
string sql = sqlBase + " WHERE tbVendedor.codigo = @codigoVendedor ORDER BY tbComissao.data";
cmd.CommandText = sql;
cmd.Connection = cn;
cmd.Parameters.AddWithValue("@codigoVendedor", codigoVendedor);

DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
return dt;
}
}
catch (Exception)
{
throw;
}
}

A seguir crie o método pesquisacodigoData:

public DataTable pesquisaData(DateTime dataInicial, DateTime dataFinal)
{
try
{
using (SqlConnection cn = new SqlConnection(clsConexao.stringConexao))
using (SqlCommand cmd = new SqlCommand())
{
cn.Open();
string sql = sqlBase + " WHERE tbComissao.data BETWEEN @dataInicial AND @dataFinal ORDER BY tbComissao.data";
cmd.CommandText = sql;
cmd.Connection = cn;
cmd.Parameters.AddWithValue("@dataInicial", dataInicial);
cmd.Parameters.AddWithValue("@dataFinal", dataFinal);

DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
return dt;
}
}
catch (Exception)
{
throw;
}
}

A seguir crie o método pesquisaTodos:

public DataTable pesquisaTodos()
{
try
{
using (SqlConnection cn = new SqlConnection(clsConexao.stringConexao))
using (SqlCommand cmd = new SqlCommand())
{
cn.Open();
string sql = sqlBase + " ORDER BY tbComissao.data";
cmd.CommandText = sql;
cmd.Connection = cn;

DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
return dt;
}
}
catch (Exception)
{
throw;
}
}

Crie a variável estática abaixo:

public static int lancamento;

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

private void tlbCancelar_Click(object sender, EventArgs e)
{
tlbNovo.Enabled = true;
tlbSalvar.Enabled = false;
gpbDados.Enabled = false;
tlbNovo.Text = "&Novo";
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;
}
lblMensagem.Text = "";
}

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:

private void frmComissao_Load(object sender, EventArgs e)
{
tlbCancelar_Click(sender, e);
}

Codificação do botão Novo:

private void tlbNovo_Click(object sender, EventArgs e)
{
tlbSalvar.Enabled = true;
tlbNovo.Enabled = false;
grbDados.Enabled = true;
tlbNovo.Tag = "Incluir";
mskData.Text = DateTime.Now.ToString("dd/MM/yyyy");
txtcodigoVendedor.Focus();
}

Codificação do botão Salvar:

private void tlbSalvar_Click(object sender, EventArgs e)
{
if (txtValor.Text.Length == 0)
{
MessageBox.Show("Informe o Valor da Venda!", "Valor", MessageBoxButtons.OK, MessageBoxIcon.Error);
txtValor.Focus();
return;
}

if (txtpercentualComissao.Text.Length == 0)
{
MessageBox.Show("Você tem que Informar o Vendedor para obter o % de Comissão!", "% Comissão", MessageBoxButtons.OK, MessageBoxIcon.Error);
cmbVendedor.Focus();
return;
}

if (txtcodigoVendedor.Text.Length == 0)
{
MessageBox.Show("Informe o Código do Vendedor!", "Vendedor", MessageBoxButtons.OK, MessageBoxIcon.Error);
cmbVendedor.Focus();
return;
}

if (MessageBox.Show("Deseja Salvar ?", "Salvar", MessageBoxButtons.YesNo) == DialogResult.Yes)
{

calcula_Comissao(); //Chama a rotina para calcular a comissão

var valorSemMascara = "";
mskData.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals; // Retira a máscara para efetuar a validação abaixo
valorSemMascara = mskData.Text;
if (valorSemMascara == "")
{
MessageBox.Show("Informe a Data!", "Data", MessageBoxButtons.OK, MessageBoxIcon.Error);
mskData.Focus();
return;
}

mskData.TextMaskFormat = MaskFormat.IncludePromptAndLiterals; // Insere a máscara na data

DateTime dataVenda;
if (!DateTime.TryParse(mskData.Text, out dataVenda)) // Tenta (verifica) se a data informada não estiver correta. out dataVenda é a saída se é verdadeiro ou falso
{
MessageBox.Show("Data Inválida!", "Data", MessageBoxButtons.OK, MessageBoxIcon.Error);
mskData.Focus();
return;
}

try
{
clsComissao classeComissao = new clsComissao();
if (tlbNovo.Tag.ToString() == "Incluir")
{
classeComissao.inserir(int.Parse(txtcodigoVendedor.Text), Convert.ToDateTime(mskData.Text), decimal.Parse(txtValor.Text));
MessageBox.Show("Comissão incluída com sucesso!", "Salvar", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
classeComissao.editar(Convert.ToInt32(txtLancamento.Text), int.Parse(txtcodigoVendedor.Text), Convert.ToDateTime(mskData.Text), decimal.Parse(txtValor.Text));
MessageBox.Show("Comissão editada com sucesso!", "Editar", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

}
catch (Exception erro)
{
MessageBox.Show(erro.Message, "Erro:", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

finally
{
tlbCancelar_Click(sender, e);
tlbNovo.Tag = "";
}
}
}

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:

private void calcula_Comissao()
{
try
{
decimal valor = Decimal.Parse(txtValor.Text); // Converte o valor da venda para decimal e armazena na variável valor
decimal PercentualComissao = decimal.Parse(txtpercentualComissao.Text); // Converte o percentual de comissão para decimal e armazena na variável percentualComissao
decimal totalComissao = (valor * PercentualComissao) / 100; // Multiplica o valor da venda pelo percentual da comissão dividindo por cem, para extrair o percentual armazenando o resultado na variável totalComissao
txttotalComissao.Text = totalComissao.ToString(); // Converte o totalComissao para string para que seja possível exibi-lo na caixa de textos txttotalComissao
}
catch (Exception erro)
{
MessageBox.Show(erro.Message);
}
}

Codificação da caixa de textos do código do vendedor txtcodigoVendedor e no evento KeyDown, insira o código abaixo:
private void txtcodigoVendedor_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.F2)
{
e.SuppressKeyPress = true;

// Instancia o formulário usando o bloco 'using' para liberar memória após o uso
using (frmPVendedor formPesquisa = new frmPVendedor())
{
// Abre o formulário e espera o resultado
if (formPesquisa.ShowDialog() == DialogResult.OK)
{
// Recupera os dados diretamente das propriedades do formulário de pesquisa
txtcodigoVendedor.Text = formPesquisa.CodigoSelecionado.ToString();
cmbVendedor.Text = formPesquisa.NomeSelecionado;
txtpercentualComissao.Text = formPesquisa.ComissaoSelecionada.ToString();

mskData.Focus();
}
else
{
// Se o usuário fechou sem selecionar nada (ou clicou em cancelar)
tlbCancelar_Click(sender, e);
}
}
}
}

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:

private void frmPComissao_Load(object sender, EventArgs e)
{
clsVendedor classeVendedor = new clsVendedor();
cmbVendedor.DataSource = classeVendedor.pesquisa_Vendedor("");
cmbVendedor.DisplayMember = "nome_vendedor";
cmbVendedor.ValueMember = "codigo";
cmbVendedor.SelectedIndex = -1;
}

Codificação do botão Fechar:

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

Codificação do botão Exibir:

private void btnExibir_Click(object sender, EventArgs e)
{
clsComissao classeComissao = new clsComissao();
if (rbtLancamento.Checked)
{
if (txtLancamento.Text.Length == 0)
{
MessageBox.Show("Informe o lançamento!", "Lançamento", MessageBoxButtons.OK, MessageBoxIcon.Error);
txtLancamento.Focus();
return;
}
dgvComissao.DataSource = classeComissao.pesquisaLancamento(Convert.ToInt32(txtLancamento.Text));
}
if (rbtVendedor.Checked)
{
if (cmbVendedor.SelectedIndex == -1)
{
MessageBox.Show("Informe o Vendedor!", "Vendedor", MessageBoxButtons.OK, MessageBoxIcon.Error);
cmbVendedor.Focus();
return;
}
dgvComissao.DataSource = classeComissao.pesquisacodigoVendedor(Convert.ToInt32(cmbVendedor.SelectedValue));
}
if (rbtData.Checked)
{
var valorSemMascara = "";
mskdataInicial.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals;
valorSemMascara = mskdataInicial.Text;
if (valorSemMascara == "")
{
MessageBox.Show("Informe a Data Inicial!", "Data Inicial", MessageBoxButtons.OK, MessageBoxIcon.Error);
mskdataInicial.Focus();
return;
}
mskdataFinal.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals;
valorSemMascara = mskdataFinal.Text;
if (valorSemMascara == "")
{
MessageBox.Show("Informe a Data Final!", "Data Final", MessageBoxButtons.OK, MessageBoxIcon.Error);
mskdataFinal.Focus();
return;
}
mskdataInicial.TextMaskFormat = MaskFormat.IncludePromptAndLiterals;
mskdataFinal.TextMaskFormat = MaskFormat.IncludePromptAndLiterals;
dgvComissao.DataSource = classeComissao.pesquisaData(Convert.ToDateTime(mskdataInicial.Text), Convert.ToDateTime(mskdataFinal.Text));
}
if (rbtTodos.Checked)
{
dgvComissao.DataSource = classeComissao.pesquisaTodos();
}
cabecalho(); // Chama o método local para formatar o DataGrid
}

Crie a subrotina cabecalho:

private void cabecalho()
{
if (rbtLancamento.Checked == false && rbtVendedor.Checked == false && rbtData.Checked == false && rbtTodos.Checked == false)
{
MessageBox.Show("Selecione o campo para pesquisa!", "Pesquisa", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}

dgvComissao.Columns[0].HeaderText = "Lancto";
dgvComissao.Columns[0].Width = 50;
dgvComissao.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
dgvComissao.Columns[1].HeaderText = "CodVend";
dgvComissao.Columns[1].Width = 70;
dgvComissao.Columns[1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
dgvComissao.Columns[2].HeaderText = "Nome do Vendedor";
dgvComissao.Columns[2].Width = 180;
dgvComissao.Columns[3].HeaderText = "Data";
dgvComissao.Columns[3].Width = 70;
dgvComissao.Columns[4].HeaderText = "Valor";
dgvComissao.Columns[4].Width = 80;
dgvComissao.Columns["valor"].DefaultCellStyle.Format = "c2";
dgvComissao.Columns[4].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
dgvComissao.Columns[5].HeaderText = "% com.";
dgvComissao.Columns[5].Width = 30;
dgvComissao.Columns[6].HeaderText = "Total Com.";
dgvComissao.Columns[6].Width = 75;
dgvComissao.Columns["Total Comissão"].DefaultCellStyle.Format = "c2";
dgvComissao.Columns[6].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
}

Codificação dos radiobutton:

limpar();

private void limpar()
{
txtLancamento.Text = "";
cmbVendedor.Text = "";
mskdataInicial.Text = "";
mskdataFinal.Text = "";
}

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

private void dgvComissao_DoubleClick(object sender, EventArgs e)
{
clsComissao.lancamento = Convert.ToInt32(dgvComissao[0, dgvComissao.CurrentRow.Index].Value.ToString());
this.Dispose();
}

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

private void tlbPesquisar_Click(object sender, EventArgs e)
{
frmPComissao pesquisaComissao = new frmPComissao();
pesquisaComissao.ShowDialog();

if (clsComissao.lancamento != 0) // Se o conteúdo da variável lancamento não for zero
{
gpbDados.Enabled = true; // Habilita o groupbox
txtLancamento.Text = clsComissao.lancamento.ToString(); // Pega o conteúdo da variável lancamento (que como é estática, ela pode ser compartilhada em qualquer classe, form) e armazena na caixa de textos txtLancamento
clsComissao classeComissao = new clsComissao(); // Instancia a classe comissão
DataRow linha = classeComissao.pesquisaLancamento(Convert.ToInt32(txtLancamento.Text)).Rows[0]; // A classe DataRow permite localizar a linha, referente ao número neste caso do lançamento
txtcodigoVendedor.Text = Convert.ToString(linha["codigoVendedor"]);
cmbVendedor.Text = Convert.ToString(linha["nome_vendedor"]); // A variável linha mais a coluna nome_vendedor, pega o o conteúdo que está armazenada na mesma, e armazena no combobox do vendedor
mskData.Text = Convert.ToString(linha["data"]);
txtValor.Text = Convert.ToString(linha["valor"]);
txtpercentualComissao.Text = Convert.ToString(linha["percentual_Comissao"]);
txttotalComissao.Text = Convert.ToString(linha["Total Comissão"]);
calcula_Comissao(); //Chama a rotina para efetuar o cálculo da comissão
gpbDados.Enabled = true;
tlbNovo.Enabled = false;
tlbSalvar.Enabled = true;
tlbNovo.Tag = "Editar";
cmbVendedor.Focus();
}
else
{
tlbCancelar_Click(sender, e);
}
}

Crie o formulário para imprimir o relatório de vendedores

Relatório de Vendedores

Name: frmRVendedor
Text: Relatório de Vendedor
StartPosition: CenterScreen
MaximizeBox: False
Size: 558; 497

Botão Imprimir:
Name: btnImprimir
Text: Imprimir
Botão Fechar:
Name: btnFechar
Text: Fechar

No construtor, deixe como abaixo:

public frmRVendedor()
{
InitializeComponent();
exibirGrid();
}

Codificação do botão Imprimir:

Formulário de Relatório de Vendedor HTML

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

Clique no botão Imprimir

Veja como ficou:
Relatório de Vendedor Exibido

Totalizando a comissão de cada vendedor, e exibindo o resultado em um DataGrid.
No formulário de comissão, no ToolStrip, adicione o botão abaixo:
Name: tlbTotalComissao - na propriedade Text: Total Comissão.

Crie o formulário para exibir o total da comissão:
Name: frmTotalComissao
Text: Total da Comissão
StartPosition: CenterScreen
MaximizeBox: False

Insira os controles abaixo no formulário total da comissão:
Label - Name: lbldataInicial - Text: Data Inicial:
MaskedTextBox - Name: mskdataInicial - Mask: 00/00/000
Label - Name: lbldataFinal - Text: Data Final
MaskedTextBox - Name: mskdataFinal - Mask: 00/00/000
GroupBox
Button - Name: btnPesquisar - Text: Pesquisar
Button - Name: btnFechar - Text: Fechar
Insira um DataGridView para exibir o resultado da pesquisa.
Name: dgvTotalComissao

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

Codificação do botão Pesquisar:
private void btnExibir_Click(object sender, EventArgs e)
{
clsComissao classeComissao = new clsComissao();
dgvComissao.DataSource = classeComissao.pesquisaTotalComissao(Convert.ToDateTime(mskdataInicial.Text), Convert.ToDateTime(mskdataFinal.Text));
}

Criação do método pesquisaTotalComissao na classe clsComissao:
public DataTable pesquisaTotalComissao(DateTime datainicial, DateTime datafinal)
{ try
{
using (SqlConnection cn = new SqlConnection(clsConexao.stringConexao))
using (SqlCommand cmd = new SqlCommand())
{
cn.Open();
string sql = "SELECT v.Nome_Vendedor, v.salario, v.Percentual_Comissao, CAST(SUM(c.valor) AS DECIMAL(18,3)) AS TotalVendas, CAST(v.salario + (SUM(c.valor) * v.Percentual_Comissao) / 100 AS DECIMAL(18,3)) AS SalarioFinal FROM tbVendedor v INNER JOIN tbcomissao c ON v.codigo = c.codigoVendedor WHERE data BETWEEN @datainicial AND @datafinal"; sql += " GROUP BY v.Nome_Vendedor, v.salario, v.Percentual_Comissao;";
cmd.Parameters.AddWithValue("@dataInicial", datainicial);
cmd.Parameters.AddWithValue("@dataFinal", datafinal);
cmd.CommandText = sql;
cmd.Connection = cn;

DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
return dt;
}
}
catch (Exception)
{
throw;
}
}

No formulário de comissão frmComissao, na opção Total da Comissão, chame o formulário frmTotalComissao.
private void tlbTotalComissao_Click(object sender, EventArgs e)
{
frmTotalComissao form = new frmTotalComissao();
form.ShowDialog();
}

Veja como ficou o resultado da pesquisa do total da comissão:
Total da Comissão