Newsgroup: it.comp.appl.access
Titolo: (Lungo) Requery non viene eseguito su una maschera continua

Il problema è di una banalità sconcertante, ma non riesco a trovare una soluzione.
Ho una maschera continua che presenta l'elenco delle fatture emesse.
La maschera è sempre in sola lettura.
L'origine record della maschera è la seguente query:
SELECT [Fatture (testata)].*
FROM [Fatture (testata)]
WHERE (
([N_Fattura]-Val(Left$(Str$([N_Fattura]),5))*10^(len(str$(N_Fattura))-5))=[Forms]![Fatture (riepilogo)]![txtRicercaNum]
Or [Forms]![Fatture (riepilogo)]![txtRicercaNum] Is Null
)
 AND (CD_Cliente=[Forms]![Fatture (riepilogo)]![txtRicercaCli] OR [Forms]![Fatture (riepilogo)]![txtRicercaCli] IS NULL)
 AND Year(DT_Fattura)=nz([Forms]![Fatture (riepilogo)]![txtAnno],year(date()))
ORDER BY [Fatture (testata)].N_Fattura DESC;
Sulla maschera è presente un pulsante per inserire nuove fatture.
Il codice associato all'evento SuClick è il seguente:
Sub cmdInserisce_Click()
On Error GoTo Err_cmdInserisce_Click
Dim stDocName As String, stLinkCriteria As String, rs As Recordset, nID As Long
 
    Set rs = CurrentDb.OpenRecordset("Fatture (testata)")
    With rs
      .AddNew
      ![DT_Fattura] = Date
      .Update
      .Bookmark = .LastModified
      nID = !ID_Fattura
      .Close
    End With
    Set rs = Nothing
 
    stBlocco = Imposta_Blocco("Fatture (testata)", nID, "B")
    If stBlocco = "OK" Then
       Me.Requery
       stDocName = "Fatture"
       stLinkCriteria = "[ID_Fattura]= " & nID
       DoCmd.OpenForm stDocName, , , stLinkCriteria, acEdit, , "INS/"
    Else
       MsgBox "Impossibile procedere: fattura utilizzata da " & stBlocco
    End If
Exit_cmdInserisce_Click:
    Exit Sub
Err_cmdInserisce_Click:
    MsgBox Err.Description, , Me.Caption
    Resume Exit_cmdInserisce_Click
End Sub
La maschera Fatture viene aperta per consentire all'utente di immettere i dati della fattura.
Quando l'utente conferma la fattura, viene eseguito il seguente codice:
Private Sub cmdEsci_Click()
On Error GoTo Err_cmdEsci_Click
Dim lTrans As Boolean
Dim rsDettaglio As Recordset, rsAnalisi As Recordset, rsDetFat As Recordset
 
   If cOpnMod <> "VIS" Then
      If MsgBox("Confermi il salvataggio delle modifiche ?", 36, Me.Caption) = vbYes Then
         If Nz(Me![CD_Cliente], 0) = 0 Then
            MsgBox "Selezionare il cliente", , Me.Caption
            DoCmd.CancelEvent
            Me.cmbCD_Cliente.SetFocus
         Else
            If Nz(Me![DT_Fattura], dLoval) = dLoval Then
               MsgBox "Impostare la data fattura", , Me.Caption
               DoCmd.CancelEvent
               Me.txtDT_Fattura.SetFocus
            Else
               If Nz(Me.chkSW_NotaCredito, False) = False And ArrotondaNumero(Nz(DSum("Importo", "[Fatture (scadenze)]",
"CD_Fattura=" & Me.txtID_Fattura), 0), Par_Ndec_Valuta) <> ArrotondaNumero(Nz(Me.txtTotale, 0), Par_Ndec_Valuta) Then
                  MsgBox "Totale scadenze (" & ArrotondaNumero(Nz(DSum("Importo", "[Fatture (scadenze)]", "CD_Fattura="
& Me.txtID_Fattura), 0), Par_Ndec_Valuta) & ") diverso da totale documento (" & ArrotondaNumero(Nz(Me.txtTotale, 0),
Par_Ndec_Valuta) & ")", vbCritical
                  DoCmd.CancelEvent
               Else
                  lTrans = GesTrans("B", DBEngine.Workspaces(0))
                  Set rsAnalisi = CurrentDb.OpenRecordset("Analisi (testata)")
                  If cOpnMod = "MOD" Then
                     ' Smarca le analisi eventualmente già associate alla fattura
                     Set rsDettaglio = CurrentDb.OpenRecordset("SELECT * FROM [Fatture (dettaglio)-Analisi] WHERE
SW_Fatturare=False AND [Fatture (dettaglio)].CD_Fattura = " & Me.txtID_Fattura)
                     With rsDettaglio
                       If .RecordCount > 0 Then
                          .MoveFirst
                          Do While Not .EOF
                            rsAnalisi.FindFirst "ID_Analisi=" & !ID_Analisi
                            rsAnalisi.Edit
                            rsAnalisi!CD_Fattura = 0
                            rsAnalisi.Update
                            .MoveNext
                          Loop
                       End If
                     End With
                  End If
                  Set rsDettaglio = CurrentDb.OpenRecordset("SELECT * FROM [Fatture (dettaglio)-Analisi] WHERE [Fatture
(dettaglio)].CD_Fattura = " & Me.txtID_Fattura)
                  With rsDettaglio
                    If .RecordCount > 0 Then
                       .MoveFirst
                       Set rsDetFat = CurrentDb.OpenRecordset("Fatture (dettaglio)")
                       Do While Not .EOF
                         If ![SW_Fatturare] = True Then
                            If Nz(![ID_Analisi], 0) > 0 Then
                               rsAnalisi.FindFirst "ID_Analisi=" & !ID_Analisi
                               rsAnalisi.Edit
                               rsAnalisi!CD_Fattura = Me.txtID_Fattura
                               rsAnalisi.Update
                            End If
                         Else
                            ' Elimina le righe non selezionate dall'utente
                            rsDetFat.FindFirst "ID_Record=" & !ID_Dettaglio
                            rsDetFat.Delete
                         End If
                         .MoveNext
                       Loop
                       rsDetFat.Close
                       Set rsDetFat = Nothing
                       If cOpnMod = "INS" Then
                          Me![N_Fattura] = Cerca_Numeratore(Year(Me![DT_Fattura]), "FATTURE", True)
                          MsgBox "Numero assegnato alla fattura: " & Left$(Trim$(Str$([N_Fattura])), 4) & "/" &
Mid$(Trim$(Str$([N_Fattura])), 5), , Me.Caption
                       End If
                    Else
                       MsgBox "Non è stato selezionato alcun certificato da fatturare", vbExclamation, Me.Caption
                       DoCmd.CancelEvent
                       .Close
                       Set rsDettaglio = Nothing
                       Exit Sub
                    End If
                    .Close
                    Set rsDettaglio = Nothing
                  End With
                  lTrans = GesTrans("C", DBEngine.Workspaces(0))
                  rsAnalisi.Close
                  Set rsAnalisi = Nothing
                  If cOpnMod = "MOD" Then
                     Call Undo_Tab_Legate("Fatture (riepilogo)", "E", "CD_Fattura = " & Me![ID_Fattura])
                     Call Undo_Tab_Legate("Fatture (scadenze)", "E", "CD_Fattura = " & Me![ID_Fattura])
                     Call Undo_Tab_Legate("Fatture (dettaglio)", "E", "CD_Fattura = " & Me![ID_Fattura])
                     Call Undo_Tab_Legate("Fatture (testata)", "E", "ID_Fattura = " & Me![ID_Fattura])
                  End If
                  stBlocco = Imposta_Blocco("Fatture (testata)", Me![ID_Fattura], "S")
                  Forms![Fatture (riepilogo)].Requery
                  DoCmd.Close acForm, Me.Name
               End If
            End If
         End If
      Else
         DoCmd.CancelEvent
      End If
   Else
      DoCmd.Close acForm, Me.Name
   End If
Exit_cmdEsci_Click:
  Exit Sub
Err_cmdEsci_Click:
  MsgBox Err.Description, , Me.Caption
  If lTrans = True Then lTrans = GesTrans("R", DBEngine.Workspaces(0))
  Resume Exit_cmdEsci_Click
End Sub
Ciò che accade (e che non mi spiego) è che la nuova fattura compare nella maschera continua in fondo alla lista,
nonostante abbia il numero più alto di tutte e la lista sia in ordine discendente sul campo N_Fattura.
L'unico modo per vederla andare al suo posto in testa alla lista è quello di chiudere e riaprire la form.
Ho provato a:
- eseguire un refresh prima di requery
- inserire DoEvents prima di requery
e non ho ottenuto alcun risultato.
Ho provato a togliere la clausola DESC dalla query, ed il comportamento è stato coerente: la nuova fattura compare in
testa alla lista mentre dovrebbe esser in fondo !
Nello stesso applicativo ci sono almeno altre nove coppie di form che funzionano allo stesso modo, ovviamente su tabelle
diverse e che non presentano questa anomalia.
Idee ? 
Vincenzo Turturro
Certificato Eucip Core Level
ITA 0000-002299 del 14/05/2007
---------------------------------------------
il sito comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------
risorse Access:
http://www.accessgroup.it
---------------------------------------------
Il sito comune di it.comp.as400
http://www.faq400.com
---------------------------------------------

 
Non credo c'entri il codice. Non è che su quella form rimane incagliato un qualche ordinamento diverso?
-- 
-- 
MAssimiliano Amendola
www.accessgroup.it
Cisa - Conferenza Italiana Sviluppatori Access

-- 



Indici (dimenticati) in tabella?
Ciao.
-- 
Sergio MAZZA 

 No: tutto in Access (BE/FE).
Allora non ho capito perchè prima fai l'update e poi torni dietro col bookmark



Per posizionarmi sul record appena creato e recuperarne l'ID che mi serve come valore per presentare all'utente il
record da valorizzare nella maschera "Fatture".


 
Certo
ma a differenza di sql server con il contatore di access appena fai l'addnew hai l'id disponibile. Con sql quella che hai fatto è l'istruzione corretta.
Prova e vedrai



Proverò, ma non credo che il problema possa dipendere da questo ...- 


 
certo che non dipende da questo
Infatti era solo una curiosità


Ciao.



Ciao Vincenzo,
hai risolto?
Se fosse una casella combinata quelle che automaticamente ti deve
mostrare l'ultimo record inserito, io avevo risolto una cosa simile in
questo modo:
Gerarchia delle caselle combinate
Questa routine permette di evitare che vengano selezionati listini che
non esistono, ossia date senza cliente. L'utente filtra la tabella
listini per cliente, e si trova l'elenco delle date disponibili, e la
combo mostra l'ultima data di listino che ho inserito, ossia la +
recente
Private Sub CBOCLIENTE_AfterUpdate()
Forms!MSC_CSTMP.Requery
[Forms]![MSC_CSTMP]![CBODATA].Enabled = True
Me!CBODATA.Requery
Me!CBODATA = Me!CBODATA.ItemData(0)
Forms!MSC_CSTMP.Requery
End Sub
Ti è stato utile???
Buon lavoro
Samantha

Samantha

 ha scritto:

Allora questo forse va meglio:
TEST 1)
Casella combinata non associata che permette di filtrare i prodotti
per cliente, posizione la data di listino all'ultima data presente,
ossia quella più recente, e infine aggiorna tutti i campi dist_vsid
con valore uguale a quello selezionato.
Private Sub CBOCLIENTE_AfterUpdate()
Forms!sm_sceltalistino.Requery
Me.cbodata.Requery
Me!cbodata = Me!cbodata.ItemData(0)
DoCmd.SetWarnings False
Dim newvers As String
newvers = "q_AGG_VersioneListino_sm_sceltalistino"
DoCmd.OpenQuery newvers, acNormal, acEdit
Forms!sm_sceltalistino.Refresh
DoCmd.SetWarnings True
End Sub
Ossia, gli dici il refresh?
TEST 2)
Tra un attimo te lo posto


