Having imported nearly 2000 contacts I found a problem - irritating since I couldn't preview the import before accepting it. I now need to select those contacts and delete them. I would very much rather not have to do it by rolling back the database...
Discuss Account Management
batch delete?
You need to be logged in to post messages
This question is answered
A couple of thoughts...
1. There's a batch delete in Leads that I'm familiar with... I'll look into Accounts/Contacts... perhaps that doesn't exist.
2. Typically there is a Preview and an "undo" after the import. I know you're passed that, but for future reference this is there and I can't express enough concern for verifying the data before accepting it.
3. Yes, I've had to do database deletes... at least all the records will have the same import id. If you do a delete, just make sure to update the Index in the Admin pages to reset that data too.
4. There are ways to do more exhaustive imports from the API... to do related data imports. This requires training.
By Tim Clarke
Thanks for the thoughts:
1) I couldn't see it. A useful mechanism for this in other packages is to make a select via some criteria then provide selection mechanisms with that sub-selection and have a batch process button.
2) The "verify before accepting" was my problem, I didn't realise that that download contained an error report....
3) Have deleted manually, several sub-tables had records too. All gone - thanks.
4) Got some documentation on that I can start with? Following a conversation with Phil Kessler yesterday, we are at that point.
ConcourseSuite has a "Transfer" application that can be used to read and write data between different CRMs and different formats. There are three classes that take CSV files and import them using the API. They are:
ImportAccounts
ImportAccountContacts (and Accounts at the same time)
ImportGeneralContacts
Those classes are used by com.concursive.crm.api.client.Transfer which is in the CRM library and can be executed from the command-line with a single parameter which specifies the path to a configuration file, for example: import-accountcontacts.xml, the contents would need to have the parameters @@ updated for your configuration:
<data-import-config>
<description>Copies contacts from an Excel generated CSV file into the CRM under a new Electronic Import user</description>
<reader class="com.concursive.crm.api.client.reader.cfs.ImportAccountContacts">
<propertyFile>@PROPERTY.FILE@</propertyFile>
<csvFile>@CSV.FILE@</csvFile>
</reader>
<writer class="com.concursive.crm.api.client.writer.cfshttpxmlwriter.CFSHttpXMLWriter">
<url>http://@URL@/ProcessPacket.do</url>
<id>@ID@</id>
@CODE@
<systemId>@SYSTEM.ID@</systemId>
</writer>
</data-import-config>
The CSV File:
OWNER = findColumn(thisRecord, new String[]);
NAME_SALUTATION = findColumn(
thisRecord, new String[]);
CONTACT_NAME = findColumn(
thisRecord, new String[]);
FIRST_NAME = findColumn(
thisRecord, new String[]);
MIDDLE_NAME = findColumn(
thisRecord, new String[]);
LAST_NAME = findColumn(
thisRecord, new String[]);
SUFFIX = findColumn(thisRecord, new String[]);
COMPANY_NAME = findColumn(
thisRecord, new String[]);
TITLE = findColumn(thisRecord, new String[]);
BUSINESS_ADDRESS_1 = findColumn(
thisRecord, new String[]);
BUSINESS_ADDRESS_2 = findColumn(
thisRecord, new String[]);
BUSINESS_ADDRESS_3 = findColumn(
thisRecord, new String[]);
BUSINESS_CITY = findColumn(
thisRecord, new String[]);
BUSINESS_STATE = findColumn(
thisRecord, new String[]);
BUSINESS_ZIP = findColumn(
thisRecord, new String[]);
BUSINESS_COUNTRY = findColumn(
thisRecord, new String[]);
HOME_ADDRESS_1 = findColumn(
thisRecord, new String[]);
HOME_ADDRESS_2 = findColumn(
thisRecord, new String[]);
HOME_ADDRESS_3 = findColumn(
thisRecord, new String[]);
HOME_CITY = findColumn(
thisRecord, new String[]);
HOME_STATE = findColumn(
thisRecord, new String[]);
HOME_ZIP = findColumn(
thisRecord, new String[]);
HOME_COUNTRY = findColumn(
thisRecord, new String[]);
BUSINESS_PHONE = findColumn(
thisRecord, new String[]);
BUSINESS_PHONE_EXT = findColumn(
thisRecord, new String[]);
BUSINESS_2_PHONE = findColumn(
thisRecord, new String[]);
BUSINESS_FAX = findColumn(
thisRecord, new String[]);
HOME_PHONE = findColumn(
thisRecord, new String[]);
HOME_2_PHONE = findColumn(
thisRecord, new String[]);
HOME_FAX = findColumn(
thisRecord, new String[]);
MOBILE_PHONE = findColumn(
thisRecord, new String[]);
OTHER_PHONE = findColumn(
thisRecord, new String[]);
PAGER = findColumn(thisRecord, new String[]);
BUSINESS_EMAIL = findColumn(
thisRecord, new String[]);
PERSONAL_EMAIL = findColumn(
thisRecord, new String[]);
OTHER_EMAIL = findColumn(
thisRecord, new String[]);
NOTES = findColumn(thisRecord, new String[]);
EMPLOYEES = findColumn(
thisRecord, new String[]);
MODIFIED = findColumn(thisRecord, new String[]);
ENTERED = findColumn(thisRecord, new String[]);
LIST_SALUTATION = findColumn(thisRecord, new String[]);
SITE_ID = findColumn(thisRecord, new String[]);
NO_EMAIL = findColumn(thisRecord, new String[]);
NO_MAIL = findColumn(thisRecord, new String[]);
CONTACT_SOURCE = findColumn(thisRecord, new String[]);
TYPE_ID = findColumn(thisRecord, new String[]);
CLIENT_ID = findColumn(thisRecord, new String[]);
DEPARTMENT = findColumn(thisRecord, new String[]);
Import errors are created in a file called "import.out"
I typically call all of this with an ant script which makes things repeatable.
I'll organize this and post it in the wiki too.