German Eine Person aus bestehenden Daten in Outlook heraussuchen

JOTHA

Well-Known Member
Licensed User
Hallo Forum,

ich möchte aus meinen Outlook-Kontakten eine Person heraussuchen und dann in einen neuen Datensatz in meiner B4P-Applikation einfügen.

Doch schon beim Heraussuchen gibt es ein Problem.
Ich habe das Beispiel aus der Online-Hilfe verwendet und mit meinen Begriffen abgewandelt.
B4X:
'------------------------------------------------------
' Eine Person aus  bestehenden Daten in Outlook heraussuchen
'------------------------------------------------------
Sub ButtonAusOutlookHeraussuchen_Click

      KontaktPersonA.New1
      PimCollectionPersonA.New1("Contacts")
      PimCollectionPersonA.SortItems("FirstName",False) 'sorts the contacts using the first name field.
      For i = 0 To PimCollectionPersonA.Count - 1
            KontaktPersonA.Value = PimCollectionPersonA.GetItem(i)
            KontaktListe.Add(KontaktPersonA.FirstName & " " & KontaktPersonA.LastName) 'Add the contact's first and last name to ListBox1.
      Next
End Sub
Leider kann man die Ausführung nur auf dem Pocket-PC testen, auf dem Desktop sieht alles so aus als ob es funktionieren würde, da die Outlook-Funktion dort ja anscheinend nur als "Dummy" ausgeführt wird.

Auf dem Pocket-PC erscheint die folgende Meldung (ist als BildDatei angehängt).

Kann das auch daran liegen, daß das Programm über 3.800 Kontakte durchsuchen muß und sich dann dabei aufhängt? Ich glaube das eher nicht, oder?
 

Attachments

specci48

Well-Known Member
Licensed User
Hallo JOTHA,

die Outlook.dll auf dem Desktop ist tatsächlich "nur " eine Dummy Dll.
Da ich die Fehlermeldung in Deinem Anhang leider nicht eindeutig entziffern kann (das Bild ist einfach zu sehr komprimiert) habe ich momentan auch keine Lösung dafür.
Kann das auch daran liegen, daß das Programm über 3.800 Kontakte durchsuchen muß und sich dann dabei aufhängt? Ich glaube das eher nicht, oder?
Durchsuchen tut er ja nicht direkt, sondern er füllt im Beispiel der Reihe nach eine Combobox. Ein OutOfMemory Error ist dann abhängig vom vorhandenen Speicherplatz.
Was passiert denn, wenn Du z.B. nur die ersten 100 Kontakte einliest? Klappt es dann, oder hängt sich der Ppc hierbei auch schon auf? Falls ja, liegt es jedenfalls nicht an der Menge.


Gruß
specci48
 

JOTHA

Well-Known Member
Licensed User
Hallo specci48,

entschuldige, daß Du die angehängte Datei nicht lesen konntest, aber die Einschränkung bei upload war max. 19,5k, da mußte ich so stark komprimieren.

Der Text war folgender:

An error occurred on sub mPersonA.ButtonAusOutlookHeraussuchen_Click.

Line number: 140

i = PimCollectionPersonA.FindItem("KontaktPersonA.Lastname","Hollmann")
Error description:
Invalid property.
Continue?
Den "Hollmann" gibt es 100% in meinen Kontakten (das bin ich selber), also müßte der auch gefunden werden.

Was passiert denn, wenn Du z.B. nur die ersten 100 Kontakte einliest? Klappt es dann, oder hängt sich der Ppc hierbei auch schon auf?
... wenn ich nur wüßte, wie ich nur die ersten 100 Kontakte einlesen kann, dann würde ich es ja mal ausprobieren. ;)
 
Last edited:

klaus

Expert
Licensed User
Hallo JOTHA,

In deiner Programmlinie hast Du scheinbar ein Leerzeichen zwischen Last und name name ?
B4X:
i = PimCollectionPersonA.FindItem("KontaktPersonA.Last name","Hollmann")
Sollte die nicht so aussehen ?
B4X:
i = PimCollectionPersonA.FindItem("KontaktPersonA.LastName","Hollmann")
Grüsse.
 

JOTHA

Well-Known Member
Licensed User
Hallo Klaus,

danke für deinen Hinweis:

... In deiner Programmlinie hast Du scheinbar ein Leerzeichen zwischen Last und name name ?
Das ist mir auch schon aufgefallen, aber im Code ist es korrekt geschrieben worden.

Das Witzige ist: Sobald ich es hier im Posting in die "Code-Schweifen" setze, trennt das Posting die zwei Worte automatisch. Deswegen habe ich 2 mal versucht, das Posting zu editieren, aber jedesmal ist es so wie oben beschrieben. Komisch, oder?

Jetzt aber das Wichtigste (auch an specci48): Es funktioniert plötzlich!

Ich weiß auch nicht warum. :confused:

Leider ist das nicht die Lösung, die ich eigentlich haben wollte. Jetzt habe ich eine Kontaktliste mit allen Kontakten drin.

Ich möchte aber folgendes machen:

Es gibt 2 Felder: Vorname und Nachname. Das sind die Suchkriterien.

Wenn ich dann auf einen Button drücke, soll das Programm alle Kontakte nach diesen 2 Kriterien durchsuchen und mir dann in einer Liste das Gefundene zur Auswahl anbieten.

Wenn ich dann auf die Auswahl klicke, sollen alle Felder (auch die anderen wie z.B. Telefon, Handy, E-Mail, Straße, etc.) automatisch mit Daten gefüllt werden.

So etwas habe ich schon mit XSForms programmiert, aber hier bei B4P ist das ganz anders.

Ich knie mich da mal rein, wenn jemand einen Tipp hat bis ich sehr dankbar.

Entschuldigt nochmal die "Irreführung"! :(
 

JOTHA

Well-Known Member
Licensed User
Nur zur Information!

In VBScript sieht das so aus:
B4X:
'----------------------------------------------------------------------------
' Funktion: imgOutlookVerknuepfung_OnClick 
'----------------------------------------------------------------------------
Sub imgOutlookVerknuepfung_OnClick()
    
   Meldung = msgbox("Daten aus Pocket-Outlook übertragen und aktualisieren ? ------------------------------------- Wenn hier bereits Daten eingetragen sind, werden diese überschrieben !", MBStyle.YesNo + MBStyle.Question, "Pocket-Outlook-Daten")
   If Meldung = vbYes Then

   Dim outlook
   Dim contact
   
   Set outlook = CreateObject("PocketOutlook.Application")
      outlook.logon
   
   Set contact = outlook.GetDefaultFolder(10).Items.Find _
      ("[FileAs] = " & """" & eingabeNachname11.Value & ", " & eingabeVorname11.Value & """")
   
   If contact Is Nothing Then
      App.PlaySound("\Windows\Notify.wav")
      MsgBox("Achtung: Kein Kontakt mit diesem Vornamen und Nachnamen gefunden oder die Felder sind nicht richtig ausgefüllt ! ------------------------------------------------ Bitte Vorname und/oder Nachname korrigieren.")
      App.PlaySound("\Windows\Clipboard.wav")
      
   Else
      App.PlaySound("\Windows\Notify.wav")
      Contact.Display
      App.PlaySound("\Windows\Clipboard.wav")
      
   Set contact = outlook.GetItemFromOid(contact.oid)
      eingabeNachname11.Value = contact.LastName
      eingabeVorname11.Value = contact.FirstName
      auswahlAnredeTitel11.Value = contact.Title
      ...
                ...
      'Hochzeitstag.Value = contact.anniversary
   
   End If
         
   Else
     App.PlaySound("\Windows\Clipboard.wav")'Code für "Nein"
   
   End If 
   
   outlook.logoff

End Sub
:)
 

specci48

Well-Known Member
Licensed User
Ich möchte aber folgendes machen:

Es gibt 2 Felder: Vorname und Nachname. Das sind die Suchkriterien.

Wenn ich dann auf einen Button drücke, soll das Programm alle Kontakte nach diesen 2 Kriterien durchsuchen und mir dann in einer Liste das Gefundene zur Auswahl anbieten.

Wenn ich dann auf die Auswahl klicke, sollen alle Felder (auch die anderen wie z.B. Telefon, Handy, E-Mail, Straße, etc.) automatisch mit Daten gefüllt werden.
Ich habe hierfür mal ein Beispielprogramm angehangen.
Die Kontaktliste wird nach Nachname sortiert und dann wird der erste Kontakt zum eingegebenen Nachnamen gesucht. Weil man immer nur nach einem Kriterium sortieren bzw. suchen kann geht es dann in einer Schleife weiter. Ab der ersten Fundstelle wird jeweils der Vorname verglichen und bei Übereinstimmung erhält die Beispieltabelle einen entsprechenden Zeileneintrag. Dann wird die Kontaktposition um 1 erhöht und, sofern man nicht das Ende der Kontake erreicht hat, der nächste Kontakt eingelesen.

Ich hoffe Dir ist damit ein wenig geholfen.


Gruß
specci48
 

Attachments

JOTHA

Well-Known Member
Licensed User
Hallo specci48,

Sorry, das ich mich jetzt erst wieder melde, um Dir zu danken.

Ich hoffe Dir ist damit ein wenig geholfen.
"Ein wenig geholfen" ist gut! Du hast mir SEHR GEHOLFEN !

Eine Frage habe ich aber noch:
Wenn man die Suche ein 2. Mal ausführt, kommt eine Fehlermeldung.

Wie kann man diese verhindern (allerdings ohne das "abfangen" mit ErrorLabel)?

Danke nochmals im Voraus!
 

specci48

Well-Known Member
Licensed User
Hi JOTHA,

"Ein wenig geholfen" ist gut! Du hast mir SEHR GEHOLFEN !
... um so besser ... ;)

In meinem Beispiel funktioniert die mehrfache Suche ja problemlos. Hast Du vielleicht bei der Übernahme in Dein Programm etwas übersehen? Welche Abbruchmeldung bekommst Du denn (ohne Errorlabel)?


Gruß
specci48
 

JOTHA

Well-Known Member
Licensed User
Hallo specci48,

... In meinem Beispiel funktioniert die mehrfache Suche ja problemlos. Hast Du vielleicht bei der Übernahme in Dein Programm etwas übersehen?
Ich habe dein Beispielprogramm nochmals getestet, was ja leider immer nur auf dem PPC geht, und es ist tatsächlich so, daß man damit mehrfache Suchen durchführen kann.

Also liegt der Fehler bei mir.

Ich dachte, es geht nur einmal, deshalb habe ich eine ErrorLabel-Schleife bei mir eingebaut.

Ich teste jetzt mal mein Programm und hoffe, den Fehler zu finden. In jedem Fall poste ich dann das Ganze (egal ob es dann funzt oder nicht), denn aus Fehlern lernt man ja auch was ...
 

JOTHA

Well-Known Member
Licensed User
Hier ist der Code ...

Hier ist der (abgeänderte) Code:
B4X:
'------------------------------------------------------
' Eine Person aus  bestehenden Daten in Outlook heraussuchen
'------------------------------------------------------
Sub ButtonAusOutlookHeraussuchen_Click
    Sip (False)
   WaitCursor (True)
'   ErrorLabel(ErrorLabelZweimalSuchenGehtNicht)
   KontaktPersonA.New1
    PimCollectionPersonA.New1("Contacts")
   PimCollectionPersonA.SortItems("LastName",False)
   KontaktSucheTabelle.AddCol(cString, "Nachname", 80)
   KontaktSucheTabelle.AddCol(cString, "Vorname", 70)
   KontaktSucheTabelle.AddCol(cString, "Geburtstag", 75)
   KontaktSucheTabelle.AddCol(cString, "Notizen", 230)
   KontaktSucheTabelle.AddCol(cString, "Telefon", 70)
   KontaktSucheTabelle.Clear
   pos = PimCollectionPersonA.FindItem("LastName", Nachname.Text)
   If pos = -1 Then
       Msgbox("Dieser Kunde ist in Pocket-Outlook noch nicht vorhanden.", " Suchergebnis", cMsgboxOK, cMsgboxHand)
      WaitCursor (False)
      Return
    End If   
   KontaktPersonA.Value = PimCollectionPersonA.GetItem(pos)   
   Do While (pos < PimCollectionPersonA.Count)   AND (KontaktPersonA.LastName = Nachname.Text)
      If  KontaktPersonA.FirstName = Vorname.Text Then
         KontaktSucheTabelle.AddRow(KontaktPersonA.LastName, KontaktPersonA.FirstName, KontaktPersonA.Birthday, KontaktPersonA.Body, KontaktPersonA.HomeTelephoneNumber)
      'die Daten aus der "KontaktSucheTabelle" in die Felder übernehmen:
      mPersonA.Anrede.Text = KontaktPersonA.Title
'      mPersonA.Geburtstag.Text = KontaktPersonA.Birthday
      mAdresseTelefon.Straße.Text = KontaktPersonA.HomeAddressStreet
      mAdresseTelefon.PLZ.Text = KontaktPersonA.HomeAddressPostalCode
      mAdresseTelefon.Ort.Text = KontaktPersonA.HomeAddressCity
      mAdresseTelefon.Telefon.Text = KontaktPersonA.HomeTelephoneNumber
      mAdresseTelefon.Handy.Text = KontaktPersonA.MobileTelephoneNumber
      mAdresseTelefon.EMail.Text = KontaktPersonA.Email1Address
      'wählt automatisch aus "Die Person ist bekannt."
      mPersonA.AusweisArt.SelectedIndex = 1
      'Focus: Geht dann automatisch mit dem Cursor zum Feld "Geburtsort"
      mPersonA.Geburtsort.Focus
      End If
      pos = pos + 1
      If pos < PimCollectionPersonA.Count Then
         KontaktPersonA.Value = PimCollectionPersonA.GetItem(pos)
      End If
   Loop
   If KontaktSucheTabelle.RowCount = 0 Then
      Msgbox("Dieser Kunde ist in Pocket-Outlook noch nicht vorhanden.", " Suchergebnis", cMsgboxOK, cMsgboxHand)
   End If
   WaitCursor (False)
'   ErrorLabelZweimalSuchenGehtNicht:
'   Msgbox("Mehr als einmal SUCHEN geht NICHT. Für eine neue Suche muß das Programm neu gestartet werden.", " Hinweis", cMsgboxOK, cMsgboxHand)
End Sub
Nach der zweiten Suche erscheint die angehängte Fehlermeldung, wobei die betreffende "Zeile 170" diese ist:
B4X:
   KontaktSucheTabelle.AddCol(cString, "Nachname", 80)
P.S.: Bei dieser Gelegenheit - ich habe ein Problem bei der Datenübernahme des Geburtstages (Birthday), deshalb ist ist diese Zeile deaktiviert.
 
Last edited:

JOTHA

Well-Known Member
Licensed User
... Fehler gefunden ...

Hallo specci48,

ich habe (glaube ich) den Fehler gefunden.

Diese Zeilen waren in der selben Sub zusammen, während Du diese Zeilen in "App_Start" hattest:

B4X:
KontaktPersonA.New1
PimCollectionPersonA.New1("Contacts")
   PimCollectionPersonA.SortItems("LastName",False)
   KontaktSucheTabelle.AddCol(cString, "Nachname", 80)
   KontaktSucheTabelle.AddCol(cString, "Vorname", 70)
   KontaktSucheTabelle.AddCol(cString, "Geburtstag", 75)
   KontaktSucheTabelle.AddCol(cString, "Notizen", 230)
   KontaktSucheTabelle.AddCol(cString, "Telefon", 70)
Das Ganze habe ich jetzt in einen anderen Bereich (beim Anzeigen des Modules mit XXX_Show) geschoben, und schon funktioniert es wieder (zumindest auf dem Desktop)!

Ich melde mich, wenn es auch auf dem PPC klappt.
 
Last edited:

JOTHA

Well-Known Member
Licensed User
... ich habe (glaube ich) den Fehler gefunden.
Ergänzung: Diese Zeilen haben auch bei der Sub "XXX_Show" eine Fehlermeldung verursacht.

Jetzt habe ich es in die "Globals" verschoben und es scheint jetzt 100% zu funktionieren (auf dem Desktop).
 

JOTHA

Well-Known Member
Licensed User
... funktioniert jetzt auch auf dem Pocket-PC

Ich melde mich, wenn es auch auf dem PPC klappt.
Also, es klappt jetzt auch auf dem Pocket-PC.

Danke nochmals für den Code, specci48! :)
 

JOTHA

Well-Known Member
Licensed User
... wenn die Suche dann 2 Ergebnisse liefert?

Hallo specci48,

wenn die Suche dann 2 Ergebnisse liefert, weil z.B. zweimal ein "Hans Maier" vorkommt, dann kann es zwei Gründe geben, warum das so ist:

a) Die Person ist irrtümlich 2 x in Outlook eingetragen.
b) Die Person gibt es tatsächlich 2 mal, es handelt sich aber um 2 verschiedene Personen (in der Regel mit verschiedenen Geburtstagen.

Die Frage daraus:

Wie kann ich eine Person durch "anklicken" in der Tabelle auswählen?


Brauche ich dazu die "ListView" von Filippo (mit CheckBoxen in der Tabelle) oder reicht da die "normale Tabelle" und dazu etwas Code? :confused:
 

specci48

Well-Known Member
Licensed User
...oder reicht da die "normale Tabelle" und dazu etwas Code? :confused:
Letzteres reicht! Im Anhang findest Du hierzu ein erweitertes Beispiel.

Die Tabelle hat eine zusätzliche (erste) Spalte bekommen, welche durch die Breite 0 aber unsichtbar bleibt. Hier merkt sich das Programm die tatsächliche Kontaktposition in der PimCollection.
Die Auswahl wird über das SelectionChanged Event der Tabelle abgefangen. Je nach Auswahl wird dann über die tatsächliche (gemerkte) Position zum Tabelleneintrag der zugehörige Kontakt bestimmt. Anschließend kann man dazu dann wie gewohnt beliebige Daten zu diesem Kontakt anzeigen oder ggf. auch ändern.


Gruß
specci48
 

Attachments

JOTHA

Well-Known Member
Licensed User
Super !!!

Hallo specci48,

vielen Dank für deine Hilfe.

Der Code funktioniert hervorragend !!!

:sign0188:
 
Top