Avatar billede hnto Nybegynder
20. februar 2006 - 10:55 Der er 10 kommentarer og
1 løsning

Tælle karakterer i et felt

Jeg har et felt i access hvor der er lavet bevidste linebraks.
eks:

[felt1]
Bilen er rød
og kan kære meget stærkt
men dette er også farligt
bla bla...etc....


Kan man på nogen måde via en query få vist hvor mange karakterer der er i linie 1, 2, 3 osv i [felt1] ?

Feks:
[Felt1]
Bilen er rød


[Felt2] 
sum karakterer i linie 1

[felt3]
sum karakterer i linie 2

[felt3]
sum karakterer i linie 3

osv...

Det vides ikke hvor mange linieskift der er i de forskellige records i [felt1]
Der kan altså med andre ord være records der indeholder 3 linier i feltet, og andre records der indeholder 15 linier.
Avatar billede jesperfjoelner Nybegynder
20. februar 2006 - 14:53 #1
Det kan godt lade sig gøre. Noget af vejen i hvert fald. Men det er jo en utrolig bøvlet opbygning. Var det ikke noget at ændre databasens struktur hvis den form for optælling er noget du skal lave meget?

Du kan jo finde det første linebreak med

=Instr(1,[felt1],vbcrlf)
Det skulle give 13.

Og det er så længden af linje 1.

Længen af linje 2 vil så være:

=Instr((Instr(1,[felt1],vbcrlf)+1),[felt1],vbcrlf) - Instr(1,[felt1],vbcrlf)

om det kan laves dynamisk uanset antallet af linjer ved jeg ikke, men måske ville det være smartere at ommøblere databasen.
Avatar billede hnto Nybegynder
20. februar 2006 - 15:45 #2
Det er ikke "muligt" at omstrukturere databasen. Den danner grundlag for et printet katalog og er kun denne ene gang det skal anvendes.
Problemet er tillige kun opstået fordi der er folk der har indtastet data uden at følge de forms der eksakt var beregnet herfor. Altså forms der indeholdt en eksakt afgrænsning af feltets bredde (visuelt).

Derfor e jeg nødsaget til at vide hvilke felter der ikke følger "spillereglerne" og få disse rettet manuelt med rigtig orddeling.. ;-)

Jeg skal lige teste det du har foreslået, og vil til orientering nok først kunne gøre dette om et par dage... håber det er ok
Avatar billede jesperfjoelner Nybegynder
20. februar 2006 - 15:49 #3
Jeg har ikke travlt, men du kan se om du kan bruge det til noget.

Hvis det var kunne man med noget kode gennemløbe dine tabel > indsamle information om opbygningen > skrive det til en ny tabel som havde felterne: felt1, felt2, felt3 osv.
Det ville være nemmere tror jeg.
Avatar billede hnto Nybegynder
20. februar 2006 - 15:54 #4
det er muligt, men den resulterende Query der laves i databasen er knyttet op mod Indesign CS, som ud fra dataene er kodet til automatisk at generere siderne i templaten. Derfor vil en ændring i databasen tillige betyde kodeændring i den Indesign template der anvendes, og det vil jeg helst ikke ud i.

Jeg har vurderet at det at rette data i databasen fysisk er den "hurtigste" udvej.
Avatar billede fdata Forsker
20. februar 2006 - 17:57 #5
Du kan jo kode dig ud af det. Opsaml længderne dynamisk og dryp dem så ned i dine felter. I grove træk noget i stil med:

Dim Rst as Recordset

Sub Test
  ' Gennemløb dine poster en ad gangen
  ' For hver post
  '  .Edit
  '  FindLængder(.Fields("Felt1"))
  '  .Update
  ' Next
End Sub

Sub FindLængder(t as string) 
  Dim Felt(25) As String
  Dim p As Integer
  Dim s As String
  Dim Idx As Integer
 
  s = t
  Idx = 0
  p = InStr(1, s, vbCrLf)
  Do Until p = 0
    Idx = Idx + 1
    Felt(Idx) = Left(s, p - 1)
    s = Mid(s, p + 2)
    p = InStr(1, s, vbCrLf)
  Loop
  Idx = Idx + 1
  Felt(Idx) = s
 
  For p = 1 To Idx
    Debug.Print Felt(p)
    Rst.Fields("Felt" & p)=  Felt(p) 
  Next p
End Sub
Avatar billede fdata Forsker
20. februar 2006 - 18:00 #6
.. og det var så lige den forkerte, der røg afsted. Her er den korrekte:

Sub FindLængder(t as string) 
  Dim Felt(25) As Integer
  Dim p As Integer
  Dim s As String
  Dim Idx As Integer
 
  s = t
  Idx = 0
  p = InStr(1, s, vbCrLf)
  Do Until p = 0
    Idx = Idx + 1
    Felt(Idx) = p - 1
    s = Mid(s, p + 2)
    p = InStr(1, s, vbCrLf)
  Loop
  Idx = Idx + 1
  Felt(Idx) = Len(s)
 
  For p = 1 To Idx
    Debug.Print Felt(p)
    Rst.Fields("Felt" & p)=  Felt(p) 
  Next p
End Sub
Avatar billede hnto Nybegynder
20. februar 2006 - 19:17 #7
fdata:
Jooohh det skal nok passe ;-)  (jeg er i disse tilfælde desværre ikke programmør)*G*

Tager din kode højde for at orddeling ikke sker midt i et ord ?
Kan din kode tage lige så mange linier som der er i feltet. hvilket er variabelt ?

Det fede kunne naturligvis være hvis man i Access kunne bede den om at lave automatisk ombrydning af tekster. Dette efter et regelsæt der sagde at feltbredden maks må antage feks 85 karakterer, herunder tillige sikrede at ordeling ikke måtte foretages midt i et ord.

Kan dette lade sig gøre vil jeg gerne give 200+ point for dette, jeg tror bare ikke der er nogen der måske vil lave en så kompleks løsning for sølle 200 bananer.. ;-|
Avatar billede fdata Forsker
21. februar 2006 - 00:26 #8
You lost me.
Hvad er det, du er ude efter. Oprindeligt bad du om en opskrift på at tælle antal tegn i hver linie. Det gør min rutine (op til 25 linieskift, individuelt pr. post).
Dette har jo intet med orddeling at gøre. Vi tæller bare tegn.

Nu taler du om automatisk ombrydning af tekster og orddeling.
- Hvad er det helt præcist, du vil?
- Vil du have samlet linierne til een (altså have fjernet linieskiftene)?
- Og hvad er det med de 85 tegn?
- Hvor skal vi gøre af de resterende tegn, hvis der er mere end 85?
Du må nok forklare lidt nærmere.
Avatar billede hnto Nybegynder
21. februar 2006 - 21:13 #9
sorry jeg ved at man ikke skal udvide opgaver i samme spørgsmål, det æøb bare lige af med mig.
Jeg kvitterer dette med point, og opretter nyt til det andet som er en fuldendt løsning ;-)
Avatar billede fdata Forsker
21. februar 2006 - 22:29 #10
Jeg er ikke helt med; men hvis du er tilfreds, er jeg det også  ;o)
Tak for point.
Avatar billede hnto Nybegynder
23. februar 2006 - 00:32 #11
fdata, hvis du er frisk...:-)

http://www.eksperten.dk/spm/690254
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