Newsgroup: it.comp.appl.access
Titolo: ottenere la data piu' alta in un recordset

ciao a tutti
in una sottomaschera a maschere continue
come faccio ad avere in un controllo
la data piu' alta, per i record già inseriti,
relativi al recordeset corrente, anche se mi trovo
sul record ancora vuoto?
 
grazie


Un bel DMax sul valore predefinito del controllo ti potrebbe andar bene?
 

Puoi usare diversi modi... quello migliore è una funzione che restituisce la data da recordset:
 
A seconda di come lavori puoi usare il RECORDSOURCE della Form oppure :
 
 Select Top 1, CampoData
 From TuaTabella
 where(proprietà Filter di maschera)
 Order By CampoData 
 
 
Ovviamente apri un rs e restituisci dalla Function il valore e la puoi assegnare direttamente al Controlsource della textbox...
 
@Alex


Grazie Alex
ora ci provo


con RECORDSOURCE della Form
come faccio poi a trovare la data piu' alta?

Apri un Recordset...?
 
Dim mRS as DAO.RecordSet
Dim strSQL As string
strSQL="SELECT TOP 1, CampoData FROM (" & Me.RecordSource & ") ORDER BY CampoData DESC"
Set mRS=DbEngine(0)(0).OpenRecordset(strSQL)
 
If Not mRS.EOF Then MsgBox mRS.Field(0).Value
 
Oppure...
With Me.RecordSetClone
   .SORT "CampoData DESC"
   .MoveFirst
   MsgBox .Fields("CampoData").Value
End With
 
Se non ti serve un Recordset ordinato... lui si riaggiorna al RECORDSET di Form... quindi non ti serve altro...
 
@Alex
 
 


grazie Alex
ho optato per questa
With Me.Parent!SM_DettFatturaFornitore.Form.RecordsetClone
   .Sort "DataCarico DESC"
   .MoveFirst
   MsgBox .Fields("DataCarico").Value
End With
 
ma su .Sort "DataCarico DESC"
ho l'errore 3251; operazione non supportata per questo tipo di oggetto
 


così non ho errore
ma non lo ordina
.Sort = "DataCarico DESC"

Il RecordSetClone in effetti non è ordinabile...
 
Questo funziona:
 
    Dim mRS As DAO.Recordset
 
    Me.Recordset.Sort = "DataCarico DESC"
    Set mRS = Me.Recordset.OpenRecordset
    mRS.MoveFirst
    MsgBox "ARRIVO =" & mRS.Fields("DataCarico")
 
@Alex


Grazie Alex
ottimo, funziona.
 
Dim mRS As DAO.Recordset
 
Me.Parent!SM_DettFatturaFornitore.Form.Recordset.Sort = "DataCarico DESC"
Set mRS = Me.Parent!SM_DettFatturaFornitore.Form.Recordset.OpenRecordset
mRS.MoveFirst
 
If mRS.Fields("DataCarico") > Me!DataDocFo Then
  MsgBox "La data Fattura deve essere superiore alla data carico!", _
    vbExclamation, "Attenzione!"
  Me.Undo
 
End If

Salve,
 
Franco dellavalle:

Origine controllo:
 
=Max([NomeCampoData])
 
 
-- 
Ciao
Karl
*********
http://www.AccessDevCon.com
 
Access FAQ: 
http://www.donkarl.com/it
 


grazie Karl
 
ho poi fatto cosi:
 
    Dim mRS As DAO.Recordset
 
    Me.Parent!SM_DettFatturaFornitore.Form.Recordset.Sort = "DataCarico DESC"
    Set mRS = Me.Parent!SM_DettFatturaFornitore.Form.Recordset.OpenRecordset
 
    If Not mRS.EOF Then
        mRS.MoveFirst
        If mRS.Fields("DataCarico") > Me!DataDocFo Then
            MsgBox "La data Fattura deve essere superiore alla data carico!", _
              vbExclamation, "Attenzione!"
            Me.Undo
 
        End If
 
    End If

 
 
L'ho scritto perché l'avevo letto prima. Sembra un "Death by VBA/DAO".
 
-- 
:-)



Perchè?
tu come l'avresti scritta?

 tu come l'avresti scritta?
 
Non è chiaro dove si trova il codice. Per questo non si sa qual'è il 
riferimento più semplice. Però in principio con un riferimento al 
controllo calcolato descritto per fare la prova di validità. Senza 
recordset, sort, move ecc.
 
 
-- 
Ciao



ciao Karl
 
Maschera principale "M_FatturaFornitore" 
con tre sottomaschere:
1-SM_NumDocFornitori (collega campi master e secondari "IdFatturaFo")
2-SM_DettFatturaFornitore (collega campi master e secondari "IdFatturaFo")
3-SM_FattureFornitoridaRicevere
 
tutte con origine da query
 
il codice è in dopo aggiornamento 
del controllo "DataDocFo"
della subform "SM_NumDocFornitori"

 della subform "SM_NumDocFornitori"
 
Nuova casella di testo "txtMaxDataCarico" nella SM_DettFatturaFornitore con:
 
=Max([DataCarico])
 
Codice:
 
If Me.Parent!SM_DettFatturaFornitore.Form!txtMaxDataCarico > 
Me!DataDocFo Then
 
   MsgBox "La data Fattura deve essere superiore alla data carico!", _
             vbExclamation, "Attenzione!"
             Me.Undo
 
End If
 
Forse ci vuole un nz() per assiccurare il riferimento alla casella 
contro Null. Ovviamente si tratta di air code, sempre pericoloso.



grazie Karl
come fai a determinare che si tratta di air code?
e invece per eviare che lo sia?

Che il suggerimento di Karl sia il più semplice non vi è dubbio alcuno... ma Karl avrà modo appunto di spiegarti non solo il significato di AIR CODE, ma meglio ancora pro ed i contro di usare AIR CODE ...
 
In questo caso la chiamata è estremamente pulita e semplice... ma c'è chi scrive righe di codice con funzioni di aggregazione popolare ControlSource di oggetti non associati.
Sono scelte... poi ad esempio chi usa la versione in ITALIANO, Karl usa quella in inglese e non ha avuto a che fare con le varie modiciche Forms/Maschere oppure i 2 punti del generatore di espressioni... ecc quindi ha sicuramente meno criticità.
 
Io non utilizzo molto ad esempio questa visione di utilizzo per l'impossibilità di debug... ad esempio...
 
Saluti.
@Alex

 Io non utilizzo molto ad esempio questa visione di utilizzo per l'impossibilità di debug... ad esempio...
 
Non sono sicuro di capire bene... sai il mio quasi italiano. ;-) Se ti 
riferisci all'uso di funzioni di aggregazioni le uso molto frequente 
anche in espressioni. Siamo in applicazioni di database dove per me 
precedono i metodi vicino alla macchina di database. Per aggregare 
valori di record niente è più "naturale", diretto, veloce delle funzioni 
di aggregazione di SQL come Min, Max, Sum ecc.


Ciao Karl.
Siete più complicati degli Italiani allora ;-)
 
Non mi riferivo alle funzioni di JET(SQL)... quelle sono ovviamente molto utili oltre che indispensabili.
 
Mi riferisco proprio alle funzioni di aggregazione sui domini DMax/Dlookup/... ovviamente da evitare in SQL per performance e scalabilità.
In realtà io le evito anche se usate per popolare CONTROLSOURCE...
 
Esempio classico che si vede spesso su Defaultvalue:
 
=NZ(DMAX(....;...;...);0)+1
 
oppure i più complessi realizzati per le PK stringa aggregate su Anno e Progressivi vari...
 
Mi riferivo a questi utilizzi delle funzioni per le quali è impossibile fare debug oltre ad essere meno performanti di semplici estrazione recordset...
 
Per questo motivo preferisco Function con gestione errori e gestione Log...
 
@Alex

 ...
 
Il mercato tedesco è abbastanza importante per la MS. Per questo tanti 
anni fa hanno deciso di essere gentile e tradurre quasi tutto. 20 anni 
fa persino esisteva una versione tradotta di _VBA_ per Excel e Word che 
era orribile.
 
Una rimanenza di questa politica è che quasi tutti nomi di funzioni sono 
diversi in espressioni di Access e codice VBA, come mostrato nei pocchi 
esempi. Ha causato millioni di errori e continua di causarli, ma è molto 
gentile. ;-)



grazie Alex


grazie Karl

 Access FAQ: 
http://www.donkarl.com/it
 
 
Ciao
@Alex


mi scuso per questo...
Certo che sarebbe per me cosa
molto gradita poter inviarevi
il mio db,
per correggere
eventuali errori strutturali
e non solo...

Ti rispondo per correttezza... ma per quanto riguarda me non è una pratica fattibile.
Sarebbe arrogante dare giudizi su lavori di altri di cui non si conosce nulla... ed ognuno poi ha un proprio modo di sviluppare, tu poi hai lacune tecnico-strutturali sul VBA che riuscirai sicuramente a colmare ma nel tempo...
 
Dare quindi un supporto come quello che chiedi e farlo seriamente con un feedback utile richiede un impegno che difficilmente ci si può permettere... e fare osservazioni superficiali non credo sia utile.
 
@Alex

 e non solo...
 
Faccio valutazioni per lavoro, cioè dura e costa il tasso orario. ;-)
 
Però puoi iniziare gratuitamente con 
http://www.donkarl.com/it/?catalogo
.



grazie


grazie