Il blog di Luciano Bastianello

(Tutto quello che non c'è non si può rompere)

Home Contact Syndicate this Site (RSS 2.0) Syndicate this Site (Atom) Login
  418 Posts :: 35 Stories :: 1265 Comments :: 284 Trackbacks

News




Certified Professional Navision




Article Categories

Archives

Post Categories

Image Galleries

Faq

Programming

Tools

Ho realizzato una revisione del mio  Calcolo e verifica CIN coordinate bancarie rendendo disponibile anche il calcolo dell'IBAN oltre che del BBAN.

Test Partita iva

Data la particolarità del calcolo IBAN (fa una funzione MODULO 97 con dei valori che eccedono i limiti di double) ho dovuto farmi in casa una funzione di divisione  e l'ho realizzata "come si faceva a scuola".
Naturalmente sono disponibile a recepire metodi più "furbi" (ricordo però che si tratta di lavorare con dividendi composti da più di 30 caratteri, questo perchè l'IBAN "italiano" è standardizzato a 27 caratteri).

Attendo il riscontro di quanti vorranno testarne il funzionamento, sia se positivo che negativo, ovviamente non chiedo il vostro numero di conto e/o qualsiasi altro dato "personale" ma semplicemente una comunicazione che il calcolo funziona oppure (speriamo di no) restituisce valori errati.

Il Codice IBAN per l'Italia è composto da:

  1. 2 caratteri per il codice dello stato
  2. 2 caratteri per il check digit
  3. 1 carattere CIN
  4. 5 caratteri ABI
  5. 5 caratteri CAB
  6. 12 caratteri Conto Corrente

Per l'IBAN esistono due algoritmi diversi rispettivamente per il calcolo check digit e verifica del check digit

  1. Calcolo

Si prende il codice BBAN, a questo si antepone il codice dello stato seguito da due zeri.
Si spostano i primi 4 caratteri in fondo alla stringa ottenuta
Si applica la tabella di conversione sostituendo i caratteri alfabetici: ABCDEFGHIJKLMNOPQRSTUVWXYZ con il loro valore posizionale nella stringa incrementato di 10 (A = 0).
Alla stringa (stringona) ottenuta convertita in numero si applica il modulo (resto della divisione intera) 97.
Si toglie il resto da 98, il risultato è un numero da 1 a 98 che rappresenta il check digit (va sempre convertito su due cifre aggiungendo eventualmente uno zero se il check digit è di una sola cifra).

   2. Verifica

Si prende il codice IBAN
Si spostano i primi 4 caratteri in fondo al codice IBAN
Si applica la tabella di conversione descritta nel calcolo
Si applica il modulo 97
Se il check digit è corretto il resto dell'operazione è 1        

Il programma si compone di 3 moduli:

1) Form (quella visualizzata) il sorgente è dentro il file del progetto 

2) La Classe con le funzioni dedicate checkbancari.cs

 

/*

 * Created by SharpDevelop.

 * User: luciano

 * Date: 26/12/2004

 * Time: 8.34

 *

 * To change this template use Tools | Options | Coding | Edit Standard Headers.

 */

 

using System;

using System.Data;

using System.Text;

 

namespace LibCs

{

 

      /// <summary>

      /// Description of CheckBancari

      /// </summary>

      public class CheckBancari

      {

            public CheckBancari()

            {

            }

           

            private string mAbi = String.Empty;

            private string mCab = String.Empty;

            private string mContoCorrente = String.Empty;

            private string mCin = String.Empty;

            private const int L_CONTO = 12;

            private const int L_ABI = 5;

            private const int L_CAB = 5;

            private bool mNormalizzaConto = true;

            private string mIBAN = String.Empty;

            private string mBBAN = String.Empty;

            private string mCheckDigitIBAN = String.Empty;

            private string mPaese = String.Empty;

            private int mDivisore = 97;

            public string Abi

            {

                  get

                  {

                        return mAbi;

                  }

                  set

                  {

                        mAbi = NormalizzaDati(value,L_ABI);

                  }

            }

           

            public string Cab

            {

                  get

                  {

                        return mCab;

                  }

                  set

                  {

                        mCab = NormalizzaDati(value,L_CAB);;

                  }

            }

           

            public string ContoCorrente

            {

                  get

                  {

                        return mContoCorrente;

                  }

                  set

                  {

                        mContoCorrente = value;

                  }

            }

           

            public string Cin

            {

                  get

                  {

                        return mCin;

                  }

                  set

                  {

                        mCin = value;

                  }

            }

           

            public string BBAN

            {

                  get

                  {

                        return mBBAN;

                  }

                  set

                  {

                        mBBAN = value;                    

                  }

            }

           

            public string IBAN

            {

                  get

                  {

                        return mIBAN;

                  }

                  set

                  {

                        mIBAN = value;                    

                  }

            }    

           

            public string CheckDigitIBAN

            {

                  get

                  {

                        return mCheckDigitIBAN;

                  }

                  set

                  {

                        mCheckDigitIBAN = value;                      

                  }

            }

                 

            public string Paese

            {

                  get

                  {

                        return mPaese;

                  }

                  set

                  {

                        mPaese = value;                   

                  }

            }

           

            public bool NormalizzaConto

            {

                  get

                  {

                        return mNormalizzaConto;

                  }

                  set

                  {

                        mNormalizzaConto = value;

                  }

            }

           

            public int Divisore

            {

                  get

                  {

                        return mDivisore;

                  }

                  set

                  {

                        mDivisore = value;

                  }

            }

 

            private string NormalizzaDati(string codice, int lunghezza)

            {

                  codice = codice.Trim();

                  int k = codice.Length;

                  if (k < lunghezza)

                  {

                        codice = "".PadLeft(lunghezza,'0') + codice;

                        k += lunghezza;

                  }

                  k -= lunghezza;

                  if (k < 0)

                        k = 0;

                  codice = codice.Substring(k);

                  return codice;

            }

           

            public string NormalizzaContoCorrente(string contoCorrenteValue)

            {

                  contoCorrenteValue = contoCorrenteValue.Trim();

                  int k = contoCorrenteValue.IndexOf(' ');

                  while (k >= 0)

                  {

                        contoCorrenteValue = contoCorrenteValue.Remove(k,1);

                        k = contoCorrenteValue.IndexOf(' ');

                  }

                  return NormalizzaDati(contoCorrenteValue,L_CONTO);

                 

            }

           

            public bool VerificaCin(string cinCode)

            {

                  return (cinCode == CalcolaCin());

            }

           

            public string CalcolaCin()

            {

                  // costanti e variabili per calcolo pesi

                  const string numeri = "0123456789";

                  const string lettere = "ABCDEFGHIJKLMNOPQRSTUVWXYZ-. ";

                  const int DIVISORE = 26;

                  int[] listaPari = {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};

                  int[] listaDispari = {1,0,5,7,9,13,15,17,19,21,2,4,18,20,11,3,6,8,12,14,16,10,22,25,24,23,27,28,26};

                 

                  // normalizzazione dati           

                  if (this.Abi.Length != L_ABI)

                        mAbi = NormalizzaDati(mAbi,L_ABI);

                  if (this.Cab.Length != L_CAB)

                        mCab = NormalizzaDati(mCab,L_CAB);

                  if (this.NormalizzaConto)

                        this.ContoCorrente = NormalizzaContoCorrente(this.ContoCorrente);

                  if (this.ContoCorrente.Length != L_CONTO)

                        this.ContoCorrente = this.ContoCorrente.PadRight(L_CONTO);

                 

                  // codice normalizzato

                  string codice = this.Abi + this.Cab + this.ContoCorrente;

                 

                  // calcolo valori caratteri

                  int somma = 0;

                  char[] c = codice.ToUpper().ToCharArray();

                  for (int k = 0; k < (L_CONTO + L_ABI + L_CAB); k++)

                  {

                        int i = numeri.IndexOf(c[k]);

                        if (i < 0)

                              i = lettere.IndexOf(c[k]);

                       

                        // se ci sono caratteri errati usciamo con un valore

                        // impossibile da trovare sul cin

                        if (i < 0)

                              return Environment.NewLine;

                       

                        if ((k % 2) == 0)

                        {

                              // valore dispari

                              somma += listaDispari[i];

                        }

                        else

                        {

                              // valore pari

                              somma += listaPari[i];

                        }

                  }

                  return lettere.Substring(somma % DIVISORE,1);

            }

 

            public bool CheckIBAN()

            {

                  if (mIBAN != "")

                        return CheckIBAN(codice);

                  else

                     return false;

            }

 

            public bool CheckIBAN(string pIBAN)

            {

                  string codice = NormalizzaIBAN(pIBAN);

                  if (!CheckLength(codice))

                        return false;

                  codice = codice.Substring(4) + codice.Substring(0,4);

                  string[] r = Funzioni.DivisioneIntera(AlfaToNumber(codice),Divisore.ToString());

                  int resto = int.Parse(r[1]);

                  return (resto == 1);         

            }

           

            public string CalcolaBBAN()

            {

                  string codice;

                  if (mIBAN != "")

                        codice = mIBAN;

                  else

                  {

                        string s = mCin;

                        if (s == "")

                              s = CalcolaCin();

                        codice = s + NormalizzaDati(mAbi,L_ABI) +

                              NormalizzaDati(mCab,L_CAB) +

                              NormalizzaContoCorrente(mContoCorrente);            

                  }

                  return codice;

            }

           

            public string CalcolaIBAN()

            {

                  string codice;

                  if (mBBAN != "")

                        codice = mBBAN;

                  else

                  {

                        codice = CalcolaBBAN();

                  }

                  return CalcolaIBAN(mPaese, codice);

            }

           

            public string CalcolaCheckIBAN(string pPaese, string pBBAN)

            {

                  return CalcolaIBAN(pPaese, pBBAN).Substring(2,2);

            }

           

            public string CalcolaIBAN(string pPaese, string pBBAN)

            {

                  pBBAN = NormalizzaIBAN(pBBAN);

                  string codice = pPaese + "00" + pBBAN;

                  codice = codice.Substring(4) + codice.Substring(0,4);

                  string numcode = AlfaToNumber(codice);

                  string[] r = Funzioni.DivisioneIntera(numcode,Divisore.ToString());

                  int resto = int.Parse(r[1]);

                  resto = (Divisore + 1) - resto;

                  return pPaese + resto.ToString("00") + pBBAN;                         

            }

           

           

            public string NormalizzaIBAN(string pCodice)

            {

                  const string alfanum = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

                  StringBuilder sb = new StringBuilder();

                  foreach(char c in pCodice)

                  {

                        if (alfanum.IndexOf(c) != -1)

                              sb.Append(c);

                  }

                  return sb.ToString();

            }

           

            private bool CheckLength(string pCodice)

            {

                  return true;

            }

           

            private string AlfaToNumber(string pCodice)

            {

                  const string alfachars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

                  StringBuilder sb = new StringBuilder();

                  foreach(char c in pCodice)

                  {

                        int k = alfachars.IndexOf(c);

                        if (k != -1)

                              sb.Append(k + 10);

                        else

                              sb.Append(c);

                  }

                  return sb.ToString();

            }

 

      }

}

 

3) La classe con la funzione di divisione "personalizzata":

using System;

using System.Text;

using System.Globalization;

 

namespace LibCs

{

      /// <summary>

      /// Descrizione di riepilogo per Funzioni.

      /// </summary>

      public sealed class Funzioni

      {

            public Funzioni()

            {

            }

                 

            public static string[] DivisioneIntera(string pDividendo, string pDivisore)

            {

                  StringBuilder Intero = new StringBuilder();

                  StringBuilder Resto  = new StringBuilder();               

                  double divisore;

                  if (! double.TryParse(pDivisore,System.Globalization.NumberStyles.Integer, System.Globalization.NumberFormatInfo.InvariantInfo, out divisore))

                        throw new Exception("Divisore errato");

                  for (int x = 0; x < pDividendo.Length; x++)

                  {

                        Resto.Append(pDividendo.Substring(x,1));

                        string s = Resto.ToString();

                        double dividendo  = 0;

                        if (!double.TryParse(s,NumberStyles.Integer, NumberFormatInfo.InvariantInfo,out dividendo))

                              throw new Exception("Dividendo Errato");

                        int volte = 0;

                        while (dividendo >= divisore)

                        {

                              dividendo -= divisore;

                              volte++;

                        }                

                        Intero.Append(volte);

                        string r = dividendo.ToString("0");

                        Resto = new StringBuilder();

                        Resto.Append(r);

                  }

                  string[] result = new string[2];

                  result[1] = Resto.ToString();

                  result[0] = Intero.ToString();

                  while (result[0].StartsWith("0"))

                        result[0] = result[0].Substring(1);

                  if (result[0] == "")

                        result[0] = "0";

                  return result;

            }

      }

}

 

A questo indirizzo è disponibile il progetto per il Framework 1.1
questo indirizzo è disponibile il progetto per il Framework 2.0 C#
questo indirizzo è disponibile il progetto per il Framework 2.0 VB.NET

posted on Monday, October 31, 2005 12:21 AM

Feedback

# re: Calcolo e Verifica IBAN e BBAN per C# 11/9/2005 5:39 PM Enrico42785
La routine in C# funziona.
L'ho provata su circa 1500 codice e ha dato esito positivo per tutti i checkdigit provati.
Complimenti.


# re: Calcolo e Verifica IBAN e BBAN per C# 6/26/2006 11:52 AM Marco
Salve, ho usato il suo codice come base per sviluppare un controllo di codici IBAN. In particolare ho fatto riferimento ai metodi:

- public bool CheckIBAN()
- public bool CheckIBAN(string pIBAN)

Qui ho rilevato come il "codice" su cui vengono effettuati i controlli sia il seguente:

codice = s + NormalizzaDati(mAbi,L_ABI) + NormalizzaDati(mCab,L_CAB) + NormalizzaContoCorrente(mContoCorrente);

In pratica il "codice" viene composto come CIN+ABI+CAB+CC. In questo modo i risultati ottenuti mi davano come errati dei codici che invece erano corretti.
Ho constatato poi che bastava aggiungere al "codice" il codice nazionalità e il check digit per risolvere la questione, ovvero:

codice = NAZ+CHK+CIN+ABI+CAB+CC

Spero di essere stato d'aiuto.
Cordiali saluti,

Marco

# re: Calcolo e Verifica IBAN e BBAN per C# 7/1/2006 3:04 PM Luciano Bastianello
Ti ringrazio del suggerimento, come puoi vedere ho tolto tutto il codice che calcolava male l'IBAN piuttosto che inserire quello da te suggerito.
Infatti non ha senso che si chieda il check dell'IBAN e poi lo si voglia lasciare vuoto e quindi da calcolare, diventa come chiedere all'oste se il suo vino è buono! :)).
Ovviamente, visto che lo si vuole verificare, bisogna impostare il codice IBAN prima di chiamare il test di validità.
Diversamente si chiami il calcolo dell'IBAN.



# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 9/20/2007 6:26 PM Antonio
Salve,
sarei interessato a conoscere le regole di calcolo del CIN per formare il BBAN, onde poter costruire io l'algoritmo di controllo.
Ho cercato di tirarle fuori leggendo il listato in C (credo), ma mi sono arreso (scrivo il Delphi-Pascal).
Cortesemente, sarebbe possibile averle al
niobi2@virgilio.it
oppure ottenere un link ove poter attingere le informazioni?
Grazie in anticipo.
Non conosco la vs/ community, mi ci sono trovato per caso, ma mi piace.
Attendo, anche una crotese risposta negativa.

Antonio

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 9/20/2007 9:42 PM Luciano Bastianello
Ovviamente la mia fonte è
http://www.ecbs.org/

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 11/23/2007 4:39 PM Roberto
int[] listaDispari = {1,0,5,7,9,13,15,17,19,21,2,4,18,20,11,3,6,8,12,14,16,10,22,25,24,23,27,28,26};

Scusa, forse non ho capito il codice, ma il secondo numero dispari non dovrebbe essere un 3?

Complimenti comunque per il lavoro e grazie

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 11/23/2007 5:10 PM Luciano Bastianello
Grazie,
Preciso che non si tratta di una lista di numeri dispari ma di pesi assegnati alle posizioni dispari.
Secondo la tua logica non ci sarebbe bisogno di avere una lista ma semplicemente aggiungere 2 al numero dispari precedente oppure testare se il numero è dispari (usando la funzione modulo es(vb): 1001223345 mod 2 (risultato = 1)

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 11/29/2007 1:34 AM carlo
scusa ma puoi spiegare il calcolo del check digit con un esempio pratico?? ho trovato sul web un esempio ma, con la calcolatrice alla mano, i conti non tornano!!!!!
Grazie

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 12/20/2007 1:33 PM LINO
SI

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 1/10/2008 5:39 PM Franz
Hai una versione java del calcolo del check-digit...?Se cosi fosse mi toglieresti un bel pò di grattacapi...
Grazie

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 3/25/2008 1:04 PM Mamado
sei forte

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 4/24/2008 3:23 PM filippo
quando provo a scaricare il progetto per il Framework 2.0 C#
4shared.com mi risponde così:
error downloading file: java.io.FileNotFoundException.
si può risolvere?
grazie

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 4/24/2008 3:36 PM Luciano Bastianello
Ho visto l'errore, purtroppo io non ci posso fare niente perchè non è nella mia disponibilità correggerlo.
Ho provato con Firefox, funziona perfettamente.

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 4/28/2008 12:36 PM filippo
per Tua informazione: con Firefox scarica un file .zip completamente vuoto.
Cordialmente.

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 6/11/2008 11:44 AM Danilo
Adesso il conto corrente può prevedere una lettera finale, alfanumerico, il tuo codice prevede anche questo ?

Cmq è un ottimo lavoro.

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 6/11/2008 11:57 AM Luciano Bastianello
Ciao,
Sono ammessi tutti i caratteri maiuscoli da A a Z più tutti i caratteri numerici.

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 6/18/2008 6:58 PM Brandano
Ah, quanto è più simpatico fare queste cose in python... ( però attenzione, non l'ho ancora testato estensivamente)

#!/usr/bin/python
# -*- coding: utf-8

def normalizza(strIn, len = 12):
strOut = ""
for l in strIn:
L = l.upper() # :)
if L in "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. ": strOut = strOut + L
return (("0"*len) + strOut)[-len:]

def cin(abi, cab, cc):
# dizionario dei pesi, il primo elemento della tupla è per i caratteri pari, il secondo per i dispari
pesi = {"0":( 0, 1), "1":( 1, 0), "2":( 2, 5), "3":( 3, 7), "4":( 4, 9), "5":( 5,13), "6":( 6,15),\
"7":( 7,17), "8":( 8,19), "9":( 9,21), "A":( 0, 1), "B":( 1, 0), "C":( 2, 5), "D":( 3, 7),\
"E":( 4, 9), "F":( 5,13), "G":( 6,15), "H":( 7,17), "I":( 8,19), "J":( 9,21), "K":(10, 2),\
"L":(11, 4), "M":(12,18), "N":(13,20), "O":(14,11), "P":(15, 3), "Q":(16, 6), "R":(17, 8),\
"S":(18,12), "T":(19,14), "U":(20,16), "V":(21,10), "W":(22,22), "X":(23,25), "Y":(24,24),\
"Z":(25,23), "-":(26,27), ".":(27,28), " ":(28,26)}

bban = normalizza(str(abi), 5) + normalizza(str(cab), 5) + normalizza(str(cc), 12)
tot = 0
for i in range(22): tot = tot + pesi[bban[i]][(i+1) % 2]
return "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[tot % 26]

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 7/1/2008 9:13 PM Giacomo
Da dove posso scaricare il progetto per VB.NET ?
Non mi funziona il link indicato.

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 7/1/2008 9:29 PM Luciano Bastianello
Deve essere a causa di qualche impostazione di internet explorer perchè anche io da firefox visualizzo la pagina di download da ie no.
Io non ho cambiato nulla, tempo fa funzionava, mi è impossibile mettere link diversi per lo stesso file.

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 7/2/2008 7:46 AM Giacomo
Non puoi rinominarlo ?
A me interessa quello in VB.NET Framework 2.0
Ti è possibile inviarmelo per email ?

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 7/30/2008 6:28 PM Max
Ciao, ti segnalo che le versioni 2.0 dei files sono assenti su 4shared.

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 8/2/2008 2:08 PM Fabio
Salve, grazie a queste pagine e a un sorgente in Clipper, ho riscritto tutte le funzioni in C puro e ne ho realizzato una DLL accessibile da ogni linguaggio. Che fosse interessato mi scriva.

Una cosa, l'operazione di 'MOD 2' che appare nella funzione per il calcolo del CIN, può essere sostituita da una 'AND 1' , essendo un multiplo di 2. Magari con le CPU odierne è la stessa cosa, ma perché non ottimizzare ? :-)

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 8/2/2008 2:09 PM Fabio
Ah, la mia e-mail : h.seldon CHIOCCIOLA libero.it

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 8/18/2008 7:54 PM Luciano Bastianello
E' ovvio che MOD e AND non sono la stessa cosa.
L'AND binario su .net può essere fatta solo con operandi binari.

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 8/19/2008 10:47 AM Fabio
Le operazioni di AND e MOD non sono la stessa cosa, ovvio. :-) Ma quando hai 'MOD x' dove 'x' è un multiplo di 2, puoi sostituirlo con una 'AND x-1'. Molti compilatori effettuano questa operazione internamente, perchè l'istruzione AND è molto meno complessa e quindi più veloce della MOD. Scusa ma se tu là sopra sostituisci 'k % 2' con 'k & 1' , non funge ? La MIA DLL è scritta in C puro (Win32) .

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 11/20/2008 1:09 PM simo
ok

# IBAN | hilpers 1/18/2009 2:32 PM Pingback/TrackBack
IBAN | hilpers

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 3/12/2009 7:39 AM DANIELE SIMONE
ciao, ho scaricato la versione per frawork 1.1, il calcolo del codice iban, non funziona, perche? lo confrontato cun un programma fatto da altre aziende, ed e diverso il risultato che produce, puoi aiutarmi, darmi una versione che funziona,

grazie tanto

basicdany@libero.it

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 9/26/2009 7:02 PM francesca
Grazie mille ...
cercavo l'algoritmo per il calcolo dell'IBAN in C#.NET e ho avuto fortuna trovando il tuo codice!

Ho fatto un po' di test e confermo che funziona!

GRAZIE,
fra

# re: Calcolo e Verifica CIN IBAN e BBAN per C# e VB.NET 11/3/2009 6:21 PM Roberto
Il Link per il download .net 2 VB non funzona. Si puo fare qualcosa ? Grazie

Post Feedback

Title:
Name:
Url:
Comments: 
Codice di sicurezza
Protected by FormShield