Newsgroup: it.comp.appl.access
Titolo: Questo non me lo spiego ma mi serve un aiuto

Ciao a tutti,
ho il seguente problema e sto impazzendo.
Apro un recordset e aggiorno i valori in esso contenuti.
Capita questo:
- se calcolo un recordset di 700 righe, vengono commessi errori di calcolo
in alcuni campi (costi e ricavi in cui uso una formula per calcolarli)
- se calcolo solo una parte dei valori (200) non vengono commessi errori di
calcolo.
Non mi spiego questo strano comportamento e voi?
Spero che qualcuno possa darmi una mano.
Sono disposto anche a postare il codice per vedere se c'è un errore. Però
non mi spiego come mai in un caso funziona e nell'altro no.
Ciao e grazie
*--- Frank ---*

"*--- Frank ---*" <fdil...@NO-SPAMTiscalinet.it> ha scritto nel messaggio
news:98o89p$3l3g$1...@stargate1.inet.it...

La logica vorrebbe che il tutto non dipenda dalla quantità di record ma
dalla casistica con cui sono contenuti nel recordset (magari il 500esimo
record fuori ordine), forse se posti il codice VBA è meglio.
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 Mah! Usi DAO o ADO? Cmq è lo stesso; verifica:
che tutti i campi dei rcd che devi calcolare contengano valori validi, se
tutto è a posto, potrebbe essere un problema di "cursori" per scorrerre il
recordset; vedi sulla guida in linea perchè hanno nomi differenti a seconda
che usi DAO o ADO oppure... invia la routine che vediamo!

 record fuori ordine), forse se posti il codice VBA è meglio.
Ok, posto il codice con i commenti
Non lo metto tutto perchè è molto ripetitivo e lungo. Ho lasciato cmq le
parti essenziali.
Se avete qualche suggerimento sul codice, ben venga.
In sintesi la funzione apre il recordset della tabella commesse e aggiorna
tutti i valori per calcolare il costo e i ricavi della commessa stessa. I
valori li recupera nelle varie tabelle del gestionale in cui ci sono
praticamente tutti i documenti del ciclo attivo e passivo aziendale.
Non so però se vi potrà servire senza poterlo provare.
Grazie
Franco
Function AggiornaC(TipoAggiornamento As Integer, DataFine, TipoComm As
String)
'----------------------------------------------------------------------
' Aggiorna tutte le commesse - Valida per il calcolo del bilancio e del
controllo di gestione
'----------------------------------------------------------------------
    Dim ErrModCorrente As String
    Dim ErrFunCorrente As String
    Dim ErrLineaCorrente As Integer
    ErrModCorrente = Application.CurrentObjectName
    ErrFunCorrente = "AggiornaCommesse"
    On Error GoTo AggiornaCommesse_Err
    Dim DDTBase, DDCBase, DDTCostiBase, DDTBasePrev
    Dim DDTAgg, DDCAgg, DDTCostiAgg, DDTAggPrev
    Dim DDTC, DDCC, DDCRientri, DDTCostiC, DDTCPrev
    Dim OrdiniClienteBase, FattureClienteBase
    Dim OrdiniClienteAgg, FattureClienteAgg
    Dim OrdiniFornitoreBase, FattureFornitoreBase
    Dim OrdiniFornitoreAgg, FattureFornitoreAgg, FattureFornitoreC
    Dim OrdiniFornitoreC
    Dim FattureCliente, FattureFornitore
    Dim CostiCommBase
    Dim CostiCommAgg
    Dim CostiPersonaleInt, OrePersonaleInt, SpesePersonaleInt
    Dim RicaviMOL, CostiMOL
    Dim RicaviMON, CostiMON
    Dim MOL, MON
    Dim Avanzamento As Byte
    Dim Messaggio As String
    Dim Risposta
    Dim Titolo As String
    Dim NumRecord As Long
    Dim varRestituisce As Variant, Lngx As Long
    Dim DataAgg
    Dim SQL As String
    '--- Richiesta operazione
    Messaggio = "Avviare operazione di aggiornamento Commesse?"
    Risposta = MsgBox(Messaggio, 36, TitoloMsgBox)
    If Risposta = 7 Then
        Messaggio = "Operazione interrotta dall'utente"
        MsgBox Messaggio, , TitoloMsgBox
        Exit Function
    End If
    '--- avvio operazione
    DoCmd.Hourglass True
    Messaggio = "Ricerca Commesse da aggiornare in corso..."
    DoCmd.Echo False, Messaggio
    DoCmd.Echo True
    'Data Aggiornamento Commesse
    DataAgg = DataFine
    'Imposta data di aggiornamento delle commesse
    DataAgg = Data_SQLG(DataAgg)    'Trasforma la data in formato SQL
            ' Crea una stringa SQL in base alla tabella Commessa dove la
data
            '   di Chiusura Amm. è > della data di aggiornamento o è NULLA
            '   e in base al tipo di commessa selezionato
            SQL = " SELECT NetEngCommesse.*"
            SQL = SQL & " FROM NetEngCommesse"
            SQL = SQL & " WHERE (((Data_Chiusura_Amm) >= " & (DataAgg) & "
Or (Data_Chiusura_Amm) Is Null)"
            SQL = SQL & " AND ((CodiceContatore) like " & CChr(TipoComm) &
")"
            SQL = SQL & " AND ((NetEngCommesse.Data_Apertura) <= " &
(DataAgg) & "));"
    'INIZIO AGGIORNAMENTO VALORI COMMESSE
    Dim dbs As DATABASE, rst As Recordset
    ' Restituisce il riferimento al database corrente.
    Set dbs = CurrentDb
    ' Crea un oggetto Recordset di tipo dynaset in base alla stringa SQL
    Set rst = dbs.OpenRecordset(SQL, dbOpenDynaset)
    ' Ottiene il conteggio dei record.
    If rst.EOF Then GoTo FineOperazione
    rst.MoveLast
    rst.MoveFirst
    NumRecord = rst.RecordCount
    If NumRecord Then
        'Vai al primo record
        rst.MoveFirst
        ' Scorre il recordset
        Do Until rst.NoMatch
            If rst.EOF Then
                GoTo AggiornaCommesse_Fine
            Else
                ' Visualizza il messaggio nella barra di stato.
                For Lngx = 1 To NumRecord
                    CommessaInUSo = rst.LottoComm
                    'Messaggio Barra di stato
                    Messaggio = "Aggiornamento Commesse alla data " &
