Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [VB.NET/2010] impedire inserimento duplicati da importazione excel

    Ciao a tutti!
    Sono nuovo del forum, quindi spero non dire o fare fesserie. In ogni caso vorrei sottoporvi una domanda su VB.net 2010. Come da titolo mi popolo una datagridview con il seguente codice:
    codice:
           OpenFileDialog1.Title = "Seleziona file Excel da importare"
            OpenFileDialog1.Multiselect = False
            OpenFileDialog1.Filter = "Formato xlsx (*.xlsx)|*.xlsx|Formato xls (*.xls)|*.xls"
            OpenFileDialog1.FilterIndex = 2
            OpenFileDialog1.FileName = ""
            OpenFileDialog1.ShowDialog()
    
            Dim FileName As String = OpenFileDialog1.FileName
            txtPath.Text = OpenFileDialog1.FileName
    
            'Dim nome As String
            'nome = IO.Path.GetFileName(FileName)
    
            Dim conn As String
            conn = "provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & txtPath.Text & ";Extended Properties=Excel 12.0;"
            Dim con As OleDbConnection = New OleDbConnection(conn)
            Dim da As OleDbDataAdapter = New OleDbDataAdapter()
            Dim cmd As OleDbCommand = New OleDbCommand()
            cmd.Connection = con
            cmd.CommandText = "SELECT * FROM [ProveVarietali$A:Y]"     
            da.SelectCommand = cmd
            Try
                da.Fill(ProveVarietali.ProveVarietaliDataSet, "ProveVarietali")
                MessageBox.Show("Importazione completata con successo!")
                ProveVarietali.ProveVarietaliDataGridView.DataSource = ProveVarietali.ProveVarietaliDataSet
                ProveVarietali.ProveVarietaliDataGridView.DataMember = "ProveVarietali"
                ProveVarietali.ProveVarietaliTableAdapter.Update(ProveVarietali.ProveVarietaliDataSet)
            Catch e1 As Exception
                MessageBox.Show("Importazione fallita!controllare le intestazioni del file sorgente!")
            End Try
    mediante il cambiamento di questa stringa di codice in:

    codice:
    cmd.CommandText = "SELECT * FROM [ProveVarietali$A:Y]"
    questo, decidendo quale colonna importare e che dati importare

    codice:
    cmd.CommandText = "SELECT colonna1 FROM [ProveVarietali$A:Y] WHERE (colonna1 between 0 and 9)"
    Qui però sorgono due domande:
    come posso impedire che non vengano importati da excel in DGW dati doppi per una determinata colonna? (quando trovato il dato semplicemente il codice dovrebbe non importare tutta la riga di excel). Ho provato con l'evento datagridview validating ma è successivo all'importazione io vorrei qualcosa che intervenisse in fase di importazione. E secondo, ma credo sia una domanda più stupida, e se volessi importare 2 colonne anziche 1 come faccio? così non funziona:

    codice:
    cmd.CommandText = "SELECT colonna1, colonna2 FROM [ProveVarietali$A:Y] WHERE (colonna1, colonna2 between 0 and 9)"
    grazie a tutti! spero possiate darmi degli spunti per sistemare il mio programmino.

    Ciao
    Ultima modifica di scolaretto; 04-10-2013 a 17:32

  2. #2

  3. #3
    Ok, grazie per la dritta. Un'altra domanda....ho risolto con il tuo suggerimento.

    codice:
    cmd.CommandText = "SELECT DISTINCT colonna1 FROM [Tabella$A:Y]"
    Però filtrando l'importazione di excel con SELECT DISTINCT per l'intestazione in colonna1, non mi importa i duplicati ma purtroppo nemmeno i dati delle restanti colonne.

    Io vorrei che quando trova il doppione in una colonna considerata (colonna1) non importa tutte la riga di dati da excel (es: range A2:Y2), e viceversa per quando non trova doppioni.

    Spero abbiate capito...

    ciao e grazie

  4. #4
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    E' così che funziona.
    Non puoi avere la botte piena e la moglie ubriaca.
    O l'uno, o l'altro.

    Altrimenti dovresti analizzare riga per riga, campo per campo e decidere cosa importare.
    Però questo modo di agire non è coerente con la struttura 'tabellare' dei dati, ergo non ha proprio senso farlo perchè è ovvio che ogni singolo campo valorizzato è riferito esclusivamente alla riga (record) a cui appartiene e non ha alcuna relazione con le altre righe.

    Francamente la tua esigenza è mi è proprio incomprensibile.

  5. #5
    Capisco...ma sebbene tu reputi incomprensibile la cosa è quello che devo fare! il mio database di access, visualizzato su DGW contiene molti dati di cui per una colonna in particolare non vi sono assolutamente e non vi devono essere doppioni. Se importando da excel l'utente sbadatamente importa un dato doppio in quella colonna sono fregato! Ecco perchè mi chiedevo vi fosse un controllo in importazione... e siccome a quel valore solo legati tutti gli altri delle altre colonne, la riga con valore doppio andava saltata e non importata! tutto qui!

    Visto che mi hai detto che non è possibile mi tocca fare con questo codice, ma come ben capisci ci mette una vita a scorrere 30.000 righe!

    codice:
    For Loop1 As Integer = 0 To DataGridView1.Rows.Count - 2
                For Loop2 As Integer = Loop1 + 1 To DataGridView1.Rows.Count - 2
                    If DataGridView1.Rows(Loop1).Cells(2).Value = DataGridView1.Rows(Loop2).Cells(2).Value Then
                        DataGridView1.Rows.RemoveAt(Loop2)
                    End If
                Next
            Next
    non è che è possibile incrementare la velocità di questo codice?
    grazie

  6. #6
    non è illegale fare SELECT DISTINCT colonna1, colonna2

    se però hai

    colonna1 colonna2
    alfa trenta
    alfa quaranta

    importerà due righe; se non ti interessa che importi trenta o quaranta (basta che non importi due alfa) puoi provare a fare

    SELECT colonna1, max(colonna2) FROM ..... GROUP BY colonna1

    facce sape'

  7. #7
    Ciao Optime,
    Grazie per la dritta! ho provato e funziona anche se il problema è diverso...o magari sono io che non capisco nulla! Mi spiego con un esempio qui sotto riporto degli esempi dei dati che devo importare e DGW. Io vorrei evitare che in colonna1 DGW mi venisse inserito un valore che è gia presente (valore B in esempio 2). Quindi semplicemente vorrei non venisse importato non solo B ma anche i valori sulla medesima riga: B | 1 | 5 | 5 | 8.

    con i vari SELECT non si riesce a fare questo in quanto si agisce solo sulla singola colonna (almeno così mi sembra d'aver capito).

    ESEMPIO (1) DGW:
    colonna1 | colonna2 | colonna3 | colonna4 | colonna5
    A 2 3 2 9
    B 5 6 2 1
    C 1 5 5 8
    R 9 9 9 2

    ESEMPIO (2) da IMPORTARE:
    colonna1 | colonna2 | colonna3 | colonna4 | colonna5
    Z 1 3 4 4
    K 4 5 5 5
    B 1 5 5 8
    S 1 1 1 8

    Cercando in internet ho trovato una persona che aveva il mio stesso problema e ha risolto, a detta sua, con un codice che controlla dopo l'imissione dei dati con velocità pressochè istantanea con questo pezzo di codice:

    codice:
    Dim r As Integer = 1
            Do
                Dim dr As DataRow = dt.Rows(r - 1)
                Do While dt.Rows(r).Item(columnIndex).ToString = dr.Item(columnIndex).ToString
                    dt.Rows.RemoveAt(r)
                    If r = dt.Rows.Count Then Exit Do
                Loop
                r += 1
            Loop Until r >= dt.Rows.Count
    Io ho dato un occhiata a quella discussione ma non ci ho capito molto. Visto che credo sia l'unica soluzione, non è che qualcuno può darci un occhiata? Le mie conoscenze sono molto basiche e ho difficoltà. Vi riporto sotto il sito.

    http://www.vbforums.com/showthread.p...ove-Duplicates

    Grazie ancora a tutti...
    Ultima modifica di scolaretto; 05-10-2013 a 21:49

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.