Ciclare una tabella

Anonimo
2012-05-15T22:37:02+00:00

Ciao,

ho una tabella “Tabella1” con 3 campi. Nel primo campo ci sono delle date in ordine crescente, nel secondo campo ci sono dei dati alfanumerici e nel terzo campo vuoto debbo svilupparmi dei calcoli.

Data               Coppie       R_M

01/01/2012      m1

01/01/2012      m2

01/01/2012      m1

02/01/2012      m1

02/01/2012      m1

02/01/2012      m3

03/01/2012      m2

03/01/2012      m2

03/01/2012      m3

04/01/2012      m2

04/01/2012      m3

04/01/2012      m1

Dunque, partendo dal primo record debbo confrontare la prima coppia (m1) con la stessa coppia sia nella stessa data che nelle date successive. Essendo primo record R_M assume il valore 1, in seguito se la stessa coppia la incontriamo nella stessa data R_M assume il valore 0, mentre nella data successiva R_M assume il valore 1; se in alcune date la coppia non si trova,R_M  somma 1 per ogni data in cui manca. In seguito, se la coppia la ritroviamo ancora nella stessa data assume il valore 0, mentre alla data successiva il valore 1 oppure il conteggio delle date in cui manca ripartendo sempre da 1; tutto questo fino alla fine dei record, poi ricomincia da capo scegliendo naturalmente la coppia successiva, diversa dalla prima(in questo caso m2). Il risultato che vorrei ottenere è il seguente:

Data               Coppie       R_M

01/01/2012      m1            1

01/01/2012      m2            1

01/01/2012      m1            0

02/01/2012      m1            1

02/01/2012      m1            0

02/01/2012      m3            2

03/01/2012      m2            2

03/01/2012      m2            0

03/01/2012      m3            1

04/01/2012      m2            1

04/01/2012      m3            1

04/01/2012      m1            3

Spero di avervi illustrato in maniera accettabile il tutto.

Ciao Vladimiro.

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2012-05-18T07:08:12+00:00

Ciao Vlady,

ogni problema, se risolvibile con una o più query, lo preferisco al codice :-)

Option Compare Database

Option Explicit

Function Vladimiro()

    Dim myRset As Recordset

    Dim myRsetCoppie As Recordset

    Dim myData As Date

    Dim swPrimo As String

    Dim swPresente As String

    Dim ctr As Integer

   Set myRset = CurrentDb.OpenRecordset("Select * From Tabella1")

   Set myRsetCoppie = CurrentDb.OpenRecordset("SELECT Coppie FROM Tabella1 GROUP BY Coppie ORDER BY Coppie")

   Do While Not myRsetCoppie.EOF

      myData = myRset("Data")

      swPrimo = "SI"

      swPresente = "NO"

      ctr = 1

      Do While Not myRset.EOF

Cicla:

         If myData = myRset("Data") Then

            If myRsetCoppie("Coppie") = myRset("Coppie") Then

               swPresente = "SI"

               If swPrimo = "SI" Then

                  swPrimo = "NO"

                  myRset.Edit

                  myRset("R_M") = ctr

                  myRset.Update

               Else

                  myRset.Edit

                  myRset("R_M") = 0

                  myRset.Update

               End If

            End If

         Else

            myData = myRset("Data")

            swPrimo = "SI"

            If swPresente = "NO" Then

               ctr = ctr + 1

            Else

               swPresente = "NO"               ctr = 1

            End If

         GoTo Cicla

         End If

         myRset.MoveNext

      Loop

    myRset.MoveFirst

    myRsetCoppie.MoveNext

    Loop

   myRset.Close

   myRsetCoppie.Close

   Set myRset = Nothing

   Set myRsetCoppie = Nothing

End Function

Fammi sapere.

Mimmo.

La risposta è stata utile?

0 commenti Nessun commento