DataAgg & " in corso, " & "Commessa: " & rst.LottoComm & "  (" & Lngx & " di
" & NumRecord & ")..."
                    varRestituisce = SysCmd(acSysCmdSetStatus, Messaggio)
                    '*** INIZIO Calcolo Totali COMMESSE
                    'QUI INIZIA IL CALCOLO DEI VALORI - METTO SOLO I PRIMI -
                    rst.Edit
                    '--- sezione magazzino DDT
                    If (rst.CodiceContatore = "OVVI") Then
                        DDTBase = DSum("Totale", "Testate_Bolle_Attive",
"LottoComm=" & CChr(CommessaInUSo) & " AND CodiceContatore='DTVI' AND
Data_Reg <=" & DataAgg)
                        If IsNull(DDTBase) Then DDTBase = 0
                        rst.DDTMagazzinoBase = DDTBase
                    Else
                        DDTBase = DSum("Totale", "Testate_Bolle_Attive",
"LottoComm=" & CChr(CommessaInUSo) & " AND CodiceContatore='DTBA' AND
Data_Reg <=" & DataAgg)
                        If IsNull(DDTBase) Then DDTBase = 0
                        rst.DDTMagazzinoBase = DDTBase
                    End If
                    '--- sezione magazzino COSTI DDT
                    If rst.DDTMagazzinoBase <> 0 Then
                        If (rst.CodiceContatore = "OVVI") Then
                            DDTCostiBase = CostiMagazzino(CommessaInUSo,
"DTVI", DataAgg)
                        Else
                            DDTCostiBase = CostiMagazzino(CommessaInUSo,
"DTBA", DataAgg)
                        End If
                        If IsNull(DDTCostiBase) Then DDTCostiBase = 0
                    Else
                        DDTCostiBase = 0
                    End If
                    rst.DDTCostiBase = DDTCostiBase
                    '    E COSI' VIA PER TUTTI I VALORI
                    '*** QUESTA E' LA PARTE INCRIMINATA
                    '--- CALCOLO RICAVI E COSTI
                    'Ricavi = FattureClienteBase + FattureClienteAgg
                    'Costi = FattureFornitoreBase + FattureFornitoreAgg +
FattureFornitoreC + DDTCostiBase + DDTCostiAgg + DDTCostiC - DDCBase -
DDCAgg - DDCC - DDCRientri + CostiCommBase + CostiCommAgg +
Forms!Commessa!Rettifica
                            'Calcolo i Costi e Ricavi con il metodo del
Controllo di Gestione
                            '---    MOL
                            RicaviMOL = OrdiniClienteBase + OrdiniClienteAgg
                            CostiMOL = OrdiniFornitoreBase +
OrdiniFornitoreAgg + OrdiniFornitoreC + DDTCostiBase + DDTCostiAgg +
DDTCostiC - DDCBase - DDCAgg - DDCC - DDCRientri + CostiCommBase +
CostiCommAgg + rst.Rettifica
                            '---    MC
                            Avanzamento = rst.Avanzamento
                            Select Case rst.Cd_Stato
                                Case "06", "02"     'DA APRIRE E DA
ASSEGNARE
                                    RicaviMON = 0
                                    CostiMON = 0
                                Case "01", "04"     'ATTIVA E STAND-BY
                                    'Se OFAT o OFCE (Assistenza) i Costi e i
Ricavi sono calcolati diversamente
                                    If (rst.CodiceContatore = "OFAT" Or
rst.CodiceContatore = "OFCE") Then
                                        'RICAVI = Ordini Vendita x SAL
                                        RicaviMON = (OrdiniClienteBase +
OrdiniClienteAgg) * (Avanzamento / 100)
                                        'COSTI = (Costi Comm) x SAL + Ordini
F. - Materiali Ordinati +  Costo Mat. Cons. + Mdo
                                        CostiMON = (CostiCommBase +
CostiCommAgg) * (Avanzamento / 100) + (OrdiniFornitoreBase +
OrdiniFornitoreAgg + OrdiniFornitoreC - DDCBase - DDCAgg - DDCC) +
(DDTCostiBase + DDTCostiAgg + DDTCostiC - DDCRientri) + (rst.Rettifica) +
CostiPersonaleInt
                                    'Tutte le altre Commesse
                                    Else
                                        'RICAVI = Costo Mat. + (Ordini
Vendita - Costo Mat.) x SAL
                                        RicaviMON = (DDTCostiBase +
DDTCostiAgg + DDTCostiC - DDCRientri) + ((OrdiniClienteBase +
OrdiniClienteAgg) - (DDTCostiBase + DDTCostiAgg + DDTCostiC - DDCRientri)) *
(Avanzamento / 100)
                                        'COSTI = (Ordini F. - Materiali
Ordinati + Costi Comm) x SAL + Costo Mat. Cons. + Mdo
                                        CostiMON = ((OrdiniFornitoreBase +
OrdiniFornitoreAgg + OrdiniFornitoreC - DDCBase - DDCAgg - DDCC) +
(CostiCommBase + CostiCommAgg) + (rst.Rettifica)) * (Avanzamento / 100) +
(DDTCostiBase + DDTCostiAgg + DDTCostiC - DDCRientri) + CostiPersonaleInt
                                    End If
                                Case "03"           'FATTURARE
                                    'RICAVI = Ordini Vendita
                                    RicaviMON = (OrdiniClienteBase +
OrdiniClienteAgg)
                                    'COSTI = Materiale + Ordini F. + Costi
