oracle + convertir chiffres en lettres

oracle + convertir chiffres en lettres - SQL/NoSQL - Programmation

Marsh Posté le 17-09-2007 à 11:21:34    

Bonjour,
svp connaissez-vous une fonction en sql permettant de convertir des chiffres en lettres? ou bien quelqu'un en a-t-il un à me proposer? par exemple: convertir "1585" en "mille cinq cent quatre vingts cinq".*
Merci

Reply

Marsh Posté le 17-09-2007 à 11:21:34   

Reply

Marsh Posté le 17-09-2007 à 12:00:19    

Salut,
Malheureusement je ne crois pas que ce soit possible...

Reply

Marsh Posté le 17-09-2007 à 12:05:04    

ooh, :( dc il n'est pas possible de convertir un montant en chiffres en lettres???

Reply

Marsh Posté le 17-09-2007 à 15:45:24    

à moins de te taper une table complète d'équivalence ^^

Reply

Marsh Posté le 18-09-2007 à 14:08:57    

Je sais qu'il existe une fonction dans les packages de base, mais elle ne sait lire et écrire que les nombres en anglais.
 
Tu devrais par contre trouver sans trop de difficulté des sources de procédures stockées Oracle qui font ça très bien. J'en avait écrit une il y a longtemps... C'est pas bien compliqué à faire, c'est surtout chiant à écrire et débugger (en français y'a trop de cas à la con...)

Reply

Marsh Posté le 22-09-2007 à 12:06:37    

C'est possible, je l'ai fait au taf mais je ne m'en souviens plus. Je te donne ça lundi :jap:
 
J'utilise ça pour mettre le montant des chèques en lettres. Si ça peut attendre lundi je te donne la réponse lundi.

Reply

Marsh Posté le 25-09-2007 à 17:29:58    

FUNCTION Function_Traduction_Mnt(Xxcpr_Amount        IN NUMBER,
                                   Xxcpr_Currency_Code IN VARCHAR2,
                                   Xxcpr_Country       IN VARCHAR2)
    RETURN VARCHAR2 IS
    Vl_Precision    NUMBER;
    Vl_Entier       NUMBER;
    Vl_Decimal      NUMBER;
    Vl_Seg_Milliard VARCHAR2(3);
    Vl_Seg_Million  VARCHAR2(3);
    Vl_Seg_Millier  VARCHAR2(3);
    Vl_Seg_Cdu      VARCHAR2(3);
    Vl_Mnt_Traduit  VARCHAR2(5000) := '';
    Vl_Tmp_Amount   NUMBER;
   
    CURSOR Xxcpr_Cur_Precision IS
      SELECT PRECISION
      FROM   Fnd_Currencies
      WHERE  Currency_Code = Xxcpr_Currency_Code;
   
    CURSOR Xxcpr_Cur_Lib_Mnt IS
      SELECT ' ' || Xlm0.Valeur || ' ' Milliard,
             ' ' || Xlm1.Valeur || ' ' Million,
             ' ' || Xlm2.Valeur || ' ' Millier,
             ' ' || Xld.Valeur_Unites || ' ' Unite_Devise,
             ' ' || Xlm10.Valeur || ' ' Milliard_Plur,
             ' ' || Xlm11.Valeur || ' ' Million_Plur,
             ' ' || Xlm12.Valeur || ' ' Millier_Plur,
             Xlm3.Valeur Seg_Milliard,
             Xlm4.Valeur Seg_Million,
             Xlm5.Valeur Seg_Millier,
             Xlm6.Valeur Seg_Cdu
      FROM   Xxrfr_Lib_Mnt Xlm0,
             Xxrfr_Lib_Mnt Xlm1,
             Xxrfr_Lib_Mnt Xlm2,
             Xxrfr_Lib_Mnt Xlm3,
             Xxrfr_Lib_Dev Xld,
             Xxrfr_Lib_Mnt Xlm4,
             Xxrfr_Lib_Mnt Xlm5,
             Xxrfr_Lib_Mnt Xlm6,
             Xxrfr_Lib_Mnt Xlm10,
             Xxrfr_Lib_Mnt Xlm11,
             Xxrfr_Lib_Mnt Xlm12
      WHERE  Xlm0.Code = 'MILLIARD'
      AND    Xlm1.Code = 'MILLION'
      AND    Xlm2.Code = 'MILLIER'
      AND    Xld.Code_Dev = Xxcpr_Currency_Code
      AND    Xlm3.Code = Vl_Seg_Milliard
      AND    Xlm4.Code = Vl_Seg_Million
      AND    Xlm5.Code = Vl_Seg_Millier
      AND    Xlm6.Code = Vl_Seg_Cdu
      AND    Xlm10.Code = 'MILLIARDS'
      AND    Xlm11.Code = 'MILLIONS'
      AND    Xlm12.Code = 'MILLIERS'
      AND    Xlm0.Pays = Xxcpr_Country
      AND    Xlm1.Pays = Xxcpr_Country
      AND    Xlm2.Pays = Xxcpr_Country
      AND    Xlm3.Pays = Xxcpr_Country
      AND    Xld.Pays = Xxcpr_Country
      AND    Xlm4.Pays = Xxcpr_Country
      AND    Xlm5.Pays = Xxcpr_Country
      AND    Xlm6.Pays = Xxcpr_Country
      AND    Xlm10.Pays = Xxcpr_Country
      AND    Xlm11.Pays = Xxcpr_Country
      AND    Xlm12.Pays = Xxcpr_Country;
   
    Vl_Rec_Lib_Mnt Xxcpr_Cur_Lib_Mnt%ROWTYPE;
   
    CURSOR Xxcpr_Cur_Lib_Mnt_Dec IS
      SELECT ' ' || Xld.Valeur_Decimales || ' ' Decimal_Devise,
             Xlm8.Valeur Mnt_Partie_Decimale
      FROM   Xxrfr_Lib_Dev Xld,
             Xxrfr_Lib_Mnt Xlm8
      WHERE  Xld.Code_Dev = Xxcpr_Currency_Code
      AND    Xlm8.Code = To_Char(Vl_Decimal)
      AND    Xld.Pays = Xxcpr_Country
      AND    Xlm8.Pays = Xxcpr_Country;
   
    Vl_Rec_Lib_Mnt_Dec Xxcpr_Cur_Lib_Mnt_Dec%ROWTYPE;
  BEGIN
   
    OPEN Xxcpr_Cur_Precision;
   
    FETCH Xxcpr_Cur_Precision
      INTO Vl_Precision;
   
    IF Xxcpr_Cur_Precision%NOTFOUND THEN
      Vl_Precision := 0;
    END IF;
   
    CLOSE Xxcpr_Cur_Precision;
   
    Vl_Entier  := Trunc(Xxcpr_Amount);
    Vl_Decimal := (Xxcpr_Amount - Vl_Entier) *
                  Power(10,
                        Vl_Precision);
   
    IF Xxcpr_Amount > 999999999999.99 THEN
      RETURN NULL;
    END IF;
   
    Vl_Seg_Milliard := To_Char(Trunc(Xxcpr_Amount / Power(10,
                                                          9)));
    Vl_Seg_Million  := Substr(To_Char(Trunc(Xxcpr_Amount /
                                            Power(10,
                                                  6))),
                              Length(To_Char(Trunc(Xxcpr_Amount /
                                                   Power(10,
                                                         6)))) - 2,
                              3);
    Vl_Seg_Million  := To_Char(To_Number(Vl_Seg_Million));
    Vl_Tmp_Amount   := Vl_Entier - (Trunc(Vl_Entier / Power(10,
                                                            6)) *
                       Power(10,
                                          6));
    Vl_Seg_Millier  := To_Char(Trunc(Vl_Tmp_Amount /
                                     Power(10,
                                           3)));
    Vl_Seg_Cdu      := To_Char(MOD(Vl_Tmp_Amount,
                                   Power(10,
                                         3)));
   
    OPEN Xxcpr_Cur_Lib_Mnt;
   
    FETCH Xxcpr_Cur_Lib_Mnt
      INTO Vl_Rec_Lib_Mnt;
   
    IF Xxcpr_Cur_Lib_Mnt%NOTFOUND THEN
      CLOSE Xxcpr_Cur_Lib_Mnt;
     
      RETURN(NULL);
    END IF;
   
    IF Vl_Seg_Milliard = 0 THEN
      Vl_Mnt_Traduit := Vl_Mnt_Traduit;
    ELSIF Vl_Seg_Milliard = 1 THEN
      Vl_Mnt_Traduit := Vl_Mnt_Traduit || Vl_Rec_Lib_Mnt.Seg_Milliard ||
                        Vl_Rec_Lib_Mnt.Milliard;
    ELSIF Vl_Seg_Milliard > 1 THEN
      Vl_Mnt_Traduit := Vl_Mnt_Traduit || Vl_Rec_Lib_Mnt.Seg_Milliard ||
                        Vl_Rec_Lib_Mnt.Milliard_Plur;
    END IF;
   
    IF Vl_Seg_Million = 0 THEN
      Vl_Mnt_Traduit := Vl_Mnt_Traduit;
    ELSIF Vl_Seg_Million = 1 THEN
      Vl_Mnt_Traduit := Vl_Mnt_Traduit || Vl_Rec_Lib_Mnt.Seg_Million ||
                        Vl_Rec_Lib_Mnt.Million;
    ELSIF Vl_Seg_Million > 1 THEN
      Vl_Mnt_Traduit := Vl_Mnt_Traduit || Vl_Rec_Lib_Mnt.Seg_Million ||
                        Vl_Rec_Lib_Mnt.Million_Plur;
    END IF;
   
    IF Vl_Seg_Millier = 0 THEN
      Vl_Mnt_Traduit := Vl_Mnt_Traduit;
    ELSIF Vl_Seg_Millier = 1 THEN
      IF Xxcpr_Country = 'PT' THEN
        Vl_Mnt_Traduit := Vl_Mnt_Traduit || Ltrim(Vl_Rec_Lib_Mnt.Millier);
      ELSE
        Vl_Mnt_Traduit := Vl_Mnt_Traduit || Vl_Rec_Lib_Mnt.Seg_Millier ||
                          Vl_Rec_Lib_Mnt.Millier;
      END IF;
    ELSIF Vl_Seg_Millier > 1 THEN
      Vl_Mnt_Traduit := Vl_Mnt_Traduit || Vl_Rec_Lib_Mnt.Seg_Millier ||
                        Vl_Rec_Lib_Mnt.Millier_Plur;
    END IF;
   
    IF Vl_Seg_Cdu = 0 THEN
      IF Vl_Mnt_Traduit IS NULL THEN
        Vl_Mnt_Traduit := Vl_Mnt_Traduit;
      ELSE
        Vl_Mnt_Traduit := Vl_Mnt_Traduit ||
                          Ltrim(Vl_Rec_Lib_Mnt.Unite_Devise);
      END IF;
    ELSE
      Vl_Mnt_Traduit := Vl_Mnt_Traduit || Vl_Rec_Lib_Mnt.Seg_Cdu ||
                        Vl_Rec_Lib_Mnt.Unite_Devise;
    END IF;
   
    CLOSE Xxcpr_Cur_Lib_Mnt;
   
    IF Vl_Decimal <> 0 THEN
      OPEN Xxcpr_Cur_Lib_Mnt_Dec;
     
      FETCH Xxcpr_Cur_Lib_Mnt_Dec
        INTO Vl_Rec_Lib_Mnt_Dec;
     
      IF Xxcpr_Cur_Lib_Mnt_Dec%NOTFOUND THEN
        CLOSE Xxcpr_Cur_Lib_Mnt_Dec;
       
        RETURN(NULL);
      END IF;
     
      Vl_Mnt_Traduit := Vl_Mnt_Traduit ||
                        Vl_Rec_Lib_Mnt_Dec.Mnt_Partie_Decimale ||
                        Vl_Rec_Lib_Mnt_Dec.Decimal_Devise;
     
      CLOSE Xxcpr_Cur_Lib_Mnt_Dec;
    ELSIF Vl_Mnt_Traduit IS NULL THEN
      Vl_Mnt_Traduit := Vl_Rec_Lib_Mnt.Seg_Cdu ||
                        Vl_Rec_Lib_Mnt.Unite_Devise;
    END IF;
   
    Vl_Mnt_Traduit := Upper(Rtrim(Vl_Mnt_Traduit));
    RETURN(Vl_Mnt_Traduit);
  END Function_Traduction_Mnt;


 
puis
 

SQL> describe Xxrfr_Lib_Mnt;
Name                   Type          Nullable Default Comments  
---------------------- ------------- -------- ------- --------  
CODE                   VARCHAR2(40)                            
PAYS                   VARCHAR2(25)  Y        'FR'              
VALEUR                 VARCHAR2(80)                            
CREATED_BY             NUMBER(15)    Y        0                
CREATION_DATE          DATE          Y        SYSDATE          
LAST_UPDATED_BY        NUMBER(15)    Y        0                
LAST_UPDATE_DATE       DATE          Y        SYSDATE          
LAST_UPDATE_LOGIN      NUMBER        Y        0                
REQUEST_ID             NUMBER(15)    Y                          
PROGRAM_APPLICATION_ID NUMBER(15)    Y                          
PROGRAM_UPDATE_DATE    DATE          Y                          
PROGRAM_ID             NUMBER(15)    Y                          
ATTRIBUTE1             VARCHAR2(150) Y                          
ATTRIBUTE2             VARCHAR2(150) Y                          
ATTRIBUTE3             VARCHAR2(150) Y                          
ATTRIBUTE4             VARCHAR2(150) Y                          
ATTRIBUTE5             VARCHAR2(150) Y                          
ATTRIBUTE6             VARCHAR2(150) Y                          
ATTRIBUTE7             VARCHAR2(150) Y                          
ATTRIBUTE8             VARCHAR2(150) Y                          
ATTRIBUTE9             VARCHAR2(150) Y                          
ATTRIBUTE10            VARCHAR2(150) Y                          
ATTRIBUTE11            VARCHAR2(150) Y                          
ATTRIBUTE12            VARCHAR2(150) Y                          
ATTRIBUTE13            VARCHAR2(150) Y                          
ATTRIBUTE14            VARCHAR2(150) Y                          
ATTRIBUTE15            VARCHAR2(150) Y                        


 
puis
 

SELECT * FROM Xxrfr_Lib_Mnt WHERE Code = '405';


405 FR quatre cent cinq 0 19/09/2001 12:49:05 0 19/09/2001 12:49:05 0                    
405 US Four Hundred five 0 19/09/2001 12:49:01 0 19/09/2001 12:49:01 0                    
405 PT quatrocentos e cinco 0 07/07/2005 13:34:56 0 07/07/2005 13:34:56 0                  


 
Dans ma table j'ai toutes les valeurs traduites de 0 à 999 pour chaque langue.
De plus j'ai les valeurs suivantes  
MILLIARD
MILLIARDS
MILLIER
MILLIERS
MILLION
MILLIONS
 
Dans chaque langue elles aussi.
 
C'est envoyé sur des lettres chèques, sur des paies nominatives par chèque... et ce depuis des années et ça marche très bien.
 
:hello:


Message édité par Profil supprimé le 25-09-2007 à 17:32:55
Reply

Marsh Posté le 14-11-2007 à 08:29:30    

Merci Trollcenter, pour ton aide!
cc vraiment gentil. mais j'avais trouvé une autre fonction entre temps.
grd merci.

Reply

Marsh Posté le 14-11-2007 à 09:37:54    

déterrage de topic tout ca...  [:jpcheck]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed