Salesforce record ID's have 2 forms: 15 chars case sensitive, and 18 chars case insensitive. It's very important that we always use 18 chars ID for all data manipulations.
For facilitating this, Salesforce has already given an out-of-the-box formula function named CASESAFEID(id), which accepts the 15 chars ID and returns the 18 chars equivalent.
How does the conversion from 15 to 18 chars actually take place?
Paste your list of IDs into the first text area.
Let's consider a 15 chars record ID (for example): a0D30000001n7Pi
1. Divide the 15 chars into 3 chunks of 5 chars each:
(a0D30)-(00000)-(1n7Pi).
2. Invert the chars of each chunks:
(03D0a)-(00000)-(iP7n1)
3. For each char, give a value of 1 if that digit is in uppercase. Give a value of 0, if that char is in lowercase or a number. The 1 values are highlighted in bold for reading convenience:
(03D0a)-(00000)-(iP7n1)
(00100)-(00000)-(01000)
4. Combine the bits from each chunk to its decimal equivalent. This will yield a decimal value between 0 (which is decimal equivalent of binary 00000) and decimal 31 (which is decimal equivalent of binary 11111) for each chunk.
In our example, it would be:
4 - 0 - 8
5. Construct an array of 32 values containing the sequence A-Z and 0-5:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5
6. Use the integer from each chunk to choose a digit from the array:
A |
B |
C |
D |
E |
F |
G |
H |
I |
J |
K |
L |
M |
N |
O |
P |
Q |
R |
S |
T |
U |
V |
W |
X |
Y |
Z |
0 |
1 |
2 |
3 |
4 |
5 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
Therefore, 4 - 0 - 8 = E A I
7. Append the resulting 3 digits, in the chunk order, to the end of the 15 chars ID, and you have the 18 chars ID:
a0D30000001n7PiEAI
Codice Apex:
String idSalesforce = 'a0D30000001n7Pi'; // change with your 15 chars ID
if(idSalesforce.length() == 18){
system.debug('Input Id is 18 char');
}
else if(idSalesforce.length() != 15){
system.debug('Input Id error');
}
else{
String suffix = '';
String idOut= '';
String InChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ012345';
for(Integer i = 0; i<3; i++){
Integer flags = 0;
for(Integer j = 0; j<5; j++){
String c = idSalesforce.substring(i*5+j, i*5+j+1);
if((c.compareTo('A')>=0) && (c.compareTo('Z')<=0)){
flags += 1 << j;
}
}
suffix = suffix + InChars.substring(flags, flags+1);
}
idOut = idSalesforce + suffix;
system.debug('Id Output 15: '+idSalesforce);
system.debug('Id Output 18: '+idOut);
}
Codice JavaScript:
var idSalesforce = 'a0D30000001n7Pi'; // change with your 15 chars ID
if(idSalesforce == ""){
alert("Please enter into the left column a list of IDs of 15 chars");
return;
}
var y = idSalesforce.value.split("\r").join("").split("\n");
var z=new Array();
for(var x=0;x<y.length;x++){
if(y[x].length == 15){
var s="";
for(var i=0;i<3; i++)
{
var f=0;
for(var j=0;j<5;j++){
var c=y[x].charAt(i*5+j);
if(c>="A" && c<="Z")
f+=1<<j;
}
s+="ABCDEFGHIJKLMNOPQRSTUVWXYZ012345".charAt(f);
}
z.push(y[x]+s);
}
else{
alert("Error : "+y[x]+" has not a length of 15 characters ("+y[x].length+")");
return;
}
}
Codice PHP:
function to18char(string $inputId){
$suffix = '';
for ($i = 0; $i < 3; $i++){
$flags = 0;
for ($j = 0; $j < 5; $j++){
$start = $i * 5 + $j;
$end = ($i * 5 + $j + 1) - $start;
$c = substr($inputId, $start, $end);
if (ctype_upper($c) && $c >= 'A' && $c <= 'Z'){
$flags = $flags + (1 << $j);
}
}
if ($flags <= 25){
$suffix .= substr('ABCDEFGHIJKLMNOPQRSTUVWXYZ',$flags,1);
}
else{
$suffix .= substr('012345', $flags - 26, 1);
}
}
return $inputId . $suffix;
}
Codice Excel (sostituire "A2" con la la cella contenente l'id di 15 caratteri) :
=A2&MID("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",1
+IF(CODE(MID(A2,1,1))>64,1,0)*IF(CODE(MID(A2,1,1))<91,1,0)*1
+IF(CODE(MID(A2,2,1))>64,1,0)*IF(CODE(MID(A2,2,1))<91,1,0)*2
+IF(CODE(MID(A2,3,1))>64,1,0)*IF(CODE(MID(A2,3,1))<91,1,0)*4
+IF(CODE(MID(A2,4,1))>64,1,0)*IF(CODE(MID(A2,4,1))<91,1,0)*8
+IF(CODE(MID(A2,5,1))>64,1,0)*IF(CODE(MID(A2,5,1))<91,1,0)*16,1)
&MID("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",1
+IF(CODE(MID(A2,6,1))>64,1,0)*IF(CODE(MID(A2,6,1))<91,1,0)*1
+IF(CODE(MID(A2,7,1))>64,1,0)*IF(CODE(MID(A2,7,1))<91,1,0)*2
+IF(CODE(MID(A2,8,1))>64,1,0)*IF(CODE(MID(A2,8,1))<91,1,0)*4
+IF(CODE(MID(A2,9,1))>64,1,0)*IF(CODE(MID(A2,9,1))<91,1,0)*8
+IF(CODE(MID(A2,10,1))>64,1,0)*IF(CODE(MID(A2,10,1))<91,1,0)*16,1)
&MID("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",1
+IF(CODE(MID(A2,11,1))>64,1,0)*IF(CODE(MID(A2,11,1))<91,1,0)*1
+IF(CODE(MID(A2,12,1))>64,1,0)*IF(CODE(MID(A2,12,1))<91,1,0)*2
+IF(CODE(MID(A2,13,1))>64,1,0)*IF(CODE(MID(A2,13,1))<91,1,0)*4
+IF(CODE(MID(A2,14,1))>64,1,0)*IF(CODE(MID(A2,14,1))<91,1,0)*8
+IF(CODE(MID(A2,15,1))>64,1,0)*IF(CODE(MID(A2,15,1))<91,1,0)*16,1)
Codice Visual Basic for Applications:
Function FixID(InID As String) As String
If Len(InID) = 18 Then
FixID = InID
Exit Function
End If
Dim InChars As String, InI As Integer, InUpper As String
Dim InCnt As Integer
InChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ012345"
InUpper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
InCnt = 0
For InI = 15 To 1 Step -1
InCnt = 2 * InCnt + Sgn(InStr(1, InUpper, Mid(InID, InI, 1), vbBinaryCompare))
If InI Mod 5 = 1 Then
FixID = Mid(InChars, InCnt + 1, 1) + FixID
InCnt = 0
End If
Next InI
FixID = InID + FixID
End Function