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

Die Präsentations Schicht

Die Beispiel Anwendung präsentiert sich in einem Outlook Style User Interface. Hierbei gelangt die "Protoview Component Suite" zum Einsatz. Diese Suite lässt sich ganz besonders einfach aus Visual Basic heraus verwenden. Die Benutzeroberfläche präsentiert sich folgendermassen:

Das Hauptformular ist ein MDI Form. Auf diesem MDI Form befinden sich das ActiveX Control "PVOutlookbar" der Protoview ActiveX Component Suite sowie die benötigten Imagelists.

    MDI-Form

      PVOutlookbar 
      ImlOutbarLarge 
      ImlOutbarSmall

Aus dem "load" Event des Forms wird die die Outlookbar aufgesetzt.

SESSION: Ich werde in der Session auf die Protoview spezifischen Implementations Details in diesem Kontext eingehen.

Anwendungsbeispiel 1

Der Datenbezug aus der Präsentations Schicht erfolgt via DCOM und präsentiert sich wie folgt:

  • Beim Click auf den Marketing Plan Item (pvOutlookBar_ItemClick) wird die Methode loadMktPlan() des Forms frmMktPlan aufgerufen
  • In der Methode loadMktPlan() des Forms frmMktPlan wird die Methode getMktPlanIndex() aufgerufen.
  • Die Methode getMktPlanIndex() schlussendlich ruft aus der Präsentationsschicht die sich in der Mittelschicht befindliche Business Komponente getindex() auf.
  • Dim oImpData As ImpactData2b.clsMktPlan 
    Set oImpData = New ImpactData2b.clsMktPlan 
    Dim oRS As Adodb.Recordset 
    Set oRS = oImpData.getIndex(tcPlu, tcPluExt, tnYear, tcCrop, tcProdType) 
    Set oImpData = Nothing
     … 
    …(Verarbeitungslogik) 
    … oRS.Close 
    Set oRS = Nothing

Anwendungsbeispiel 2

Der Datenbezug aus der Präsentations Schicht erfolgt via DCOM und präsentiert sich wie folgt:

  • Im Load Event des Forms frmMktPRoot wird die Form Methode loadProdType() aufgerufen
  • Die Methode loadProdType() ruft aus der Präsentationsschicht die sich in der Mittelschicht befindliche Business Komponente queryall() auf.

    Dim loProdtype As ImpactData2b.clsProdType 
    Set loProdtype = New ImpactData2b.clsProdType 
    Dim loRS As New Adodb.Recordset 
    Set loRS = loProdtype.queryAll 
    Set loProdtype = Nothing

     cboProductType.Clear
    Do While Not loRS.EOF

      cboProductType.AddItem loRS("prodtype")
      & " - " & Trim(loRS("prodtypedescr"))

    loRS.MoveNext
    Loop

    loRS.Close
    Set loRS = Nothing

Anwendungsbeispiel 3

Aus dem Form frmMktPlan heraus wird übder den PVExplorer heraus bei einem Wechsel zu einem anderen Node die Methode pvExplorer_AfterNodeSelectionChange() aufgerufen. Diese Methode erhält als Inputparameter die NewNode Referenz. Jeder Node hat eine Data Property welche den Formtyp definiert. Aufgrund des angewählten Nodes wird die RefreshData() Methode des entsprechenden Forms aufgerufen.

Vor dem Wechsel zu einem anderen Node muss festgestellt werden, ob es allfällige Änderungen, welche zu speichern sind, gegeben hat. Dies erfolgt über die Methode pvExplorer_BeforeNodeSelectionChange(), welche analog zur oben beschriebenen Methode diesmal die SaveData() Methode des entsprechenden Forms aufruft. Siehe Bsp. 4.

Beim Form frmMktPCrop sieht die RefreshData() Methode wie folgt aus:

    Public Sub RefreshData(toNode As pvxNode)

        Call SetTitle(toNode)

      With frmPluSel

        cPLU = .getPlu
        cPluExt = .getPLUExt
        nYear = .getYear

      End With

      Set oNode = toNode
      cCrop = toNode.Key

      Call setTabStatus("x")
      ' Alle Tabs müssen neu bei einem Click ihre Daten neu laden
      Call SSTab_Click(0)' Daten für aktuellen Tab holen

    End Sub

Hier wird bzgl. Datenbezug der Click Event des Tab Controls aufgerufen, da dort der eigentliche Datenbezug beginnt. Dieser präsentiert sich wie folgt:

    Private Sub SSTab_Click(PreviousTab As Integer)
    Select Case ssTab.Tab
    Case 0

      If getTabStatus(ssTab.Tab) = "x" Then
      Call GetCropArea(oNode.Key)

    End If
    Case 1

      If getTabStatus(ssTab.Tab) = "x" Then
      Call GetCropOverview(oNode.Key)
      End If

    Case 2

      If getTabStatus(ssTab.Tab) = "x" Then
      Call GetCropTechDetails(oNode.Key)
      End If

    End Select
    Call setTabStatus("r", ssTab.Tab)
    ' für dieses Tab wurden die Daten bereits gelesen
    End Sub

Je nachdem, welcher Tab angeklickt wurde, wird die entsprechende Methode aufgerufen. Um nicht unnötige Datenbezüge auszulösen, wird über den Tabstatus ein "x" eingetragen, wenn die Daten neu zu beziehen sind. In diesem Beispiel wird die Methode GetCropArea() illustriert. Diese präsentiert sich wie folgt:

    Private Sub GetCropArea(tcCrop As String)

      Dim loMktPlan As ImpactData2b.clsMktPlan
      Set loMktPlan = New ImpactData2b.clsMktPlan
      Dim loRS As New Adodb.Recordset
      Set loRS = loMktPlan.GetCropArea(cPLU, cPluExt, nYear, cCrop)
      Set loMktPlan = Nothing

      ' rows 0: area_ii, 'AREA' label, uom
      ' 1: seedrate_ii, 'SEEDRATE' label, uom

      ' 0-9: values_ii, 10: label, 11: uom
      ReDim laData(1, 11) As Variant

      ' init
      Dim lnRow, lnField As Integer, lcLabel As String

      For lnRow = 0 To 1

        laData(lnRow, 10) = "" ' label
        laData(lnRow, 11) = "" ' uom

        ' values_ii
        For lnField = 0 To 9
        laData(lnRow, lnField) = 0#
        Next

      Next

      lnRow = -1
      Do While Not loRS.EOF

        lnRow = lnRow + 1

        ' values_ii
        For lnField = 0 To 9

          laData(lnRow, lnField) = loRS("val_"

    & modGeneral.getFieldExt(lnField, 0))

      Next

      laData(lnRow, 10) = loRS("Label")
      laData(lnRow, 11) = loRS("uom")

      loRS.MoveNext

    Loop

    loRS.Close
    Set loRS = Nothing

    aAllData(ssTab.Tab) = laData
    Call presentCropArea

End Sub

Um den Datenbezug einmal durchführen zu können, wird folgende Matrix als Recordset bezogen:

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