Newsgroup: it.comp.appl.access
Titolo: Numerare i record

Ciao a tutti,
ho un problema che mi assilla da un po di tempo e che non trova soluzione.
Esiste la possibilita di numerare i record contenuti in una sottomaschera in
modalità
maschere continue (1,2,3...).
La cosa dovrebbe essere dinamica quindi vorrei usare un controllo non
associato e il valore non mi serve memorizzarlo.
Uso Access 2000 e la cosa che piu' mi da fastidio é che con filemaker la
cosa si puo' fare molto facilmente.
Qualche idea?
Grazie
Alessandro

 wrote in message
news:BMaq9.49193$
cS4.1...@news2.tin.it

Ti passo una Funzione di Lebans che realizza egregiamente ciò
che chiedi.
Per farla funzionare basta inserire una TXT_BOX e inserire
nella sua Origine =GetLineNumberForm(TuaForm)
Ciao @Alex
'Copyright Stephen Lebans 1999
'May not be resold
'Please include my 1 line Copyright notice
'in your code if you use these functions
'I left a bunch of development code in here in case anyone decides to go
'down the same paths I did.
'********************************************
'Only USE GetLineNumberForm  and   Serialize
'********************************************
'Stephen Lebans with help from Chris Bergmans
'Production version of GetLineNumberForm
'Works in Form or SubForm mode
'Set controlsource of unbound Text box to
'= GetLineNumberForm([Form])
'Type exactly as above
Function GetLineNumberForm(f As Form)
    Dim rs As Recordset
    Dim frmMain As Form
    Dim frmCur As Form
    Dim strNAME As String
    Dim IsItSubForm As Boolean
    Dim strFName As String
 
    'is the form referenced in the parameter currently
    'loaded as a SubForm?
    'Check it parent property to find out.
 
    On Error Resume Next
    strFName = 
f.Parent.Name
    IsItSubForm = (Err = 0)
 
    'Point to our error handler
    On Error GoTo Err_GetLineNumber
 
    If IsItSubForm Then
        'its a SubForm
        Set frmMain = f.Parent.Form
        strNAME = f.Name
        Set frmCur = frmMain(strNAME).Form
        Set rs = frmCur.RecordsetClone
 
    Else
        'It's not a SubForm
        Set rs = f.RecordsetClone
        Set frmCur = f
    End If
 
        ' Find the current record.
        rs.Bookmark = frmCur.Bookmark
        GetLineNumberForm = rs.AbsolutePosition + 1
Bye_GetLineNumber:
       Set rs = Nothing
       Set frmMain = Nothing
       Set frmCur = Nothing
       Exit Function
Err_GetLineNumber:
       Resume Bye_GetLineNumber
End Function
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 nella sua Origine =GetLineNumberForm(TuaForm)
Molto carina. Ci stavo provando anch'io ma non ero ancora riuscito. Non ero a
conoscenza della proprietą AbsolutePosition :-)
Ciao. Claudio.

 Ciao. Claudio.
Beh, sapere tutto è sempre difficile...!  ;-)
L'unico difetto di questa procedura è che in caso 
di scorrimento veloce l'aggiornamento del campo
non è in tempo reale, ma si nota un leggero ritardo
dovulo alla calcolata....!!!
PAZIENZA.
Ciao @Alex


 ha scritto nel messaggio
news:BMaq9.49193$cS4.1...@news2.tin.it...

In alternativa all'ottima soluzione proposta da Alex, puoi anche usare
questa funzione proposta da Mamma Microsoft:
      Function GetLineNumber(F As Form, KeyName As String, KeyValue)
         Dim RS As Recordset
         Dim CountLines
         On Error GoTo Err_GetLineNumber
         Set RS = F.RecordsetClone
         ' Find the current record.
         Select Case RS.Fields(KeyName).Type
            ' Find using numeric data type key value?
            Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, _
            DB_DOUBLE, DB_BYTE
               RS.FindFirst "[" & KeyName & "] = " & KeyValue
            ' Find using date data type key value?
            Case DB_DATE
               RS.FindFirst "[" & KeyName & "] = #" & KeyValue & "#"
            ' Find using text data type key value?
            Case DB_TEXT
               RS.FindFirst "[" & KeyName & "] = '" & KeyValue & "'"
            Case Else
               MsgBox "ERROR: Invalid key field data type!"
               Exit Function
         End Select
         ' Loop backward, counting the lines.
         Do Until RS.BOF
            CountLines = CountLines + 1
            RS.MovePrevious
         Loop
Bye_GetLineNumber:
         ' Return the result.
         GetLineNumber = CountLines
         Exit Function
Err_GetLineNumber:
         CountLines = 0
         Resume Bye_GetLineNumber
      End Function
Nell'origine record della casella di testo non associata in cui vuoi
visualizzare il numero progressivi scrivi:
=GetLineNumber([Form];"ID";[ID])
Dove ID è il nome della chiave primaria che è origine record della
sottomascchera.
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

Grazie mille!!!
era quello che cercavo
Alessandro

 sottomascchera.
    Roberto!... Mi meraviglio di te... Come mai non usi una funzione di
aggregazione?
    :-))
    Per esempio:
        =DCount("*"
               ;[RecordSource]
               ;"[ID]<=" & [ID]
               & IIf([FilterOn];" AND " & [Filter];""))
    Ovviamente l'origine record dovra' essere un nome di una query salvata,
come e' sempre igienico che sia, dopotutto.
--
Ciao :-)
Maurizio
--------
?SPQR(C)
 X
--------

 --------
--


 aggregazione sui dominii. :-))
    Perche' io ai miei braccini ci tengo...


> "Alessandro" news:BMaq9.49193$
cS4.1...@news2.tin.it
:

    Potresti, per favore, testare questo codice che ho appena scritto e
farmi sapere come funziona e quali eventuali problemi presenta?
    Ovviamente la richiesta e' estesa a tutti i frequentatori del ng che
vorranno cortesemente perdere un po' di tempo.
    Grazie.
    Copia in un modulo la seguente funzione e per testarla assegna
all'origine controllo di una casella di testo la formula:
        =GetRecNum()
Public Function GetRecNum( _
) As Long
  On Error GoTo erh
  With CodeContextObject.RecordsetClone
    If (.BOF = True) And (.EOF = True) Then
    Else
      .Bookmark = CodeContextObject.Bookmark
      GetRecNum = .AbsolutePosition + 1
    End If
  End With
ext:
  Exit Function
erh:
  GetRecNum = 0
  Resume ext
End Function


   End With
Non sapevo esistesse la proprietà CodeContextObject ... complimenti!
Una domanda non è meglio la condizione seguente?
     If (.BOF = false) or (.EOF = false) Then
                     .Bookmark = CodeContextObject.Bookmark
                     GetRecNum = .AbsolutePosition + 1
      End if
Ciao, Ettore

 vorranno cortesemente perdere un po' di tempo.
Windows 2000 SP2 ITA - Access 2000 SR1 ITA
A una prima prova sembra funzionare senza problemi.
Sono solo un po' turbato dalla strana struttura if/then/else ;-)
Ciao. Claudio.

 Ciao, Ettore
Beh, complimenti a MAURIZIO per la fantasia
, anche se non è necessario visto lo spessore....!!
Io mi permetto di aggiungere un ulteriore ricamo....:
      If not(.BOF AND .EOF) Then
                      .Bookmark = CodeContextObject.Bookmark
                      GetRecNum = .AbsolutePosition + 1
      End if
Ciao a tutti.


      If (.BOF = false) or (.EOF = false) Then
    Quando scrivo codice scrivo sempre prima:
        If (...) Then
        Else
        End If
poi aggiungo il resto. E lascio tutto cosi' come sta finche' non ho
completato i test, fase questa in cui potrebbe essere utile il "ramo morto"
per una riga di debug o un msgbox. Una volta stabilito che quel "ramo" non
serve scrivo:
        If Not (...) Then
        End If
in modo che in una eventuale manutenzione successiva sia possibile
ripristinare il ramo Else senza sprecare nemmeno uno dei miei ultimi e
scarsi neuroni. Sai com'e'... non ho piu' diciott'anni e vado quasi per il
triplo...


triplo...
Allora due conti so farli anch'io: 18 più 18 fa 36 , 36 più quasi 18 ,
facciamo 16, ......   allora .... numble ..... 6 e 6 ..... 2 ..riporto
1 ..... 3 più 1 più 1 ....5 ... 5 e 2 .... 52 : 
MINCHIA CHE VECCHIO!!.:-)
Ciao. Fabrizio

 MINCHIA CHE VECCHIO!!.:-)
Ma io ti stacco le orecchie!!!
Ti faccio notare che i cinquantenni hanno molta più esperienza di voi
sbarbatelli  ;-))
Ciao: Ettore (il triplo - qualcosa)

sbarbatelli  ;-))
Quanta bella giovinezza .... chi vuol esser lieto sia , del doman non
v'è certezza :-)
Ciao. Fabrizio

> "Maurizio Borrelli" news:aof6fe$mbdmv$
1...@ID-52090.news.dfncis.de
:
[...]
    Gia' che c'ero ho voluto provare a vedere se la stessa logica puo'
essere usata per le (famose) somme parziali. A prima vista sembra
funzionare. Mi fate sapere qualcosa, per favore? Grazie.
Public Function GetRunningSum( _
  ByVal FieldName As String _
) As Double
  On Error GoTo erh
  Dim obj As Object
  Dim sql As String
  Dim rst As DAO.Recordset
  Set obj = CodeContextObject
  With obj.RecordsetClone
    If Not ((.BOF = True) And (.EOF = True)) Then
      .Bookmark = obj.Bookmark
      sql = "SELECT"
      sql = sql & " Sum([FieldValue]) AS [TopSum]"
      sql = sql & " FROM"
      sql = sql & " ("
      sql = sql & " SELECT TOP " & .AbsolutePosition + 1
      sql = sql & " [" & FieldName & "] AS FieldValue"
      sql = sql & " FROM"
      sql = sql & " ([" & 
obj.Recordset.Name
 & "])"
      sql = sql & " )"
      Set rst _
        = CurrentDb.OpenRecordset( _
              sql _
            , DAO.dbOpenSnapshot _
            , DAO.dbFailOnError)
      GetRunningSum = rst![TopSum]
    End If
  End With
ext:
  On Error Resume Next
  rst.Close
  Set rst = Nothing
  Set obj = Nothing
  Exit Function
erh:
  GetRunningSum = 0


 Ciao. Fabrizio
"Magnifico"...... ;-)


@Alex
Grazie per l'apprezzamento ... ah non dicevi a me . :-)
cmq per chi a voglia di rileggerla :
http://www.fausernet.novara.it/fauser/biblio/lorenzo/lorenzo1.htm#lore7
Ciao. Fabrizio

 @Alex
a me me pare 'na schifezza
--
Lorenzo

a me me pare 'na schifezza
Ignorante , inacculturato e puzzone :-))
Ti offro poesia e tu sprezzi: con te non ci parlo piů!! :-)
Ciao. Fabrizio

> "Maurizio Borrelli" news:aoghob$md8n1$
1...@ID-52090.news.dfncis.de
:
[...]
    Scusate ancora...
    Ho aggiunto la gestione dei filtri e dell'ordinamento.
Public Function GetRunningSum( _
  ByVal FieldName As String _
) As Double
  On Error GoTo erh
  Dim frm As Access.Form
  Dim sql As String
  Dim rst As DAO.Recordset
  Set frm = CodeContextObject
  With frm.RecordsetClone
    If Not ((.BOF = True) And (.EOF = True)) Then
      .Bookmark = frm.Bookmark
      sql = "SELECT"
      sql = sql & " Sum([FieldValue]) AS [TopSum]"
      sql = sql & " FROM"
      sql = sql & " ("
      sql = sql & " SELECT TOP " & .AbsolutePosition + 1
      sql = sql & " [" & FieldName & "] AS [FieldValue]"
      sql = sql & " FROM"
      With frm
        sql = sql & " ([" & .Recordset.Name & "])"
        If (.FilterOn = True) Then
          sql = sql & " WHERE"
          sql = sql & .Filter
        End If
        If (.OrderByOn = True) Then
          sql = sql & " ORDER BY"
          sql = sql & .OrderBy
        End If
      End With
      sql = sql & " )"
      Set rst _
        = CurrentDb.OpenRecordset( _
              sql _
            , DAO.dbOpenSnapshot _
            , DAO.dbFailOnError)
      GetRunningSum = rst![TopSum]
    End If
  End With
