Jag har en nyhetssida där jag vill hämta in de 5 semaste nyheterna ur en acess-databas. Den första nyheten skall skrivas ut i sin helhet medan de andra bara ska skrivas ut med rubrik och ett givet antal tecken ur själva texten. Hur löser jag detta? Om jag förstått dig rätt borde något i stil med detta fungera. Om man skall göra något för första raden enbar är det DUMT att lägga en if sats. Bättre att skriva: Hej! Så här blev lösningen: För att kolla om den avkapade posten har text kvar kan du använda funktionen Sven skrev här ovan >>Andreas Hillqvist Andreas Hillqvists script kan nog inte bli bättre, men det gäller ju att du använder det på rätt sätt. Har du öppnat din anslutning? Koden förutsätter ett ADODB.Connection objekt öppnat och tilldelat conn variablen.Skriva ut de första x-antal tecknen ur vissa poster
Alla lösningar jag hittat har riktat in sig på sql, typ:
"SELECT LEFT(fltText,100) AS fltTextLeft, fltNID, fltHeader, fltDate FROM tblNews ORDER BY fltDate"
men det funkar ju inte i detta fallet eftersom fösta posten skall skrivas ut heltSv: Skriva ut de första x-antal tecknen ur vissa poster
SELECT TOP 5 [fält] FROM ... ORDER BY ...
rad = 1
do while not rs.EOF '(rs är ditt recordset alltså)
if rad = 1 then
' först nyheten, skriv ut allt.
Response.Write(rs("RUBRIK"))
Response.Write(rs("TEXTEN"))
rad = 2
else
'Resten av nyheterna
Response.Write(rs("RUBRIK"))
'Skriver ut de 30 första tecknen i texten
Response.Write( Left(rs("TEXTEN"),30) )
end if
rs.movenext
loopSv:Skriva ut de första x-antal tecknen ur vissa poster
<%
Dim fltNID
Dim fltDate
Dim fltHeader
Dim fltText
Set rs = CreateObject("ADODB.Recordset")
rs.Open conn, "SELECT fltText, fltNID, fltHeader, fltDate" & vbCrLf & _
"FROM tblNews" & vbCrLf & _
"ORDER BY fltDate"
If rs.EOF Then
Response.Write "Finns inga nyheter!"
Else
Set fltNID = rs("fltNID")
Set fltDate = rs("fltDate")
Set fltHeader = rs("fltHeader")
Set fltText = rs("fltText")
' först nyheten, skriv ut allt.
Response.Write fltDate & " - " & Server.HTMLEncode(fltHeader) & "<BR>" & vbCrLf
Response.Write Server.HTMLEncode(fltText.Value)
rs.MoveNext
'Resten av nyheterna
Do Until rs.EOF
Response.Write fltDate & " - " & Server.HTMLEncode(fltHeader) & "<BR>" & vbCrLf
If fltText.ActualSize > 30
Response.Write Server.HTMLEncode(Left(fltText.Value, 30)) & "..."
Else
Response.Write Server.HTMLEncode(fltText.Value)
End If
rs.movenext
Loop
End If
rs.Close
%>
Sv: Skriva ut de första x-antal tecknen ur vissa poster
Här har du en funktion som du anropar där du vill ha den avkortade texten stå.
Funktionen tar två argument: texten och hur många tecken som ska visas.
Funktionen ser också till att avkapningen inte sker mitt i ett ord samt att den lägger till tre punkter för att visa att texten egentligen är längre.
<%
Function shorten(txt,n)
result = Left(txt,n)
lastspacePos = InStrRev(result," ")
result = Left(result,lastspacePos)
shorten = result & " ..."
End Function
texten = "Ett oscilloskop är ett instrument som kan visa hur en spänning förändras med tiden. Traditio-nella oscilloskop är relativt stora instrument som använder ett katodstrålerör som display precis som TV-apparater och CRT-bildskärmar. CRT står just för Catode Ray Tube (katodstråle-rör). Därför blir också instrumentet stort."
Response.Write(texten & "<hr />")
Response.Write(shorten(texten,50)) 'Här anropas funktionen med variabeln "texten" och 50 tecken
%>
//SvenneSv: Skriva ut de första x-antal tecknen ur vissa poster
SQL:
SELECT TOP 5 * FROM tabell WHERE fKategori ='nyheter' ORDER BY fDatum DESC
(visar inte den sista posten, den plockas fram för att scriptet ska veta om den ska visa "alla nyheter"-länken)
Första posten skrivs ut för sig för att underlätta en lite annan designlösning på den. Sedan loopar jag resterande poster så här:
<code>
<%For i = 1 To 3
if not rs.EOF then%>
<%If rs("fBeskrivning")<> "" Then%>
<small><%=rs("fDatum")%></small><br>
<strong><%=rs("fBeskrivning")%></strong>
<%Else%>
<strong>Update: <%=rs("fDatum")%></strong>
<%End If%>
<br>
<%text = rs("fText")
Text = Replace(Text,vbcrlf,"<br>" & vbCrLf)%>
<%Text = left(Text,90)
Text = Text & "..."%>
<%= Text %>
<br>
<small>Update by: <%=rs("fUppdateratAv")%></small>
<br><br>
<%rs.MoveNext%>
<%Else%>
<% exit for%>
<% End If %>
<%Next%>
<%End If%>
<%If not rs.EOF then%>
All news»
<%End If%>
</code>
Nu undrar jag om det finns något sätt att avläsa ifall den aktuella avkapade posten har text kvar, så att scriptet vet om det ska skriva ut "..." + en länk för att ta besökaren till den fullständiga nyheten.Sv:Skriva ut de första x-antal tecknen ur vissa poster
<%
Function shorten(txt,n)
result = Left(txt,n)
lastspacePos = InStrRev(result," ")
result = Left(result,lastspacePos)
'Kollar om texten är längre än antalet tecken du vill visa
if len(txt) > n then
result = result & " ..."
end if
shorten = result
End Function
%>
Sen skulle jag rekommendera att du skriver din kod enligt sättet Andreas angav här ovan, det känns lite smidigare.
Sv: Skriva ut de första x-antal tecknen ur vissa poster
Jag får inte din kod att fungera alls. Det känns som att det saknas en hel del saker i koden, exempelvis ett "then" i if-satssen. Hur jag än gör så skriker scriptet ifrån att det saknas objekt.Sv:Skriva ut de första x-antal tecknen ur vissa poster
"Allting rätt, som används fel blir ju galet..."
<code>
sText = "Men vad tror du att detta skall kunna bli om du inte gör någonting för att det skall bli
någonting?"
response.write shorten(sText,15)
</code>Sv:Skriva ut de första x-antal tecknen ur vissa poster
Att koden inte fungerar alls kan bero på att jag inte kört koden utan skrivit den för att ge insperation.
Koden visar upp några principer.