Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    74

    vb2010: contare tutti i record di table2 per ogni record di table1

    Salve a tutti.

    Ho due tabelle (abbastanza voluminose). Nella prima non ci sono campi ripetuti, nella seconda, invece si.
    Dovrei "contare" tutti i record (singoli) presenti nella table2 che abbiano il valore del campo "cod2" uguale a quello del corrispondente "cod1" di table1 e che soddisfino una serie di condizioni.

    Quindi per ogni record di table1 con cod1 = x cerco su table2 quelli che hanno table2.cod2 = table1.cod1 e che soddisfino le condizioni di

    campox_2 >= 30000
    campoy_2 >= "01/10/2012"
    campoz_2 <> 30 and campoz_2 <> 90

    Ho provato ad usare la distinct ma non sono riuscito a risolvere il problema.,
    Ho pensato di inserire dei cicli sulle due tabelle ma il processo è lunghissimo (le table contengono 2.000 e 4.000 record in media)

    Grazie
    Dopo anni di programmazione amatoriale in VBA, ho deciso di passare a VB.NET

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    74
    Momentaneamente ho risolto cosi' ...

    codice:
    Private Function calcola_fi(ByVal limite As Integer) As IntegerDim dbConn1 As New OleDbConnection(stringaconn)
            Dim re As Integer
            dbConn1.Open()
            Dim dbAdapter_fi As New OleDbDataAdapter("select * from FI where FIimp >= " & limite, dbConn1)
            Dim dbAdapter_rg As New OleDbDataAdapter("select * from RG", dbConn1)
            Dim dbDataSet_fi As New DataSet
            Dim dbDataSet_rg As New DataSet
            dbAdapter_fi.Fill(dbDataSet_fi)
            dbAdapter_rg.Fill(dbDataSet_rg)
    
    
    
    
            For Each fi_ro As DataRow In dbDataSet_fi.Tables(0).Rows
                
                Dim dbAdapter_tmp As New OleDbDataAdapter("select distinct (RGcod) from RG where RGimp >= " & limite & " and RGcat <> 950 and RGcat <> 399 and RGdatadel >= #" & CDate(datavi.Text) & "# and RGcod = " & fi_ro.Item("FIcod"), dbConn1)
                Dim dbDataSet_tmp As New DataSet
                dbAdapter_tmp.Fill(dbDataSet_tmp)
                If dbDataSet_tmp.Tables(0).Rows.Count > 0 Then
                 
                    re = re + 1
    
    
                End If
                calcola_fi = re
    
    
            Next
    
    
            dbConn1.Close()
    soluzione che funziona ma che molto lenta .....

    Qualcuno sa aiutarmi a velocizzare questa ricerca ?

    Grazie
    Dopo anni di programmazione amatoriale in VBA, ho deciso di passare a VB.NET

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    74
    ... anzi, a dire il vero .... questa condizione

    codice:
    and RGdatadel >= #"&CDate(datavi.Text)&"# 
    non funziona (è come se non ci fosse, praticamente) ...
    Dopo anni di programmazione amatoriale in VBA, ho deciso di passare a VB.NET

  4. #4
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Non si fa così.
    Se tu avessi 2 milioni di righe, leggerle tutte una per volta ti ci vuole una vita.

    In genere si fa una query basata sulle chiavi primarie, (che essendo indicizzate è la più veloce).
    Non conosco le tue tabelle, ma da quello che mi pare di aver capito potresti (ma controlla) fare più o meno così:

    codice:
    SELECT T1.cod1, Count(T1.cod1) AS Qta 
    FROM Tabella1 As T1 INNER JOIN Tabella2 As T2 ON T1.cod1= T2.cod2
    WHERE <tue condizioni>
    GROUP BY T1.cod1

    otterrai 2 colonne: nella prima avrai l'elenco dei Cod1 presenti, nella seconda la Qta rispettiva.

    S.E. & O.


  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    74
    Intanto grazie per la risposta. (immaginavo, ovviamente che la mia soluzione non potesse essere quella giusta ....).
    Ho dimenticato di dire che questo lavoro lo faccio su tabelle di un database access.

    Ora ho provato la tua soluzione e la mia stringa è diventata:

    codice:
    sql = "SELECT RGcod, Count(RGcod) AS Qta FROM RG As T1 INNER JOIN FI As FIcod ON RGcod= FIcod where RGimp >= " & limite & " and RGcat <> 550 and RGcat <> 399 and RGdatadel >= #" & datavi.Text & "# GROUP BY RGcod"
    
    Dim dbAdapter_tmp As New OleDbDataAdapter(sql, dbConn1)
                Dim dbDataSet_tmp As New DataSet
                dbAdapter_tmp.Fill(dbDataSet_tmp)
    ma su questa istruzione:

    dbAdapter_tmp.Fill(dbDataSet_tmp)

    ottengo errore

    "istruzione join non supportata".

    Non saprei proprio ....

    P.S.
    potresti dirmi se la condizione inserita sulla data è inserita correttamente ? Penso di no, perche' impostata "datavi" , ad esempio a "01/01/2014" mi estraeva anche record con data 01/11/2013 ....

    Grazie
    Dopo anni di programmazione amatoriale in VBA, ho deciso di passare a VB.NET

  6. #6
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Prima di tutto devi indicare i campi includendo il nome delle tabelle (o alias che usi), ovvero non RGcod, ma T1.RGcod, e così via...
    Seconda cosa, con Access in un enunciato SQL devi sempre formattare le date nel formato americano: MM/DD/YYYY.

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    74
    Ok.
    Mi scuso anticipatamente per le continue domande, ma per me è una materia nuova e quindi mi trovo in difficolta'.

    Ho modificato in questo modo:

    codice:
     Dim td As Date = CDate(datavi.Text)
                td = Format(td, "dd/MM/yyyy")
                sql = "SELECT RG.RGcdg, Count(RG.RGcdg) AS Qta FROM RG As T1 INNER JOIN FI As t2 ON RG.RGcdg = FI.FIcdg where RG.RGimp >= " & limite & " and RG.RGcat <> 550 and RG.RGcat <> 399 and RG.RGdatad >= " & td & " GROUP BY RG.RGcdg"
    ma continuo ad ottenere "Errore di sintassi nell'espressione JOIN"


    Non è che per caso occorre che le tabelle siano indicizzate sul capo di join ?
    Le mie, essendo temporanee (le cancello e le ricarico ad ogni elaborazione) non hanno campi chiave...

    Grazie
    Ultima modifica di karug64; 25-05-2014 a 13:22
    Dopo anni di programmazione amatoriale in VBA, ho deciso di passare a VB.NET

  8. #8
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Quote Originariamente inviata da karug64 Visualizza il messaggio
    Ok.
    Mi scuso anticipatamente per le continue domande, ma per me è una materia nuova e quindi mi trovo in difficolta'.
    I tuoi errori sono grossolani ed indicano una scarsa conoscenza delle basi del linguaggio SQL.
    Te lo dico non per polemica o per accusarti, ma solo per farti prendere atto che prima di 'scrivere' bisogna 'studiare'.

    Quote Originariamente inviata da karug64 Visualizza il messaggio
    Ho modificato in questo modo:
    codice:
     Dim td As Date = CDate(datavi.Text)
                td = Format(td, "dd/MM/yyyy")
                sql = "SELECT RG.RGcdg, Count(RG.RGcdg) AS Qta FROM RG As T1 INNER JOIN FI As t2 ON RG.RGcdg = FI.FIcdg where RG.RGimp >= " & limite & " and RG.RGcat <> 550 and RG.RGcat <> 399 and RG.RGdatad >= " & td & " GROUP BY RG.RGcdg"
    ma continuo ad ottenere "Errore di sintassi nell'espressione JOIN"
    Ovviamente, dato che stai usando gli alias nelle tabelle ma non nei nomi dei campi.

    Comunque, facciamo così: dalla tua query togli As T1 e As t2 e dovrebbe funzionare (vedi sotto).

    Un suggerimento: abituati a non scrivere l'enunciato SQL in una sola riga, ma suddividerlo su più righe, così:
    codice:
    sql = "SELECT RG.RGcdg, Count(RG.RGcdg) AS Qta "
    sql = sql + " FROM RG INNER JOIN FI ON RG.RGcdg = FI.FIcdg "
    sql = sql + " WHERE RG.RGimp >= " + limite 
    sql = sql + "     AND RG.RGcat <> 550 "
    sql = sql + "     AND RG.RGcat <> 399 "
    sql = sql + "     AND RG.RGdatad >= " + td 
    sql = sql + " GROUP BY RG.RGcdg "

    Nota gli spazi aggiunti volutamente all'inizio ed alla fine di ogni riga.

    Ne guadagnerai in leggibilità e di conseguenza in manutenzione.


    Per finire, le interrogazioni ad una base dati si effettuano usando Command + Parametri che risolvono e prevengono un sacco di problemi (vedi esempi nella mia firma sia per NET che per VB6.0).
    Ad esempio, se tu avessi usato un Command, il problema della formattazione della data non l'avresti avuto.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    74
    Ok. Grazie infinite.
    (Ho provveduto a registrarmi sul sito in firma ed a scaricare il progetto che studiero' con attenzione).

    L'ultimo problema è dato dalla condizione sulla data....

    ho fatto cosi':

    codice:
    Dim td As String
            td = datavi.Text.Substring(3, 2) + "/" + Microsoft.VisualBasic.Left(datavi.Text, 2) + "/" + Microsoft.VisualBasic.Right(datavi.Text, 4)
    ed ho ottenuto la data invertita che ho inserito nella sql cosi'

    codice:
    sql = sql + "     AND RG.RGdatad >= #" & td & "#"
    ma mi estrae record che non soddisfano la condizione:
    per esempio

    RG.RGdatad = #7/29/2011# (ossia 29/07/2011)
    td = #10/1/2011# (ossia 01/10/2011)

    questa riga non dovrebbe essere estratta, ma viene estratta ugualmente ....

    Grazie.



    P.S. chiedo al moderatore se si puo' modificare il testo della discussione dall'attuale a
    vb2010: contare i record di table2 su table1 e condizione su data


    Grazie
    Dopo anni di programmazione amatoriale in VBA, ho deciso di passare a VB.NET

  10. #10
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Invece è corretto, dato che tu hai messo la condizione

    >=

    e il 01/10/2011 è maggiore del 29/07/2011

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.