ext:
  On Error Resume Next
  rst.Close
  Set rst = Nothing
  Set frm = Nothing


 Grazie per l'apprezzamento ... ah non dicevi a me . :-)
Già, ma Alessandro pare, e dico pare, non ci ha capito...!!!
Che ci vogliamo fare...???


 Che ci vogliamo fare...???
e gia' mi tocca cercare dei "medici" boni
--
a.cara

 Ti offro poesia e tu sprezzi: con te non ci parlo più!! :-)
Perche' che ho fatto?
--
a.cara

Perche' che ho fatto?
Niente ma c'ho voglia di tirarmela da intelettuale :-)
Ciao. Fabrizio

Alex wrote:

Non fare il pazzo!!:-)
Ciao. Fabrizio

Che ci vogliamo fare...???
Niente lasciamolo nella sua ignoranza: è un uomo senza scalogno !! :-)
Ciao. Fabrizio


sono portato a pensare che la vostra sia una congiura 
sara' bene fuggire a rotta di collo
--
a.cara

 Ciao. Fabrizio
Fabri, confessa... Amanda se n'è andata...
che ci vuoi fare... (Amanda gliel'ho detto.. non non gli ho detto che sei
venuta da me... lo so che ci rimane male...)
Fatti forza
ciao MAssimiliano

 sono portato a pensare che la vostra sia una congiura
    Che palle!




Va bene , la facciamo finita Don Ferra'. 
Ciao. Fabrizio

Fatti forza
IO , fatti forza tu adesso!! :-)
Ciao. Fabrizio


il solito piagnone
--
a.cara

 Va bene , la facciamo finita Don Ferra'.
    Se ti fossi preso il disturbo di contarle avresti notato ch'eran sei.


 > Maurizio Borrelli:

    Affatto! Chiamami piuttosto E.R.


Maurizio Borrelli wrote:

Uè delfi' fai la veci di Biso e lascia stare Maurì !!!
( faccio tutto ciò per un solo motivo : gli ho appena postato una
domanda ) :-)
Ciao. Fabrizio



http://www.exibart.com/arte_eventi/Magnificenza/StemmadeiMediciLorena.htm
Te la passo , ma per amicizia: "odo strider mani unghiate su fragili
cristalli." :-)
Ciao. Fabrizio

 cristalli." :-)
    Mi sottostimi a tal punto? Dimentichi certo che il sorriso e' sempre
presente nella mia firma.


presente nella mia firma.
Al contrario , se no mollavo il colpo da subito : non c'è volta che
non mi piaccia conversare con te ( mi permetto di dirlo oggi perchè so
che non c'è Biso in giro a dirci di darci dei bacini). 
Ciao. Fabrizio

farmi sapere come funziona e quali eventuali problemi presenta?
Win98SE - Access 97 : ottimo ed abbondante !!

 --------
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 seguente funzione:
[...]
    Grazie.
    Spiegami, per favore: da come scrivi sembrerebbe che la funzione che ho
postato (meglio parlare della versione del post successivo, pero') non
funzioni in sottomaschere o in maschere continue mentre i (pochi) test che
ho fatto mi dicono che funziona anche in questi casi.
    Le cose che mi interessa sapere (mi rivolgo a tutto il ng, ovviamente)
sono principalmente due:
         . se ci sono situazioni nella quale la funzione non da' il
        risultato atteso;
         . quale fra le varie funzioni che hanno il medesimo scopo
        e' piu' veloce, affidabile, in una parola efficiente.


 Win98SE - Access 97 : ottimo ed abbondante !!
    Grazie.


        e' piu' veloce, affidabile, in una parola efficiente.
Purtroppo ho poco tempo per testare la faccenda (e le prestazioni), "a pelle" posso dire d'aver
trovato eccellente la soluzione che proponi.
Se funzia a dovere ... anche il Biso dovrà complimentarsi  ;-))
Ciao, Silvio

 --------
Ciao :-)



Ho studiato un po'. :-)
Ho scoperto che Access 97 non accetta una sottoquery come argomento di un
predicato segnalando l'errore 3131.
L'help in linea dice:
========================
Errore di sintassi nella proposizione FROM (3131).
Č stata immessa un'istruzione SQL contenente una proposizione FROM non
valida.
Cause possibili:
· Una parola riservata o un nome di argomento č scritto in modo errato o č
mancante.
· La punteggiatura non č corretta.
========================
se poi si clicca su *parola riservata*, l'help dice:
========================
Parola riservata
Parola che fa parte di un linguaggio come, ad esempio, il linguaggio SQL del
modulo di gestione del database Microsoft Jet.
Le parole riservate includono i nomi di istruzioni, funzioni predefinite e
tipi di dati, metodi, operatori o oggetti. Esempi sono SELECT, UPDATE,
BETWEEN, SET e INSERT. Non utilizzare le parole riservate per nomi di
variabili o di oggetti.
========================
Infine circa la proposizione FROM l'help dice:
=======================
Proposizione FROM
Specifica le tabelle o le query contenenti i campi elencati nell'istruzione
SELECT.
Sintassi
SELECT elencocampi
FROM espressionetabella [IN databaseesterno]
*omissis*
Espressionetabella
Espressione che identifica una o piů tabelle da cui vengono recuperati i
dati. L'espressione puň essere un singolo nome di tabella, un nome di query
salvato o un nome composto risultante da un INNER JOIN, un LEFT JOIN o un
RIGHT JOIN.
*omissis*
=======================
da cui č desumibile che come Espressionetabella non č prevista una frase SQL
(almeno  cosě capisco, visto che esplicita che se si fa riferimento ad una
query, essa deve essere salvata)



Scusate, volevo scrivere:
Ho scoperto che Access 97 non accetta una sottoquery come argomento di un
predicato FROM, segnalando l'errore 3131.


 predicato FROM, segnalando l'errore 3131.
    Provero' ad approfondire la questione anche se, dal mio punto di vista,
e' marginale. Non mi interessa gestire le query non salvate.


> "Maurizio Borrelli" news:aogqmh$m83n0$
1...@ID-52090.news.dfncis.de
:
[...]
    Queste le versioni definitive, credo, delle due funzioni:
        GetRecNum
        GetRunningSum
di cui abbiamo parlato nel 3d.
    Con GetRunningSum non c'e' stato niente da fare, ho dovuto ripiegare sul
noto metodo della somma record per record.
    Ho dichiarato GetRunningSum As Variant ma e' piu' opportuno usarla con
il tipo piu' appropriato. Cosi' se si vuole si puo' fare una copia della
funzione per ciascun tipo che si vuole gestire chiamando queste copie per
esempio GetRunningSumLong, GetRunningSumCurrency, ...
Public Function GetRecNum( _
) As Long
  On Error GoTo erh
  Dim frm As Access.Form
  Dim rst As DAO.Recordset
  Set frm = CodeContextObject
  Set rst = frm.RecordsetClone
  With rst
    If Not ((.BOF = True) And (.EOF = True)) Then
      .Bookmark = frm.Bookmark
      GetRecNum = .AbsolutePosition + 1
    End If
  End With
ext:
  Set rst = Nothing
  Set frm = Nothing
  Exit Function
erh:
  GetRecNum = 0
  Resume ext
End Function
Public Function GetRunningSum( _
  ByVal ControlObject As Access.Control _
) As Variant
  On Error GoTo erh
  Dim frm As Access.Form
  Dim rst As DAO.Recordset
  Dim fld As DAO.Field
  Set frm = CodeContextObject
  Set rst = frm.RecordsetClone
  With rst
    If Not ((.BOF = True) And (.EOF = True)) Then
      .Bookmark = frm.Bookmark
      Set fld = .Fields.Item(ControlObject.ControlSource)
      Do Until (.BOF = True)
        GetRunningSum _
          = GetRunningSum _
          + Nz(fld.Value, 0)
        .MovePrevious
      Loop
    End If
  End With
ext:
  Set fld = Nothing
  Set rst = Nothing
  Set frm = Nothing
  Exit Function
erh:
  GetRunningSum = 0
  Resume ext
End Function
--


 --------
--
