Avatar billede troelsm Nybegynder
22. september 2008 - 22:41 Der er 14 kommentarer og
1 løsning

Akkumulering af felter i access

Jeg bruger indimellem
iff([felt1] Is null;([felt1]);([felt2]))

men her skal jeg næsten gøre det enkeltvis så jeg tænke på er det muligt at gøre det med 7-8 felter på engang...

altså jeg har
felt1 - felt2 - felt3 - felt4 osv.

disse skal samles således at indhold starter i f1

så eksempelvis følgende
felt1 = tekst1
felt2 =
felt3 = tekst2
felt4 = telst3
felt5 =
felt6 =
felt7 = tekst4
felt8 = tekst4

bliver til
f1 = tekst1
f2 = telst2
f3 = tekst3
f4 = tekst4
f5 =
f6 =
f7 =
f8

Hvilket felter der er noget i vides ikke på forhånd og den kan variere fra række til række
Avatar billede mugs Novice
22. september 2008 - 23:01 #1
Udtryk1: [felt1] & " " & [felt2] & " " & [felt3] & " " & [felt4] & " " & [felt5] & " " & [felt6] & " " & [felt7] & " " & [felt8]
Avatar billede troelsm Nybegynder
22. september 2008 - 23:52 #2
Den løsning ligger alle felter sammen :-)
Det var ikke det som var meningen, det som skulle ske var alt alle felter skulle flyttes til venstre så der ikke var nogen tomme felter se fra venste.
Avatar billede kjulius Novice
22. september 2008 - 23:55 #3
Jeg kan ikke se, hvordan du skulle kunne gøre det i en forespørgsel eller en update. Du kan jo kun "se" felterne i tabellen. Hvis f.eks. indholdet af felt3 flyttes/kopieres til felt2, vil indholdet jo stadig være der i felt3. Du vil altså ikke kunne flytte/kopiere indholdet af felt4 til felt3, for det indeholder jo data.

Det er ikke på nogen måde en optimal lagringsmetode. Det vil være meget bedre, at gemme data med et type-id og så et felt til værdien, altså en række pr. værdi i stedet for én række med flere værdier i felter.

Men hvis du fastholder din langt fra optimale tabelopbygning vil en reorganisering af data (update) efter min mening derfor skulle køres i VBA, f.eks.:

Sub ReorganizeTable()
    Dim db As Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("dinTabel")
    Do While Not rs.EOF
        If rs.Fields.Count > 2 Then
            ' Vi antager, at felt 0 er Id feltet, og at resten af felterne er de felter, der skal reorganiseres...
            For x = 1 To rs.Fields.Count - 2
                If IsNull(rs.Fields(x)) Then
                    'Det testede felt indeholder Null, finde det næste felt, som indeholder en værdi...
                    For y = x + 1 To rs.Fields.Count - 1
                        If Not IsNull(rs.Fields(y)) Then
                            rs.Edit
                            rs.Fields(x) = rs.Fields(y)
                            rs.Fields(y) = Null
                            rs.Update
                        End If
                    Next
                End If
            Next
        End If
    Loop
End Sub

NB! Koden er ikke testet...
Avatar billede mugs Novice
23. september 2008 - 00:09 #4
OK - Så har jeg misforstået dit spørgsmål. Men enig i kjulius i, at din tabelstruktur langt fra er optimal.

Du bør undgå tomme felter i dine tabeller. Kaldes vist "forældreløse poster".
Avatar billede troelsm Nybegynder
23. september 2008 - 00:18 #5
kjulius - jeg vil prøve at teste din kode

og enig i at man skal undgå tomme felter
problem er at det er ikke mig som laver tabeller,
det er data som jeg importere fra text, excel eller csv filer som jeg så efterfølgende vil have venstre stillet :-)
Avatar billede kjulius Novice
23. september 2008 - 00:21 #6
Hov der skulle da i hvert fald have været en rs.MoveNext lige før Loop instruktionen for at den kan virke.
Avatar billede kjulius Novice
23. september 2008 - 01:36 #7
TIP: Hvis nu felterne, der skal testes og ombyttes ikke ligger i forlængelse af hinanden, eller der findes andre felter i tabellen, som ikke skal opdateres, kan felternes selekteres ved at erstatte tabelnavnet med en SELECT:

rs=db.OpenRecordset("SELECT Id, Felt1, Felt2, Felt3, Felt4, Felt5 FROM dinTabel")
Avatar billede troelsm Nybegynder
23. september 2008 - 16:16 #8
Ja helt vriker det ikke :-)
Sådan er resultatet

Oprindelig
Id    Felt1    Felt2    Felt3    Felt4    Felt5    Felt6    Felt7    Felt8    Felt9    Felt10    Felt11    Felt12    Felt13    Felt14    Felt15    Felt16
2    tekst1    tekst2    tekst3    tekst4    tekst5                        tekst6                   
3        tekst1    tekst2    tekst3    tekst4    ddddd                    tekst5                   
5    tekst1    tekst2    tekst3    tekst4    tekst5            ddddd            tekst6                   
8    tekst1    tekst2    tekst3    tekst4    tekst5                        tekst6    ddddd               

Efter kode
Id    Felt1    Felt2    Felt3    Felt4    Felt5    Felt6    Felt7    Felt8    Felt9    Felt10    Felt11    Felt12    Felt13    Felt14    Felt15    Felt16
2    tekst1    tekst2    tekst3    tekst4    tekst5    tekst6                                       
3    tekst5                                                           
5    tekst1    tekst2    tekst3    tekst4    tekst5    tekst6                                       
8    tekst1    tekst2    tekst3    tekst4    tekst5    ddddd                                       

Sådan burde det have set ud
Id    Felt1    Felt2    Felt3    Felt4    Felt5    Felt6    Felt7    Felt8    Felt9    Felt10    Felt11    Felt12    Felt13    Felt14    Felt15    Felt16
2    tekst1    tekst2    tekst3    tekst4    tekst5    tekst6                                       
3    tekst1    tekst2    tekst3    tekst4    ddddd    tekst5                                       
5    tekst1    tekst2    tekst3    tekst4    tekst5    ddddd    tekst6                                   
8    tekst1    tekst2    tekst3    tekst4    tekst5    tekst6    ddddd                                   
lidt spændt på at
Avatar billede troelsm Nybegynder
23. september 2008 - 16:17 #9
Oprindelig
Id    Felt1    Felt2    Felt3    Felt4    Felt5    Felt6    Felt7    Felt8    Felt9    Felt10    Felt11    Felt12               
2    tekst1    tekst2    tekst3    tekst4    tekst5                        tekst6                   
3        tekst1    tekst2    tekst3    tekst4    ddddd                    tekst5                   
5    tekst1    tekst2    tekst3    tekst4    tekst5            ddddd            tekst6                   
8    tekst1    tekst2    tekst3    tekst4    tekst5                        tekst6    ddddd               

Efter kode
Id    Felt1    Felt2    Felt3    Felt4    Felt5    Felt6    Felt7    Felt8    Felt9    Felt10    Felt11    Felt12               
2    tekst1    tekst2    tekst3    tekst4    tekst5    tekst6                                       
3    tekst5                                                           
5    tekst1    tekst2    tekst3    tekst4    tekst5    tekst6                                       
8    tekst1    tekst2    tekst3    tekst4    tekst5    ddddd                                       

Sådan burde det have set ud
Id    Felt1    Felt2    Felt3    Felt4    Felt5    Felt6    Felt7    Felt8    Felt9    Felt10    Felt11    Felt12               
2    tekst1    tekst2    tekst3    tekst4    tekst5    tekst6                                       
3    tekst1    tekst2    tekst3    tekst4    ddddd    tekst5                                       
5    tekst1    tekst2    tekst3    tekst4    tekst5    ddddd    tekst6                                   
8    tekst1    tekst2    tekst3    tekst4    tekst5    tekst6    ddddd
Avatar billede troelsm Nybegynder
23. september 2008 - 16:18 #10
så den smider noget at teksten væk,
hvis den første felt er tomt så bliver resultat indhold af det sidste felt der er noget i,

i de øvrige sletter den mellemligende tekst og sætter sidste felt ind sidst
Avatar billede kjulius Novice
23. september 2008 - 16:46 #11
OK, jeg tror jeg kan se, hvor problemet kunne være. Prøv at indsætte et Exit For efter Update i koden.
Avatar billede kjulius Novice
03. oktober 2008 - 13:15 #12
Hjalp det?
Avatar billede troelsm Nybegynder
06. oktober 2008 - 22:58 #13
Yeps, nu virker det perfekt, har desværre ikke haft tid til at kigge på det før nu :-)
Avatar billede kjulius Novice
08. oktober 2008 - 21:28 #14
Okay, det var godt!
Avatar billede troelsm Nybegynder
26. februar 2009 - 21:28 #15
TÆnkte lidt på
nedenstående virker jo perfekt - men kan man få den til at løbe den modsatte vej så den ikke akkumulere mod venstre men mod højre?

Private Sub Kommandoknap0_Click()

    Dim db As Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("adresser")
    Do While Not rs.EOF
        If rs.Fields.Count > 2 Then
            ' Vi antager, at felt 0 er Id feltet, og at resten af felterne er de felter, der skal reorganiseres...
            For x = 1 To rs.Fields.Count - 2
                If IsNull(rs.Fields(x)) Then
                    'Det testede felt indeholder Null, finde det næste felt, som indeholder en værdi...
                    For y = x + 1 To rs.Fields.Count - 1
                        If Not IsNull(rs.Fields(y)) Then
                            rs.Edit
                            rs.Fields(x) = rs.Fields(y)
                            rs.Fields(y) = Null
                            rs.Update
                            Exit For
                        End If
                    Next
                End If
            Next
        End If
        rs.MoveNext
    Loop
End Sub
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