Comm. + Mdo
                                    CostiMON = (DDTCostiBase + DDTCostiAgg +
DDTCostiC - DDCRientri) + (OrdiniFornitoreBase + OrdiniFornitoreAgg +
OrdiniFornitoreC - DDCBase - DDCAgg - DDCC) + (CostiCommBase + CostiCommAgg)
+ (rst.Rettifica) + CostiPersonaleInt
                                Case "05"           'CHIUSA
                                    'RICAVI = Fatture
                                    RicaviMON = FattureClienteBase +
FattureClienteAgg
                                    'COSTI = Materiale + Ordini F. + Costi
Comm. + Mdo
                                    CostiMON = (DDTCostiBase + DDTCostiAgg +
DDTCostiC - DDCRientri) + (OrdiniFornitoreBase + OrdiniFornitoreAgg +
OrdiniFornitoreC - DDCBase - DDCAgg - DDCC) + (CostiCommBase + CostiCommAgg)
+ (rst.Rettifica) + CostiPersonaleInt
                                Case "07", "08"     'CHIUSA AMMINISTRATIVA E
VI
                                    'RICAVI = Fatture
                                    RicaviMON = FattureClienteBase +
FattureClienteAgg
                                    'COSTI = Materiale + Fatture + Costi
Comm. + Mdo
                                    CostiMON = (DDTCostiBase + DDTCostiAgg +
DDTCostiC - DDCRientri) + (FattureFornitoreBase + FattureFornitoreAgg +
FattureFornitoreC - DDCBase - DDCAgg - DDCC) + (CostiCommBase +
CostiCommAgg) + (rst.Rettifica) + CostiPersonaleInt
                            End Select
                            'Se non ci sono Ordini di Vendita (CN) e quindi
i ricavi sono = 0, metto che i ricavi sono = ai costi
                            If (RicaviMOL = 0) Then
                                RicaviMON = CostiMON
                            End If
                            rst.Ricavi = RicaviMON
                            rst.Costi = CostiMON
                            '--- MOL (LORDO)
                            If RicaviMOL <> 0 Then
                                mol = (RicaviMOL - CostiMOL) / RicaviMOL *
100
                            Else
                                mol = 0
                            End If
                            rst.mol = mol
                            '--- MON (NETTO)
                            If RicaviMON <> 0 Then
                                MON = (RicaviMON - CostiMON) / RicaviMON *
100
                            Else
                                MON = 0
                            End If
                            rst.MON = MON
                            If (rst.LottoComm = "101/01/2001") Then
                                Debug.Print rst.LottoComm
                                Debug.Print rst.Costi
                                Debug.Print rst.Ricavi
                            End If
                            'FINE Calcolo TOTALI Commesse
                            rst.Update
                            'INSERISCO NELLA TABELLA
zo_ValorizzazioneCommessa i Valori presi da NetEngCommesse
                            SQL = "INSERT INTO zo_ValorizzazioneCommesse"
                            SQL = SQL + " ( LottoComm, CodiceContatore,
Data_Agg,"
                            SQL = SQL + " Cd_Clien, Cd_Agent, Cd_Comme,
Cd_Stato, Avanzamento,"
                            SQL = SQL + " Data_Apertura, Data_Inizio,
Data_Fine,"
                            SQL = SQL + " OrdiniCliente, FattureCliente,"
                            SQL = SQL + " OrdiniFornitore,
FattureFornitore,"
                            SQL = SQL + " Rettifica, DDTCosti,"
                            SQL = SQL + " CostiCommerciali, MdoInterna,
MdoServizi,"
                            SQL = SQL + " SALServizi, SALCostiComm,"
                            SQL = SQL + " Costi, Ricavi, MCP, MCC )"
                            SQL = SQL + " SELECT LottoComm, CodiceContatore,
" & DataAgg & " AS Data_Agg,"
                            SQL = SQL + " NetEngCommesse.Cd_Clien,
NetEngCommesse.Cd_Agent,"
                            SQL = SQL + " NetEngCommesse.Cd_Comme,
NetEngCommesse.Cd_Stato,"
                            SQL = SQL + " NetEngCommesse.Avanzamento,
NetEngCommesse.Data_Apertura,"
                            SQL = SQL + " NetEngCommesse.Data_Inizio,
