Jump to content
D00DLEZ

Guardar Dados de datagridview numa tabela sem chave primária.

Recommended Posts

D00DLEZ

Boa tarde!

Tenho um pequeno problema... Estou a construir um projecto para uma empresa onde tenho de usar a base de dados deles, na qual não posso alterar qualquer definição.

Nesse mesmo programa tenho de guardar os dados de uma tabela apresentada num datagridview, mas sem chave primária foi um bocado complicado.

De qualquer maneira arranjei maneira do programa guardar os dados, o problema é que ele apenas guarda 1 de cada vez...

Se houver por ai uma alma caridosa que me consiga por o botão a guardar todos os dados que forem alterados, ficaria extremamente agradecido.

Aqui fica o código

Public Class Main
    '------BD WINTOUCH---------
    Dim bindingsource1 As New BindingSource
    Dim da As New SqlDataAdapter
    Dim ds As New DataSet

    '------------------------- 

    Dim col1, col2, col3, col4, col5, col6, col7 As String
    Dim col01, col02, col03, col04, col05, col07 As Integer
    Dim col8 As Boolean
    Dim col06 As Double

Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged

'Vai atribuir valores a cada variavel para depois fazer a comparação

        col1 = DataGridView1.Rows(e.RowIndex).Cells(0).Value
        col2 = DataGridView1.Rows(e.RowIndex).Cells(1).Value
        col3 = DataGridView1.Rows(e.RowIndex).Cells(2).Value
        col4 = DataGridView1.Rows(e.RowIndex).Cells(3).Value
        col5 = DataGridView1.Rows(e.RowIndex).Cells(4).Value
        col06 = CDbl(DataGridView1.Rows(e.RowIndex).Cells(5).Value)
        col7 = DataGridView1.Rows(e.RowIndex).Cells(6).Value
        If (DataGridView1.Rows(e.RowIndex).Cells(7).Value) Is DBNull.Value Then
            col8 = False
        End If
    End Sub



Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Guardar.Click

        Dim db1 As New SqlConnection(My.Settings.MyConnString)
        Dim SQL1 As String

'Abertura da base de dados.
        db1.Open()

'Passa o que estava na variavel STRING para as INTEGER por causa dos campos numericos na BD
        col01 = col1
        col02 = col2
        col04 = col4



        'MsgBox(col06)
'Execução do comando SQL onde vai guardar 1 linha apenas.

        SQL1 = "update wcblmovimentos set Reconciliado =null  where dia=" & col01 & "and mes=" & col2 & " and diario='" & col3 & "' and numdiario=" & col04 & " and descricao='" & col5 & "' and valor=" & col06 & " and natureza='" & col7 & "';"
        Dim command As New SqlCommand(SQL1, db1)
        command.ExecuteScalar()

        db1.Close()

    End Sub
End Class

PS: O unico campo que vai ser alterado é o da coluna "Reconciliado" ou Col8. Nunca ninguém irá alterar as outras colunas.

Cumprimentos e obrigado desde já!

Share this post


Link to post
Share on other sites
Caça

Cria um ciclo que percorre todos os itens da grid

For Each L as DataGridViewRow in DataGridView1.Rows
   If L.IsNewRow Then Exit Sub
   'Coloca o teu código aqui
Next


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
D00DLEZ

Vou experimentar, já posto feedback.

AH e esqueci-me de acrescentar: A base de dados que abro com este programa provém de uma outra aplicação, pelo que já vem preenchida e nunca ninguém irá acrescentar dados através da minha aplicação.

Aproveitando  a boleia, ando a procura do código para transformar uma coluna do datagridview (neste caso a coluna reconciliado) numa coluna checkbox, mas não encontro nada  ;)

Share this post


Link to post
Share on other sites
Caça

Aproveitando  a boleia, ando a procura do código para transformar uma coluna do datagridview (neste caso a coluna reconciliado) numa coluna checkbox, mas não encontro nada  ;)

Procura nas propriedades da coluna, actualmente deve estar como DataGridViewTextBoxColumn


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
D00DLEZ

For Each L As DataGridViewRow In DataGridView1.Rows

                If L.IsNewRow Then Exit Sub
                db1.Open()
                col01 = col1
                col02 = col2
                'col03 = col3
                col04 = col4
                'col05 = col5
                'Dim col06 = CDec(col6)
                MsgBox(col06)
                SQL1 = "update wcblmovimentos set Reconciliado =null  where dia=" & col01 & "and mes=" & col2 & " and diario='" & col3 & "' and numdiario=" & col04 & " and descricao='" & col5 & "' and valor=" & col06 & " and natureza='" & col7 & "';"
                Dim command As New SqlCommand(SQL1, db1)
                command.ExecuteScalar()

                db1.Close()
            Next

