StoreID
Hallo Kruemelino,
ich habe die V 2.23 mit OL 2003 und einer "externen" PSD (OL-Kompatibel 97-2000) getestet - hier scheint alles zu funktionieren...
Die Frage, wie fische ich die StoreID raus, ist glaube ich nicht so scher zu beantworten. - Vorweg: der Fehler bei GetItemFromID tritt natürlich immer auf, egal in welcher Funktion/Modul... -
Getestet hatte ich das Zusammenspiel zwischen AnrMonRing und FindeAnrufer (s.u.):
in FindeAnrufer hangeln wir uns ja bis zu einem ContactItem vor, welches eine EntryID (KontaktID) hat - der zugehörige Parent ist der entsprechende Ordner und der hat die StoreID => die StoreID muss nun nur noch zusätzlich zur KontaktID übergenen werden [...könnte man ja ggf. auch als Array machen...]
wie siehts also im Einzelnen für Funktionen mit GetItemFromID aus:
* AnrMonRing:
+ ruft FindeKontakt (FindeAnrufer) auf => FindeKontakt kann über aktKontakt.Parent.StoreID neben der EntryID auch die StoreID liefern
+ AnrMonRing kann StoreID auch für "letzterAnrufer" per SaveSetting speichern
* AnrMonDISCONNECT:
+ [habe hier nicht alles kapiert...] StoreID sollte per GetSetting für "letzterAnrufer" abgerufen werden können
* AnrMonEinblenden:
+ dito: StoreID per GetSetting aus "letzterAnrufer"
* Wählbox:
+ WählboxStart:
- StoreID über FindeKontakt
- StoreID muss mit in Journaleintrag
+ WählenAusKontakt:
- If .Class = olContact Then => StoreID = .Parent.StoreID
- StoreID muss mit in Journaleintrag
+ RückrufAnrListe:
- StoreID per GetSetting aus "AnrListe"
+ Wahlwiederholung:
- StoreID per GetSetting aus in "AnrListe"
* AnrMonCALL:
- StoreID über FindeKontakt
[StoreID-SaveSetting für AnrListe+letzterAnrufer: in AnrMonRing über FindeKontakt]
* formWählBox:
+ ButtonZeigeKontakt_Click:
- StoreID muss dem Form in Wählbox dito formWählbox.Tag = KontaktID übergeben werden
* Zusammenhang von oContactItems_ItemAdd und KontaktErstellen ist mir unklar
Ich habe mir natürlich die Frage gestellt, wie implementiert man die Sache relativ einfach => die erste Idee ist, die KontaktID (EntryID) und die StoreID als "Array" zu handhaben und "serialisiert" sowohl in der Registry als auch im Tag abzulegen z.B. als "EntryID|StoreID" also "098324583|52345092359".
Über split wären die zwei IDs ja auch gut zu trennen.
Hier nochmal meine alten Tests:
PHP:
Sub AnrMonRING_x()
' AnrMonRING(FBStatus As String, posRING As Long, anzeigen As Boolean)
' wertet einen eingehenden Anruf aus
' Parameter: FBStatus (String): Status-String der FritzBox
' posRING (Long): Position von RING im Status-String
' anzeigen (Boolean): nur bei 'true' wird 'AnrMonEinblenden' ausgeführt
Dim olNamespace As Outlook.NameSpace ' MAPI-Namespace
Dim olFolder As Outlook.MAPIFolder
Dim TelNr As String ' ermittelte TelNr
Dim Anrufer As String ' ermittelter Anrufer
Dim vCard As String ' vCard des Anrufers
Dim KontaktID As String ' ID der Kontaktdaten des Anrufers
Dim LandesVW As String ' eigene Landesvorwahl
Dim iIndx, jIndx, kIndx As Integer
Dim olFolderStoreID As String ' StoreId des Ordners
LandesVW = "0049"
TelNr = "0303416774"
' Daten zurücksetzen
KontaktID = "-1;"
Anrufer = ""
' Anrufer in den Outlook-Kontakten suchen
Set olNamespace = CreateObject("Outlook.Application").GetNamespace("MAPI")
' laufe durch alle Ordner des Namespace
For iIndx = 1 To olNamespace.Folders.Count
' laufe durch alle Items des/der Namespace-Ordner
For jIndx = 1 To olNamespace.Folders.Item(iIndx).Folders.Count
' Setze Ordner-Variable
Set olFolder = olNamespace.Folders.Item(iIndx).Folders.Item(jIndx)
' ist Ordner = Kontaktordner?
If olFolder.DefaultItemType = olContactItem Then
' JA: dann...
' ...finde StoreID
olFolderStoreID = olFolder.StoreID
' ...FindeAnrufer_x
If FindeAnrufer_x(TelNr, LandesVW, KontaktID, olFolder, olFolderStoreID) Then
With olNamespace.GetItemFromID(KontaktID, olFolderStoreID)
Anrufer = Replace(.FullName & " (" & .CompanyName & ")", " ()", "")
MsgBox Anrufer & Chr(13) & Chr(13) & olFolder.Name & Chr(13) & Chr(13) & olFolder.Parent.Name
End With
End If
End If
Next
Next
Set olNamespace = Nothing
End Sub
Private Function FindeAnrufer_x(TelNr As String, LandesVW As String, KontaktID As String, Ordner As Object, olFolderStoreID As String) As Boolean
' sucht in der Kontaktdatenbank nach der TelNr
' Parameter: TelNr (String): Telefonnummer des zu Suchenden
' LandesVW (String): eigene Landesvorwahl
' KontaktID (String): ID der Kontaktdaten falls was gefunden wurde (nur Rückgabewert)
' Ordner (Object): der zu durchsuchende Kontaktordner (für die rekursive Suche)
' Rückgabewert (Boolean): 'true' wenn was gefunden wurde
Dim iKontakt As Long ' Zählvariable für den aktuellen Kontakt
Dim iOrdner As Long ' Zählvariable für den aktuellen Ordner
Dim aktKontakt As Object ' aktuelles Element
Dim gefunden As Boolean ' was gefunden?
Dim alleTelNr As Variant ' alle TelNr eines Kontakts
Dim iTelNr As Long ' Zählvariable für die aktuelle TelNr
Dim aktTelNr As String ' aktuelle TelNr
gefunden = False
iKontakt = 1
Do While Not gefunden And iKontakt <= Ordner.Items.Count
Set aktKontakt = Ordner.Items(iKontakt)
With aktKontakt
' nur Kontakte werden durchsucht
If .Class = olContact Then
alleTelNr = Array(.AssistantTelephoneNumber, .BusinessTelephoneNumber, _
.Business2TelephoneNumber, .CallbackTelephoneNumber, .CarTelephoneNumber, _
.CompanyMainTelephoneNumber, .HomeTelephoneNumber, .Home2TelephoneNumber, _
.ISDNNumber, .MobileTelephoneNumber, .OtherTelephoneNumber, _
.PagerNumber, .PrimaryTelephoneNumber, .RadioTelephoneNumber)
iTelNr = LBound(alleTelNr)
Do While Not gefunden And iTelNr <= UBound(alleTelNr)
If Not Len(alleTelNr(iTelNr)) = 0 Then
aktTelNr = nurZiffern(alleTelNr(iTelNr), LandesVW)
If TelNr = aktTelNr Then
gefunden = True
KontaktID = aktKontakt.EntryID
TelNr = alleTelNr(iTelNr)
olFolderStoreID = aktKontakt.Parent.StoreID
End If
End If
iTelNr = iTelNr + 1
Loop
End If
End With
DoEvents
iKontakt = iKontakt + 1
Loop
' Unterordner werden rekursiv durchsucht
iOrdner = 1
Do While iOrdner <= Ordner.Folders.Count And Not gefunden
gefunden = FindeAnrufer_x(TelNr, LandesVW, KontaktID, Ordner.Folders.Item(iOrdner), Ordner.Folders.Item(iOrdner).StoreID)
iOrdner = iOrdner + 1
Loop
FindeAnrufer_x = gefunden
Set aktKontakt = Nothing
'Set Ordner = Nothing ' ausgestellt für MsgBox
End Function