Allora ragazzi
siete la mia ultima spiaggia
ho testato e ritestato questa sub ma non riesco a capire
se la eseguo passo passo va tutto bene ma se lancio l'esecuzione finisce in un ramo in un momento sbagliato: mi spiego meglio
devo inserire o aggiornare delle righe in una tabella quindi prima faccio un controllo di esistenza della chiave di quella tabella;
se la chiave esiste allora faccio l'aggiornamento altrimenti faccio l'inserimento.
quello che succede è che questo controllo di esistenza funziona con il debug, ma non senza(infatti va in chiave duplicata)
ho pensato che potrebbe essere un problema di commit, però access non gestisce questa istruzione; allora ho provato con begintrans e committrans ma niente.
posto il codice (scusate se è un pò lungo
codice:
Public Sub calcola_classifica()

Dim db As Database
Dim rsESISTENZA As New ADODB.Recordset
Dim rsCALENDARIO As New ADODB.Recordset
Dim rsCLASSIFICA As New ADODB.Recordset

Dim esiste As Boolean
Dim goal_casa, goal_fuori As Integer
Dim id_squadra As Integer
Dim giocate_casa As Integer
Dim punti_casa As Integer
Dim vinte_casa As Integer
Dim perse_casa As Integer
Dim X_casa As Integer
Dim giocate_fuori As Integer
Dim punti_fuori As Integer
Dim vinte_fuori As Integer
Dim perse_fuori As Integer
Dim X_fuori As Integer
Dim g_fatti_casa As Integer
Dim g_subiti_casa As Integer
Dim g_fatti_fuori As Integer
Dim g_subiti_fuori As Integer
Dim diff_reti As Integer

id_campionato = 1
Conn_Calcetto.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
                                  App.Path & "\campionato.mdb;"
Conn_Calcetto.CursorLocation = adUseClient
Conn_Calcetto.Open

Set db = OpenDatabase(App.Path & "\campionato.mdb")
db.Execute "delete from classifica_app", dbFailOnError
db.Close

rsCALENDARIO.Open "SELECT * FROM CALENDARIO ORDER BY " & _
    "1, 2, 3", Conn_Calcetto, 1, 3

rsCALENDARIO.MoveFirst
Do Until rsCALENDARIO.EOF
    goal_casa = goal_fatti(rsCALENDARIO("id_giornata"), rsCALENDARIO("id_squadra_casa"))
    goal_fuori = goal_fatti(rsCALENDARIO("id_giornata"), rsCALENDARIO("id_squadra_fuori"))
    GoSub carica_record_casa
    GoSub controlla_esistenza
    If esiste Then
        GoSub update_classifica
    Else
        GoSub insert_classifica
    End If
    GoSub carica_record_fuori
    GoSub controlla_esistenza
    If esiste Then
        GoSub update_classifica
    Else
        GoSub insert_classifica
    End If
    rsCALENDARIO.MoveNext
Loop
rsCLASSIFICA.Open "SELECT * FROM CLASSIFICA_APP ORDER BY " & _
    "1", Conn_Calcetto, 1, 3
Set F_classifica.DataGrid1.DataSource = rsCLASSIFICA
Exit Sub

insert_classifica:
Set db = OpenDatabase(App.Path & "\campionato.mdb")
db.Execute "INSERT INTO CLASSIFICA_APP " & _
           "VALUES( " & _
           id_squadra & ", " & _
           giocate_casa & ", " & _
           giocate_fuori & ", " & _
           punti_casa & ", " & _
           punti_fuori & ", " & _
           vinte_casa & ", " & _
           perse_casa & ", " & _
           X_casa & ", " & _
           vinte_fuori & ", " & _
           perse_fuori & ", " & _
           X_fuori & ", " & _
           g_fatti_casa & ", " & _
           g_subiti_casa & ", " & _
           g_fatti_fuori & ", " & _
           g_subiti_fuori & ", " & _
           diff_reti & ")", dbFailOnError
db.Close
Return

update_classifica:
Set db = OpenDatabase(App.Path & "\campionato.mdb")
db.Execute "update CLASSIFICA_APP SET " & _
           "GIOCATE_CASA = GIOCATE_CASA + " & giocate_casa & _
           ", GIOCATE_FUORI = GIOCATE_FUORI + " & giocate_fuori & _
           ", PUNTI_CASA = PUNTI_CASA + " & punti_casa & _
           ", PUNTI_FUORI = PUNTI_FUORI + " & punti_fuori & _
           ", VINTE_CASA = VINTE_CASA + " & vinte_casa & _
           ", PERSE_CASA = perse_casa + " & perse_casa & _
           ", X_CASA = X_CASA + " & X_casa & _
           ", VINTE_FUORI = VINTE_FUORI + " & vinte_fuori & _
           ", PERSE_FUORI = PERSE_FUORI + " & perse_fuori & _
           ", X_FUORI = X_FUORI + " & X_fuori & _
           ", G_FATTI_CASA = G_FATTI_CASA + " & g_fatti_casa & _
           ", G_SUBITI_CASA = G_SUBITI_CASA + " & g_subiti_casa & _
           ", G_FATTI_FUORI = G_FATTI_FUORI + " & g_fatti_fuori & _
           ", G_SUBITI_FUORI = G_SUBITI_FUORI + " & g_subiti_fuori & _
           ", DIFF_RETI = DIFF_RETI + " & diff_reti & _
           " where ID_SQUADRA = " & id_squadra, dbFailOnError
db.Close
Return

controlla_esistenza:
rsESISTENZA.Open "select id_squadra from CLASSIFICA_APP " & _
                 "where id_squadra = " & id_squadra, Conn_Calcetto, 1, 3
If rsESISTENZA.EOF Or rsESISTENZA.BOF Then
    esiste = False
Else
    esiste = True
End If
rsESISTENZA.Close
Return

carica_record_casa:
    'valorizzo record per la squadra in casa
    id_squadra = rsCALENDARIO("id_squadra_casa")
    giocate_casa = 1
    giocate_fuori = 0
    If goal_casa > goal_fuori Then
        punti_casa = 3
        vinte_casa = 1
        perse_casa = 0
        X_casa = 0
    Else
        If goal_casa = goal_fuori Then
            punti_casa = 1
            vinte_casa = 0
            perse_casa = 0
            X_casa = 1
        Else
            punti_casa = 0
            vinte_casa = 0
            perse_casa = 1
            X_casa = 0
        End If
    End If
    punti_fuori = 0
    vinte_fuori = 0
    perse_fuori = 0
    X_fuori = 0
    g_fatti_casa = goal_casa
    g_fatti_fuori = 0
    g_subiti_casa = goal_fuori
    g_subiti_fuori = 0
    diff_reti = g_fatti_casa - g_subiti_casa
Return

carica_record_fuori:
    'valorizzo record per la squadra fuori casa
    id_squadra = rsCALENDARIO("id_squadra_fuori")
    giocate_casa = 0
    giocate_fuori = 1
    If goal_fuori > goal_casa Then
        punti_fuori = 3
        vinte_fuori = 1
        perse_fuori = 0
        X_fuori = 0
    Else
        If goal_fuori = goal_casa Then
            punti_fuori = 1
            vinte_fuori = 0
            perse_fuori = 0
            X_fuori = 1
        Else
            punti_fuori = 0
            vinte_fuori = 0
            perse_fuori = 1
            X_fuori = 0
        End If
    End If
    punti_casa = 0
    vinte_casa = 0
    perse_casa = 0
    X_casa = 0
    g_fatti_fuori = goal_fuori
    g_fatti_casa = 0
    g_subiti_fuori = goal_casa
    g_subiti_casa = 0
    diff_reti = g_fatti_fuori - g_subiti_fuori
Return
End Sub

Public Function goal_fatti(id_giornata, id_squadra)
Dim Conn As New ADODB.Connection
Dim rsGOALFATTI As New ADODB.Recordset
Conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
                                  App.Path & "\campionato.mdb;"
Conn.CursorLocation = adUseClient
Conn.Open
rsGOALFATTI.Open "SELECT SUM(TOTALE_GOAL) AS GOAL FROM MARCATORI " & _
                 "WHERE" & _
                 " ID_SQUADRA = " & id_squadra & _
                 " AND ID_GIORNATA = " & id_giornata & _
                 " AND ID_CAMPIONATO = " & id_campionato _
                 , Conn, 1, 3
goal_fatti = rsGOALFATTI("goal")
rsGOALFATTI.Close
Conn.Close
End Function