Isso assim continua a guardar-me apenas 1 de cada vez... Desconfio que tenha a ver com todas as variaveis.

Como Atribuo o valor daquela linha uma única vez no datagridview1 as variaveis, ele apenas e só vai ter aquele valor quando carregar no guardar, o que faz com que ele possa percorrer o dgv1 todo mas apenas e só vai guardar aqueles valores...

Agora como é que hei de fazer... Falta-me apenas fazer a porra do guardar e este problema está a encalhar tudo...

Penso eu que com uma chave primária na porra da tabela seria mais fácil... Erro da parte deles...

Quanto a coluna checkbox, eu não tenho quais queres colunas no dgv, ele preenche-o com as colunas vindas das base de dados deles, pelo que é tudo feito por código.

Necessitava era mesmo da(s) linha(s) de código necessarias para dizer que a 7ª coluna da tabela e uma coluna checkbox >.<

Share this post


Link to post
Share on other sites
Caça

Também tens de mudar as variáveis, ex

col01 = L.Cells(0).Value

isto dentro do ciclo


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
D00DLEZ

Ele não sai do ciclo e não guarda qualquer dados...

Ainda lhes vou impor essa coisa - "Cada modificação, carregam no guardar."

Já estou farto de pensar nisto >.<

Share this post


Link to post
Share on other sites
Caça

Ou não entra, ou dá erro. Ciclo infinito é que não pode.

EDIT: Nao coloques

If L.IsNewRow Then Exit Sub

mas sim

If L.IsNewRow Then Exit For


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
D00DLEZ

Estou-te a dizer  ;)

Tenho uma msgbox no ciclo que devolve o valor do campo "Valor" na base de dados. Usei-o para verificar se ele estava mesmo mesmo a guardar o campo certo.

Quando carregava no guardar aparecia-me sempre essa msgbox vezes e vezes sem conta  :confused:

Mas adiante, vou experimentar :D

Obrigado pela ajuda que tens dado.

Share this post


Link to post
Share on other sites
Caça

Mostra o teu código actual


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
D00DLEZ
            For Each L As DataGridViewRow In DataGridView1.Rows

                If L.IsNewRow Then Exit For


                db1.Open()

                col01 = L.Cells(0).Value
                col02 = L.Cells(1).Value
                col04 = L.Cells(3).Value

                MsgBox(col06)
                SQL1 = "update wcblmovimentos set Reconciliado =null  where dia=" & col01 & "and mes=" & col2 & " and diario='" & col3 & "' and numdiario=" & col04 & " and descricao='" & col5 & "' and valor=" & col06 & " and natureza='" & col7 & "';"
                Dim command As New SqlCommand(SQL1, db1)
                command.ExecuteScalar()

                db1.Close()

            Next

Share this post


Link to post
Share on other sites
Caça

Estás sempre a abrir a conexão e a fechar, devias abri-la no inicio do ciclo e depois fecha-a no fim do ciclo.


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
D00DLEZ

Ciclo infinito outra vez...

Estou supostamente vou-me reunir esta semana com eles, se até lá não resolver isso, vou-lhes dizer que cada vez que alteram o reconciliado, têm de guardar.

Share this post


Link to post
Share on other sites
Caça

O código que tens não dá para fazer nenhum ciclo infinito. Só é repetido enquanto houver linhas na DataGridView1.

Deves é ter mais algum código antes ou fora desse sub que não me estás a mostrar e que te está a causar isso.


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
D00DLEZ

Correção: já não está a fazer o ciclo infinito, mas continua-me a guardar 1 registo apenas.

Quanto ao código fora do sub, é mesmo o unico que tenho. O resto nada tem a ver com esse botão.

Share this post


Link to post
Share on other sites
Caça

Estás a usar 7 variáveis e só estás a mudar o valor a 3, por isso a query é executada várias vezes, mas nem em todos os casos existem, com os 7 filtros, registos para actualizar.


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
D00DLEZ

Eu estou a usar todas as variáveis, as col1 etc são STRING e as Col01 são Integer, aquilo que tenho no ciclo é apenas para passar o valor de alguns campos para numéricos para não dar erro a guardar na base de dados, pois lá estão definidas assim mesmo.

Foi a única maneira que arranjei para dizer que quero apenas e só atualizar aquela linha, e tendo os 7 campos com os valores atribuídos aquelas variáveis é da maneira que ele atualiza apenas e só aquela linha e mais nenhuma.

É que a tabela não tem qualquer chave primária e isso dificulta um bocado  🤔

Share this post


Link to post
Share on other sites
Caça

OK, mas tem de haver maneira de dar a volta a isso.


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
D00DLEZ

Pois deve haver >.<

Eu e um colega já batalhamos o VB mas mesmo assim perdemos quase sempre  ;)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.