none
ChekBox RRS feed

  • Pergunta

  • Boa tarde forum.

    Preciso da ajuda e vcs. Tenho uma formulário onde gero um relatório de saldo de estoque, para gerar este relatório uso o reportviwer, este relatório e gerado através de um select que faço no banco da dados, neste select tenho uma coluna de saldo de produto, no meu formulário tenho um chekbox, para marcar se o relatório será gerado tazendo tambem itens com saldo zerado ou só trazendo itens com saldo maior que zero, como faço esta condição direto no c#.

    Segue a imagem do meu formulário

    Segue meu código.

    namespace MenuRelatorios
    {
        public partial class frmEstoqueLote : Form
        {
            public frmEstoqueLote()
            {
                InitializeComponent();
            }

           private void frmEstoqueLote_Load(object sender, EventArgs e)
            {

            }

           private void btnPesquisar_Click(object sender, EventArgs e)
           {

               DateTime dtBase;
               DateTime.TryParse(txtDtBase.Text, out dtBase);

               this.EstoqueLoteTableAdapter.Fill_Est(this.Estoque.EstoqueLote, txtCodProd.Text, txtArmazem.Text, dtBase.ToString("yyyyMMdd"));

               this.reportViewer1.RefreshReport();
           }
                // Criei uma função que retorna um string (o nome)
                public string retornaProduto(string txtCodigo)
                 {
                     // criei uma variável para retornar o nome
                     string ret = string.Empty;

                     // fui no dataset e peguei a string de conexão que ele usa
                     string connectionString = this.EstoqueLoteTableAdapter.Connection.ConnectionString;

                     // crio uma instância do banco de dados utilizando a string de conexão acima
                     using (SqlConnection con = new SqlConnection(connectionString))
                     {
                         // mando abrir
                         con.Open();

                         // faço a query, concatenando com o txtCodigo ( A1_COD = '" + txtCodigo + "'";  )
                         string strQuery = @"
                                             SELECT        B1_DESC
                                             FROM          SB1020
                                             WHERE         B1_COD = '" + txtCodigo + "'";

                         // rodo o comando, passando a query e a conexão
                         using (SqlCommand command = new SqlCommand(strQuery, con))

                         // Lendo o resultado atraves do command.ExecuteReader
                         using (SqlDataReader reader = command.ExecuteReader())
                         {
                             // se tiver dados
                             while (reader.Read())
                             {
                                 // mando ler o primeiro campo (e único também = A1_NOME)
                                 reader.GetString(0);

                                 // jogo na variavel de retorno, como é um só, eu dou break pra sair do laço (nem precisava)
                                 ret = reader[0].ToString();
                                 break;
                             }
                         }
                     }

                     // retorno o valor (A1_NOME) desejado
                     return ret;
                 }

            private void txtCodProd_KeyDown(object sender, KeyEventArgs e)
            {
                            // No evento txtCodCliente_KeyDown (apertar tecla do txtCodCliente
                     // Se a tecla apertada for Enter
                     if (e.KeyCode == Keys.Enter)
                     {
                         // Ele vai lá na função que criei, passando o codCliente e retorna no campo do nome (txtNomeCliente.Text)
                         txtDescProd.Text = retornaProduto(txtCodProd.Text);

                         // Manda o cursor dar foco no txtDataDe
                         txtCodProd.Focus();
                     }
            }

            private void chekSaldo_CheckedChanged(object sender, EventArgs e)
            {

            }

            }
        }


    JUNIOR GUERREIRO T.I

    quinta-feira, 23 de fevereiro de 2017 14:59

Respostas

  • Certo, mas como está no C# seu código? É um método isso?

    Vou postar como eu faço aqui, tudo bem?

    private DataTable List(string pB8_PRODUTO, string pB8_LOCAL, DateTime pB8_DTVALID, bool listarSaldoMaior)
            {
                SqlCommand Command = null;
                SqlDataAdapter DataAdapter = null;
                DataTable table = null;
    
                try
                {
                    StringBuilder Query = new StringBuilder();
                    Query.Append(" SELECT  ");
                    Query.Append("      SB.B8_PRODUTO, ");
                    Query.Append("      S1.B1_DESC, ");
                    Query.Append("      SB.B8_LOCAL, ");
                    Query.Append("      (SB.B8_SALDO - SB.B8_EMPENHO) AS SALDO, ");
                    Query.Append("      SB.B8_LOTECTL, ");
                    Query.Append("      CONVERT(VARCHAR(10), CAST(B8_DFABRIC AS DATE),103) AS DTFABRICAÇÃO, ");
                    Query.Append("      CONVERT(VARCHAR(10), CAST(B8_DTVALID AS DATE),103) AS DTVALIDADE ");
                    Query.Append(" FROM SB8020 SB ");
                    Query.Append("  INNER JOIN SB1020 S1 WITH (NOLOCK) ON S1.B1_COD = SB.B8_PRODUTO ");
                    Query.Append(" WHERE SB.D_E_L_E_T_ <> '*' AND S1.D_E_L_E_T_ <> '*' AND SB.B8_PRODUTO = @B8_PRODUTO AND SB.B8_LOCAL = @B8_LOCAL ");
                    Query.Append(" AND SB.B8_DTVALID > @B8_DTVALID ");
                    if (listarSaldoMaior)
                        Query.Append(" AND SALDO > 0 ");
                    else
                        Query.Append(" AND SALDO = 0 ");
                    Query.Append(" ORDER BY S1.B1_DESC ");
    
                    Command = Connection.Connection.CreateCommand();
                    Command.CommandText = Query.ToString();
    
                    Command.Parameters.Add("@B8_PRODUTO", SqlDbType.VarChar).Value = pB8_PRODUTO;
                    Command.Parameters.Add("@B8_LOCAL", SqlDbType.VarChar).Value = pB8_LOCAL;
                    Command.Parameters.Add("@B8_DTVALID", SqlDbType.DateTime).Value = pB8_DTVALID;
    
                    DataAdapter = new SqlDataAdapter(Command);
                    table = new DataTable();
                    DataAdapter.Fill(table);
                }
                catch (Exception ex)
                {
                }
                finally
                {
                    if (Command != null)
                    {
                        Command.Dispose();
                        Command = null;
                    }
    
                    if (DataAdapter != null)
                    {
                        DataAdapter.Dispose();
                        DataAdapter = null;
                    }
                }
    
                return table;
            }

    No evento click do botão que você chamar o relatório, você faz o seguinte:

    DataTable table = List("000977", "01", new DateTime(2017,2,23), true);

    Obs.: Se você passar TRUE, vai listar com quantidade maior que 0, caso passe FALSE, vai ser quantidade = 0.

    tudo bem?

    Qualquer dúvida, estou a disposição.

    att.

    Felipe


    sexta-feira, 24 de fevereiro de 2017 17:43

Todas as Respostas

  • Bom dia!

    Cara, é simples, no seu select do relatório, você passa mais um parâmetro "bool listarSaldoMaior".

    Ai na sua condição você verificar, se for true você faz sua condição "where qtd > 0".

    Posta sua query do report pra eu dar uma olhada.

    att.

    Felipe

    sexta-feira, 24 de fevereiro de 2017 14:59
  • Obrigado pela atenção felipe, e que sou muito leigo ainda no c# se vc puder inserir no meu codigo acima vai me ajudar bastante.

    segue minha query

    SELECT
     SB.B8_PRODUTO,
     S1.B1_DESC,
     SB.B8_LOCAL,
     (SB.B8_SALDO - SB.B8_EMPENHO) AS SALDO,
     SB.B8_LOTECTL,
     CONVERT(VARCHAR(10), CAST(B8_DFABRIC AS DATE),103) AS DTFABRICAÇÃO,
     CONVERT(VARCHAR(10), CAST(B8_DTVALID AS DATE),103) AS DTVALIDADE
    FROM SB8020 SB
     INNER JOIN SB1020 S1 WITH (NOLOCK) ON S1.B1_COD = SB.B8_PRODUTO
    WHERE SB.D_E_L_E_T_ <> '*' AND S1.D_E_L_E_T_ <> '*' AND SB.B8_PRODUTO = '000977' AND SB.B8_LOCAL = '01'
    AND SB.B8_DTVALID > CONVERT(datetime,'23/02/2017', 103)
    ORDER BY S1.B1_DESC


    JUNIOR GUERREIRO T.I

    sexta-feira, 24 de fevereiro de 2017 15:58
  • Certo, mas como está no C# seu código? É um método isso?

    Vou postar como eu faço aqui, tudo bem?

    private DataTable List(string pB8_PRODUTO, string pB8_LOCAL, DateTime pB8_DTVALID, bool listarSaldoMaior)
            {
                SqlCommand Command = null;
                SqlDataAdapter DataAdapter = null;
                DataTable table = null;
    
                try
                {
                    StringBuilder Query = new StringBuilder();
                    Query.Append(" SELECT  ");
                    Query.Append("      SB.B8_PRODUTO, ");
                    Query.Append("      S1.B1_DESC, ");
                    Query.Append("      SB.B8_LOCAL, ");
                    Query.Append("      (SB.B8_SALDO - SB.B8_EMPENHO) AS SALDO, ");
                    Query.Append("      SB.B8_LOTECTL, ");
                    Query.Append("      CONVERT(VARCHAR(10), CAST(B8_DFABRIC AS DATE),103) AS DTFABRICAÇÃO, ");
                    Query.Append("      CONVERT(VARCHAR(10), CAST(B8_DTVALID AS DATE),103) AS DTVALIDADE ");
                    Query.Append(" FROM SB8020 SB ");
                    Query.Append("  INNER JOIN SB1020 S1 WITH (NOLOCK) ON S1.B1_COD = SB.B8_PRODUTO ");
                    Query.Append(" WHERE SB.D_E_L_E_T_ <> '*' AND S1.D_E_L_E_T_ <> '*' AND SB.B8_PRODUTO = @B8_PRODUTO AND SB.B8_LOCAL = @B8_LOCAL ");
                    Query.Append(" AND SB.B8_DTVALID > @B8_DTVALID ");
                    if (listarSaldoMaior)
                        Query.Append(" AND SALDO > 0 ");
                    else
                        Query.Append(" AND SALDO = 0 ");
                    Query.Append(" ORDER BY S1.B1_DESC ");
    
                    Command = Connection.Connection.CreateCommand();
                    Command.CommandText = Query.ToString();
    
                    Command.Parameters.Add("@B8_PRODUTO", SqlDbType.VarChar).Value = pB8_PRODUTO;
                    Command.Parameters.Add("@B8_LOCAL", SqlDbType.VarChar).Value = pB8_LOCAL;
                    Command.Parameters.Add("@B8_DTVALID", SqlDbType.DateTime).Value = pB8_DTVALID;
    
                    DataAdapter = new SqlDataAdapter(Command);
                    table = new DataTable();
                    DataAdapter.Fill(table);
                }
                catch (Exception ex)
                {
                }
                finally
                {
                    if (Command != null)
                    {
                        Command.Dispose();
                        Command = null;
                    }
    
                    if (DataAdapter != null)
                    {
                        DataAdapter.Dispose();
                        DataAdapter = null;
                    }
                }
    
                return table;
            }

    No evento click do botão que você chamar o relatório, você faz o seguinte:

    DataTable table = List("000977", "01", new DateTime(2017,2,23), true);

    Obs.: Se você passar TRUE, vai listar com quantidade maior que 0, caso passe FALSE, vai ser quantidade = 0.

    tudo bem?

    Qualquer dúvida, estou a disposição.

    att.

    Felipe


    sexta-feira, 24 de fevereiro de 2017 17:43
  • Muito obrogado Felipe deu certinho aqui. vlw

    JUNIOR GUERREIRO T.I

    sexta-feira, 24 de fevereiro de 2017 18:36