Anzahl von Elementen mit Bedinung anzeigen

2 Probleme:
1.)
Ich habe folgenden Code:

Code:
set RSnumber = conn.execute ("select count(*) as 'Anzahl' from News where Datum < " _
& date)

Anzahl = RSnumber(0)

Wie man sieht, will ich die Anzahl aller Elemente bekommen, deren Datum größer als das aktuelle ist. Allerdings bekomme ich folgenden Fehler:

Code:
Microsoft JET Database Engine Fehler '80040e14' 

Syntaxfehler in Zahl in Abfrageausdruck 'Datum < 27.01.2004'. 

/events.asp, line 31

Hat jemand ne Idee wie man das lösen könnte?


2.) Wie sortiere ich in einer Datenbank (MS Access nach Datum und Uhrzeit, wenn es zwei unterschiedliche Felder sind?

Code:
set RSNews = server.createobject ("adodb.recordset")
	set RSNews = conn.execute("select Headline, Datum, Uhrzeit, Ort, Typ, Teaser, Top from News order by Datum")

==> funktioniert einwandfrei, sortiert wie gewünscht nach Datum

Code:
set RSNews = server.createobject ("adodb.recordset")
	set RSNews = conn.execute("select Headline, Datum, Uhrzeit, Ort, Typ, Teaser, Top from News order by Uhrzeit")
==> funktioniert so auch gut, sortiert halt jetzt nach Uhrzeit

Code:
set RSNews = server.createobject ("adodb.recordset")
	set RSNews = conn.execute("select Headline, Datum, Uhrzeit, Ort, Typ, Teaser, Top from News order by Datum AND Uhrzeit")

Funktioniert nicht - gibt mir anscheinend zufällige Elemente zurück.

Der Hintergrund ist ein Newssystem für Events - das von einer Redaktion gehandelt wird. D.h. Trägt Person a ein Event für Tag x um 22 Uhr ein und Person für Tag X ein Event um 23 Uhr, dann wird das, sortiert man anch Datum, sogar in der Uhrzeit Reihenfolge angezeigt. Wird aber das 23 Uhr Elemtn zuerst eingegeben, und dann das 22 Uhr Element, sind sie nicht in Order.

Ist die einzige Möglichkeit jetzt, für jeden Tag ein eigenes Recordset zu bauen, das halt der Form 'where Datum = date + x order by Uhrzeit' ist?
 
Zuletzt bearbeitet:
Als Lösung zu 1)

Das Datum in einfache Anführungszeichen setzten.
Also:
WHERE Datum < '" & date & "'"

Bei 2) wird beim Sortieren das Datum und die Zeit mit einem logischen UND verknüpft und dann erst sortiert. Darum die "zufällige" Reihenfolge.
Man könnte den Einträgen einen Key mit autoincrease geben und nach dem sortieren. Oder soweit ich mich erinnere anstatt dem AND ein komma (,) setzen. Habs nicht ausprobiert.

Was vielleicht auch geht, ist das Datum und die Uhrzeit zu addieren (Datum + Zeit) Das sollte gehen, da vielfach die Tage als ganze Zahl seit einem Datum (z.b. 01.01.1900) gespeichert werden und die Uhrzeit dann im Bruchteil.. also .5 wäre so ca. Mittag.

Übrigens gibt es sicher einen Datentypen in der Datenbank, der beides (Uhrzeit und Datum) gleichzeitig enthält.
 
Hi

zu 1)
es reicht, wenn Du schreibst

where Datum >= Date()
oder
where Datum > Date()

where Datum <= Date()
oder
where Datum < Date()


Jetzt bleibt natürlich die Frage, ob Du größer oder kleiner meinst. Du schreibst größer, das Statement wird aber auf kleiner gecodet. Nu, musst du wissen, Zeichen < oder > bzw. <= oder >= kennst Du ja ;)

zu 2)
für Dein 2. Problem würde ich den Default-Wert fürs Datumsfeld beim Insert in Access auf now() setzen. Dann hast auch keine Probs. im order by
 
Zuletzt bearbeitet:
So, hab beides gelöst:

Für Problem eins hat die Lösung von Luzie geholfen:

Code:
("select count(*) as 'Anzahl' from News where datum >= date() ")

das mit den Anführungszeichen von Ste hat leider nicht geklappt.

Und für Problem zwei geht der Punkt an ste, das mit dem Komma ist die Lösung:
Code:
from News order by Datum, Uhrzeit



Vielen Dank nochmal!
 
So, neue Frage

So, neue Frage:

Ich habe eine Datenbank, in der mehrere Galerien und die Adressen u den einzelnen Bildern gespeichert sind. Das sind 2 Tabellen. Wenn ich mir jetzt die Bilder (die ja jeweils Teil einer Galerie sind, also eine Bild-ID und eine dazugehärige GaleryID haben) anzeigen lasse, dann mache ich das über folgendes Statement:

Code:
Dim strProvider
   strProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
Dim strDatabase
   strDatabase = "DATA SOURCE=" & Server.MapPath ("./") & "\dbank\main.mdb;"
Dim strComplete
   strComplete = strProvider & strDatabase
Set conn = Server.CreateObject("ADODB.Connection")
conn.open strComplete

set RSPhoto = conn.execute ("select ID, name, galleryid, angesehen, frei from Photos where " _
								& "ID = " & Request.QueryString("ID") & " and " _
								& "galleryid = " & Request.QueryString("Galleryid") & "" )

Um dann per Button 'Weiter' auf das nächste Bild innerhalb der Galerie zu springen, nutze ich folgenden Code:

Code:
set RSfindnext = conn.execute ("select ID, name, galleryid, frei from Photos where " _
								& "ID > " & Request.QueryString("ID") & " and " _
								& "galleryid = " & Request.QueryString("Galleryid") & "" )

Ich lasse also nach dem nächsten Bild suchen, das nach dem aktuellen die gleiche GalleryID hat. Ich kann nicht einfach über ein MOVE.NEXT gehen, da die Bilder nicht unbedingt in einer Reihenfolge pro Galerie gespeicher werden, daher lass ich nach dem nächsten suchen. Das ganze ist eine Access Datenbank, die ich (zumindest weiß ich irgendwie nicht wies anders geht) nur vorwärts lesen kann.

Die Frage ist jetzt: Wie kann ich den Code für 'Vorheriges Bild' gestalten? Ich kann ja nicht einfach das Bild vor dem aktuellen Element nehmen, da ja nicht sicher gestellt ist, das das noch zur gleichen Galerie gehört.
Wenn ich jetzt einfach das größer in ein kleiner verwandle
Code:
& "ID < " & Request.QueryString("ID") & " and " _
, dann zeigt er mir das erste Bild in der Tabelle, das der entsprechenden Galerie angehört, an - nicht jedoch das Bild, das direkt vor dem aktuellen ist.

Ich hab dann mal was versucht nach der Art:

*öffne Tabelle*
*suche nach erstem Bild der Galerie*
*wenn erstesBild.Nachfolger = aktuellesBild dann zeige erstes Bild, sonst geh weiter*

bzw
Code:
' currentID = Request.Querystring("ID")
' dim match
' match = "false"
' dim lastfound
' Do until match = true
' 	set RSfindnext = server.createobject ("adodb.recordset")
' 	set RSfindnext = conn.execute ("select ID, name, galleryid, frei from Photos where " _
' 	                                     & "galleryid = " & Request.QueryString("Galleryid") & "" )
' 	                                     nur Testausgabe hier: response.write RSfindnext("ID")
' 	justfound = RSfindnext("ID")
' 	if justfound = currentID then
' 	match = true
' 	else
' 	lastfound = RSfindnext("ID")
' 	end if
' loop

aber das hat auch noch nicht so richtig funktioniert.

Hat jemand ne Idee?
 
Zuletzt bearbeitet:
Ja, so ungefähr. Also mehrere Galerien, und jedes Bild wird einer bestimmten Galerie zugeordnet. Daher zwei Tabellen: Eine 'Galleries' und eine 'Photos'.
Galleries hat folgendes Design:
ID (Autowert) | Galeriename(text) | Ort(text) | Datum(date) | frei(t/f)

Photos folgendes:

ID (Autowert) | dateiname (text) | galleryID (Number) | öffentlich (t/f)


Also ist bei jedem Bild in der Tabelle 'Photos' die GalleryID der Verweis auf die AutoID einer Galerie in der 'Galleries' Tabelle.

Photos werden nicht pro Galerie in einer Reihenfolge abgelegt, daher kann ich nicht einfach über RS.MovePrevious oder RS.MoveNext gehen, sondern muss erst das nächste Bild mit der gleichen galleryID - also das nächste Bild aus der gleichen Galerie suchen.

Jetzt deutlicher geworden?
 
Jo und genauso ist dies auch gemacht.

Die Thumbs werden in dem Falle dem Bericht zugeordnet, käme Deiner Gallerie gleich. Die ID für den Bericht liegt mit in der Tabelle, wo sich sich Bilder befinden. Diese ID wird immer mit übergeben, über jeden Link und wird immer in der SQL mit ausgelesen. Es ergibt sich immer ein Packetchen der entspr. Gallerie. Das Script ist vom Aufbau ähnlich wie Deines. Ich häng es Dir mal an. Vielleicht wirds Dir dann klarer. Für den vor- bzw. zurückLink gebe ich immer eine Variable mit, die in dem Falle die dazugehörige SQL auswählt.
 

Anhänge

  • show.txt
    3,5 KB · Aufrufe: 42
Code:
if prev then
	sql = "select * from tbl_bilder where bdokID=" & b_dokID & " and ID < " & ID & " order by ID
	DESC"
Ich nehme mal an, das das hier der Part des 'zurückgehens' in der Liste ist, oder? Du nimmst also alle Bilder vor der ID, sortierst sie DESC und damit hast Du das Bild, was dem aktuellen praktisch 'am nächsten' ist als aktuelles Element, oder?
Danke, werd ich nachher gleich mal ausprobieren.


So, dann wäre das mit der Bildnavigation auch erledigt ;) .



Andere Frage: Ich habe ein uploadscript aus dem Buch 'Tobias Weltner - Active Server Pages lernen und beherschen', was völlig ohne extra Tools auskommt, ziemlich einfach gestaltet ist und mir von der Funktion eigentlich auch schon genügt. Ich weiß nicht, wie das mit den Rechten ist, daher werde ich dieses Script hier erstmal auch nicht komplett posten, sondern nur den Part, der meiner Meinung anch relevant für mein Problem ist:

Ich will durch dieses Script Bilder hochladen lassen, d.h. das Script auf jpgs und gifs begrenzen.

Nun gibt es in der Stelle einen Teil, der sich Dateinamen-finden nennt:
Code:
' Dateinamen finden:
			startpos = InstrRev(headerdata, "filename=")
			startpos = Instr(startpos, headerdata, """")
			endpos = Instr(startpos+1, headerdata, """")
			filename = mid(headerdata, startpos+1, endpos-startpos-1)
			if filename = "" then
				%><p><i>Es wurde kein Dateiname angegeben!</i></p><%
				Response.End
			end if

(Mal generell: Normalerweise würde ich die Frage jetzt nicht stellen, sondern einfach nur per Trial and Error vorgehen. Komischerweise aber läuft das Script nicht auf meinem Rechner (dllhost wird immer größer und der aktuelle IIS Teil stürzt praktisch ab (hab auf Isolierung gestellt, damit mir IIS nicht komplett abkratzt), sondern nur auf dem Server, auf den ich schon die fertigen Scripte hochlade. Da ich aber da nicht zuviel Müll machen will oder irgendwie den Server abschießen will, will ich lieber hier ein theoretisches Trial and Error machen).

Also, um jetzt nach der Dateiendung zu scannen, müsste ich jetzt doch einfach über etwas wie
filelength = len(filename) die größe des Namens rausbekommen, und dann sowas wie
Code:
if filename[filelength - 4] = . and filename[filelength - 3] = j and filename[filelength - 2] = p and filename[filelength - 1] = g then
eingeben, um die letzten 4 Elemente auf .jpg oder auf .gif zu scannen, oder?
 
eigentlich brauchst Du doch nur die letzen 4 Zeichen rechts auszulesen. Das geht mit der Funktion right(string,Zahl)

<%
dim a, b
a = LCase("meinfilename.JPG")
b = right(a,4)
if b = ".jpg" then
response.write "korrekt!"
else
response.write "falsch!"
end if
%>
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück