Avatar billede mitbrugernavn Praktikant
31. marts 2003 - 16:56 Der er 11 kommentarer og
1 løsning

formatere tekst fra db - med linieskift

følgende kode skulle gerne udskrive tekst fra database med en streng på 25 karaktere, men det gør den ikke ????
hvorfor ????

nogen der ligger med en kode der laver linieskift ved et mellemrum efter x antal ord ?????

er snart helt grå...


<%
function maxantal(str)
inputStr = str
reDim  arr(0)
str = replace(inputStr,"<br>",vbCrLf)
MaxLength = 25
while (LEN(str)>0)
  splitIndex = InStrRev(str, vbCrLf, MaxLength)
  if splitIndex = 0 then
    splitIndex = InStrRev(str, " ", MaxLength)
    if splitIndex = 0 then splitIndex = LEN(str)
  end if 
  ReDim Preserve arr(UBOUND(arr) + 1)
  arr(UBOUND(arr)) = LEFT(str, splitIndex)
  str = MID(str, splitIndex + 1)
wend
outStr = ""
for i = LBound(arr) to UBound(arr)
  outStr = outStr & arr(i) & vbCrLf
next
outStr = replace (outStr, vbCrLf, "<br>")
maxantal = outStr
end function
%>
<html>
<head>
<!-- #include file="dataopkald.asp" -->
<%
Conn.Open DSN
strSQL = "Select * From billeder"
Set rs = Conn.Execute(strSQL)
%>
</head>
<body bgcolor="#C0C0C0" leftmargin="0" topmargin="0">
<%
Do
%>
        <table width="100%" border="0" cellspacing="0" cellpadding="0" class="txt2" >
          <tr>
            <td width="5%">&nbsp;</td>
            <td width="23%">&nbsp; </td>
            <td width="67%"><%Response.Write maxantal(rs("tekst")) %>
            </td>
            <td width="5%">&nbsp;</td>
          </tr>
</table> 
<%
  rs.MoveNext
Loop While Not rs.EOF
Conn.Close
Set Conn = Nothing
%>     
</body>
</html>
Avatar billede eagleeye Praktikant
31. marts 2003 - 17:27 #1
Ja den ville skrive op til 25 karakter pr linje. Hvad får ud ?  Er der ikke 25 karakter linje?
Avatar billede mitbrugernavn Praktikant
01. april 2003 - 09:44 #2
nej, den skriver glad :-( hele linjen ud, som om den fuldstændig overser funktionen. ????
Avatar billede mitbrugernavn Praktikant
01. april 2003 - 13:54 #3
har forsøgt mig frem og kommet frem til følgende :

<%
dim inputStr, str, MaxLength, splitIndex, outStr
function maxantal(str)
inputStr = str
reDim  arr(0)
str = replace(inputStr,"<br>",vbCrLf)
MaxLength = 20
while (LEN(str)>0)
  splitIndex = InStrRev(str, vbCrLf, MaxLength)
  if splitIndex = 0 then
    splitIndex = InStrRev(str, " ", MaxLength)
    if splitIndex = 0 then splitIndex = LEN(str)
  end if 
  ReDim Preserve arr(UBOUND(arr) + 1)
  arr(UBOUND(arr)) = LEFT(str, splitIndex)
  str = MID(str, splitIndex + 1)
wend
outStr = ""
for i = LBound(arr) to UBound(arr)
  outStr = outStr & arr(i) & vbCrLf
next
outStr = replace (outStr, vbCrLf, "<br>")
maxantal = outStr
end function

%>
<html>
<head>
<!-- #include file="../dataopkald.asp" -->
<%
Conn.Open DSN
strSQL = "Select * From billeder"
Set rs = Conn.Execute(strSQL)
strTekst = "dette stykke tekst skulle gerne dele efter 20 tegn og mellemrum"
Response.write maxantal(strTekst)
%>
</head>
<body bgcolor="#C0C0C0" leftmargin="0" topmargin="0">
<%
Do
%>
        <table width="100%" border="0" cellspacing="0" cellpadding="0" class="txt2" >
          <tr>
            <td width="5%"></td>
            <td width="23%">&nbsp; </td>
            <td width="67%">
            </td>
            <td width="5%">&nbsp;</td>
          </tr>

</table> 
<%
  rs.MoveNext
Loop While Not rs.EOF
Conn.Close
Set Conn = Nothing
%>     
</body>
</html>

så skriver den teksten ud som den skal, men retter jeg denne linie:

strTekst = "dette stykke tekst skulle gerne dele efter 20 tegn og mellemrum"
til
strTekst = rs("tekst")

ref. til tabellen, så skriver den hele teksten ud i en linie og
tager kun første post, looper overhovedet ikke igennem.

??????
Avatar billede eagleeye Praktikant
01. april 2003 - 20:54 #4
I det kode udskriver den kun teksten i strTekst uden at udskrive noget i recordsetet:

strTekst = "dette stykke tekst skulle gerne dele efter 20 tegn og mellemrum"
Response.write maxantal(strTekst)


Prøv at lave koden sådan her:


<html>
<head>
<!-- #include file="../dataopkald.asp" -->
<%
Conn.Open DSN
strSQL = "Select * From billeder"
Set rs = Conn.Execute(strSQL)
%>
</head>
<body bgcolor="#C0C0C0" leftmargin="0" topmargin="0">
<%
Do While Not rs.EOF
%>
        <table width="100%" border="0" cellspacing="0" cellpadding="0" class="txt2" >
          <tr>
            <td width="5%"></td>
            <td width="23%">&nbsp; </td>
            <td width="67%"><% Response.write maxantal(rs("Tekst") %></td>
            <td width="5%">&nbsp;</td>
          </tr>
</table> 
<%
  rs.MoveNext
Loop
Conn.Close
Set Conn = Nothing
%>     
</body>
</html>
Avatar billede mitbrugernavn Praktikant
02. april 2003 - 08:58 #5
Den skriver teksten ud nu, men den springer funktionen over og skriver i en lang linie ???? dette stykke tekst er også skrevet i en kører men håber at den automatisk laver et linieskift.

Virker dit script hos dig?????
Avatar billede eagleeye Praktikant
02. april 2003 - 20:22 #6
Den virker fint her functionen men jeg har også brugt en fast tekst og ikke fra en database. Kan du give et eks på det tekst du hendter fra databasen.
Er der mellemrum i teksten? eller er der _ eller en anden karaker ?
Avatar billede mitbrugernavn Praktikant
03. april 2003 - 09:25 #7
dit svar trøster mig lidt, det fungere også fint hos mig hvis det er fast tekst.

Det skal være som følgende:

En side hvor brugeren indtaster div. oplysninger og et felt med tekst (er i db sat til et notatfelt) og i dette felt er der stor sandsynlighed for at brugeren (incl. mig selv) bare skriver derudaf uden at tænke på at lave linieskift ;-)) - tingene bliver smidt i databasen og kan derefter trækkes ud på ovennævnte side i et felt der har en bestemt bredde, men som kan variere i højden alt efter hvor meget tekst der er. Så der er mulighed for at brugeren indsætter et linieskift, men højest tænkeligt ikke andre karaktere.

