Gli ID dei record di Salesforce possono essere di due tipi: 15 caratteri case sensitive, e 18 caratteri case insensitive. E' molto importante utilizzare sempre l'ID a 18 caratteri per tutte le manipolazioni di dati.
Per facilitarci in questo compito, Salesforce ha fornito una formula chiamata CASESAFEID(id), che accetta come input un ID a 15 caratteri, e ritorna l'equivalente a 18 caratteri.
Ma come avviene realmente la conversione da 15 a 18 caratteri?
Inserire la lista di ID Salesforce nel primo box.
Consideriamo un ID a 15 caratteri di esempio: a0D30000001n7Pi
1. Dividiamo l'ID in tre parti da 5 caratteri ciascuna:
(a0D30)-(00000)-(1n7Pi).
2. Invertiamo i caratteri di ogni blocco:
(03D0a)-(00000)-(iP7n1)
3. Per ogni carattere, diamo il valore 1 se quel carattere è in maiuscolo, altrimenti diamo il valore 0 se quel carattere è in minuscolo o un numero. I valori 1 sono evidenziati in grassetto per comodità di lettura:
(03D0a)-(00000)-(iP7n1)
(00100)-(00000)-(01000)
4. Trasformiamo i codici binari di ciascun blocco nel loro equivalente decimale. Ciò produrrà un valore decimale compreso tra 0 (che è l'equivalente di 00000 binario) e il decimale 31 (che è l'equivalente di 11111 binario) per ogni blocco.
Nel nostro caso sarà:
4 - 0 - 8
5. Costruiamo un array di 32 caratteri, contenente la sequenza A-Z e 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. Utilizzando i numeri decimali ottenuti da ogni blocco, preleviamo la posizione equivalente dall'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 |
Quindi 4 - 0 - 8 = E A I
7. Aggiungiamo i 3 nuovi caratteri ottenuti all'ID iniziale:
a0D30000001n7PiEAI
Codice Apex:
String idSalesforce = 'a0D30000001n7Pi'; // inserire l'Id desiderato
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'; // inserire l'Id desiderato
if(idSalesforce == ""){
alert("Inserire una lista di ID di 15 caratteri");
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("Errore : "+y[x]+" non ha una lunghezza di 15 caratteri ("+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