Avatar billede hnto Nybegynder
23. februar 2006 - 00:30 Der er 14 kommentarer og
1 løsning

samling af linier

Hej Eksperter.

Jeg har et felt i en access database hvor der står noget tekst der er delt over flere linier. Indholdet i feltet kan variere i antallet af linier. Record 1 kan feks bestå af 3 linier som vist i mit eksempel nedenfor. Andre felter kan have op til måske 50 linier i feltet.

Eks:
[felt1]
bilen er rød
den kan køre stærkt
med dette er også farligt

Spørgsmål:
Jeg ville gerne at teksten først blev placeret på én samlet  linie. Det vil sige udskifte linebreaket med en backtab

Eks:
bilen er rød den kan køre stærkt med dette er også farligt


Dernæst ville jeg gerne lave en ombrydning af denne nye "1 linie" tekst således at der fra højre mod venstre blev talt karakterer, og efter hver 80' ende karakterer blev indsat et linebreak. Hvis linebreaket sker midt i et ord skal den ombryde teksten lige for det ord der normalt ville være blevet brudt således jeg ikke har en forkert orddeling.

eks.
det er dejligt vejr i dag, og solen...bla bla...når månen kommer

Lad os antage at karakter nr 80 = "å" i ordet "månen".
Da ville koden normalt bare ombryde til:

det er dejligt vejr i dag, og solen...bla bla...når må
nen kommer

HEr er det den skal tage højde for dette og ombryde lige for ordet således det bliver til:

det er dejligt vejr i dag, og solen...bla bla...når
månen kommer

NB.
Da der jo kan være mange linier oprindeligt og dermed også mange karakterer, skal koden kunne "tælle" de 80 mere end 1 gang.
Det vil sige at den starter fra højre i 1-linieteksten og bryder efter 80 (hvis dette ikke er midt i ordet..) dernæst tæller den igen 80 og bryder osv....

Jeg ville gerne give mere en 200 point men det er jo ikke længere muligt ;-(( Håber alligevel der er en sjæl der vil hjælpe mig om muligt...
Avatar billede tjp Mester
23. februar 2006 - 03:05 #1
Måske kan du bruge nedenstående funktion som udfører og returnerer det ønskede i VBS (ok, den tilføjer delestreger, når linjeskift ikke er mulig på anden måde, men ellers... *S*). Den kaldes med den ønskede tekst og linjelængde, fx 'nytekst = MakeLineShift(gltekst, 80)':

Function MakeLineShift (txt, lineLength)
  tmp = Replace(txt, vbNewLine, " ")
  iLen = Len(tmp)
  iCount = 1
  iOldLength = lineLength
  newStr = ""
  line = ""
  While (iCount + lineLength) < iLen
    iLastSpace = InStrRev(tmp, " ", iCount + lineLength)
    If iLastSpace > iCount Then
      lineLength = iLastSpace - iCount+ 1
    Else
      line = "-"
    End If
    newStr = newStr & Mid(tmp,iCount,lineLength)& line & vbNewLine
    iCount = iCount + lineLength
    lineLength = iOldLength
    line = ""
  Wend
  newStr = newStr & Mid(tmp, iCount, lineLength)
  MakeLineShift = newStr
End Function
Avatar billede hnto Nybegynder
23. februar 2006 - 08:37 #2
øhh..
Nu er jeg ikke lige hardcore programmør ;-)

Hvis nu jeg siger at Databasen hedder EMK, og tabellen hedder MASTER og feltet hedder ARTIKELTEKST.
Hvad bliver det resulterende script så ?

NB.
Når du skriver VBS er det Visual BAsic Studio eller ??, og hvis det er VBS kender access så de samme funktioner ?

Hilsen Novisen...
Avatar billede -anders- Juniormester
23. februar 2006 - 10:06 #3
Prøv at oprette en forspørgsel og med tag feltet ARTIKELTEKST. i en tom kolonne i denne forsprøgsel (´designvisnin)skal du skrive nedenstående:

Info: Erstat([ARTIKELTEKST];Chr(13)+Chr(10);" ")

Altså Info er et beregnet udtryk hvor du benytter Funktionen Repalce (Erstat)til at finde alle linjeskift og sætte teksten på en lang række. For hvert linjeskift kommer der så et mellem i teksten det er denne "" der gør det. Måske det er det du er ude efter ?
Avatar billede -anders- Juniormester
23. februar 2006 - 10:09 #4
Den med at tælle karakterer og yderlige ombrydning af teksten har jeg desværre ikke noget bud på, men ovenstående er testet og virker
Avatar billede hnto Nybegynder
23. februar 2006 - 10:10 #5
Ja dette var step 1 altså det at få alle linier ombrudt til en.
Men det er step2 der virkelig giver "kvaler". ;-)
Avatar billede hnto Nybegynder
23. februar 2006 - 10:11 #6
Denne kender jeg godt fra et tidligere stillet spørgsmål ;-)
Avatar billede -anders- Juniormester
23. februar 2006 - 10:14 #7
Okay se venligst bort fra mit svar, håber du for en masse gode indlæg :o)
Avatar billede supertekst Ekspert
23. februar 2006 - 12:49 #8
I koden optræder der 3 tabelfelter, som er defineret som Notat-felt.

Option Compare Database
Private Sub Kommandoknap6_Click()  'udfør redigering
Dim p, linie As String, part, ix, uRed As String
    linie = ""
    uRed = [Uredigeret]
   
    [Redigeret] = ""
    [linie80] = ""
   
    While InStr(uRed, vbCrLf) > 0
        p = InStr(uRed, vbCrLf)
        If p > 0 Then
            linie = linie + Left(uRed, p - 1) + " "
            uRed = Mid(uRed, p + 2)
        End If
    Wend
   
    [Redigeret] = linie + uRed
   
    While Len([Redigeret]) > 80
        ix = 80
   
        While Mid([Redigeret], ix, 1) <> " "
            ix = ix - 1
        Wend
       
        [linie80] = [linie80] + Left([Redigeret], ix) + vbCrLf
        [Redigeret] = Mid([Redigeret], ix + 1)
    Wend
   
    [linie80] = [linie80] + [Redigeret]
End Sub
Avatar billede hnto Nybegynder
23. februar 2006 - 13:45 #9
supertekst:

Hvis din kode skal fyres af i et modul, skal der så ikke være nogen form for reference til tabeller eller felter hvor koden skal "slå igennem" ?
Avatar billede supertekst Ekspert
23. februar 2006 - 16:16 #10
Hej hnto

Der er oprettet en formular på basis af tabellen, hvorpå der også er en knap, ved klik på knappen udføres koden.

Er du interesseret i hele DB'en - så send en mail til pb@supertekst-it.dk

Mvh
Avatar billede hnto Nybegynder
23. februar 2006 - 16:36 #11
send den venligst til atoftgaard@mail.dk

MB
rename filen til txt aht til firewall
Avatar billede fdata Forsker
23. februar 2006 - 20:50 #12
Har ikke tjekket superteksts kode; men hvis den fungerer skal headeren vel bare ændres til:

Private Sub RedigerLinie(Uredigeret as String)
  Dim p, linie As String, part, ix, uRed As String
  Dim Redigeret as string, Linie80 as String

... altså droppe formularen.

Så burde du kunne bruge
  Felt1Redigeret: RedigerLinie([Felt1])
i en forespørgsel
Avatar billede hnto Nybegynder
24. februar 2006 - 08:50 #13
jeg har også i mellemtidenm fået en af vore programmører til at kigge å opgaven og skal derfor teste vedlagte. Det skulle være bulletproof og kemplet.

Function MakeLineShift() '(txt, lineLength)
    Dim rs As DAO.Recordset
    Dim db As Database
    Set db = CurrentDb
    Set rs = db.OpenRecordset("Table1", dbOpenDynaset)
   
    Dim rsFieldName As String
    rsFieldName = "test"
   
    Dim breakLength As Integer
    breakLength = 80
   
    Dim breakIdx As Integer
   
   
    Dim replaceString As String
    replaceString = vbNewLine
       
    While rs.EOF = False
        Dim helelinien As String
        If Len(rs.Fields(rsFieldName).Value) > 0 Then
            helelinien = rs.Fields(rsFieldName).Value
            breakIdx = breakLength
            If Len(helelinien) > breakIdx Then
                While breakIdx < Len(helelinien)
                    If Mid(helelinien, breakIdx, 1) = " " Then
                        Mid(helelinien, breakIdx, Len(replaceString)) = replaceString
                        breakIdx = breakIdx + breakLength
                    Else
                        Dim i As Integer
                        For i = breakIdx To 0 Step -1
                            If Mid(helelinien, i, 1) = " " Then
                                Mid(helelinien, i, Len(replaceString)) = replaceString
                                breakIdx = i + breakLength
                                Exit For
                            End If
                        Next i
                    End If
                Wend
                rs.Edit
                rs.Fields(rsFieldName).Value = helelinien
                rs.Update
                rs.MoveNext
            End If
        Else
            rs.MoveNext
        End If
    Wend
    rs.Close
    db.Close
    Dim res As String
    res = MsgBox("Finished", vbOKOnly)
    Exit Function
   
End Function
Avatar billede hnto Nybegynder
24. februar 2006 - 13:43 #14
små rettelser. Dette wer testet og virker rigtig godt, men som tak for indlæg og tilsendt database fra supertekst kvitterer jeg med point.

Her er dog den resulterende kode jeg internt har fået lavet og som jeg vælger at anvende.

Function MakeLineShift() '(txt, lineLength)
    Dim rs As DAO.Recordset
    Dim db As Database
    Set db = CurrentDb
    Set rs = db.OpenRecordset("table1", dbOpenDynaset)
   
    Dim rsFieldName As String
    rsFieldName = "new"
   
    Dim breakLength As Integer
    breakLength = 80
   
    Dim breakIdx As Integer
   
   
    Dim replaceString As String
    replaceString = vbNewLine
       
    While rs.EOF = False
        Dim helelinien As String
        If Len(rs.Fields(rsFieldName).Value) > 0 Then
            helelinien = rs.Fields(rsFieldName).Value
            breakIdx = breakLength
            If Len(helelinien) > breakIdx Then
                While breakIdx < Len(helelinien)
                    If Mid(helelinien, breakIdx, 1) = " " Then
                        helelinien = Mid(helelinien, 1, breakIdx) & Replace(helelinien, " ", replaceString, breakIdx, 1)
                        breakIdx = breakIdx + breakLength
                    Else
                        Dim i As Integer
                        For i = breakIdx To 0 Step -1
                            If Mid(helelinien, i, 1) = " " Then
                                helelinien = Mid(helelinien, 1, i) & Replace(helelinien, " ", replaceString, i, 1)
                                breakIdx = i + breakLength
                                Exit For
                            End If
                        Next i
                    End If
                Wend
                rs.Edit
                rs.Fields(rsFieldName).Value = helelinien
                rs.Update
                rs.MoveNext
            Else
                rs.MoveNext
            End If
        Else
            rs.MoveNext
        End If
    Wend
    rs.Close
    db.Close
    Dim res As String
    res = MsgBox("Finished", vbOKOnly)
    Exit Function
   
End Function
Avatar billede supertekst Ekspert
24. februar 2006 - 15:52 #15
Jeg takker :-)
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