Newsgroup: it.comp.appl.access
Titolo: function troppo lenta

ciao a tutti
 
e' possibile migliorare questa function?
 
grazie per l'aiuto
 
Function Transpose()
' abilita la riga se devi pulire la tabella di destinazione
  CurrentDb.Execute "DELETE * FROM TbNumDocFornitoriOriz"
 
  Dim RS1_1 As Recordset, RS1_2 As Recordset, RS2 As Recordset
  Dim SQL As String, SourceTable As String, TargetTable As String
  Dim nFatt As String, nNCred As String
  Dim DataFatt As Variant, DataNCred As Variant
 
  '-- Definizioni --
  SourceTable = "TbNumDocFornitori"
  TargetTable = "TbNumDocFornitoriOriz"
  '------------------
 
  SQL = "SELECT " & SourceTable & ".IdFatturaFo FROM " & SourceTable
  SQL = SQL & " GROUP BY " & SourceTable & ".IdFatturaFo;"
 
  Set RS1_1 = CurrentDb.OpenRecordset(SQL, dbOpenDynaset)
  Set RS1_2 = CurrentDb.OpenRecordset(SourceTable, dbOpenDynaset)
  Set RS2 = CurrentDb.OpenRecordset(TargetTable, dbOpenDynaset)
 
  Do Until RS1_1.EOF
    Do Until RS1_2.EOF
      If RS1_1!IdFatturaFo = RS1_2!IdFatturaFo Then
        If RS1_2!IdTipoDocumento <> 2 Then
          nFatt = nFatt & RS1_2!NumeroDocFo & "-"   'IdTipoDocumento 1-3
          DataFatt = RS1_2!DataDocFo
        Else
          nNCred = nNCred & RS1_2!NumeroDocFo & "-" 'IdTipoDocumento 2
          DataNCred = RS1_2!DataDocFo
 
        End If
 
      End If
      RS1_2.MoveNext
 
    Loop
    If Right(nFatt, 1) = "-" Then nFatt = Left(nFatt, Len(nFatt) - 1)
    If Right(nNCred, 1) = "-" Then nNCred = Left(nNCred, Len(nNCred) - 1)
    RS2.AddNew
    RS2!IdFatturaFo = RS1_1!IdFatturaFo
    RS2!nFattFo = nFatt
    RS2!nNCredFo = nNCred
    RS2!DataFattFo = DataFatt
    RS2!DataNCredFo = DataNCred
    RS2.Update
    nFatt = ""
    nNCred = ""
    DataFatt = Null
    DataNCred = Null
    RS1_2.MoveFirst
    RS1_1.MoveNext
 
  Loop
 
  RS1_1.Close: Set RS1_1 = Nothing
  RS1_2.Close: Set RS1_2 = Nothing
  RS2.Close: Set RS2 = Nothing
 
End Function


per ora ho sostituito: CurrentDb con
Dim dbCur As DAO.Database
Set dbCur=CurrentDb
 
.....
 
Set dbCur= Nothing

TUTTI i recordset sono Dynaset...?
Mi pare RS1_1 e RS1_2 possano essere ReadOnly.
Poi RS1_2 mi pare venga violato inutilmente... prova ad aprirlo direttamente con condizione WHERE IDFatturato=RS1_1!IdFatturato
 
@Alex


ciao Alex e grazie
tutti i recordset sono Dynaset...? 
solo la TbNumDocFornitoriOriz (tabella che riceve i dati modificati) non è relazionata con nessun'altra tb

Quindi...?
Ti è chiara la definizione di Dynaset, quando serve, quando non serve e quando non si deve usare...?
La solita guida spiega le differenze e puoi agire di conseguenza...
 
@Alex


permette di modificare i campi e di eliminarli catena.
 
Quindi sulla tb origine dati va Snapshot o Dynaset (aggiornamenti non coerenti)?

Tu che dici....?
Dopo aver letto saprai prendere una decisione tecnica...!
Fatti la domanda e datti la risposta...
Devi leggere o anche modificare...?
 
 
In ogni caso il secondo suggerimento era quello che dava miglioramenti nelle performances molto rilevanti... Non ne hai parlato... quindi lo hai capito.
 
@Alex


intendevi in questo modo, vero?
 
Function Transpose()
 
' da richiamare con: Transpose
 
  Dim dbCur As DAO.Database
  Dim RS1_1 As Recordset, RS1_2 As Recordset, RS2 As Recordset
  Dim SQL As String
  Dim nFatt As String, nNCred As String
  Dim DataFatt As Variant, DataNCred As Variant
 
  Set dbCur = CurrentDb
 
  ' abilita la riga se devi pulire la tabella di destinazione
  dbCur.Execute "DELETE * FROM TbNumDocFornitoriOriz;"
 
  SQL = "SELECT IdFatturaFo FROM TbNumDocFornitori"
  SQL = SQL & " GROUP BY IdFatturaFo;"
 
  Set RS1_1 = dbCur.OpenRecordset(SQL, dbOpenSnapshot)
  Set RS1_2 = DBEngine(0)(0).OpenRecordset( _
    "SELECT IdFatturaFo, IdTipoDocumento, NumeroDocFo, DataDocFo FROM TbNumDocFornitori WHERE IdFatturaFo = " & RS1_1!IdFatturaFo)
  Set RS2 = dbCur.OpenRecordset("TbNumDocFornitoriOriz", dbOpenDynaset)
 
  Do Until RS1_1.EOF
    Do Until RS1_2.EOF
      If RS1_2!IdTipoDocumento <> 2 Then
        nFatt = nFatt & RS1_2!NumeroDocFo & "-"   'IdTipoDocumento 1-3 "Fatt. n.", "Nota Deb. n."
        DataFatt = RS1_2!DataDocFo
      Else
        nNCred = nNCred & RS1_2!NumeroDocFo & "-" 'IdTipoDocumento 2 "Nota Cred. n."
        DataNCred = RS1_2!DataDocFo
 
      End If
      RS1_2.MoveNext
 
    Loop
    If Right(nFatt, 1) = "-" Then nFatt = Left(nFatt, Len(nFatt) - 1)
    If Right(nNCred, 1) = "-" Then nNCred = Left(nNCred, Len(nNCred) - 1)
    RS2.AddNew
    RS2!IdFatturaFo = RS1_1!IdFatturaFo
    RS2!nFattFo = nFatt
    RS2!nNCredFo = nNCred
    RS2!DataFattFo = DataFatt
    RS2!DataNCredFo = DataNCred
    RS2.Update
    nFatt = ""
    nNCred = ""
    DataFatt = Null
    DataNCred = Null
    RS1_2.MoveFirst
    RS1_1.MoveNext
 
  Loop
 
  RS1_1.Close: Set RS1_1 = Nothing
  RS1_2.Close: Set RS1_2 = Nothing
  RS2.Close: Set RS2 = Nothing
  Set dbCur = Nothing
 
End Function


però cosi mi accoda nella TbNumDocFornitoriOriz
per tutti i record il primo record della TbNumDocFornitori

Ma pensa... se lo metti fuori dal ciclo esterno RS1_1 è ovvio.
 
@Alex

 @Alex
 
grazie Alex, cosi' giusto?
 
Function Transpose()
 
' da richiamare con: Transpose
 
  Dim dbCur As DAO.Database
  Dim RS1_1 As Recordset, RS1_2 As Recordset, RS2 As Recordset
  Dim SQL As String
  Dim nFatt As String, nNCred As String
  Dim DataFatt As Variant, DataNCred As Variant
 
  Set dbCur = CurrentDb
 
  ' abilita la riga se devi pulire la tabella di destinazione
  dbCur.Execute "DELETE * FROM TbNumDocFornitoriOriz;"
 
  SQL = "SELECT IdFatturaFo FROM TbNumDocFornitori"
  SQL = SQL & " GROUP BY IdFatturaFo;"
 
  Set RS1_1 = dbCur.OpenRecordset(SQL, dbOpenSnapshot)
  Set RS2 = dbCur.OpenRecordset("TbNumDocFornitoriOriz", dbOpenDynaset)
 
  Do Until RS1_1.EOF
    Set RS1_2 = DBEngine(0)(0).OpenRecordset( _
    "SELECT IdFatturaFo, IdTipoDocumento, NumeroDocFo, DataDocFo" _
      & " FROM TbNumDocFornitori WHERE IdFatturaFo = " & RS1_1!IdFatturaFo)


L'idea era questa... giusto.
Ora il ciclo Com e va...?
 
@Alex


perfetto 
ancora grazie