TEST 2)
Penso che tu hai un recorset sotto la maschera che non fa il refresh,
non si aggiorna. Ho avuto il tuo stesso problema, e l'ho risolto
mettendo questo codice.
Avevo trovato un post vecchio, dove proprio spiegava il problema che
io avevo e che è simile al tuo... mannaggia a me che non l'ho
conservato... provo a vedere nei post se riesco a trovarlo. Cmq ti
posto il codice che ho utilizzato io...
 CurrentDb.QueryDefs.Refresh
    Private Sub upd_Click()
    On Error GoTo Err_upd_Click
    Dim msclone As Recordset, intl As Integer
    Dim fld As Field
    Dim dbagg As Database
    Dim rstagg As DAO.Recordset
    Dim qdagg As QueryDef
    Set dbagg = CurrentDb
    Set qdagg = dbagg.QueryDefs("Q_MSC_CSTMP")
    qdagg.Parameters("[forms]![MSC_CSTMP]![CBOCLIENTE]") = Me!
CBOCLIENTE
    qdagg.Parameters("[Forms]![MSC_CSTMP]![CBODATA]") = Me!CBODATA
        CurrentDb.QueryDefs.Refresh
    Me.Refresh
        Set rstagg = qdagg.OpenRecordset()
    Set msclone = Me.RecordsetClone
    If msclone.RecordCount = 0 And rstagg.RecordCount = 0 Then
     MsgBox "Non ci sono prodotti a listino"
     Exit Sub


Scusa, ma hai provato a fare  un requery sull'evento apertura della
maschera Fatture?
TEST 3)
Se la data dei costi che voglio vedere non è l'ultima ma un'altra,
selezionando altra data in automatico aggiorno tutti i campi
Private Sub CBODATA_AfterUpdate()
DoCmd.SetWarnings False
Forms![sm_sceltalistino].Corpo.Visible = False
Dim newvers As String
newvers = "q_AGG_VersioneListino_sm_sceltalistino"
DoCmd.OpenQuery newvers, acNormal, acEdit
Forms!sm_sceltalistino.Refresh 'Obbliga l'aggiornamento immediato
DoCmd.SetWarnings True
Forms![sm_sceltalistino].Corpo.Visible = True
End Sub


Refresh esempio dalla guida:
Esempio di metodo Refresh
Nel seguente esempio viene utilizzato il metodo Refresh per aggiornare
l'insieme Fields della tabella Categorie in base alle modifiche
apportate ai dati OrdinalPosition. L'ordine dell'insieme Fields viene
modificato soltanto dopo che è stato utilizzato il metodo Refresh.
Sub RefreshX()
   Dim dbsNorthwind As Database
   Dim tdfEmployees As TableDef
   Dim aintPosition() As Integer
   Dim astrFieldName() As String
   Dim intTemp As Integer
   Dim fldLoop As Field
   Set dbsNorthwind = OpenDatabase("Northwind.mdb")
   Set tdfEmployees = dbsNorthwind.TableDefs("Categories")
   With tdfEmployees
      ' Display original OrdinalPosition data and store it
      ' in an array.
      Debug.Print _
         "Original OrdinalPosition data in TableDef."
      ReDim aintPosition(0 To .Fields.Count - 1) As Integer
      ReDim astrFieldName(0 To .Fields.Count - 1) As String
      For intTemp = 0 To .Fields.Count - 1
         aintPosition(intTemp) = _
            .Fields(intTemp).OrdinalPosition
         astrFieldName(intTemp) = .Fields(intTemp).Name
         Debug.Print , aintPosition(intTemp), _
            astrFieldName(intTemp)
      Next intTemp
      ' Change OrdinalPosition data.
      For Each fldLoop In .Fields
         fldLoop.OrdinalPosition = _
            100 - fldLoop.OrdinalPosition
      Next fldLoop
      Set fldLoop = Nothing
      ' Print new data.
      Debug.Print "New OrdinalPosition data before Refresh."
      For Each fldLoop In .Fields
         Debug.Print , fldLoop.OrdinalPosition, fldLoop.Name
      Next fldLoop
      .Fields.Refresh
      ' Print new data, showing how the field order has been
      ' changed.
      Debug.Print "New OrdinalPosition data after Refresh."
      For Each fldLoop In .Fields
         Debug.Print , fldLoop.OrdinalPosition, fldLoop.Name
      Next fldLoop
      ' Restore original OrdinalPosition data.
      For intTemp = 0 To .Fields.Count - 1
         .Fields(astrFieldName(intTemp)).OrdinalPosition = _
            aintPosition(intTemp)
      Next intTemp
   End With
   dbsNorthwind.Close
End Sub

esseAemme wrote:
oh ma tagliare un pò il msg, no???



Ciao,
Ma ieri non avevo nemmeno il tempo di respirare, e allora ho fatto le
cose di fretta.
VT hai risolto?
Non so dalle vostre parti, ma qui stamattina fa un freddo pazzesco...
ci voleva il maglione stamattina...
Bg a tutti 2
Samantha