Her på eksperten kan man også skrive i en kører og når det vises er der indsat linieskift. Nøjagtig det jeg søger.

Har tænkt på om man skal gøre det inden det bliver smidt i databasen, men så skal bruger nok ikke indtaste et mellemrum eller hva???

Håber at du kan bruge dette til noget.
Avatar billede mitbrugernavn Praktikant
03. april 2003 - 16:32 #8
har fået det til at virke nu, nærmere kode og forklaring imorgen, men kort functionen skal udføres inden den lægges i db, så ryger mellemrum med ind, det eneste problem jeg har nu er at den lægger et <br> ind før teksten starter i db, og den kan jeg ikke knække, det må være noget i funktionen der gør det eller hva????
Avatar billede eagleeye Praktikant
04. april 2003 - 00:50 #9
Hvis du bruger samme function så udvid dette loop:

for i = LBound(arr) to UBound(arr)
  outStr = outStr & arr(i) & vbCrLf
next


Til dettte så den tjekke på om stregne den ligger i er tom.

for i = LBound(arr) to UBound(arr)
  if arr(i) <> "" then
    outStr = outStr & arr(i) & vbCrLf
  end if
next
Avatar billede mitbrugernavn Praktikant
04. april 2003 - 14:31 #10
fandt ud af at funktionen sagtens kan ligge på siden som kalder data ud:

<%
dim inputStr, str, MaxLength, splitIndex, outStr
function maxantal(str)
inputStr = str
reDim  arr(0)
str = replace(inputStr, "<br>", vbCrLf)
MaxLength = 40
while (LEN(str)>0)
  splitIndex = InStrRev(str, vbCrLf, MaxLength)
  if splitIndex = 0 then
    splitIndex = InStrRev(str, " ", MaxLength)
    if splitIndex = 0 then splitIndex = LEN(str)
  end if 
  ReDim Preserve arr(UBOUND(arr) + 1)
  arr(UBOUND(arr)) = LEFT(str, splitIndex)
  str = MID(str, splitIndex + 1)
wend
outStr = ""
for i = LBound(arr) to UBound(arr)
  outStr = outStr & arr(i) & vbCrLf
next
outStr = replace (outStr, vbCrLf, "<br>")
maxantal = outStr
end function

%>
<html>
<head>

<!-- #include file="../dataopkald.asp" -->
<%

Conn.Open DSN

strSQL = "Select * From billeder WHERE webside LIKE 'billed1'"
Set rs = Conn.Execute(strSQL)


%>


<title>1 Billeder</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="stylesheet" type="text/css" href="../../28032003demo/style/style4.css">

</head>

<body bgcolor="#C0C0C0" leftmargin="0" topmargin="0">
<table width="425" border="0" cellspacing="0" cellpadding="0" height="168">
  <tr align="left" valign="top">
    <td colspan="2" class="trprikker" height="168">
      <div id="Layer1" style="position:absolute; width:391; height:20px; z-index:6; left: 6px; top: 5; visibility: visible" class="txt2">
        <div align="center" class="txt5understreg">Billeder 1</div>
      </div>

      <div id="Layer2" style="position:absolute; width:391px; height:112px; z-index:7; left: 6px; top: 32">
        <%
Do
strImagesURL = rs("ImagesURL")
strImagesURL = "<img src='" & strImagesURL & "'>"
strTekst = rs("tekst")

strTekst = maxantal(strTekst)
strTekst = Trim(strTekst)
%>



        <table width="100%" border="0" cellspacing="0" cellpadding="0">
          <tr>
            <td height="18">&nbsp;</td>
          </tr>
        </table>
        <table width="391px%" border="0" cellspacing="0" cellpadding="0" class="txt2" >
          <tr>
            <td height="14" colspan="2"><%=strImagesURL%></td>
          </tr>
          <tr>
            <td height="9" colspan="2">&nbsp; </td>
          </tr>
          <tr>
            <td width="50">&nbsp; </td>
            <td class="txt2"><%=strTekst%></td>
          </tr>
          <tr>
            <td colspan="2">&nbsp;</td>
          </tr>
          <%

  rs.MoveNext
Loop While Not rs.EOF

Conn.Close
Set Conn = Nothing
%>
        </table>
      </div>
    </td>
  </tr>
</table>
</body>
</html>

det er vist det nemmeste.

Mennnnn hvis en bruger på formular siden indtaster f.eks 1000 tegn uden mellemrum, så har jeg et ny problem på udskrifssiden, smider de 1000 tegn i en smørre ;-(((. Løsningen må være en funktion der automatisk indsætter et mellemrum hvis noget er over 20 tegn og denne funktion kan så ligge på opdateringssiden eller hva'????

Og har du løsningen til sådan en lille smart funktion ??
Avatar billede eagleeye Praktikant
07. april 2003 - 19:21 #11
Det er lavet på en anden måde men denne function gør det + det andet:



inputStr = "Noget test med mange dhdhdhdhdhdhdhdhdhdhdhdhdhdhhdhddhdhfsdgsdfgsdfgsdfgsdfgsdfgsdfgsdfgsdf tegn"


ConstmaxCharPrLine = 20
charPrLine = 0 'Counter
i = 1 'Counter
outStr = ""
inputStr = replace (inputStr,"<br>", vbCrLf)
do while len(inputStr) > 0
  if len(inputStr)>maxCharPrLine then
    maxCharPrLine = ConstmaxCharPrLine
  else
    maxCharPrLine = len(inputStr)
  end if
  indexBR = inStr(1,inputStr, Chr(10)) 'Tjek for return
  if indexBR = 0 then 'ingen return
      indexMM = inStrRev(inputStr," ",maxCharPrLine)
      if indexMM = 0 then 'Tjek om der ingen mellemrum er i ordet
        indexMM = maxCharPrLine
        outStr = outStr & Left(inputStr,maxCharPrLine)
        if (len(inputStr) > maxCharPrLine) then
          outStr = outStr & "-" & vbCrLf
        end if
      else
        outStr = outStr & Left(inputStr,indexMM) & vbCrLf       
      end if
      indexBR = indexMM
  else
    if indexBR > maxCharPrLine then 'tjek om der er flere tegn end tilladt
      indexMM = inStrRev(inputStr," ",maxCharPrLine)
      if indexMM = 0 then 'Tjek om der ingen mellemrum er i ordet
        indexMM = maxCharPrLine
        outStr = outStr & Left(inputStr,maxCharPrLine) & "-" & vbCrLf
      else
        outStr = outStr & Left(inputStr,indexMM) & vbCrLf
      end if
      indexBR = indexMM
    else
      outStr = outStr & left(inputStr,indexBR)
    end if
  end if
  inputStr = mid(inputStr,indexBR+1)
  i = i + 1
  if i = 50 then inputStr = ""
loop


outStr = replace (outStr, vbCrLf, "<br>")
Response.Write outStr
Avatar billede mitbrugernavn Praktikant
08. april 2003 - 13:28 #12
Havde fået det til at virke med 2 funktioner, men er også helt fin og mere overskuelig.

Tak for hjælpen.
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
Kurser inden for grundlæggende programmering

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