Version 2+ av Salesforce ODBC-drivrutinen gör att du kan batcha flera SOQL Insert-satser. Den här bloggen visar hur du infogar flera Microsoft Access-poster i Salesforce.
För att komma igång:
- Installera och licensiera Salesforce.com ODBC-drivrutinen på maskinen där Microsoft Access är installerat.
Innan du kan använda Salesforce.com ODBC-drivrutinen för att ansluta din applikation till Salesforce.com måste du konfigurera en ODBC-datakälla. En ODBC-datakälla lagrar anslutningsdetaljerna för måldatabasen (t.ex. Salesforce.com) och ODBC-drivrutinen som krävs för att ansluta till den (t.ex. Salesforce.com ODBC-drivrutinen).
För att köra ODBC Administrator (som du använder för att skapa en datakälla), skriv det här kommandot i Windows Kör-dialogrutan om du använder en 64-bitarsversion av Microsoft Office:
%windir%\system32\odbcad32.exe
–Eller–
Skriv detta kommando om du använder en 32-bitarsversion av Microsoft Office:
%windir%\syswow64\odbcad32.exe
Om du inte är säker på om din version av Microsoft Office är 32-bitars eller 64-bitars, starta ett Office-program t.ex. Microsoft Access och leta sedan efter programmets process i Aktivitetshanteraren. Om processnamnet är (för Microsoft Access) MSACCESS.EXE *32, är Microsoft Office 32-bitars. Om processnamnet är MSACCESS.EXE är Microsoft Office 64-bitars.
Så här skapar du en datakälla för Salesforce.com ODBC-drivrutin:
- I ODBC Administrator, välj fliken System DSN och välj sedan Lägg till.
- I dialogrutan Skapa ny datakälla väljer du Easysoft Salesforce ODBC SOQL-drivrutin och väljer sedan Slutför.
- Slutför dialogrutan Easysoft Salesforce SOQL ODBC Driver DSN Setup:
Inställning Värde DSN SFSOQL Användarnamn Namnet på din Salesforce.com-användare. Till exempel, [email protected]. Lösenord Lösenordet för din Salesforce.com-användare. Token Säkerhetstoken för din Salesforce.com-användare, om det behövs. För att ta reda på om du behöver tillhandahålla en säkerhetstoken, välj knappen Testa. Om anslutningsförsöket misslyckas med ett fel som innehåller
LOGIN_MUST_USE_SECURITY_TOKEN
, måste du tillhandahålla en.Salesforce.com skickar säkerhetstokenen via e-post till den e-postadress som är kopplad till ditt Salesforce.com-användarkonto. Om du inte har fått en säkerhetstoken kan du återskapa den. Salesforce.com kommer sedan att skicka den nya säkerhetstoken till dig via e-post. För att återskapa din säkerhetstoken, logga in på Salesforce.com och välj sedan Inställningar från användarmenyn. Sök efter "säkerhetstoken" i snabbsökningsrutan. Klicka på Återställ säkerhetstoken på sidan Återställ säkerhetstoken. När du får token i din e-postklient, kopiera den och klistra in den i Token-fältet.
- Använd knappen Test för att verifiera att du lyckas ansluta till Salesforce.com.
Microsoft Access
- Skapa en ny Microsoft Access-databas.
- Skapa en tabell som heter Konto med dessa kolumner:
Kolumn Datatyp ID Autonummer AccName Korttext Egenskapsbeskrivning Korttext Adress Korttext Stad Korttext Postnummer Korttext - Ange några exempeldata i tabellen. Till exempel:
AccName Property Description Address Town PostCode MyCo Head Office 1 MyStreet MyTown AB1 DEF AcmeLtd Workshop 1 MyRoad MyTown AB1 XYZ
- Tryck på ALT+F11 för att starta Visual Basic Editor.
- Sätt i en ny modul och lägg till följande kod. Det finns två subrutiner och en hjälpfunktion. Båda subrutinerna infogar åtkomstposterna i Salesforce i bulk. Den andra subrutinen visar hur man använder en parametriserad SOQL-infogningssats.
- På menyn Kör, använd Kör Sub/UserForm för att köra underrutinerna.
Option Compare Database Sub InsertAccounts() Dim con As New ADODB.Connection Dim comm As New ADODB.Command Dim PrmName As New ADODB.Parameter Dim PrmAddress As New ADODB.Parameter Dim PrmTown As New ADODB.Parameter Dim PrmPostCode As New ADODB.Parameter Dim PrmDescription As New ADODB.Parameter Dim RowCount As Long Dim i As Integer Dim db As DAO.Database Dim rs As DAO.Recordset Dim BlockCount As String Dim isPosted As Boolean RowCount = 0 ' Open the connection to the Easysoft Salesforce SOQL ODBC Driver data source con.Open "SFSOQL" comm.ActiveConnection = con ' Set up the initial insert statement using ? for each column I am going to pass in comm.CommandText = "insert into Account (Name, BillingStreet, BillingCity, BillingPostalCode, Description ) values ( ?, ?, ?, ?, ? )" ' Bind all the columns to the statement Set PrmName = comm.CreateParameter("P1", adVarWChar, adParamInput, 255, Null) Set PrmAddress = comm.CreateParameter("P2", adVarWChar, adParamInput, 255, Null) Set PrmTown = comm.CreateParameter("P3", adVarWChar, adParamInput, 120, Null) Set PrmPostCode = comm.CreateParameter("P4", adVarWChar, adParamInput, 60, Null) Set PrmDescription = comm.CreateParameter("P5", adLongVarWChar, adParamInput, 255, Null) comm.Parameters.Append PrmName comm.Parameters.Append PrmAddress comm.Parameters.Append PrmTown comm.Parameters.Append PrmPostCode comm.Parameters.Append PrmDescription ' Create a connection to the local database and start working through the rows Set db = CurrentDb Set rs = db.OpenRecordset("select * from Account order by Id") BlockCount = 0 Do While Not rs.EOF RowCount = RowCount + 1 If BlockCount = 0 Then ' Start a new transaction con.BeginTrans isPosted = False End If BlockCount = BlockCount + 1 Debug.Print RowCount & " : " & rs.Fields("AccName") DoEvents ' Prepare to transfer the data to the ODBC driver PrmName.Value = rs.Fields("AccName") If Not IsNull(rs.Fields("Address")) Then PrmAddress.Value = Replace(rs.Fields("Address"), ",", vbCrLf) Else PrmAddress.Value = Null End If If Not IsNull(rs.Fields("Town")) Then PrmTown.Value = rs.Fields("Town") Else PrmTown.Value = Null End If If Not IsNull(rs.Fields("Town")) Then PrmPostCode.Value = rs.Fields("PostCode") Else PrmPostCode.Value = Null End If If Not IsNull(rs.Fields("Property Description")) Then PrmDescription.Value = rs.Fields("Property Description") Else PrmDescription.Value = Null End If comm.Execute ' When 200 rows have been sent to the driver, commit If BlockCount = 200 Then Debug.Print "Block posted" con.CommitTrans isPosted = True BlockCount = 0 End If ' Loop through the block until the end is reached rs.MoveNext Loop rs.Close db.Close ' Finally, if there are any rows left to commit, send them If Not isPosted Then con.CommitTrans con.Close End Sub Sub InsertAccountsParameterisedSOQL() Dim con As New ADODB.Connection Dim SQL As String Dim SQLBase As String Dim BlockCount As Long Dim isPosted As Boolean Dim RowCount As Long Dim i As Integer Dim db As DAO.Database Dim rs As DAO.Recordset RowCount = 0 ' Open the connection to the Easysoft Salesforce SOQL ODBC Driver data source con.Open "SFSOQL" SQLBase = "insert into Account (Name, BillingStreet, BillingCity, BillingPostalCode, Description ) values ( " ' Create a connection to the local database and start working through the rows Set db = CurrentDb Set rs = db.OpenRecordset("select * from Account order by Id") BlockCount = 0 Do While Not rs.EOF RowCount = RowCount + 1 If BlockCount = 0 Then ' Start a new transaction con.BeginTrans isPosted = False End If BlockCount = BlockCount + 1 Debug.Print RowCount & " : " & rs.Fields("AccName") DoEvents ' Prepare to transfer the data to the ODBC driver SQL = SQLBase If IsNull(rs.Fields("AccName")) Then SQL = SQL & "NULL, " Else SQL = SQL & "'" & EscQuotes(rs.Fields("AccName")) & "', " End If If IsNull(rs.Fields("Address")) Then SQL = SQL & "NULL, " Else SQL = SQL & "'" & EscQuotes(Replace(rs.Fields("Address"), ",", vbCrLf)) & "', " End If If Not IsNull(rs.Fields("Town")) Then SQL = SQL & "NULL, " Else SQL = SQL & "'" & EscQuotes(rs.Fields("Town")) & "', " End If If IsNull(rs.Fields("PostCode")) Then SQL = SQL & "NULL, " Else SQL = SQL & "'" & EscQuotes(rs.Fields("PostCode")) & "', " End If If IsNull(rs.Fields("Property Description")) Then SQL = SQL & "NULL) " Else SQL = SQL & "'" & EscQuotes(rs.Fields("Property Description")) & "')" End If con.Execute SQL ' When 200 rows have been sent to the driver then commit If BlockCount = 200 Then Debug.Print "Block posted" con.CommitTrans isPosted = True BlockCount = 0 End If ' Loop through the block until the end is reached rs.MoveNext Loop rs.Close db.Close ' Finally, if there are any rows left to commit, send them If Not isPosted Then con.CommitTrans con.Close End Sub Function EscQuotes(inpStr As String) As String EscQuotes = Replace(inpStr, "'", "''") End Function