A versão 2+ do driver ODBC do Salesforce permite agrupar várias instruções SOQL Insert. Este blog mostra como inserir vários registros do Microsoft Access no Salesforce.
Para começar:
- Instale e licencie o Driver ODBC Salesforce.com na máquina em que o Microsoft Access está instalado.
Antes de poder usar o Driver ODBC do Salesforce.com para conectar seu aplicativo ao Salesforce.com, você precisa configurar uma fonte de dados ODBC. Uma fonte de dados ODBC armazena os detalhes da conexão para o banco de dados de destino (por exemplo, Salesforce.com) e o driver ODBC necessário para se conectar a ele (por exemplo, o driver ODBC Salesforce.com).
Para executar o Administrador ODBC (que você usa para criar uma fonte de dados), na caixa de diálogo Executar do Windows, digite este comando se estiver usando uma versão de 64 bits do Microsoft Office:
%windir%\system32\odbcad32.exe
-Ou-
Digite este comando se estiver usando uma versão de 32 bits do Microsoft Office:
%windir%\syswow64\odbcad32.exe
Se você não tiver certeza se sua versão do Microsoft Office é de 32 bits ou 64 bits, inicie um aplicativo do Office, por exemplo. Microsoft Access e, em seguida, procure o processo do aplicativo no Gerenciador de tarefas. Se o nome do processo for (para Microsoft Access) MSACCESS.EXE *32, o Microsoft Office é de 32 bits. Se o nome do processo for MSACCESS.EXE, o Microsoft Office é de 64 bits.
Para criar uma fonte de dados do Driver ODBC do Salesforce.com:
- No Administrador de ODBC, escolha a guia DSN do sistema e, em seguida, escolha Adicionar.
- Na caixa de diálogo Criar nova fonte de dados, escolha Easysoft Salesforce ODBC SOQL Driver e, em seguida, escolha Concluir.
- Preencha a caixa de diálogo Configuração de DSN do Driver ODBC Easysoft Salesforce SOQL:
Configuração Valor DSN SFSOQL Nome de usuário O nome do seu usuário do Salesforce.com. Por exemplo, meuusuário@meudomínio.com. Senha A senha do seu usuário do Salesforce.com. Token O token de segurança para seu usuário do Salesforce.com, se necessário.
Para saber se você precisa fornecer um token de segurança, escolha o botão Testar. Se a tentativa de conexão falhar com um erro que contémLOGIN_MUST_USE_SECURITY_TOKEN, você precisa fornecer um.
O Salesforce.com envia por email o token de segurança para o endereço de email associado à sua conta de usuário do Salesforce.com. Se você não recebeu um token de segurança, poderá regenerá-lo. A Salesforce.com enviará o novo token de segurança por e-mail para você. Para regenerar seu token de segurança, faça login no Salesforce.com e escolha Configuração no menu do usuário. Procure por "token de segurança" na caixa Busca rápida. Clique em Redefinir token de segurança na página Redefinir token de segurança. Ao receber o token em seu cliente de e-mail, copie-o e cole-o no campo Token.
- Use o botão Testar para verificar se você consegue se conectar com sucesso ao Salesforce.com.
Microsoft Access
- Crie um novo banco de dados do Microsoft Access.
- Crie uma tabela chamada Conta com estas colunas:
Coluna Tipo de dados ID Numeração automática AccName Texto curto Descrição da propriedade Texto curto Endereço Texto curto Cidade Texto curto Código Postal Texto curto - Insira alguns dados de exemplo na tabela. Por exemplo:
AccName Property Description Address Town PostCode MyCo Head Office 1 MyStreet MyTown AB1 DEF AcmeLtd Workshop 1 MyRoad MyTown AB1 XYZ
- Pressione ALT+F11 para iniciar o Editor do Visual Basic.
- Insira um novo módulo e adicione o código a seguir. Existem duas sub-rotinas e uma função auxiliar. Ambas as sub-rotinas inserem os registros de acesso no Salesforce em massa. A segunda sub-rotina mostra como usar uma instrução de inserção SOQL parametrizada.
- No menu Executar, use Executar Sub/UserForm para executar as sub-rotinas.
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