[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] 

Die Methode Showkalender

Variable, die in den Templates später angezeigt werden sollen, müssen als PUBLIC definiert sein! Wir definieren ein Array paMonth, welches entsprechend der Anzeige 6 Wochen a 7 Tage beinhaltet (paMonth[6,7]). Dieses Array wird dann programmatisch entweder mit einem Leerzeichen oder mit dem HTML-Code des Tages-Buttons gefüllt. Desgleichen geschieht mit den Wochenbuttons im Array paWoche

    PRIVATE pcDatString,pcNewMonJahr, pcMonJahrLabel
    PRIVATE ARRAY paMonth, paWoche
    LOCAL lcButton, lcMonJahr,lnMonth,lnYear,lcRetHtml,;
      ldDatum, ldStart, ldEnd, lcTag, lnWochNr, ldMonStart
    *-- Arrays löschen
    DIMENSION paMonth[1]
    paMonth = .F.
    DIMENSION paWochw[1]
    paWoche = .F.
    *-- Und Dimensionen einstellen
    DIMENSION paMonth[7,6]

    DIMENSION paWoche[6]

Wir lesen die übergebenen Parameter:  

    lcButton  = oWebApp.GetFormVar("Button")
    lcMonJahr = oWebApp.GetFormVar("MonJahr")
    lnMonth   = VAL(SUBSTR(lcMonJahr,1,2))
    lnYear    = VAL(SUBSTR(lcMonJahr,3,4))

und Bestimmung von Start- und Endedatum für die Anzeige der Veranstaltungen je nach gewähltem Button sowie der Festlegung des PUBLIC-Strings pcDatString für die Anzeige auf der HTML-Seite  

    DO CASE
       CASE ALLTRIM(lcButton) = '<'
          *--Rückwärts-Button wurde geklickt
          lnAktMonth  = lnMonth - 1
          lnAktYear   = lnYear
          IF lnAktMonth = 0
             lnAktMonth = 1
             lnAktYear = lnYear - 1
          ENDIF
          ldDatum = DATE(lnAktYear,lnAktMonth,1)
          ldStart = ldDatum
          ldEnd    = ldDatum + (GOMONTH(ldDatum,1) - ldDatum) -1
          pcDatString = CMONTH(ldDatum) + ' ' + ALLTRIM(STR(YEAR(ldDatum)))
       CASE ALLTRIM(lcButton) = '>'
          *--Vorwärts-Button wurde geklickt       lnAktMonth  = lnMonth + 1
          lnAktYear   = lnYear
          IF lnAktMonth = 13
             lnAktMonth = 1
             lnAktYear = lnYear + 1
          ENDIF
          ldDatum = DATE(lnAktYear,lnAktMonth,1)
          ldStart = ldDatum
          ldEnd    = ldDatum + (GOMONTH(ldDatum,1) - ldDatum) -1
          pcDatString = CMONTH(ldDatum) + ' ' + ALLTRIM(STR(YEAR(ldDatum)))
     
       CASE ISDIGIT(lcButton)
          *--Ein Tages-Button wurde gewählt
          lcTag       = STRTRAN(lcButton,' ','0')
          ldDatum = DATE(lnYear,lnMonth,VAL(lcTag))
          ldStart     = ldDatum
          ldEnd    = ldDatum
          pcDatString = ALLTRIM(STR(DAY(ldDatum)))+'. ' + CMONTH(ldDatum) + ' ' + ALLTRIM(STR(YEAR(ldDatum)))
       CASE 'Woche' $ lcButton
          *-- Ein Wochen-Button wurde gewählt
          lnWochnr = VAL(SUBSTR(lcButton,7,1))
          ldMonStart  = DATE(lnYear,lnMonth,1)
          ldDatum     = ldMonStart - DOW(ldMonStart) + 1 + 7*(lnWochNr - 1)
          ldStart     = lddatum
          ldEnd    = ldDatum + 6
          pcDatString = DTOC(ldStart) + " bis " + DTOC(ldEnd)
       OTHERWISE
          *-- Kein Button wurde gewählt (1. Aufruf)
          IF EMPTY(lcMonJahr)
             ldDatum = DATE(YEAR(Date()),MONTH(Date()),1)
          ELSE
             ldDatum = DATE(lnYear,lnMonth,1)
          ENDIF
          *-- Alle Veranstaltungen des Monats anzeigen
          ldStart     = ldDatum
          ldEnd    = ldDatum + (GOMONTH(ldDatum,1) - ldDatum)
          pcDatString = CMONTH(ldDatum) + ' ' + ALLTRIM(STR(YEAR(ldDatum)))
    ENDCASE

Selektion der im oben gewählten Zeitraum liegenden Veranstaltungenin den temporären Cursor tmpVeranst

    lcVeranstTabelle =  ADDBS(THIS.cDataPath)+"veranstaltungen.dbf"
    SELECT veranstaltungen.idveranst,;
          veranstaltungen.datum,;
          veranstaltungen.Uhrzeit,;
          veranstaltungen.veranst,;
          veranstaltungen.Ort,;
          veranstaltungen.Kosten;
       FROM &lcVeranstTabelle ;
       WHERE BETWEEN(Datum,ldStart,ldEnd);
       ORDER BY DATUM;
       INTO CURSOR tmpVeranst

Wir initialisieren die HTML-Ausgabe ...


    oWebApp.oHtml.reset()

...lesen das Templatefiles für die Veranstaltungsseite ein...:


    lcRetHtml = oWebApp.oHtml.GetTemplateFile("veranstaltungen.htm")

… und ersetzten die HTML-Tabelle (ID=Veranstaltungen) im Template durch die Werte aus dem Cursor 


    SELECT tmpVeranst
    lcRetHtml = oWebApp.oHtml.MergeTable(lcRetHtml,"Veranstaltungen")
    USE IN tmpVeranst

Jetzt füllen wir entsprechend dem gewählten Monat die Arrays paMonth und paWoche...

    *-- Bestimmung der Kalenderbuttons
    lnSpalte = 1
    lnZeile = 1
    lnStartPos = DOW(DATE(YEAR(ldDatum),MONTH(ldDatum),1))
    lnAnzTage = GOMONTH(ldDatum,1) - ldDatum
     
    *-- Die ersten Buttons sind leer (SPACE(1))
    DO WHILE lnSpalte < lnStartPos
       paMonth[lnSpalte,1] = "&nbsp;"
       lnSpalte = lnSpalte + 1
    ENDDO
     
    *-- Jetzt kommen die Buttons
    FOR lnCnt = 1 TO lnAnzTage
       IF lnSpalte = 8
          lnSpalte = 1
          lnZeile = lnZeile + 1
       ENDIF
       paMonth[lnSpalte,lnZeile] = [<input type="submit" name="Button" value="] + STRTRAN(STR(lnCnt,2),' ','0')+[">]
       lnSpalte = lnSpalte + 1
    ENDFOR
     
    *-- Den Rest ebenfalls auf SPACE(1) setzen
    DO WHILE lnSpalte < 9 AND lnZeile < 7
       IF lnSpalte = 8
          lnSpalte = 1
          lnZeile = lnZeile + 1
          IF lnZeile = 7
             EXIT
          ENDIF
       ENDIF
       paMonth[lnSpalte,lnZeile] = "&nbsp;"
       lnSpalte = lnSpalte + 1
    ENDDO
     
    *-- Und die WochenButtons
    FOR lnCnt = 1 TO 6
       paWoche[lnCnt] = [<input type="submit" name="Button" ]+;
                        [value="Woche ]+ALLTRIM(STR(lnCNt))+[">]
    ENDFOR

Jetzt erstellen wir noch PUBLIC-Variablen für den neuen (nun aktuellen) Monat sowie für die Anzeige des gewählten Zeitraums

    pcNewMonJahr = STRTRAN(STR(MONTH(ldDatum),2),' ','0') +;
        ALLTRIM(STR(YEAR(ldDatum)))
    pcMonJahrLabel = CMONTH(ldDatum) + ' ' + ALLTRIM(STR(YEAR(ldDatum)))

Über die Merge-Funktion werden die Platzhalter im HTML-Template durch die realen Werte ausgetauscht


    lcRetHtml = oWebApp.oHtml.Merge(lcRetHtml)

Und der resultierende HTML-Code wird an die Ausgabe angehängt


    oWebApp.oHtml.AppendHtml(lcRethtml)

Die Methode Browse      

Hier wird die gewünschte UserID gelesen, der entsprechende SQL-Befehl ausgeführt, das Templatefile eingelesen und über Mergetable und Merge die Platzhalter durch die aktuellen Werte ersetzt. Anschließend wird das Ergebnis zurückgegeben.

    LOCAL lcUser,lcPassword,lcVeranstTabelle,lcIDUser,lnIDUser
     
    lcVeranstTabelle =  ADDBS(THIS.cDataPath)+"veranstaltungen.dbf"
     
    lcIDUser = oWebApp.GetFormVar("UserID")
    lnIDUser = IIF(EMPTY(lcIDUser),0,VAL(lcIDUser))
     
    WITH oWebApp
       .oHtml.reset()
       IF lnIDUser # 0
          lcSelect = "SELECT * FROM "+lcVeranstTabelle + ;
                     " WHERE iduser = " + ALLTRIM(STR(lnIDUser)) +;
                     " INTO CURSOR tmpVeranst"
       ELSE
          lcSelect = "SELECT * FROM "+lcVeranstTabelle  +;
                     " INTO CURSOR tmpVeranst"
       ENDIF
       &lcSelect
     
       lcRetHtml = .oHtml.getTemplateFile("BrowseVeranstaltungen.htm")
       lcRetHtml = .oHtml.MergeTable(lcRetHtml,"Veranstaltungen")
       lcRetHtml = .oHtml.Merge(lcRetHtml)
     
       .oHtml.AppendHtml(lcRetHtml)
    ENDWITH

Die Methode Edit

Der Datensatz mit der übergebenen ID wird gesucht, das Templatefile für die Edit-Seite geladen und die Platzhalter durch die Feldinhalte ersetzt (VALUES der Elemente des Formulars)

    LOCAL lnIDVeranst, llError, lcRetHtml, lcVeranstTabelle
     
    lnIDVeranst = VAL(oWebApp.GetFormVar("VeranstID"))
    lcVeranstTabelle =  ADDBS(THIS.cDataPath)+"veranstaltungen.dbf"
     
    SELECT *;
       FROM &lcVeranstTabelle;
       WHERE idVeranst = lnIDVeranst;
       INTO CURSOR tmpVeranst
     
    llError = .F.
    IF _TALLY > 0
       WITH oWebApp.oHtml
          .reset()
          lcRetHtml = .getTemplateFile("EditVeranstaltung.htm")
          lcRetHtml = .Merge(lcRetHtml)
          .AppendHtml(lcRetHtml)
       ENDWITH
    ELSE
       ERROR "Zu bearbeitender Datensatz wurde nicht gefunden"
       llError = .T.
    ENDIF

Die Methode Save

In der Methode Save werden die Werte der Formularfelder ausgelesen und per SQL-Update in die Tabelle geschrieben. Anschließend wird die Methode Browse erneut aufgerufen.

    LOCAL lcVeranst, lnIDVeranst,ldDatum, lcUhrzeit, lcOrt,lcKostem,lcButton, lcVeranstTabelle
    lnIDVeranst = VAL(oWebApp.GetFormVar("VeranstID"))
    ldDatum = CTOD(oWebApp.GetFormVar("Datum"))
    IF EMPTY(ldDatum)
       ERROR "Das Datum bitte wie folgt eingeben: TT.MM.JJJJ"
       RETURN
    ENDIF
     
    lcUhrzeit   = ALLTRIM(oWebApp.GetFormVar("Uhrzeit"))
    lcVeranst   = ALLTRIM(oWebApp.GetFormVar("Veranst"))
    lcOrt       = ALLTRIM(oWebApp.GetFormVar("Ort"))
    lcKosten    = ALLTRIM(oWebApp.GetFormVar("Kosten"))
    lcButton    = UPPER(ALLTRIM(oWebApp.GetFormVar("Button")))
     
    lcVeranstTabelle =  ADDBS(THIS.cDataPath)+"veranstaltungen.dbf"
    IF lcButton = "SPEICHERN"
       UPDATE &lcVeranstTabelle ;
          SET Datum = ldDatum,;
             Uhrzeit = lcUhrzeit,;
             Veranst = lcVeranst,;
             Ort = lcOrt,;
             Kosten = lcKosten;
          WHERE idVeranst = lnIDVeranst
    ENDIF
    oWebApp.oVeranstaltungen.browse()

Die letzten Vorbereitungen vor dem ersten Start...

Damit unser Webserver auch seine Informationen über Applikation - Pfade usw. erhält, müssen wir noch ein paar Einträge in die Registry machen.

   

Und ab !!!

..aber erst einmal ohne Browser. Da wir in einer COM-Applikation nur schwierig debuggen können, starten wir zunächst unser MAIN-Programm, in dem wir die Browser-Aufrufe simulieren. So lassen sich die meisten Fehler hervorragend finden

TIP: Setzten Sie einen Haltepunkt auf oWebApp.lError. So hält der Debugger gleich an, wenn irgendwo ein Fehler auftritt.

    PUBLIC oWebApp
    CLEAR
    CD C:\INETPUB\SCRIPTS\DEVCON
     
    IF TYPE('oWebApp')='O' AND !ISNULL(oWebApp)
       *Objekt schon da
    ELSE
       oWebApp = NEWOBJECT('DEVCON','KLASSEN\WEBAPP')
    ENDIF
     
    IF VART(oWebApp) = 'O'
        lcHtml = oWebApp.process("Method=Veranstaltungen~Showkalender","",0)
     
    *!* lcHtml = oWebApp.process("Method=Veranstaltungen~browse"+;
                            "&Userid=2","",0)
    *!* lcHtml = oWebApp.process("Method=Veranstaltungen~edit"+;
                            "&Veranstid=5","",0)
       *!* lcHtml = oWebApp.process("Method=Veranstaltungen~save&veranstid=5"+;
                               "C:\Temp\webini.ini",0)
    *!* lcHtml = oWebApp.process("Method=Veranstaltungen~browse"+;
                            "&Userid=2","",0)
      ? lcHtml
    ELSE
       = MESSAGEBOX('Kein oWebApp vorhanden')
    ENDIF
    clear all
    close tables all

Wenn alles fehlerfrei läuft, erstellen Sie eine EXE-Datei, starten den Browser und geben folgendes ein:

http://localhost/scripts/inetpub/devcon.dll/devcon.devcon.process?veranstaltungen~showkalender

[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ]