AtNotes Übersicht Willkommen Gast. Bitte einloggen oder registrieren.
24.09.17 - 23:19:24
Übersicht Hilfe Regeln Glossar Suche Einloggen Registrieren
News:
Schnellsuche:
+  Das Notes Forum
|-+  Lotus Notes / Domino Sonstiges
| |-+  Projekt Bereich
| | |-+  Help-Desk Applikation !!Help!! (Moderatoren: eknori, Thomas Schulte)
| | | |-+  Help Application demo at Lotusphere
« vorheriges nächstes »
Seiten: [1] 2 3 ... 9 Nach unten Drucken
Autor Thema: Help Application demo at Lotusphere  (Gelesen 102498 mal)
eknori
@Notes Preisträger
Moderator
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 10779


« am: 21.12.05 - 05:26:50 »

Kam gerade rein ...

Zitat
Hello Ulrich, 

I am with Research In Motion, the makers of the BlackBerry solution.
We are currently looking to demonstrate at Lotusphere BlackBerry Mobile
Data Services 4.1 support for Domino 7 web services and your application
appeared as a candidate.   Do you have any current work to extend the
application using the native D7 web services?   Any means to get
development assistance from your team to add this into the application
(at least a few basic functions) in the next few weeks?

Thanks in advance,

Jon

_____________________________
Jonathan Christiansen
Senior Manager, Technical Services
Cingular Business Unit
Rogers Business Unit
Research In Motion Limited
Gespeichert
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2965


WWW
« Antworten #1 am: 21.12.05 - 17:18:04 »

Biete ab dem 29.12. meine konstruktive Mitarbeit an. Schau mir das mal an.
Danach sieht es so aus, dass ich bis zum 03.01. auf jeden Fall frei habe, wobei der 1. und weite Teile des 31. natürlich ausfallen. Es sollte aber machbar sein, zumindest teilweise präsentabel zu Webservice-enablen.
Wobei dies vielleicht nicht die ganz hohe SOA Schule sein wird.

Gruß Axel
Gespeichert

Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile
eknori
@Notes Preisträger
Moderator
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 10779


« Antworten #2 am: 21.12.05 - 18:19:17 »

Zitat
Biete ab dem 29.12. meine konstruktive Mitarbeit an

Danke Axel, das Angebot nehme ich sehr gerne an. Habe Jonathan gerade gemailt, daß wir das grundsätzlich können, wir aber noch ein paar mehr Informationen benötigen, welche functions sich die Brombeeren denn so vorstellen ...

Und wenn daß nicht zu abgehoben ist, ( und 3 Freiflüge, FirstClass + Hotel in Orlando dabei rauspringen ) sind wir doch zu allen Schandtaten bereit, oder  Cheesy

Scherz beiseite; ist eine  Herausforderung, da daß Thema für mich neu ist; aber man kann ja nur dazulernen...
Gespeichert
eknori
@Notes Preisträger
Moderator
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 10779


« Antworten #3 am: 21.12.05 - 20:05:17 »

@Axel, korrigiere mich bitte, wenn ich vollkommen falsch liege.

Lassen wir einmal die Mails in HELP außer acht; dann bleiben Tickets und Todo.

Also gibt es eigentlich nur 2 ( grosse ? ) Klassen

class Ticket und
class Todo

Nehmen wir die Klasse Ticket

diese enthält dann Public und private functions und subs

eine mögliche function könnte dann sein

public function getAllBySupporter ( sName as String ) as NotesDocumentCollection (?)

wobei das Ermitteln der results dann über private funcs erfolgt...

oder

public function GetSubjectFromTicket ( TicketNum as String ) as string

( hier wäre dann ein

Private  Function openDatabase(dbname As String) As Boolean
      Set db = s.GetDatabase("", dbname)
      If db.IsOpen Then
         openDatabase = True
      Else
         openDatabase = False
         msg = "Cannot open database " & dbname
      End If
   End Function
   
   Private Function openView(viewname As String) As Boolean
      Set view = db.GetView(viewname)
      If view Is Nothing Then
         openView = False
         msg = "Cannot open view " & viewname
      Else
         openView = True
      End If
   End Function
   
   Private Sub getSubject
      If doc.HasItem("Subject") Then
         msg = doc.GetItemValue("Subject")(0)
      Else
         msg = "Document does not have Subject"
      End If
   End Sub

im Spiel ... )

Das ist jetzt LS; ist aber auch in Java möglich. Das scheint wurscht zu sein, obwohl mein 7er Client immer abschmiert, wenn ich versuche Java Code in einen WS zu pasten ... ( das aber nur am Rande )

Und das wäre dann schon das ganze Geheimnis der WebServices ?? Will meinen; wir coden Functionen ( erwartet Eingabe , schmeisst Wert zurück)

Um mehr muss man sich an dieser Stelle nicht kümmern; wie der Anforderer mit dem Rückgabewert umgeht, ist seine Sache ...  Huh

Sehe ich das richtig ( vereinfacht ) ?
« Letzte Änderung: 21.12.05 - 20:10:07 von eknori » Gespeichert
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2965


WWW
« Antworten #4 am: 21.12.05 - 21:55:24 »

Aus meiner Sicht sollte man ein aufgabenbezogenes externes Interface schaffen, das alle Aufgaben, die man sinnvoll aus Blackberry in Help ausführen könnte, als Service anbietet. In der Praxis würde man natürlich an irgendeiner Ecke anfangen.

Deine Trennung in public und private functions ist schon sauber. D.h. Notes spezifische Dinge wie getView, getDatabase werden private gekappselt.

getAllBySupporter (sName as String) ist schon mal vernünftig. Der Rückgabewert als asDocumentCollection nicht so. Am besten man gibt die Sammlung der Tickets der Person als xml-runter. Später dazu mehr.

GetSubjectFromTicket ( TicketNum as String ) as string hört sich für mich nicht so sinnvoll ist. Warum sollte man sich von Blackberry erst die TicketNum holen und dann das dazugehörige Subject noch mal extra? Webservices sind nicht besonders performant.
Das ist, was mit vernünftiger Granularität der Services gemeint ist. D.h. man sendet am besten einen ganzen Sack der Tickets runter. Oder man sendet ein paar Werte pro Ticket runter, die in einer Ansicht (nicht NotesView) auf Blackberry dargestellt werden können (etwa TicketNum, Datum, Priorität, Subject) etc und hat dann noch eine zweite Funktion, die nach Auswahl des Tickets aus der Blackberry Ansicht das gesamte Ticket zurückliefert (bzw. alle Teile des Tickets, die in Blackberries Detailansicht des Tickets dargestellt werden sollen). 
Das interessante ist, dass man ganze Dateistrukturen (ähnlich wie ein struct oder type in LotusScript) als xml darstellen kann auch wenn sie verschachtelt sind.
Und xml kann sowohl von Notes als auch von Blackberry in die proprietäre Objektstruktur (Notes-Objekte oder Blackberry-Objekte) umgewandelt werden. Die Aufgabe auf !!Help!!-Seite wäre dann nur das marshalling/un-marshalling (umwandeln) notes-> xml und xml-> notes.
In TicketService könnten dann noch Funktionen wie solveTicket(TicketDoc) oder createTicket(TicketDoc) angeboten werden. Wobei TicketDoc dann (das gesamte Ticket als xml enkodieren würden) oder (nur ein key (ticketNum) und die Felder, die möglicherweise editiert werden können).
Die doc-lit Webservices machen total Sinn. Und nicht nur die rpc-Webservices, wo man nur Strings, Zahlen und alles einzeln übertragen kann. Bei doc-lit Webservices kann man anwendungs-determinierte strucs (z.B. ticket) hin und herschicken. Das geht mit xml und ist auch nicht so schwierig.

Eine weitere Anforderung wäre natürlich authentification/authorization. Weiss aber nicht wie gut das zur Zeit in Notes unterstützt wird. Die einfachere Möglichkeit wäre ssl. Ansonsten wird da aber auch an einer Art xml-Feldverschlüsselung gearbeitet.

Webservices Interfaces sind nicht Objekt-Orientiert!
Sie sind eigentlich mehr Prozeduren, denen man aber structs als Parameter übergeben kann oder die structs zurückliefern können. Es bringt nichts wenn man sich Subject oder ein paar andere Attribute einzeln vom remote Notesserver holen würde. Besser diese structs-Geschichte. Enterprise Java Beans funktioniert teilweise so, dass man sich einzelne Werte vom entfernten Server runterpopelt. EJB-aficionados kommen dann immer mit den dollen caches. In der Praxis ist das dann aber trotzdem langsam.
Ted Neward hat das mal damit verglichen:
Mit heutiger Technologie dauert es 38 Jahre, um von Pluto hin und zurück zu fliegen.
Auf Pluto gibt es total gutes Bier.
Wieviel Bier würde man mit einem Raumschiff von Pluto mitnehmen?
Soviel man tragen kann und sicher nicht jede Bierflasche einzeln (wie teilweise EJB2.0 in Websphere oder erst ticketNum und dann das dazugehörige Subject). 

Hoffe das ist verständlich.
Code:
<ticket>
<topic>
Der Button Neues Ticket in der Ansicht Ticket funktioniert nicht
</topic>
<createDateTime>
03.12.04 10:00:00
</createDateTime>
<creator>
Jupp Derwall
</creator>
<history>
<entry>
<date>
14.12.04 10:30:00
</date>
<user>
Sarah Burdenski
</user>
<content>
weiss nicht
</content>
</entry>
<entry>
<date>
14.12.04 10:35:00
</date>
<user>
Big Boss
</user>
<content>
wenn das nicht in 3 Tagen gelöst ist, gibts Ärger
</content>
</entry>
</ticket>
Die Umwandlung in diese Struktur ist einfacher als es vielleicht erst aussieht.
« Letzte Änderung: 21.12.05 - 22:53:33 von kennwort » Gespeichert

Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile
eknori
@Notes Preisträger
Moderator
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 10779


« Antworten #5 am: 22.12.05 - 05:22:46 »

Zitat
Hoffe das ist verständlich.

Ja, das ist es; danke für die Erläuterungen ...

Zitat
Oder man sendet ein paar Werte pro Ticket runter, die in einer Ansicht (nicht NotesView) auf Blackberry dargestellt werden können (etwa TicketNum, Datum, Priorität, Subject) etc und hat dann noch eine zweite Funktion, die nach Auswahl des Tickets aus der Blackberry Ansicht das gesamte Ticket zurückliefert (bzw. alle Teile des Tickets, die in Blackberries Detailansicht des Tickets dargestellt werden sollen).
Zitat
oder createTicket(TicketDoc)

Ich denke, so etwas hat sich Jonathan wohll vorgestellt; habe aber noch keine Antwort auf meine Mail erhalten ...
Gespeichert
eknori
@Notes Preisträger
Moderator
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 10779


« Antworten #6 am: 22.12.05 - 19:23:40 »

Zitat
Ted Neward hat das mal damit verglichen:
Mit heutiger Technologie dauert es 38 Jahre, um von Pluto hin und zurück zu fliegen.
Auf Pluto gibt es total gutes Bier.
Wieviel Bier würde man mit einem Raumschiff von Pluto mitnehmen?
Soviel man tragen kann und sicher nicht jede Bierflasche einzeln (wie teilweise EJB2.0 in Websphere oder erst ticketNum und dann das dazugehörige Subject).

schöner Vergleich; aber er trifft den Nagel wirklich auf den Kopf. Erfordert eine bisschen andere Denke bei der Entwicklung der Services, aber das sollte machbar sein.

Immer noch keine Antwort. OK, mag an der momentanen "festlichen" Stimmung liegen. Da schalten wohl alle mal einen Gang runter ...
Gespeichert
eknori
@Notes Preisträger
Moderator
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 10779


« Antworten #7 am: 23.12.05 - 17:06:41 »

Langsam werde ich mit dem Thema warm und auch ein wenig mutiger. Statt einfach nur ein paar Werte aus der DB abzufragen, habe ich mit einen kleinen web service geschrieben, der ein neues Doc in der DB erzeugt und mit Werten füllt.

Sub Click(Source As Button)
   Const urlWSD = "http://main/FirstTest.nsf/FirstTest?wsdl"       ' This is the URL of the server hosting this web service
   Dim result As String
   Dim ret As Integer
   Dim stockSymbol As String
   
'Create a new MSSOAP client object
   Dim webService As Variant
   Set webService =CreateObject("MSSOAP.SoapClient")
   
'Initialize connection to the WSDL file and get WSDL structure
   Call webService.mssoapinit (urlWSD)
   
   key = "tunesien"
   
   'result = webService.getHauptstadt(key)
   ret = webService.createNewDoc ( "England", "London" )
   
   Msgbox ret
End Sub

Als Datenbank nehme ich vorerst einaml die Datenbank, die Axel in diesem Thread gepostet hat http://atnotes.de/index.php?topic=26569.0

Der web service sieht dann so aus:

Class Land
   Private ses As NotesSession
   Private db As NotesDatabase
   Private vwLand As NotesView
   
   Public Sub New
      Set ses = New NotesSession()
      Set db = ses.currentDatabase
      Set vwLand = db.getView("land")
   End Sub
   
   
   Public Function getHauptstadt (land As String) As String
      Dim docLand As NotesDocument
      Set docLand = vwLand.GetDocumentByKey(land)
      If docLand Is Nothing Then
         getHauptstadt = "LAND <" & land & "> kann in der Datenbank nicht gefunden werden."
      Else
         getHauptstadt = docLand.Hauptstadt(0)
      End If
      
   End Function
   
   Public Function createNewDoc ( strLand As String, strHauptstadt As String ) As Integer
      
      On Error Goto ERRHANDLE
      
      Dim doc As NotesDocument
      Set doc = db.CreateDocument
      doc.Land = strLand
      doc.Hauptstadt = strHauptstadt      
      doc.Form = "land"
      Call doc.Save (True,True)
      createNewDoc = 0
EXITPOINT:
      Exit Function
ERRHANDLE:
      createNewDoc = 1
      Resume EXITPOINT
   End Function
   
End Class

Ich finde, daß das, was man als web service bezeichnet noch recht unspektakulär aussieht; eigentlich nix anderes als ein Agent mit Rückgabewert ...

OK, der RetVal im Beispiel ist ein einfacher String oder ein integer; mal sehen, wie das mit komplexeren Strukturen aussieht.

Gespeichert
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2965


WWW
« Antworten #8 am: 23.12.05 - 18:15:15 »

Ist es auch nicht.
WSDL Files an sich sind relativ komplex. Ich hab Leute getroffen, die das scheinbar mit einem Blick lesen können.
Die benötigten doc-lit style Webservices erfordern xml-Processing und ich hab in der freien Wildbahn schon die unglaublich kompliziertesten Konstrukte gesehen wie Leute xml parsen. Ich glaub der heute gepostete Link zu den Amazon Webservice aus Domino hat einige gute Ideen. Werd das mal durchgehen. Das sieht gut aus.

Webservices/SOA zielen auch darauf hinaus, dass Transaktions- und Securitykontexte über Webservices verteilt werden, Felder verschlüsselt werden, etc. Wenn man damit anfängt und das auch noch performant halten will, wirds komplex.
Gespeichert

Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile
eknori
@Notes Preisträger
Moderator
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 10779


« Antworten #9 am: 23.12.05 - 18:23:31 »

Bin ja froh, daß ich erst einmal das Frontent ( Eclipse ) zum Laufen bekommen habe. ( Dank deiner Anleitung, Axel )
Jetzt werde ich mich in der verbleibenden Zeit, bis das Christkind kommt einmal daran machen, verschiedene Dinge auszuprobieren. Auch werde ich mir die Links von Christoph einmal näher ansehen.

Ich bin guter Hoffnung, daß wir die Brombeeren auf der LS mit ein paar guten Services versorgen können. Was AUTH und dergleichen angeht ... die wollen ja lediglich ein paar einfache Dinge haben.
Gespeichert
eknori
@Notes Preisträger
Moderator
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 10779


« Antworten #10 am: 23.12.05 - 19:40:50 »

Habe gerade eine Antwort von Jon bekommen

Zitat
Ulrich, my apologies on the delayed response.   All of the functions you described below were in line with my thoughts.   Accessing collections of tickets, viewing tickets, search for ticket, creating and modifying tickets.     We are looking for apps to demo against our MDS 41 web services consumer IDE (MDS studio) and would showcase the app at lotusphere.   Any chance you can have something by January 10th?

Was sagt das Team ? Ist das machbar ?
Gespeichert
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2965


WWW
« Antworten #11 am: 23.12.05 - 21:26:06 »

Frag ihn am besten noch, wie er sich die Authentizifierungs/Autorisierungsfrage vorstellt?
SSL?
Falls meine Hilfe benötigt wird, habe ich zwischen dem 27.12. und dem 4.1. einige freie Tage.
Aus meiner Sicht ist es für den Producer (Server, also !!!Help!!!) einfacher als für den Client (die).
Also auf jeden Fall machbar.

Axel
Gespeichert

Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile
Thomas Schulte
@Notes Preisträger
Moderator
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 4387


Ich glaub mich tritt ein Pferd


« Antworten #12 am: 23.12.05 - 22:12:32 »

Seh ich auch so. Das ist machbar.

Und die Zeit wäre nicht das Problem. Ich hab bis zum 10.01. Urlaub.
Gespeichert

Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach
eknori
@Notes Preisträger
Moderator
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 10779


« Antworten #13 am: 25.12.05 - 18:47:35 »

Hier einmal der Rumpf eines Web Services "wsTicket"

Funktionen:

-- CreateTicket ( strUser As String, strProblem As String ) As Integer
-- CloseTicket ( strTicket As String ) As Integer
-- AssignTicket ( strTicket As String, strAssignTo As String ) As Integer
-- GetAllTicketsBySupporter ( strSupporter As String ) As Variant

Das CreateTicket funktioniert schon einmal soweit  Cool ; die anderen Funktionen beinhalten ein einfaches ERRHANDLE, aber noch keinen Funktionscode.

Bei GetAllTicketsBySupporter stehe ich ein wenig auf dem Schlauch; in LS würde ich eine NotesDocumentCollection zurückgeben; das funktioniert aber bei einem web service nicht.  Huh

Was noch fehlt ist das Abrufen eines bestimmten Tickets, und damit verbunden auch das Suchen nach einem Ticket ...

%REM
#####################################################
 INCLUDES
#####################################################
%END REM   
%INCLUDE "lsxsd.lss"

%REM
#####################################################
 CONSTANTS
#####################################################
%END REM   
Private Const CREATE_TICKET_FORM = "BugReport"
Private Const CREATE_TICKET_INITIAL_STATUS = "0"
Private Const CREATE_TICKET_VIA_WEBSERVICE = 1

Private Const CREATE_TICKET_ERR_NOERROR = 0
Private Const CREATE_TICKET_ERR_MISC_ERROR = 1
Private Const CREATE_TICKET_ERR_MANDANTORY = 2

Private Const ASSIGN_TICKET_ERR_NOERROR = 0
Private Const ASSIGN_TICKET_ERR_MISC_ERROR = 1
Private Const ASSIGN_TICKET_ERR_MANDANTORY = 2

Private Const CLOSE_TICKET_ERR_NOERROR = 0
Private Const CLOSE_TICKET_ERR_MISC_ERROR = 1
Private Const CLOSE_TICKET_ERR_MANDANTORY = 2

Private Const GET_TICKET_ERR_NOERROR = 0
Private Const GET_TICKET_ERR_MISC_ERROR = 1
Private Const GET_TICKET_ERR_MANDANTORY = 2

%REM
#####################################################
 VARIABLES
#####################################################
%END REM   
Private s As NotesSession
Private db As NotesDatabase
Private success As Variant

%REM
#####################################################
 WEBSERVICE
#####################################################
%END REM      
Class wsTicket
   
%REM
#####################################################
 Public Sub New
#####################################################
%END REM      
   Public Sub New
      ' initialize some stuff
      Set s = New NotesSession()
      Set db = s.currentDatabase
   End Sub
   
%REM
#####################################################
 Public Function CreateTicket ( strUser As String, strProblem As String ) As Integer
#####################################################
%END REM   
   Public Function CreateTicket ( strUser As String, strProblem As String ) As Integer
      
      CreateTicket = CREATE_TICKET_ERR_NOERROR
      
      
      On Error Goto ERRHANDLE
      If Trim(strUser) = "" Or Trim(strProblem) = "" Then
         CreateTicket = CREATE_TICKET_ERR_MANDANTORY ' mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else
         Dim doc As NotesDocument
         Dim dateTime As New NotesDateTime( "" )
         Call dateTime.SetNow
         
         Set doc = db.CreateDocument
         doc.Form = CREATE_TICKET_FORM
         doc.User = strUser      
         doc.Problem = strProblem
         doc.Status = CREATE_TICKET_INITIAL_STATUS ' new Ticket, unassigned
         doc.Webservice = CREATE_TICKET_VIA_WEBSERVICE
         doc.DateCreated = Cstr(dateTime.DateOnly)
         doc.TimeCreated = Cstr(dateTime.TimeOnly)
         success = doc.ComputeWithForm( False, False )
         Call doc.Save (True,True)
      End If
      
EXITPOINT:
      Exit Function
      
ERRHANDLE:
      CreateTicket = CREATE_TICKET_ERR_MISC_ERROR
      Resume EXITPOINT
      
   End Function
   
%REM
#####################################################
 Public GetAllTicketsBySupporter ( strSupporter As String ) As Variant
#####################################################
%END REM      
   Public Function GetAllTicketsBySupporter ( strSupporter As String ) As Variant
      
      On Error Goto ERRHANDLE      
      GetAllTicketsBySupporter = GET_TICKET_ERR_NOERROR
      
      If Trim(strSupporter) = "" Then
         GetAllTicketsBySupporter = GET_TICKET_ERR_MANDANTORY ' mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else      
      ' Your Code goes here   
      End If    
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      GetAllTicketsBySupporter = GET_TICKET_ERR_MISC_ERROR
      Resume EXITPOINT      
      
   End Function
   
%REM
#####################################################
 Public Function AssignTicket (strTicket As String, strAssignTo As String) As Integer
#####################################################
%END REM   
   Public Function AssignTicket (strTicket As String, strAssignTo As String) As Integer
      
      On Error Goto ERRHANDLE      
      AssignTicket = ASSIGN_TICKET_ERR_NOERROR
      
      If Trim(strTicket) = "" Or Trim(strAssignTo) = "" Then
         AssignTicket = ASSIGN_TICKET_ERR_MANDANTORY  'mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else      
      ' Your Code goes here   
      End If
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      AssignTicket = ASSIGN_TICKET_ERR_MISC_ERROR
      Resume EXITPOINT
   End Function
   
%REM
#####################################################
 Public Function CloseTicket ( strTicket As String ) As Integer
#####################################################
%END REM   
   Public Function CloseTicket ( strTicket As String ) As Integer
      
      On Error Goto ERRHANDLE      
      CloseTicket = CLOSE_TICKET_ERR_NOERROR
      
      If Trim(strTicket) = "" Then
         CloseTicket = CLOSE_TICKET_ERR_MANDANTORY 'mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else      
      ' Your Code goes here   
      End If    
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      CloseTicket = CLOSE_TICKET_ERR_MISC_ERROR
      Resume EXITPOINT   
   End Function
   
End Class
Gespeichert
eknori
@Notes Preisträger
Moderator
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 10779


« Antworten #14 am: 27.12.05 - 18:09:07 »

Hier ein Update des bisherigen Codes; nach wie vor kämpfe ich mit der Übergabe eine NotesDocumentCollection als ReturnValue einer Anfrage

%REM
#####################################################
 INCLUDES
#####################################################
%END REM   
%INCLUDE "lsxsd.lss"

%REM
#####################################################
 CONSTANTS
#####################################################
%END REM   
Private Const CREATE_TICKET_FORM = "BugReport"
Private Const CREATE_TICKET_INITIAL_STATUS = "0"
Private Const CREATE_TICKET_VIA_WEBSERVICE = 1

Private Const CREATE_TICKET_ERR_NOERROR = 0
Private Const CREATE_TICKET_ERR_MISC_ERROR = 1
Private Const CREATE_TICKET_ERR_MANDANTORY = 2

Private Const ASSIGN_TICKET_ERR_NOERROR = 0
Private Const ASSIGN_TICKET_ERR_MISC_ERROR = 1
Private Const ASSIGN_TICKET_ERR_MANDANTORY = 2

Private Const CLOSE_TICKET_ERR_NOERROR = 0
Private Const CLOSE_TICKET_ERR_MISC_ERROR = 1
Private Const CLOSE_TICKET_ERR_MANDANTORY = 2

Const DEFAULT_RETURN_VALUE ="-"

%REM
#####################################################
 VARIABLES
#####################################################
%END REM   
Private s As NotesSession
Private db As NotesDatabase
Private doc As NotesDocument
Private success As Variant
Private SearchFormula As String
Private strPersonName As String
Private i As Integer
Private nn As NotesName
Private col As NotesDocumentCollection

Class Ticket
   Public User As String
   Public TicketNumber As String
   Public Problem As String
End Class

Class TicketDetails
   Public User As String
   Public TicketNumber As String
   Public Problem As String
   ' ... more to declare
End Class

%REM
#####################################################
 WEBSERVICE
#####################################################
%END REM      
Class wsTicket
   
%REM
#####################################################
 Public Sub New
#####################################################
%END REM      
   Public Sub New
      ' initialize some stuff
      Set s = New NotesSession()
      Set db = s.currentDatabase
   End Sub
   
%REM
#####################################################
 Public Function CreateTicket ( strUser As String, strProblem As String ) As Integer
#####################################################
%END REM   
   Public Function CreateTicket ( strUser As String, strProblem As String ) As Integer
      
      CreateTicket = CREATE_TICKET_ERR_NOERROR
      
      
      On Error Goto ERRHANDLE
      If Trim(strUser) = "" Or Trim(strProblem) = "" Then
         CreateTicket = CREATE_TICKET_ERR_MANDANTORY ' mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else
         Dim doc As NotesDocument
         Dim dateTime As New NotesDateTime( "" )
         Call dateTime.SetNow
         
         Set doc = db.CreateDocument
         doc.Form = CREATE_TICKET_FORM
         doc.User = strUser      
         doc.Problem = strProblem
         doc.Status = CREATE_TICKET_INITIAL_STATUS ' new Ticket, unassigned
         doc.Webservice = CREATE_TICKET_VIA_WEBSERVICE
         doc.DateCreated = Cstr(dateTime.DateOnly)
         doc.TimeCreated = Cstr(dateTime.TimeOnly)
         success = doc.ComputeWithForm( False, False )
         Call doc.Save (True,True)
      End If
      
EXITPOINT:
      Exit Function
      
ERRHANDLE:
      CreateTicket = CREATE_TICKET_ERR_MISC_ERROR
      Resume EXITPOINT
      
   End Function
   
%REM
#####################################################
 Public Function GetAllTicketsBySupporter ( ) As Variant
#####################################################
%END REM      
   Public Function GetAllTicketsBySupporter ( strSupporter As String, status As String ) As Ticket
      
      On Error Goto ERRHANDLE      
      ' open, progress, closed, empty string or all
      If status = "" Or Ucase(status) = "ALL" Then
         status = "ALL"
      End If
      
      Select Case Ucase(status)
         
      Case "OPEN"
         
      Case "CLOSED"
         
      Case "PROGRESS"
         
      Case "ALL"          
         SearchFormula =_
         |@UpperCase(Form) ="BUGREPORT" & @Name([CN];supporter)="|_
         & CommonNameString (strSupporter ) & |"|
         
      Case Else
         
      End Select
      
      Dim dateTime As New NotesDateTime(_
      Cstr(Datenumber(2000, 5, 1)))
      
      ' get all tickets for a given supporter
      
      Set col = db.Search( SearchFormula, dateTime,0)
      
      Set GetAllTicketsBySupporter = New Ticket
      
      If Trim(strSupporter) = "" Or Col.Count = 0 Then
         ' the function must have a return value
         GetAllTicketsBySupporter.User = DEFAULT_RETURN_VALUE
         GetAllTicketsBySupporter.TicketNumber = DEFAULT_RETURN_VALUE
         GetAllTicketsBySupporter.Problem = DEFAULT_RETURN_VALUE
         Exit Function ' nothing else to do, get outa here !
      Else      
      ' Your Code goes here   
         Set doc = col.GetFirstDocument
         
         GetAllTicketsBySupporter.User = CommonNameString(getItemValue ("user"))
         GetAllTicketsBySupporter.TicketNumber = getItemValue ("ReqNumber")
         GetAllTicketsBySupporter.Problem = getItemValue ("problem")
         
      End If    
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      Resume EXITPOINT      
      
   End Function
   
%REM
#####################################################
 Public Function AssignTicket (strTicket As String, strAssignTo As String) As Integer
#####################################################
%END REM   
   Public Function AssignTicket (strTicket As String, strAssignTo As String) As Integer
      
      On Error Goto ERRHANDLE      
      AssignTicket = ASSIGN_TICKET_ERR_NOERROR
      
      If Trim(strTicket) = "" Or Trim(strAssignTo) = "" Then
         AssignTicket = ASSIGN_TICKET_ERR_MANDANTORY  'mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else      
      ' Your Code goes here   
      End If
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      AssignTicket = ASSIGN_TICKET_ERR_MISC_ERROR
      Resume EXITPOINT
   End Function
   
%REM
#####################################################
 Public Function CloseTicket ( strTicket As String ) As Integer
#####################################################
%END REM   
   Public Function CloseTicket ( strTicket As String ) As Integer
      
      On Error Goto ERRHANDLE      
      CloseTicket = CLOSE_TICKET_ERR_NOERROR
      
      If Trim(strTicket) = "" Then
         CloseTicket = CLOSE_TICKET_ERR_MANDANTORY 'mandantory fields
         Exit Function ' nothing else to do, get outa here !
      Else      
      ' Your Code goes here   
      End If    
      
EXITPOINT:
      Exit Function
ERRHANDLE:
      CloseTicket = CLOSE_TICKET_ERR_MISC_ERROR
      Resume EXITPOINT   
   End Function
   
%REM
#####################################################
 Private Function CommonNameString (strName As String) As String
#####################################################
%END REM   
   Private Function CommonNameString (strName As String) As String
      Set nn = New NotesName( strName )
      strPersonName = nn.Common
      CommonNameString = strPersonName
   End Function
   
%REM
#####################################################
 Private Function getItemValue ( strItem As String ) As String
#####################################################
%END REM      
   Private Function getItemValue ( strItem As String ) As String
      If doc.HasItem(strItem) Then
         getItemValue = doc.GetItemValue( strItem )(0)
      Else
         getItemValue = DEFAULT_RETURN_VALUE
      End If
   End Function
End Class
« Letzte Änderung: 27.12.05 - 19:40:28 von eknori » Gespeichert
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2965


WWW
« Antworten #15 am: 27.12.05 - 21:15:16 »

Ulrich,

es macht aus meiner Sicht keinen Sinn, NotesDocumentCollection zu übergeben.
Blackberry hat keinen Notes Client und da gibt es überhaupt keine NotesDocumentCollection.
Vielleicht ist das schon so in Domino Webservices vorgesehen, dass da keine Domino-proprietären Objekte übertragen werden können.
Das ist, was ich mit Document-Style Webservices meine.

Was für einen Client nimmst du?
Eclipse Web Tools Platform?
Ich versuch morgen mal !!!Help!!! auf Domino 7 zu installieren. 

Gruß Axel
Gespeichert

Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2965


WWW
« Antworten #16 am: 27.12.05 - 22:56:22 »

Im Grunde genommen hat das mit dem Complex Type Kapitel (ziemlich weit unten) von hier zu tun:
http://www-128.ibm.com/developerworks/lotus/library/nd7-webservices/index.html
Du kannst einfach nicht beliebige Datentypen über RPC-style übergeben. D.h. sie dürfen nur aus den genannten in RPC erlaubten Datentypen bestehen.
Du kannst zwar Klassen, Arrays, evtl. sogar Listen (noch nicht genau angeschaut) übertragen, aber eben keine komplexen, in Lotus eingebauten Objekte (z.B. NotesDocumentCollection).
Intern wird das in die SOAP-Datentypen, enkodiert als xml übersetzt.
Ganz hilfreich wars bei meinem ersten Webservices Projekt, als ich einen Proxy dazwischengeschaltet habe (gibts im apache-axis Projekt). Dann kann man nämlich sehen *wie* das Zeugs per xml-message zwischen Consumer und Producer hin-und-hergeschickt wird.
Kann ich mal zeigen.
Damit sieht man besser, was unter der Haube abläuft.
Du müßtest die Document Collection in eine eigene Klasse mappen. Irgendwann werden dann Document-style Webservices einfacher.

Gruß Axel

« Letzte Änderung: 28.12.05 - 01:13:59 von kennwort » Gespeichert

Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile
eknori
@Notes Preisträger
Moderator
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 10779


« Antworten #17 am: 28.12.05 - 06:09:08 »

@Axel:

Zum Testen nehme ich Eclipse mit Web Services Explorer Plugin.
Ja, ich weiß, daß man keine Collection übergeben kann.  Habe gestern mal Julian angemailt und ihn gefragt, wie man das lösen könnte; hier seine Antwort:

Ulrich -

There are a few ways to accomplish what you want.

One thing you will NOT be able to do is return an actual NotesDocumentCollection. You can return a custom class, or an array of a custom class, but not a Notes class.

The easiest way to do it in LotusScript is to create a custom class that is something like this:

========= CODE =========

Class TicketCollection
    Public Tickets() As Ticket
    Public Count As Integer
End Class

========= CODE =========


And then you'd have a function in your web service like:


========= CODE =========

Public Function GetAllTickets () As TicketCollection
    Dim session as new NotesSession
    Dim db as NotesDatabase
    Dim dc as NotesDocumentCollection
    Dim doc as NotesDocument
    Dim count as integer

    set db = session.CurrentDatabase
    set dc = db.AllDocuments()
    count = dc.Count
   
    set GetAllTickets = new TicketCollection
    GetAllTickets.Count = count
    If (count = 0) then
        Redim GetAllTickets.Tickets(count)
    Else
        Redim GetAllTickets.Tickets(count - 1)
    End If
   
    count = 0
    set doc = dc.GetFirstDocument
    do until (doc is nothing)
        '** write some kind of function that converts a NotesDocument
        '** to an object of type Ticket
        set GetAllTickets.Tickets(count) = GetTicketInfo(doc)
        count = count + 1
        set doc = db.GetNextDocument(doc)
    loop
   
End Function

========= CODE =========

When something calls the web service, it will have to read the WSDL file to understand how to parse both a TicketCollection and a Ticket, but that's pretty trivial at this point. All you have to do is have the calling code get the TicketCollection, check to see if there are any tickets in it, and if there are, read through the TicketCollection.Ticket() array.

It's useful to have the TicketCollection.Count variable in there, because it's safer to check for TicketCollection.Count == 0 than it is to start reading a possibly null array.

By the way, all the code above was typed directly into this e-mail, so there are likely some errors. But it should give you the idea, anyway.

Hope that helps!

- Julian

Das mit  Public Tickets() As Ticket hatte ich auch schon, aber irgendwie hat das nicht hingehauen; jetzt weiß ich auch warum: Public Count As Integer ist das fehlende Puzzle Teil.
Gespeichert
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2965


WWW
« Antworten #18 am: 28.12.05 - 07:31:53 »

Hmm. Von der Klasse ist es jetzt in Ordnung.
Ein Ticketobjekt besteht ja nun lediglich aus den in SOAP erlaubten Datentypen.
Ich halte nach wie vor doc-Style als sinnvoller.
Hast du es einmal ausprobiert.
Ich kann mal versuchen das hier nachzuvollziehen.
Gespeichert

Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2965


WWW
« Antworten #19 am: 28.12.05 - 08:22:53 »

Ok. Ich habs jetzt für meinen Land/Hauptstadt Webservice ausprobiert.
Ich glaub das Problem ist weniger das mit der 0-Collection, sondern mehr dem WSDL zu erklären, was man unter einem Array von Custom-Objekten versteht.
Genau das muss aber im WSDL stehen, würd ich sagen.
Du kannst in einer LotusScript ja nicht einmal deklarieren, dass du einen bestimmten Array zurückgeben willst sondern nur Variant. IMHO muss das Custom Objekt (in meinem Fall LandInst mit den Membern name und Hauptstacdt) aber im WSDL beschrieben werden, damit das funktioniert.


Ohne mir ganz sicher zu sein, sehe ich 2 Möglichkeiten:
a) Irgendwie das wsdl-File customizen (auch nicht einfach) oder
b) Doc-Lit Style Webservices.

Ich versuch das erstmal mit dem Land-Webservices, mach aber heute längere Pausen.

Neuer Land webservice mit neuer Funktion getAllLands()
Code:
Class Land
Private ses As NotesSession
Private db As NotesDatabase
Private vwLand As NotesView


Public Sub New
Set ses = New NotesSession()
Set db = ses.currentDatabase
Set vwLand = db.getView("land")
End Sub


Public Function getHauptstadt (land As String) As String
Dim docLand As NotesDocument
Set docLand = vwLand.GetDocumentByKey(land)
If docLand Is Nothing Then
getHauptstadt = "LAND <" & land & "> kann in der Datenbank nicht gefunden werden."
Else
getHauptstadt = docLand.Hauptstadt(0)
End If

End Function

Public Function getAllLands() As Variant

Dim retVal() As LandInst
Dim aCounter As Long
aCounter = -1
Dim aLandInst As LandInst


Dim docLand As NotesDocument
Set docLand = vwLand.getFirstDocument

Do Until docLand Is Nothing
aCounter = aCounter + 1
Set aLandInst = New LandInst()
aLandInst.name = docLand.land(0)
aLandInst.hauptStadt = docLand.hauptStadt(0)
Redim Preserve retVal(aCounter)
Set retVal(aCounter) = aLandInst
Set docLand = vwLand.GetNextDocument(docLand)
Loop
If aCounter > - 1 Then
getAllLands = retVal
Else
getAllLands = retVal
End If

End Function

End Class

erzeugt dieses WSDL:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="urn:DefaultNamespace" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="urn:DefaultNamespace" xmlns:intf="urn:DefaultNamespace" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <wsdl:message name="GETHAUPTSTADTResponse">
  <wsdl:part name="GETHAUPTSTADTReturn" type="xsd:string"/>
 </wsdl:message>
 <wsdl:message name="GETALLLANDSRequest">
 </wsdl:message>
 <wsdl:message name="GETHAUPTSTADTRequest">
  <wsdl:part name="LAND" type="xsd:string"/>
 </wsdl:message>
 <wsdl:message name="GETALLLANDSResponse">
  <wsdl:part name="GETALLLANDSReturn" type="xsd:anyType"/>
 </wsdl:message>
 <wsdl:portType name="Land">
  <wsdl:operation name="GETHAUPTSTADT" parameterOrder="LAND">
   <wsdl:input message="impl:GETHAUPTSTADTRequest" name="GETHAUPTSTADTRequest"/>
   <wsdl:output message="impl:GETHAUPTSTADTResponse" name="GETHAUPTSTADTResponse"/>
  </wsdl:operation>
  <wsdl:operation name="GETALLLANDS">
   <wsdl:input message="impl:GETALLLANDSRequest" name="GETALLLANDSRequest"/>
   <wsdl:output message="impl:GETALLLANDSResponse" name="GETALLLANDSResponse"/>
  </wsdl:operation>
 </wsdl:portType>
 <wsdl:binding name="DominoSoapBinding" type="impl:Land">
  <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
  <wsdl:operation name="GETHAUPTSTADT">
   <wsdlsoap:operation soapAction="GETHAUPTSTADT"/>
   <wsdl:input name="GETHAUPTSTADTRequest">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:input>
   <wsdl:output name="GETHAUPTSTADTResponse">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:output>
  </wsdl:operation>
  <wsdl:operation name="GETALLLANDS">
   <wsdlsoap:operation soapAction="GETALLLANDS"/>
   <wsdl:input name="GETALLLANDSRequest">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:input>
   <wsdl:output name="GETALLLANDSResponse">
    <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:DefaultNamespace" use="encoded"/>
   </wsdl:output>
  </wsdl:operation>
 </wsdl:binding>
 <wsdl:service name="LandService">
  <wsdl:port binding="impl:DominoSoapBinding" name="Domino">
   <wsdlsoap:address location="http://localhost"/>
  </wsdl:port>
 </wsdl:service>
</wsdl:definitions>


Dieser Teil sieht für mich nicht sonderlich ermutigend aus:
Code:
<wsdl:message name="GETALLLANDSResponse">
  <wsdl:part name="GETALLLANDSReturn" type="xsd:anyType"/>
 </wsdl:message>

Vielleicht hat Julian Lust sich an der Diskussion zu beteiligen?
Der Land-Webservice wäre ein einfaches Beispiel als Modell, um Domino-Webservices dazu zu bringen, komplexere Datentypen herauszugeben.

Gruß Axel
Gespeichert

Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile
Seiten: [1] 2 3 ... 9 Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006, Simple Machines Prüfe XHTML 1.0 Prüfe CSS
Impressum Atnotes.de - Powered by Syslords Solutions - Datenschutz | Partner: