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

    DataView e filtro valori unici...

    ciao,

    ho un DataTable chiamato 'Articoli' costituito, fra gli altri dei seguenti campi:

    Codice, Descrizione, Categoria, SottoCategoria, Produttore, Prezzo, UltimoCosto, ecc..

    La visualizzazione che voglio ottenere è la seguente:

    Produttore
    codice, descrizione, ecc.
    codice, descrizione, ecc.

    Produttore
    codice, descrizione, ecc.
    codice, descrizione, ecc.

    Produttore
    codice, descrizione, ecc.
    codice, descrizione, ecc.

    Per ottimizzare le risorse sul database (SqlServer2k) eseguo il metodo (fa parte di un WebService) che mi riempe questo DataTable, all'interno di un DataSet, solo al caricamento della pagina; lo stesso datatable lo uso in una prima istanza per effettuare il binding di un DataRepeater che in ogni suo Item riporta il logo del produttore (l'immagine ovviamente è ricavata, previo controllo della presenza attraverso il filesystem, dal codice del produttore letto dal DataTable in questione) seguito da un DataGrid valorizzato con i dati degli articoli che appartengono a quel produttore. Quest'ultima operazione è eseguita durante il binding, appunto del repeater, e ad ogni istanza il DataView viene nuovamente filtrato per fillare il DataGrid coi soli record che riguardano gli articoli del produttore di turno.

    Naturalmente funziona, e risulta una soluzione poco costosa perché leggo i dati una sola volta (altrimenti, essendo la query una serie di join tra più tabelle, più l'operazione di filtro per categoria, sottocategoria, importo massimo, testo di ricerca ecc sarebbe una soluzione troppo costosa in termini di risorse, essendo eseguita da remoto mediante web service) e non faccio altro che filtrare il DataView ad ogni ciclo. Il problema è che, ovviamente, una volta ordinati i risultati per produttore, nel repeater vengono ripetute n istanze dello stesso datagrid per lo stesso produttore, tante quanti sono gli articoli del produttore.

    In pratica ottengo qualcosa del tipo:


    ASUS
    [lista di articoli]
    ASUS
    [lista di articoli]
    ASUS
    [lista di articoli]
    ABIT
    [lista di articoli]
    ABIT
    [lista di articoli]

    e così via, ottengo tante ripetizioni per ogni produttore quanti sono i suoi articoli.

    Veniamo al dunque

    Naturalmente per evitare questo inconveniente, dovrei dare in pasto al DataRepeater una selezione di dati in cui i valori dei produttori sono unici e non ripetuti tanti quanti sono gli articoli di ogni singolo produttore.
    In pratica, vorrei ottenere lo stesso effetto della clausola SQL Distinct ma utilizzando quell'unico DataTable letto, evitando dunque più letture (=più connessioni).
    E', in qualche modo, possibile filtrare valori unici da un DataTable/DataView?

    Grazie in anticipo

  2. #2

    Re: DataView e filtro valori unici...

    Originariamente inviato da Nospheratu
    ...vorrei ottenere lo stesso effetto della clausola SQL Distinct ma utilizzando quell'unico DataTable letto, evitando dunque più letture (=più connessioni).
    E', in qualche modo, possibile filtrare valori unici da un DataTable/DataView?
    Non c'e' un metodo gia' pronto per ottenere lo stesso risultato di una distinct sql. Puoi pero' creare una tua funzione a cui passare la dataview per poi ottenere lo stesso risultato.
    Saluti a tutti
    Riccardo

  3. #3

    Re: Re: DataView e filtro valori unici...

    Originariamente inviato da riccardone
    Non c'e' un metodo gia' pronto per ottenere lo stesso risultato di una distinct sql. Puoi pero' creare una tua funzione a cui passare la dataview per poi ottenere lo stesso risultato.
    è quello che vorrei evitare, essendo sicuramente una soluzione non altrettanto performante di una nativa

  4. #4
    risolto, sembra abbastanza veloce
    posto le due funzioni, magari potrebbero servire a qualcuno

    codice:
        Function ColumnEqual(ByVal A As Object, ByVal B As Object) As Boolean
            If A Is DBNull.Value And B Is DBNull.Value Then Return True
            If A Is DBNull.Value Or B Is DBNull.Value Then Return False
            Return A = B
        End Function
        <WebMethod()> _
        Public Sub SelectDistinct(ByRef ds As DataSet, ByVal s_TabellaDestinazione As String, ByVal s_TabellaOrigine As String, ByVal s_NomeColonna As String)
            Dim dt As New DataTable(s_TabellaDestinazione) _
                , dt_TabellaOrigine As DataTable = ds.Tables(s_TabellaOrigine) _
                , dr As DataRow, LastValue As Object
            dt.Columns.Add(s_NomeColonna, dt_TabellaOrigine.Columns(s_NomeColonna).DataType)
    
            For Each dr In dt_TabellaOrigine.Select("", s_NomeColonna)
                If LastValue Is Nothing OrElse Not ColumnEqual(LastValue, dr(s_NomeColonna)) Then
                    LastValue = dr(s_NomeColonna)
                    dt.Rows.Add(New Object() {LastValue})
                End If
            Next
            ds.Tables.Add(dt)
        End Sub

  5. #5
    ho fatto una piccola modifica, questa versione importa tutte le colonne nella nuova tabella, non solo quella del filtro distinct

    codice:
        Public Sub SelectDistinct(ByRef ds As DataSet, ByVal s_TabellaDestinazione As String, ByVal s_TabellaOrigine As String, ByVal s_NomeColonna As String)
            Dim dt_Destinazione As New DataTable(s_TabellaDestinazione) _
                , dt_TabellaOrigine As DataTable = ds.Tables(s_TabellaOrigine) _
                , dr As DataRow, LastValue As Object _
                , DataColumn As DataColumn
    
            For Each DataColumn In dt_TabellaOrigine.Columns
                With DataColumn
                    dt_Destinazione.Columns.Add(.ColumnName, .DataType)
                End With
            Next
    
            For Each dr In dt_TabellaOrigine.Select("", s_NomeColonna)
                If LastValue Is Nothing OrElse Not ColumnEqual(LastValue, dr(s_NomeColonna)) Then
                    LastValue = dr(s_NomeColonna)
                    dt_Destinazione.ImportRow(dr)
                End If
            Next
            ds.Tables.Add(dt_Destinazione)
        End Sub

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 © 2026 vBulletin Solutions, Inc. All rights reserved.