NetEngCommesse.Data_Fine, "
                            SQL = SQL + "
[OrdiniClienteBase]+[OrdiniClienteAgg] AS OrdiniCliente,"
                            SQL = SQL + "
[FattureClienteBase]+[FattureClienteAgg] AS FattureCliente,"
                            SQL = SQL + "
[OrdiniFornitoreBase]+[OrdiniFornitoreAgg]+[OrdiniFornitoreC] AS
OrdiniFornitore,"
                            SQL = SQL + "
[FattureFornitoreBase]+[FattureFornitoreAgg]+[FattureFornitoreC] AS
FattureFornitore,"
                            SQL = SQL + " NetEngCommesse.Rettifica,"
                            SQL = SQL + "
[DDTCostiBase]+[DDTCostiAgg]+[DDTCostiC]-[DCMagazzinoRientri] AS DDTCosti,"
                            SQL = SQL + "
[CostiCommOrdiniBase]+[CostiCommOrdiniAgg] AS CostiCommerciali, "
                            SQL = SQL + "
[CostiOrePersonale]+[SpesePersonale] AS MdoInterna,"
                            If (rst.Cd_Stato = "08") Then
                                SQL = SQL + "
[FattureFornitoreBase]+[FattureFornitoreAgg]+[FattureFornitoreC]-[DCMagazzin
oBase]-[DCMagazzinoAgg]-[DCMagazzinoC] AS MdoServizi,"
                                SQL = SQL + "
([FattureFornitoreBase]+[FattureFornitoreAgg]+[FattureFornitoreC]-[DCMagazzi
noBase]-[DCMagazzinoAgg]-[DCMagazzinoC]) * (Avanzamento / 100) AS
SALServizi,"
                            Else
                                SQL = SQL + "
[OrdiniFornitoreBase]+[OrdiniFornitoreAgg]+[OrdiniFornitoreC]-[DCMagazzinoBa
se]-[DCMagazzinoAgg]-[DCMagazzinoC] AS MdoServizi,"
                                SQL = SQL + "
([OrdiniFornitoreBase]+[OrdiniFornitoreAgg]+[OrdiniFornitoreC]-[DCMagazzinoB
ase]-[DCMagazzinoAgg]-[DCMagazzinoC]) * (Avanzamento / 100) AS SALServizi,"
                            End If
                            SQL = SQL + "
([CostiCommOrdiniBase]+[CostiCommOrdiniAgg]) * (Avanzamento / 100) AS
SALCostiComm, "
                            SQL = SQL + " NetEngCommesse.Costi,
NetEngCommesse.Ricavi,"
                            SQL = SQL + " NetEngCommesse.MOL,
NetEngCommesse.MON"
                            SQL = SQL + " FROM NetEngCommesse"
                            SQL = SQL + " WHERE LottoComm = " &
CChr(rst.LottoComm)
                            db.Execute SQL
                    'PASSA AL RECORD SUCCESSIVO
                    rst.MoveNext
                Next Lngx
                varRestituisce = SysCmd(acSysCmdClearStatus)
            End If
        Loop
    End If
'--- FINE operazione
FineOperazione:
    rst.Close
    Set dbs = Nothing
    DoCmd.Hourglass False
    DoCmd.Echo True, "Fine operazione"
    MsgBox "Nessuna commessa da aggiornare trovata con i criteri impostati"
    Exit Function
AggiornaCommesse_Fine:
    rst.Close
    Set dbs = Nothing
    DoCmd.Hourglass False
    DoCmd.Echo True
    MsgBox "Operazione Terminata con Successo.", 64, TitoloMsgBox
    Exit Function
AggiornaCommesse_Err:
    MsgBox ComponiMsgErr(Err, Error, ErrModCorrente, ErrFunCorrente,
ErrLineaCorrente), 16, TitoloMsgBox
    Resume AggiornaCommesse_Fine
End Function


Ho trovato il problema. Errore di codice come sempre.
Grazie cmq
Ciao
*--- Frank ---*


Sono contento per te, ma visto la complessità del codice VBA, sono contento
anche per me. ;-)
