Davide Gammone
Come convertire gli ID di Salesforce da 15 a 18 caratteri

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

Questo sito utilizza cookie, anche di terze parti, per offrirti servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina o cliccando qualunque suo elemento acconsenti all'uso dei cookie. Se vuoi saperne di più o negare il consenso a tutti o ad alcuni cookie, clicca qui.