Avatar billede jensen363 Forsker
15. februar 2011 - 12:33 Der er 7 kommentarer og
1 løsning

Find højeste og laveste tal i en række

En række består i kolonner af en ID og åstallet fra 2000 - 2012

Hver id er unik, og indholdet i årstallet er enten 0 eller -1, eksempel

ID  00 01 02 03 04 05 06 07 08 09 10 11 12
AA1  0  0  0  0 -1 -1  0  0  0  0  0 -1 -1
AA2  0  0  0  0  0  0  0  0  0  0  0  0  0
AA3  -1 -1  0  0  0  0  0  0  0  0  0  0  0

0  = aktiv enhed
-1 = inaktiv enhed

Jeg skal have beriget hver ID med 2 ekstra kolonner, hvori seneste aktive periode fremgår år fra/til, hvilket for de tre eksempler vil sige :

AA1  Første år = 06  sidste år = 09 ( har været inaktiv i 04 + 05 )
AA2  Første år = 00  sidste år = blank ( fortsat aktiv )
AA3  Første år = 02  sidste år = blank ( fortsat aktiv )

Og så fremdeles ... håber det giver mening

Nogen gode forslag ???
Avatar billede xenoxsis Nybegynder
15. februar 2011 - 14:29 #1
Altså dine kolonner er ID (dvs 13 kolonner som der ser ud nu?) og så skal du have tilføjet 2 hvor der skal for AA1 skal stå: 06 i den ene og 09 i den anden? For AA2 00 og null osv?
Avatar billede jensen363 Forsker
15. februar 2011 - 14:38 #2
Det er korrekt :-)

De to ekstra felter er benævnt :

LatestActiveStart
LatestActiveEnd

Og skal indeholde resultatet af programkørslen for alle rækker
Avatar billede xenoxsis Nybegynder
15. februar 2011 - 14:43 #3
Og lige for en god ordens skyld. Ifølge det jeg tæller så skulle AA1 være inaktiv i 04 + 05 samt 11 + 12 - Dvs der skal stå 06 i LatestActiveStart og 10 i LatestActiveEnd ikke? (Og ikke 09 som du skrev?)
Avatar billede jensen363 Forsker
15. februar 2011 - 14:48 #4
Sorry ... tastefejl ...

hhv. 06 og 10 er korrekt
Avatar billede xenoxsis Nybegynder
15. februar 2011 - 15:45 #5
Sådan. Den her tilføjer de 2 kolonner til slutningen af din tabel, efter at have slettet dem først (bare lige HUSK at ændre navnet "tableNameString").

Algoritmen er sådan set okay let, hvis du ikke kan gennemskue koden eller har spørgsmål så spørger du bare og så skal jeg prøve at forklare algoritmen for dig :-)

Den skulle virke som forventet medmindre din table er mærkbart forskellig fra det beskrevede :-)

---------------------------------

Public Sub RunLatest()
    Dim tableNameString, sqlString As String
    Dim db As Database
    Dim rec As DAO.Recordset
    Dim currStart, currEnd As String
    Dim isCurrStart, isCurrEnd, wasEnd As Boolean
   
    tableNameString = "Tabel1"
   
    Set db = CurrentDb
   
    'Fjerner kolonnerne "LatestActiveStart" og "LatestActiveEnd"
    If (fieldExists(tableNameString, "LatestActiveStart")) Then
        sqlString = "ALTER TABLE " & tableNameString & " DROP COLUMN LatestActiveStart"
        db.Execute (sqlString)
    End If
    If (fieldExists(tableNameString, "LatestActiveEnd")) Then
        sqlString = "ALTER TABLE " & tableNameString & " DROP COLUMN LatestActiveEnd"
        db.Execute (sqlString)
    End If
   
    'Tilføjer kolonnerne på ny (Altså null'er dem)
    sqlString = "ALTER TABLE " & tableNameString & " ADD COLUMN LatestActiveStart Text (10) NULL"
    db.Execute (sqlString)
    sqlString = "ALTER TABLE " & tableNameString & " ADD COLUMN LatestActiveEnd Text (10) NULL"
    db.Execute (sqlString)
   
    Set rec = db.OpenRecordset(tableNameString)
   
    'Går igennem posterne en efter en
    Do Until rec.EOF
        isStart = False
        isEnd = False
        currStart = 0
        currEnd = 0
        'Gennemgår kolonner
        For i = 0 To rec.Fields.Count - 1
            'Sørger for at den kun tager sig af de kolonner hvor navnene er numeriske
            If (IsNumeric(rec.Fields(i).Name)) Then
                If (rec.Fields(i) = 0) Then
                    If (Not isStart) Then
                        isStart = True
                        currStart = rec.Fields(i).Name
                        isEnd = False
                    End If
                ElseIf (rec.Fields(i) = -1) Then
                    If (Not isEnd) Then
                        isEnd = True
                        currEnd = rec.Fields(i - 1).Name
                        isStart = False
                    End If
                End If
            End If
        Next i
        rec.Edit
        rec.Fields("LatestActiveStart") = currStart
        If (isEnd) Then rec.Fields("LatestActiveEnd") = currEnd
        rec.Update
        rec.MoveNext
    Loop
       
    rec.Close
    Debug.Print "Done"
End Sub

Public Function fieldExists(ByVal tblName As String, ByVal fieldName As String) As Boolean
    Dim x As Integer
   
    For x = 0 To CurrentDb.TableDefs(tblName).Fields.Count - 1
        If CurrentDb.TableDefs(tblName).Fields(x).Name = fieldName Then fieldExists = True
    Next x
End Function
Avatar billede jensen363 Forsker
15. februar 2011 - 16:14 #6
Jeg får fejl i ALTER TABLE statement

Her

'Tilføjer kolonnerne på ny (Altså null'er dem)
    sqlString = "ALTER TABLE " & tableNameString & " ADD COLUMN LatestActiveStart Text (10) NULL"
    db.Execute (sqlString)
Avatar billede jensen363 Forsker
15. februar 2011 - 16:23 #7
Men det er vist også det eneste som fejler :-)

Jeg fjernede den del af koden som sletter/oprettet de to kolonner og kørte koden på resten ... det ser ud til at virke
Avatar billede jensen363 Forsker
15. februar 2011 - 16:29 #8
Hold da kæ... hvor er det godt gået ... takker mange gange.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester