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 )
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?
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?)
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
'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
Hold da kæ... hvor er det godt gået ... takker mange gange.
Synes godt om
Ny brugerNybegynder
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.