Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Outlook 2007 contacts Importieren ?

0 views
Skip to first unread message

Silenus paparias

unread,
Nov 2, 2009, 7:56:01 AM11/2/09
to
Hallo

Gibts eine moeglichekeit daten aus der Contacts-Flies (*.vcf) von
Outlook2007 , im meine Anwendung zu importieren ?

Wenn ja, wo kann ich mehr info erhalten?

Danke.

Jürgen Wondzinski

unread,
Nov 2, 2009, 11:04:15 AM11/2/09
to
Hallo Silenus

ne VCARD (*.VCF) ist doch einfach nur ne Textdatei, die kannst du doch
problemlos einlesen und zerlegen?

Rein ausm Bauch raus ungef�hr so:
cContent = FileToStr(Getfile("VCF"))
cTelefon = STREXTRACT(cContent, "TEL;WORK;VOICE:",CHR(13))


--

wOOdy
Visual FoxPro Technologieberater
Microsoft "Most Valuable Professional" 1996 bis 2009

"*��)
�.���.�*��) �.�*�)
(�.��. (�.�` *
..�`.Visual FoxPro: It's magic !
(�.�``��*

Olaf Doschke

unread,
Nov 2, 2009, 1:52:54 PM11/2/09
to
Mal abgesehen von StrExtract, Outlook-Kontakte sind auch nur Outlook-Items
wie Mails und lassen sich per Automation auslesen:

#DEFINE olFolderContacts 10
oOutlook = CREATEOBJECT("Outlook.Application")
oMapiNamespace = o.GetNamespace('MAPI')
oFolderContacts = oMapiNamespace.GetDefaultFolder(olFolderContacts)
FOR EACH oItem IN oFolder.Items
? oItem.FirstName
? oItem.LastName
? oItem.BusinessTelephoneNumber
? oItem.MailingAddress
? oItem.BusinessHomePage
? oItem.Email1Address
? oItem.Email2Address
...
ENDFOR

�ber den Objectbrowser kommst Du an alle Office/Outlook Konstanten ran,
insbesondere alle olFolder-Typen.
Ein Breakpoint in der For-Schleife und Du kannst Dir per Intellisense alle
ContactItem-Properties anscheuen.

Tsch��, Olaf.


Silenus paparias

unread,
Nov 3, 2009, 2:18:02 AM11/3/09
to
Hallo.
Danke erstmal.

Dies soll ein einmalige procedure werden. Ich will auch nicht in der
Anwendung/formen rumbasteln.
Folgendes ueberlegt:
Der Anwender exportiert die Kontakte in eine Excel-File, sortiert sie,
loescht die doppelte Eintraege etc.
Jetzt komme ich... Nehme und fuege hinzu diese daten in meine DBF
(mit VFP commands,) das wars!

Fuer jede Anregung danke im voraus.

Gruss.

Jürgen Wondzinski

unread,
Nov 3, 2009, 2:40:41 AM11/3/09
to
Hallo Silenus,

Warum sollte der Anwender die Kontakte erst mal nach Excel exportieren?
Kontakte sind in einem Kontaktmanager (wie Outlook) am besten zu bearbeiten,
also soll er doch da seine Kontakte aussortieren.

Und du kannst sie mit der absolut simplen Routine, die dir Olaf gezeigt hat,
direkt aus Outlook einlesen. Der Umweg �ber VCARD oder Excel ist totaler
Schwachfug, sorry. Und macht dir auf jeden Fall deutlich mehr
Programmier-Aufwand.

>> mit VFP commands

Alles, was du in VFP machst, ist "mit VFP commands"; egal ob du nun
prozedural eine VCard oder Excel einliest oder objektorientiert auf Outlook
zugreifst. Man muss sich nur mal damit besch�ftigen WOLLEN.

Silenus paparias

unread,
Nov 3, 2009, 5:51:11 AM11/3/09
to
Hallo Juergen.

Wie schon gesagt ich will nicht in der anwendung "rumbatseln".

Die Anwendung laeuft schon und hat ueber 300 Kontakte drin

Die Outlook Kontakt Daten sind schon von mir in eine temp-DBF
gespeichert worden.

Eine append from temp.dbf hat nur leerzeile hinzugefuegt in meine DBF.

Da die Anzahl der Felder und die Feldername verschieden sind in der
DBFs , wie bestimme ich wo was rein soll?

Gruss

Olaf Doschke

unread,
Nov 3, 2009, 6:55:15 AM11/3/09
to
> Eine append from temp.dbf hat nur leerzeile hinzugefuegt in meine DBF.
>
> Da die Anzahl der Felder und die Feldername verschieden sind in der
> DBFs , wie bestimme ich wo was rein soll?

Wenn was die Quelle des Appends ist?

Grunds�tzlich zum Append:
Du hast eine Ziel-DBF, die Du selektierst. Dann machst Du den APPEND der
Quell-DBF. Die Feldnamen m�ssen in beiden DBFs �bereinstimmen, die
Feldreihenfolge und selbst der Feldtyp sind zweitrangig, sofern die Typen
zumindest kompatibel sind. Man kann z.B. ein C(100) Feld in ein C(50) Feld
appenden, mu� dann evtl. eben nur mit abgeschnittenen Werten rechnen.

Wenn Du also eine Contacts.dbf in Deiner Datenbank hast, wei�t Du, wie die
temp.dbf, aus der Du weitere Kontakte importieren willst aussehen mu�. Das
Mapping von Feldnamen kann Dir keiner Abnehmen, wenn die Strukturen
unterschiedlich sind, dann mu�t Du eben noch einen import Cursor erstellen
z.B. mittels create cursor inmport (feldliste), insert into import select
feld1 as richtigername1, feld2 as richtigername2, ... from temp.dbf, und
anschlie�end ein APPEND FROM DBF("import"). Was Dir ein Append aber nie
abnimmt ist, ein Merge/Abgleich mit schon vorhandenen Kontakten. Dazu
brauchst Du schon eine Programmlogik aus Updates und Inserts der einzelnen
Kontakte, oder Du f�gst blind alle Kontakte an und tilgst dann im Anschlu�
erst Doppler.

An der Stelle in meinem Beispielcode, wo ich beispielhaft einige
ContactItem-Eigenschaften ausgebe, kannst Du aber genauso die besagte
UPDATE/INSERT Logik vorsehen, um die Kontakte zu synchronisieren/zu
erg�nzen, z.B.

Update Contacts SET
Vorname = oItem.Firstname, ;
Nachname = oItem.Lastname, ;
.... ;
WHERE Contacts.EntryID = oItem.EntryID && siehe Anmerkung unten

IF _tally=0 && Kein Update, also neuer Kontakt
INSERT INTO Contacts (...felder...) VALUES (...oItem....,oItem....)

* wenn die Felder geschickterweise so hei�en wie die
Outlook-ContactItem-Properties, dann z.B. einfach
INSERT INTO Contacts FROM NAME oItem
Endif

Je nach den Feldnamen in Deiner Contacts.DBF �ndern sich Update und Insert
logischerweise.

Daneben m��te man dann alle Contacts durchgehen und evtl. die l�schen, die
sich in Outlook nicht mehr auffinden lassen, wenn Outlook das f�hrende
System der Kontaktdaten sein soll, oder man pumpt dann eben Kontakte nach
Outlook, die dort fehlen.

Was die EntryID angeht ist diese zumindest innerhalb Outlook ein eindeutiger
Schl�ssel f�r einen Kontakt, den man am besten auch in seine Contacts.DBF
�bernimmt, um eineindeutig Kontakte zwischen Outlook und seinen eigenen
Daten abgleichen zu k�nnen. Wenn das nicht gegeben ist und Du die
Applikationstabelle der Kontakte nicht selbst �ndern kannst, mu�t Du im
Zweifelsfall eben mehrere Kontakteigenschaften heranziehen, wie Vorname,
Nachnahme, Mailadresse und Geburtsdatum, die insgesamt einen Kontakt
eindeutig reidentifizieren. Das Bl�de an solchen Ersatzschl�sseln ist, da�
gerade eine Korrektur an den darin beteiligten Feldern den Kontakt dann aber
unauffindbar macht. Daher die EntryID.

�brigens haben sich in meinen Beispielcode zwei Fehler eingeschlichen:
a) an der Stelle oMapiNamespace = o.GetNamespace('MAPI') mu� es nat�rlich
hei�en
oMapiNamespace = oOutlook.GetNamespace('MAPI')

b) die Schleife geht �ber alle Items in oFolderContacts, nicht �ber oFolder.

insgesamt also:
#DEFINE olFolderContacts 10
Use Contacts.DBF IN 0 && anpassen an die Zieltabelle.

oOutlook = CREATEOBJECT("Outlook.Application")

oMapiNamespace = oOutlook.GetNamespace('MAPI')
oFolderContacts = oMapiNamespace.GetDefaultFolder(olFolderContacts)
FOR EACH oItem IN oFolderContacts.Items
* ...Update/Insert Logik pro Kontakt, ein Outlook-Kontakt ist gerade in
oItem, Contacts o.�. ist der Alias der Zieltabelle.
ENDFOR

Tsch��, Olaf.


Bernhard Sander

unread,
Nov 3, 2009, 7:10:10 AM11/3/09
to
Hallo Silenus,

> Eine append from temp.dbf hat nur leerzeile hinzugefuegt in meine DBF.
>
> Da die Anzahl der Felder und die Feldername verschieden sind in der
> DBFs , wie bestimme ich wo was rein soll?

Beim APPEND FROM tabelle.dbf kann man h�chstens die Feldauswahl einschr�nken
aber keine anderweitigen Feldzuordnungen vorgeben. Die Reihenfolge der Felder
ist aber grunds�tzlich egal.

Auswege:
SELECT feldeins AS einfeld, felddrei AS zweifeld, feldsiebzehn AS dreifeld ...
FROM quelltabelle INTO TABLE zwischentabelle WHERE ...
SELECT zieltabelle
APPEND FROM zwischentabelle

oder:
Schleife �ber die Quelltabelle und dann die Zeilen einzeln �bertragen.

oder:
COPY TO zwischendatei.csv FIELDS in der ben�tigten Reihenfolge TYPE DELIMITED
SELECT zieltabelle
APPEND FROM zwischendatei.csv TYPE DELIMITED
hier spielt die Reihenfolge der Felder die Hauptrolle. Feldnamen sind in der
Datei keine drin.

Gru�
Bernhard Sander

Olaf Doschke

unread,
Nov 3, 2009, 10:16:30 AM11/3/09
to
> oder:
> COPY TO zwischendatei.csv FIELDS in der ben�tigten Reihenfolge TYPE
> DELIMITED
> SELECT zieltabelle
> APPEND FROM zwischendatei.csv TYPE DELIMITED
> hier spielt die Reihenfolge der Felder die Hauptrolle. Feldnamen sind in
> der Datei keine drin.

Was das angeht k�nnte man auch ein SELECT INTO ARRAY machen und APPEND FROM
ARRAY nutzen.

Tsch��, Olaf.


Jürgen Wondzinski

unread,
Nov 3, 2009, 12:19:51 PM11/3/09
to
Hallo Olaf,

>> Was die EntryID angeht ist diese zumindest innerhalb Outlook ein
>> eindeutiger

Schl�ssel f�r einen Kontakt, den man am besten auch in seine Contacts.DBF
�bernimmt <<


Oobacht! ;) Die EntryId ist bei Outlook / Exchange immer nur Folderbezogen
eindeutig, d.h: wenn du ein Item in nen anderen Folder verschiebst, �ndert
sich dessen EntryId; der jeweilige Folder generiert f�r deinen Context die
EntryId.

Wenn du also Kontakte oder Termine synchron halten willst, musst du selber
ne eindeutige ID in eines der CustomFields speichern, damit du dein Item
wiederfindest.

--

wOOdy
Visual FoxPro Technologieberater
Microsoft "Most Valuable Professional" 1996 bis 2009

"*��)
�.���.�*��) �.�*�)
(�.��. (�.�` *
..�`.Visual FoxPro: It's magic !
(�.�``��*


Silenus paparias

unread,
Nov 4, 2009, 1:13:02 AM11/4/09
to
Hallo Leute.

Habe an der Contacts.dbf die structur gaendert, so das sie mit meine
Anwendungs DBF uebereichstimt, und habe dann alle Daten mit append
from uebernohmen.

Gruss und danke.

Olaf Doschke

unread,
Nov 4, 2009, 10:03:06 AM11/4/09
to
> Oobacht! ;) Die EntryId ist bei Outlook / Exchange immer nur Folderbezogen
> eindeutig, d.h: wenn du ein Item in nen anderen Folder verschiebst, �ndert
> sich dessen EntryId; der jeweilige Folder generiert f�r deinen Context die
> EntryId.

Gut zu wissen, Danke!

Tsch��, Olaf.


0 new messages