none
Gravar parcelas RRS feed

  • Pergunta

  • Boa tarde!

    Estou desenvolvendo uma aplicação desktop só para treinamento mesmo antes usava banco acces funcionava tudo perfeitamente.

    O idcontrole tem que ser o mesmo para todas as parcelas nesse exemplo pegou o codigo 42 que é o códgo da conta como no acces veja abaixo;

    estou trocado pelo SQLITE, e esta acontecendo o seguinte, o idcontrole esta gravando códigos em sequencia não pode acontecer.

          

    lembrando que tenho dois métodos, uma GravarConta(controle) e outro gravaparcelas, no evento do botão salvar executo primeiro o método gravaconta depois gravaparcelas

           private void btnSalvar_Click(object sender, EventArgs e)
            {            
                GravarConta();
                salvar_parcela();
                LimpaCampo();
                dataGridParcelas.DataSource = null;
            }


    Agora veja os métodos;

     private void GravarConta()
            {
                if (CodFornecedor != string.Empty)
                {                       
                    try
                    {
                        ContasMODEL objprecos = new ContasMODEL();
    
                        objprecos.IDControle = Convert.ToInt32(txtCodigo.Text);
                        objprecos.Id_centro_custo = Convert.ToInt32(CodCentroCusto);
                        objprecos.Datacadastro = Convert.ToDateTime(dtLancamento.Text);
                        objprecos.IDFornecedor = Convert.ToInt32(CodFornecedor);
                        objprecos.Descricao = txtDescricao.Text;
    
                        ContasBLL precosbll = new ContasBLL();
                        precosbll.gravaPrecosDal(objprecos);
    
                        txtCodigo.Text = RetornaCodigoContaMaisUm(QueryParcela).ToString();//EU                   
                    }
                    catch (SQLiteException ex)
                    {
                        MessageBox.Show("Verifique os erros", ex.Message);
                    }
                }
                else
                    MessageBox.Show("Escolha um fornecedor", "Atenção!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

    Gravar

     private void gravar_Parcelas()
            {
                foreach (DataGridViewRow linha in dataGridParcelas.Rows)
                {
                    int posicao = 0;
                    //*********************
                    var conn = Conexao.Conex();           
                    
                    SQLiteCommand cmd = new SQLiteCommand("INSERT INTO parcelas (idparcela, idcontrole, num_parcela, datavenc, valor_parc ) VALUES (@idparcela, @idcontrole, @num_parcela, @datavenc, @valor_parc)", conn);
                    posicao = linha.Index;
                    conn.Open();
                    string cod_parcela = linha.Cells[0].Value.ToString();
                    string cod_controle = linha.Cells[1].Value.ToString();
                    string num_parcela = linha.Cells[2].Value.ToString();
                    string preço = linha.Cells[4].Value.ToString();
                    string data = linha.Cells[3].Value.ToString();//Nova implmentação
    
                    Int32 parcela = Convert.ToInt32(cod_parcela);
                    Int32 controle = Convert.ToInt32(cod_controle);
                    Int32 numroparcela = Convert.ToInt32(num_parcela);
                    DateTime Data = Convert.ToDateTime(data);//Nova implementação
    
                    parcela = Convert.ToInt32(RetornaCodigoContaMaisUm(QueryParcela).ToString());// Nova implemntação
    
                    preço = preço.Replace("R", "").Replace("$", "").Replace(" ", "").Replace(".", "");
                    cmd.Parameters.AddWithValue("@idparcela", parcela);
                    cmd.Parameters.AddWithValue("@idcontrole", controle);
                    cmd.Parameters.AddWithValue("@num_parcela", numroparcela);
                    cmd.Parameters.AddWithValue("@datavenc", Data);
                    cmd.Parameters.AddWithValue("@valor_parc", Convert.ToDecimal(preço));
    
                    cmd.ExecuteNonQuery();
                    conn.Close();
                }
                MessageBox.Show("Gravado com sucesso !", "Informação!", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

    Relações no Acces- aqui funciona normal

    Olha o código que usei para criar as tabelas no SQLITE;

    CREATE TABLE centrocusto
    (
      idcentro INTEGER CONSTRAINT AUTO_INCREMENT PRIMARY KEY,
      centro_custo  TEXT
    )
    
    CREATE TABLE controle
    (
          idcontrole INTEGER AUTO_INCREMENT PRIMARY KEY,
          datacadastro DATE,
          idcentro INTEGER CONSTRAINT centrocusto REFERENCES idcentro,
          idfornecedor INTEGER CONSTRAINT fornecedor REFERENCES idfornecedor,
          descricao TEXT
    
          /*FOREIGN KEY(idcentro) REFERENCES centrocusto(idcentro)
          FOREIGN KEY(idfornecedor) REFERENCES fornecedor(idfornecedor) */
    )
    CREATE TABLE fornecedor
    (
      idfornecedor INTEGER CONSTRAINT AUTO_INCREMENT PRIMARY KEY,
      fornecedor  TEXT
    )
    
    CREATE TABLE parcelas
    (
      idparcela INTEGER CONSTRAINT AUTO_INCREMENT PRIMARY KEY,
      idcontrole  INTEGER CONSTRAINT controle REFERENCES idcontrole,
      num_parcela INTEGER,
      valor_parc FLOAT,
      datavenc DATE,
      datapgto DATE,
      pago BOOLEAN
    
      /*FOREIGN KEY(idcontrole) REFERENCES controle(idcontrole)    */
      
    )
    
    CREATE TABLE usuario
    (
      idusuario INTEGER CONSTRAINT AUTO_INCREMENT PRIMARY KEY,
      usuario   TEXT,
      senha TEXT,
      nivelacesso TEXT
    )

    Alguém poderia me dar um força nessa tarefa?

    quarta-feira, 27 de abril de 2016 16:06

Respostas

  • Consegue resolver o problema, foi só inverter a ordem  primeiro idparcela em seguida txtCodigo, dessar forma resolver antes estava txtCodgo.tex, Idparcela++

     for (var i = 0; i < Num_Parcela; i++)
                    {
                        dt.Rows.Add( Idparcela++, txtCodigo.Text, (i + 1), Data_Venc.AddMonths(i + 1), resultado); // gerando as parcelas no grid                    
                    }
                    dataGridParcelas.DataSource = dt;

    quarta-feira, 27 de abril de 2016 21:21

Todas as Respostas

  • Errei o correto é;

    private void btnSalvar_Click(object sender, EventArgs e)
            {            
                GravarConta();
                gravar_Parcelas();
                LimpaCampo();
                dataGridParcelas.DataSource = null;
            }

    quarta-feira, 27 de abril de 2016 16:09
  • Boa tarde,

    Não encontrei o erro no seu código. Confirma se na coluna 2 da sua grid o código do controle esta correto. Quando você esta inserindo a parcela, esta obtendo os dados do DataGridView e o código do controle esta obtendo da segunda coluna.

    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    quarta-feira, 27 de abril de 2016 17:09
  • o código do controle esta correto só que é a coluna 0, na grid esta tudo ok,

    Aqui ta correto a coluna idcontrole mostra um único código para todas as parcelas, mas ao gravar sai na seguência nesse caso ele gravaria 4,5,6,7,8...

    quarta-feira, 27 de abril de 2016 20:58
  • Consegue resolver o problema, foi só inverter a ordem  primeiro idparcela em seguida txtCodigo, dessar forma resolver antes estava txtCodgo.tex, Idparcela++

     for (var i = 0; i < Num_Parcela; i++)
                    {
                        dt.Rows.Add( Idparcela++, txtCodigo.Text, (i + 1), Data_Venc.AddMonths(i + 1), resultado); // gerando as parcelas no grid                    
                    }
                    dataGridParcelas.DataSource = dt;

    quarta-feira, 27 de abril de 2016 21:21