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.
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 !
(�.�``��*
#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.
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.
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.
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
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.
> 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
Was das angeht k�nnte man auch ein SELECT INTO ARRAY machen und APPEND FROM
ARRAY nutzen.
Tsch��, 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 !
(�.�``��*
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.
Gut zu wissen, Danke!
Tsch��, Olaf.