10 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2012-05-16T19:39:14+00:00

    Ciao Mimmo, cercherò di spiegare in maniera più chiara sempre con lo stesso esempio di sopra.

    .........................................................

    Non mi è chiaro : se in alcune date la coppia non si trova sommo 1 a R_M. Ma di quali records?

    ..........................................................

    Anche se le date si ripetono per più di una volta (nell'esempio ogni data è ripetuta 3 volte) noi le dobbiamo considerare date univoche; ecco perché se una coppia si ripete in una stessa data assume il valore 0.

    Alla fine non facciamo altro che conteggiare quante date univoche (cioè consideriamo una sola data di quelle che si ripetono) incontriamo tra una coppia e la successiva identica coppia. Prendiamo in considerazione solo la coppia m1:

    Data               Coppie       R_M

    01/01/2012      m1            1

        "        "            .....................

        "        "            m1            0

    02/01/2012      m1            1

        "        "            m1            0

    "        "           ......................

    03/01/2012     ......................

        "        "           ......................

        "        "           ......................

    04/01/2012     ......................

        "        "           ......................

        "        "            m1            3

    Siccome m1 si trova nella prima data (cioè in una delle prime 3 stesse date) comincia il conteggio e R_M assume il valore di 1 (poi 0 in quanto si ripete nella stessa data); ripetendosi alla data successiva, il valore 1 non cambia; mentre non essendoci in nessuna delle tre stesse date successive R_M conteggia una data e da 1 passa a 2; poi la incontra ad una delle tre successive stesse date e da 2 passa a 3.

    Se non l'avesse incontrata, da 3 passava a 4 e successivamente se la incontrava da 4 passava a 5. La cosa importante però è che una volta incontrata, il conteggio riparte sempre da 1. Ad esempio:

    Data               Coppie       R_M

    01/01/2012      .....................

        "        "            m1              1

        "        "            .....................

    02/01/2012      .....................

        "        "            .....................

    "        "           ......................

    03/01/2012     ......................

        "        "           ......................

        "        "           m1               3

    04/01/2012     ......................

        "        "           ......................

        "        "           m1               1

    Oppure:

    Data               Coppie       R_M

    01/01/2012      .....................

        "        "            ....................

        "        "            .....................

    02/01/2012      .....................

        "        "           m1               2

    "        "           m1               0

    03/01/2012     ......................

        "        "           ......................

        "        "           m1               1

    04/01/2012     ......................

        "        "           ......................

        "        "           m1               1

    In definitiva, bisogna contare le date(univoche) in cui la coppia in gioco non appare.

    Ciao Vladimiro

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2012-05-16T09:18:20+00:00

    Ciao Vlady, non è completo

    Function Vladimiro()

    Dim myRset As Recordset

    Dim myData As Date

    Dim myVal As String

    Dim myData1 As Date

       Set myRset = CurrentDb.OpenRecordset("Select * From Tabella1")

       Do While Not myRset.EOF

          myData = myRset("Data")

          myVal = myRset("Coppie")

          myRset.Edit

          myRset("R_M") = 1

          myRset.Update

          myRset.MoveNext

          Do While Not myRset.EOF

             If myVal = myRset("Coppie") Then

                If myData = myRset("Data") Then

                   myRset.Edit

                   myRset("R_M") = 0

                   myRset.Update

                Else

                   If myRset("Data") <> myData1 Then

                      myData1 = myRset("Data")

                      myRset.Edit

                      myRset("R_M") = 1

                      myRset.Update

                   Else

                      myRset.Edit

                      myRset("R_M") = 0

                      myRset.Update

                   End If

                End If

             End If

             myRset.MoveNext

          Loop

          myRset.FindFirst "Coppie > '" & myVal & "'"

       Loop

       Set myrst = Nothing

    End Function

    Non mi è chiaro : se in alcune date la coppia non si trova sommo 1 a R_M. Ma di quali records?

    Mimmo

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2012-05-16T07:56:26+00:00

    Scusa Vlady, rileggendo il tuo post:

    poi ricomincia da capo scegliendo naturalmente la coppia successiva

    decade la necessità del valore univoco!

    Provo a buttare giù un po' di codice.

    Mimmo

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2012-05-16T07:48:23+00:00

    Ciao Vladimiro,

    vedo solo il problema della ripartenza a fine ciclo. Non avendo un valore univoco nel record noi hai modo di ripartire da...

    Ti sarebbe possibile definire un Id (contatore univoco) nella tabella?

    Mimmo

    La risposta è stata utile?

    0 commenti Nessun commento