No SQL Server, crie o Banco de Dados e as tabelas abaixo:
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 | |
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;
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;
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
{
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
Inserir o controle Panel
Name: pnlTituloInserir 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)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()Crie a variável estática abaixo:
public static int lancamento;Formulário de comissão:
Crie o formulário abaixo:
| 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)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:
| 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

Botão Imprimir:
Name: btnImprimir
Text: Imprimir
Botão Fechar:
Name: btnFechar
Text: Fechar
No construtor, deixe como abaixo:
public frmRVendedor()
Codificação do botão Imprimir:

Codificação do botão Fechar:
private void btnFechar_Click(object sender, EventArgs e)
{
this.Close();
}
Clique no botão Imprimir
Veja como ficou:
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: