Blog
Dateien tabellarisch ausgeben
Am Freitag habe ich versprochen, ich verrate, wozu man das neue Tag table nutzen kann. Wozu braucht man die interne Tabellennummer einer Datenbank? Zum Zugriff auf diese natürlich. Nun muss ich zugeben, dass man das durchaus auch mit Bordmitteln hätte lösen können, aber wenn man auf eine Tabelle zugreifen möchte, von der man nicht weiß, ob sie bereits geöffnet ist, ist das etwas Aufwand. Das table-Tag macht das schlicht einfacher.
Ein Beispiel:
Angenommen ich habe bei eforia einige Dateien, die ich direkt als Tabelle zum Download anbieten möchte. Mit einem kleinen Script ist das schnell erledigt. Dieses Beispiel greift hier auf die Echtdaten zu. Ich gebe alle Dateien aus, die in eforia mit "presse/" gespeichert sind. Das Resultat sieht so aus:
Und der Code dafür ist:
<table width="100%">
<tr>
<td><b>Datum</b></td>
<td><b>Name</b></td>
<td><b>Download</b></td>
</tr>
{execprog} var fhAusgabe,nEL,nEL2 : integer var db,nRec : integer var cELFiles : string[99999,1] var cTemp : string setpara('ec 0') fhAusgabe:=Rewrite('ramtext:out',0)
db:={[9]table:cms_files} Access(db,'cms_files.id') nEL:=0 nRec:=FindRec(db,'presse/','cms_files.id') While nRec>0 Do ReadRec(db,nRec) If GetField(db,'Name') like 'presse/*' then cELFiles[nEL,0]:=GetField(db,'Name') cELFiles[nEL,1]:=GetField(db,'Dateidatum') nEL++ nRec:=NextRec(db) Else nRec:=0 End End
StrSort(cELFiles,nEL-1,0,'0')
nEL2:=0 while nEL2<nEL do writeln(fhAusgabe,'<tr>') writeln(fhAusgabe,'<td>'+cELFiles[nEL2,1]+'</td>') cTemp:=cELFiles[nEL2,0] cTemp:=cTemp[length('presse/')+1,255] writeln(fhAusgabe,'<td>'+tohtml(cTemp)+'</td>') writeln(fhAusgabe,'<td><a href="{[4]file="'+cELFiles[nEL2,0]+'"}" target="_blank">Download</a></td>') writeln(fhAusgabe,'</tr>') nEL2++ end
setpara('ec 1') close(fhAusgabe)
{/execprog}
</table>
Wie man sieht, öffne ich die Tabelle noch ganz einfach in Standard-HTML-Code. Nur die Zeilen werden dann per Execprog-Script eingefügt. Die Datenbank wird mit {table:cms_files} abgefragt. Die Ermittlung der Datensätze und die Ausgabe sind 2 Schleifen. Das hat einfach den Sinn, dass man dazwischen noch beliebig sortieren kann.
Selbstverständlich könnte man dafür auch ein eigenes Modul machen. In der Praxis ist aber jede Ausgabe immer wieder ein wenig anders. Da ist es schön einfach das kleine Code-Schnippsel schnell und direkt anpassen zu können.
Dieser Artikel wurde veröffentlicht am 15.02.2010 um 09:52 Uhr.
Noch kein Kommentar.
Execprog
Irgendwie ist es manchmal zu aufwendig, für kleine Aufgaben extra ein eigenes Modul zu schreiben. Mit der if-Abfrage alleine kommt man aber auch nicht weiter. Also dachte ich zuerst, ich integriere Tags um Variablen zu definieren und Schleifen zu ermöglichen. Aber so richtig Übersichtlich ist das nicht, außerdem wäre es alles andere als schnell. Da fiel mir eine sehr, sehr alte Funktion der tdbengine ein: Execprog. Damit wird ein Stück Quellcode zur Laufzeit übersetzt und ausgeführt. Darum dann flugs einen Tag gebastelt:
Beispiel:
{execprog}
var fhAusgabe : integer
fhAusgabe:=Rewrite('ramtext:out')
writeln(fhAusgabe,'hallo welt')
close(fhAusgabe)
{/execprog}
Nachdem man ja nicht direkt an der aktuellen Stelle ausgeben kann, benutze ich einfach ramtext:out. Alles was man in dem Mini-Progrämmchen dorthin ausgibt, wird nach Beendigung an der aktuellen Stelle eingefügt.
Mit Variablen muss man ein wenig aufpassen, man kann eforia-Eigene nämlich auch überschreiben. Insgesammt ist die Funktion sehr mächtig, man sollte also wissen was man tut. Bei Compiler-Fehlern im Programm wird das Problem angezeigt, man muss also nicht ganz "blind" arbeiten.
Wo ist nun der Sinn?
Beispielsweise kann man in einem RSS-Feed Tags ausgeben. Allerdings einzeln in einer besonderen Weise. Intern gespeichert werden die Tags aber in einem Feld. Das muß man also etwas "umbauen". Das geht dann so:
{execprog} var fhAusgabe : integer var cTags,cTemp : string cTags:=getfield(cms_web,'Tags') fhAusgabe:=Rewrite('ramtext:out',0) while cTags#'' do write(fhAusgabe,'<category><!--[CDATA[') if pos(' ',cTags)>0 then cTemp:=cTags[1,pos(' ',cTags)-1] cTags:=cTags[pos(' ',cTags)+1,255] else cTemp:=cTags cTags:='' end write(fhAusgabe,cTemp) writeln(fhAusgabe,']]--></category>') end close(fhAusgabe)
{/execprog}
Ein Nachteil sei noch erwähnt: Der Programmcode muss im Quelltextmodus eingegeben werden. Sonst stören HTML-Codes für Zeilenumbrüche oder Leerzeichen. Hier muss ich mal einen neuen Button im Editor einbauen, der das dann so macht wie jetzt die Javascript oder PHP-Bereiche. Allerdings hat das keine hohe Priorität, weil ich es hauptsächlich für Vorlagen verwenden werde.
Dieser Artikel wurde veröffentlicht am 19.11.2008 um 17:24 Uhr.
3 Kommentare.
Zeige 1 - 2 von 2
|
|
Hier bloggt Horst Klier mit und über eforia web manager und was dazugehört (HTML, Javascript, Internet, Webdesign, Such- maschinenoptimierung, usw.).
Übersicht über alle Beiträge
|