Desenvolvendo em C#

Status
Not open for further replies.

Guilherme

New member
Joined
Aug 21, 2024
Messages
1
Programming Experience
Beginner
Estou desenvolvedo um software que tem como principal objetivo fazer a conferência de pedidos via coletor. Um sistema simples que por hora só fará SELECT para trazer informações dos pedidos que cairem na separação.

Essa primeira tela terá um grid que trará pedidos que estão no departamento de SEPARAÇÂO e ao clicar em alguma das linhas será mais um select que buscará algumas informações do pedido.

image.png.bfd913a2a10a6494b62c833e4ade828b.png




Nesta próxima tela, carregará o primeiro item do pedido, trazendo Código do item, Localização, Descrição, Marca, Embalagem e a quantidade que deve ser separada. E um botão para INICIAR A SEPARAÇÃO.

image.png.881dd0a9bd286b715c6ac2019b8c61f3.png




Ao clicar em INICIAR SEPARAÇÃO, coloquei como forma de saber qual é o código de barras que o select puxou para o item apenas para finalidade de tratamento de erros..
image.png.eb701f43e113f89bad5646641ce1e8d6.png


Ao dar ok na tela anterior, abrirá a tela para o usuário ler o código de barras e informar a quantidade que há em estoque para ser separado e por fim ele clica em SEPARAR.

image.png.cc85f010a2d23d30b4bb27cd4ea90036.png




O problema é que ao clicar em SEPARAR o sistema informa que o produto foi separado e volta a tela anterior, informando o próximo item da lista que está presente no pedido para que faça uma nova separação. Ao clicar em INICIAR SEPARAÇÃO o sistema puxa o código de barras do primeiro item e não do item que foi carregado, isso serve para qualquer outro item sempre puxará o código de barras do primeiro produto e não do produto que está sendo apresentado.

image.png.3ab0a80dcf86ffdcb0de217263b2a2bc.png




O código de barras lido sempre é o da imagem abaixo porém o código de barras desse item é 7891962014982. Embora nessa tela os campos Código do item, Descrição, Marca, Embalagem e localização estão sendo passados de item pra item, ao fazer a comparação pra saber se o código de barras lido e a quantidade vendida pertence ao produto dá algum problema. Me parece falta de index mas já tentei de tudo e não foi.

É como se a comparação estivesse sendo feita sempre com base no primeiro produto do select e não do produto que está sendo apresentado.



image.png.bceac907a1af4b01c5de4e71e68cb1bc.png




Vou deixar meu código aqui, caso algúem puder me ajudar por favor. Peço perdão caso tenha cometido algum erro. Sou iniciante em C#.

OBS: REMOVI APENAS PARTES DO CÓDIGO QUE TINHAM MINHAS CREDENCIAIS.



using System;
using System.Data;
using System.Data.SqlClient;
using System.Net.Mail;
using System.Net;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace SistemaSeparacao
{
public partial class FormSeparacao : Form
{
private int idPedido;
private int currentItemIndex = 0; // Índice do item atual
private SqlConnection conexao;
private List<string> itensCortados = new List<string>(); // Lista para armazenar os itens cortados

public FormSeparacao(int pedidoId)
{
InitializeComponent();
idPedido = pedidoId;
conexao = new SqlConnection(";");
CarregarProximoItem(); // Chama o método para carregar o primeiro item
}

public void ArmazenarItemCortado(string itemCortado)
{
itensCortados.Add(itemCortado);
}

public void CarregarProximoItem()
{
SqlDataReader reader = null;
try
{
conexao_Open();
SqlCommand comando = new SqlCommand(
"SELECT CPAC_COTPEDIDO_ITEM.ID_PRODUTO, PRODUTOS.NOME, PRODUTOS.MARCA, " +
"PRODUTOS.CODBARRAS, " +
"PRODUTOS.EMBALAGEM, PRODUTOS.LOCALIZACAO, " +
"CAST(CPAC_COTPEDIDO_ITEM.QTDVENDIDA AS DECIMAL(18,0)) AS QTDVENDIDA " +
"FROM CPAC_COTPEDIDO_ITEM " +
"JOIN PRODUTOS ON CPAC_COTPEDIDO_ITEM.ID_PRODUTO = PRODUTOS.ID_PRODUTO " +
"WHERE CPAC_COTPEDIDO_ITEM.ID_COTPEDIDO = @idPedido ORDER BY CPAC_COTPEDIDO_ITEM.SEQUENCIA", conexao);

comando.Parameters.AddWithValue("@idPedido", idPedido);
reader = comando.ExecuteReader();

int itemCount = 0;
while (reader.Read())
{
if (itemCount == currentItemIndex)
{
txtCodigoProduto.Text = reader["ID_PRODUTO"].ToString();
txtNomeProduto.Text = reader["NOME"].ToString();
txtMarca.Text = reader["MARCA"].ToString();
txtEmbalagem.Text = reader["EMBALAGEM"].ToString();
txtLocalizacao.Text = reader["LOCALIZACAO"].ToString();
txtQtdVendida.Text = reader["QTDVENDIDA"].ToString();
currentItemIndex++; // Avança para o próximo item na próxima chamada
return; // Sai da função se um item foi carregado
}
itemCount++;
}

// Se não há mais itens para carregar
if (itemCount == 0 || itemCount <= currentItemIndex)
{
// Se houver itens cortados, envie um e-mail
if (itensCortados.Count > 0)
{
MessageBox.Show("Enviando e-mail com itens cortados."); // Depuração
EnviarEmailItensCortados();
}

MessageBox.Show("Todos os itens foram separados.");
this.Close(); // Fecha a tela se todos os itens foram processados
}
}
catch (Exception ex)
{
MessageBox.Show("Erro ao carregar item: " + ex.Message);
}
finally
{
if (reader != null)
{
reader.Close(); // Certifique-se de fechar o leitor
}
conexao.Close();
}
}

private void btnIniciarSeparacao_Click(object sender, EventArgs e)
{
int currentItemIndex = 0; // Ou outro valor que você precisa passar

FormLeitura formLeitura = new FormLeitura(idPedido, currentItemIndex);
formLeitura.Owner = this; // Define o FormSeparacao como o dono de FormLeitura
formLeitura.ShowDialog();
}


private void EnviarEmailItensCortados()
{
try
{
// Configure o e-mail
MailMessage mail = new MailMessage("", "");
mail.Subject = $"Pedido {idPedido}: Itens Cortados";
mail.Body = "Os seguintes itens foram cortados:\n" + string.Join("\n", itensCortados);

// Configure o servidor SMTP
SmtpClient smtpClient = new SmtpClient("");
smtpClient.Port = ;
smtpClient.Credentials = new NetworkCredential("");
smtpClient.EnableSsl = true;

// Enviar o e-mail
smtpClient.Send(mail);

MessageBox.Show("E-mail enviado com sucesso!");
}
catch (Exception ex)
{
MessageBox.Show("Erro ao enviar e-mail: " + ex.Message);
}
}
}
}





AGORA DO FORMLEITURA



using System;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace SistemaSeparacao
{
public partial class FormLeitura : Form
{
private int idPedido; // Variável para armazenar o ID do pedido
private SqlConnection conexao; // Variável de conexão com o banco de dados
private string codigoBarrasCorreto; // Variável para armazenar o código de barras correto do item atual
private int currentItemIndex; // Variável para armazenar o índice do item atual

// Construtor que aceita um argumento de ID do pedido
public FormLeitura(int pedidoId, int itemIndex)
{
InitializeComponent(); // Inicializa os componentes do formulário
idPedido = pedidoId; // Atribui o ID do pedido à variável de classe
currentItemIndex = itemIndex; // Atribui o índice do item atual à variável de classe
conexao = new SqlConnection(";"); // Inicializa a conexão com a string de conexão correta
CarregarItemAtual(); // Carrega o item atual ao inicializar o formulário
}

private void CarregarItemAtual()
{
try
{
conexao_Open();
SqlCommand comando = new SqlCommand(
"SELECT CPAC_COTPEDIDO_ITEM.ID_PRODUTO, CPAC_COTPEDIDO_ITEM.QTDVENDIDA, PRODUTOS.CODBARRAS " +
"FROM CPAC_COTPEDIDO_ITEM " +
"JOIN PRODUTOS ON CPAC_COTPEDIDO_ITEM.ID_PRODUTO = PRODUTOS.ID_PRODUTO " +
"WHERE CPAC_COTPEDIDO_ITEM.ID_COTPEDIDO = @idPedido " +
"ORDER BY CPAC_COTPEDIDO_ITEM.SEQUENCIA OFFSET @itemIndex ROWS FETCH NEXT 1 ROWS ONLY", conexao);

comando.Parameters.AddWithValue("@idPedido", idPedido);
comando.Parameters.AddWithValue("@itemIndex", currentItemIndex); // Usando o índice atual para buscar o item correto
SqlDataReader reader = comando.ExecuteReader();

if (reader.Read())
{
// Armazena o código de barras correto do item atual
codigoBarrasCorreto = reader["CODBARRAS"].ToString().Trim();
int qtdVendida = Convert.ToInt32(reader["QTDVENDIDA"]); // Atualiza a quantidade a ser separada

// Atualiza o campo de texto com a quantidade vendida
txtQtdSeparada.Text = qtdVendida.ToString();

// Depuração: Exibe o código de barras correto
MessageBox.Show($"Código de Barras Correto Carregado: {codigoBarrasCorreto}");
}
else
{
MessageBox.Show("Nenhum item correspondente foi encontrado para este pedido.");
}

reader.Close(); // Certifique-se de fechar o reader
}
catch (Exception ex)
{
MessageBox.Show("Erro ao carregar item: " + ex.Message);
}
finally
{
conexao.Close(); // Fecha a conexão com o banco de dados
}
}

private void btnSeparar_Click(object sender, EventArgs e)
{
// Validação de entrada
if (string.IsNullOrWhiteSpace(txtCodigoBarras.Text))
{
MessageBox.Show("Por favor, escaneie ou insira o código de barras.");
return;
}

if (string.IsNullOrWhiteSpace(txtQtdSeparada.Text) || !int.TryParse(txtQtdSeparada.Text, out int qtdSeparada))
{
MessageBox.Show("Por favor, insira uma quantidade válida.");
return;
}

string codigoBarrasLido = txtCodigoBarras.Text.Trim();

// Comparação dos códigos de barras ignorando maiúsculas e minúsculas
if (codigoBarrasLido.Equals(codigoBarrasCorreto, StringComparison.OrdinalIgnoreCase))
{
try
{
conexao_Open();
SqlCommand comando = new SqlCommand(
"SELECT CPAC_COTPEDIDO_ITEM.ID_PRODUTO, CPAC_COTPEDIDO_ITEM.QTDVENDIDA " +
"FROM CPAC_COTPEDIDO_ITEM " +
"JOIN PRODUTOS ON CPAC_COTPEDIDO_ITEM.ID_PRODUTO = PRODUTOS.ID_PRODUTO " +
"WHERE CPAC_COTPEDIDO_ITEM.ID_COTPEDIDO = @idPedido AND PRODUTOS.CODBARRAS = @codigoBarrasCorreto", conexao);

comando.Parameters.AddWithValue("@idPedido", idPedido);
comando.Parameters.AddWithValue("@codigoBarrasCorreto", codigoBarrasCorreto);
SqlDataReader reader = comando.ExecuteReader();

if (reader.Read())
{
int qtdVendida = Convert.ToInt32(reader["QTDVENDIDA"]);
string codigoProduto = reader["ID_PRODUTO"].ToString(); // Obter o código do produto

if (qtdSeparada > qtdVendida)
{
MessageBox.Show("A quantidade separada é superior à vendida.");
}
else if (qtdSeparada < qtdVendida)
{
if (MessageBox.Show("A quantidade separada é inferior à vendida. Deseja realizar corte?", "Corte", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
// Calcular a diferença e armazenar o item cortado
int diferenca = qtdVendida - qtdSeparada;
string itemCortado = $"Código do Produto: {codigoProduto}, Quantidade Cortada: {diferenca}";

FormSeparacao formSeparacao = (FormSeparacao)this.Owner;
formSeparacao.ArmazenarItemCortado(itemCortado);

// Incrementa o índice e carrega o próximo item
currentItemIndex++;
formSeparacao.CarregarProximoItem();

this.Close(); // Fecha a tela de leitura
}
}
else
{
MessageBox.Show("Item separado corretamente!");

// Incrementa o índice e carrega o próximo item
currentItemIndex++;
FormSeparacao formSeparacao = (FormSeparacao)this.Owner;
formSeparacao.CarregarProximoItem();

this.Close(); // Fecha a tela de leitura
}
}
else
{
MessageBox.Show("Nenhum item correspondente foi encontrado para este pedido.");
}

reader.Close(); // Certifique-se de fechar o reader
}
catch (Exception ex)
{
MessageBox.Show("Erro ao verificar item: " + ex.Message);
}
finally
{
conexao.Close(); // Fecha a conexão com o banco de dados
}
}
else
{
MessageBox.Show("Código de barras não confere.");
}
}
}
}
 
Unfortunately, this is an English language forum. Please start another thread in English.
 
Status
Not open for further replies.

Latest posts

Back
Top Bottom