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:

Datum Name Download
08.08.2005 ewm_box.zip Download
08.05.2003 ewm_logo.zip Download
17.11.2005 halloween Download
21.03.2006 ostern Download
08.08.2005 screenshots.zip Download
17.11.2005 xmas Download


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.).

>> Zur Blog Startseite

RSS-Feed
abonnieren


Übersicht über alle Beiträge



eforia® ist ein eingetragenes Markenzeichen.
Alle anderen Marken und Markenzeichen gehören Ihren jeweiligen Besitzern.
Letzte Aktualisierung dieser Seite: 03.03.2024 / 15:59:55
Suche  
Login / Userdaten
Impressum/Datenschutz