Controle Vitale

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Controle Vitale

Message par falsam »

C'est un utilitaire permettant de contrôler la validité d'une carte Vitale quand on a pas la carte Vitale en face de soi. je sais que que le sujet est déja abordé par Micoute, mais j'avais envie de proposer une version différente de la sienne.

Cet utilitaire calcul aussi la Cle INSEE mais je pense que cette pratique est réglementée.

je n'ai pas pu tester les numéro corse, n'en ayant pas en ma possession.

N'hésitez pas à tester ce code avec vos propres cartes. Merci de vos retours d'expérience.

Comme à chaque fois ce code est sous licence "As you like"

Code : Tout sélectionner

;Controle Vitale Version 1.01
;2013 - falsam 
;O.S. Windows

EnableExplicit

Enumeration
  #FontApp
  #FontH1
  #FontH2
  
  #Mainform
  #NumInsee
  #NumInseeKey
  #Help
  
  #NumInseeCalc
  #NumInseeVerify
EndEnumeration

Define.l Event, WEvent, MEvent, GEvent, TEvent

Global WindowStyle.i=#PB_Window_SystemMenu|#PB_Window_ScreenCentered
Global NumInsee.s, NumInseeKey.i, Col.i

;Reg Ex pour tester que la chaine ne comporte que des chiffre de 0 à 9
Global *RegMatch = CreateRegularExpression(#PB_Any ,"[0-9]") 

Procedure StringGadgetCursorX(Gadget) 
  Protected Min.i, Max.i
  
  SendMessage_(GadgetID(Gadget),#EM_GETSEL,@Min,@Max) 
  ProcedureReturn Max-SendMessage_(GadgetID(Gadget),#EM_LINEINDEX,SendMessage_(GadgetID(Gadget),#EM_LINEFROMCHAR,Min,0),0)+1 
EndProcedure 

;Calcul ou vérification de la clé de controle
Procedure CheckInseeKey(NumInsee.s, NumInseeKey.i, Verify.b=#False)
  Protected Result.l  
  
  Result = 97 - (Val(NumInsee) - 97*Int(Val(NumInsee)/97))
  
  If Verify = #False
    ;La clé est juste vérifié
    If Result = NumInseeKey
      ProcedureReturn #True
    Else
      ProcedureReturn #False
    EndIf
    
  Else
    
    ;la clé est calculée
    ProcedureReturn Result
  EndIf
   
EndProcedure


;Cas de la Corse
;On remplace le caractère A ou B par un zéro.
;Si la lettre est A ==> 2A devient 19 (NumInsee - 1 000 000).
;Si la lettre est B ==> 2B devient 18 (NumInsee - 2 000 000)
Procedure.s CaseCorse(NumInsee.s)
  Protected Dummy.q ;Numéro insee à 13 chiffres
  
  If FindString(NumInsee, "2A")
    ReplaceString(NumInsee, "2A", "19", #PB_String_InPlace)
    Dummy = Val(NumInsee)
  EndIf
  
  If FindString(NumInsee, "2B")
    ReplaceString(NumInsee, "2B", "18", #PB_String_InPlace)
    Dummy = Val(NumInsee)
  EndIf
    
  ProcedureReturn Str(Dummy)
  
EndProcedure

Procedure Open_MainForm()
  Protected IdGadget.i
  
  OpenWindow(#Mainform, 0, 0, 400, 250, "Controle Vitale 1.00", WindowStyle)
    
  ;Un peu de couleur
  SetWindowColor(#MainForm, $037422)
    
  ;Dessin cotes gauche
  IdGadget = CanvasGadget(#PB_Any, 0, 0, 100, 250)
  StartDrawing(CanvasOutput(IdGadget))
  Box(0, 0, 100, 250, $037422)
  DrawingMode(#PB_2DDrawing_Outlined )  
  LineXY(0, 0, 100, 250, RGB(0, 0, 0))
  FillArea(1, 5, RGB(0, 0, 0), RGB(255, 215, 0))
  DrawingMode(#PB_2DDrawing_Transparent ) 
  DrawingFont(FontID(#FontH1))
  DrawText(30, 3, "Vit", RGB(255, 215, 0))
  DrawingFont(FontID(#FontH2))
  DrawRotatedText(5, 240, "(2013) falsam", 90 ,$037422)
  StopDrawing()
  
  ;Dessin Entete
  IdGadget = CanvasGadget(#PB_Any, 100, 0, 300, 70)
  StartDrawing(CanvasOutput(IdGadget))
  Box(0, 0, 300, 70, $037422)
  DrawingMode(#PB_2DDrawing_Transparent ) 
  DrawingFont(FontID(#FontH1))
  DrawText(0, 3, "ale", RGB(255, 215, 0))
  DrawingFont(FontID(#FontH2))
  DrawText(30, 55, "Tout simplement essentielle.", RGB(255, 255, 255))
  StopDrawing()
    
  IdGadget = TextGadget(#PB_Any, 50, 82, 80, 20, "Code Insee")
  SetGadgetColor(IdGadget, #PB_Gadget_BackColor, $037422) 
  SetGadgetColor(IdGadget, #PB_Gadget_FrontColor, $FFFFFF) 
  
  ;13 Chiffre pour le numéro INSEE
  ;01-01 sexe (1 pour masculin, 2 pour féminin)
  ;02-03 Année de naissance (2 derniers chiffres du millésime)
  ;04-05 Mois de naissance sur 2 chiffres
  ;06-07 Numéro du département de naissance (99 pour l'étranger, 2A et 2B pour la Corse)
  ;08-10 Numéro d’ordre de la commune de naissance dans le département
  ;11-13 Numéro d'ordre d'inscription sur le registre d'état civil (3 chiffres)  
  StringGadget(#NumInsee, 130, 80, 200, 22, "", #PB_String_UpperCase) 
  SetGadgetAttribute(#NumInsee, #PB_String_MaximumLength, 13)
  
  ;La clé de vérification
  StringGadget(#NumInseeKey, 335, 80, 50, 22, "", #PB_String_UpperCase) 
  SetGadgetAttribute(#NumInseeKey, #PB_String_MaximumLength, 2)
  
  ;Texte d'aide
  TextGadget(#Help, 130, 110, 250, 100, "?")
  SetGadgetColor(#Help, #PB_Gadget_BackColor,$037422)
  SetGadgetColor(#Help, #PB_Gadget_FrontColor, $FFFFFF) 
  
  ;Bouton de verification ou de création de la clé INSEE
  ButtonGadget(#NumInseeVerify, 310, 220, 80, 22, "Calculer") 
   
EndProcedure

Procedure Start()
  ;Initialisation application, police, etc ..
  LoadFont(#FontApp, "Arial", 11)
  LoadFont(#FontH1, "Arial", 40, #PB_Font_Bold) ;Font titre
  LoadFont(#FontH2, "Arial", 9, #PB_Font_Bold) ;Font sous-titre
  SetGadgetFont(#PB_Default,FontID(#FontApp)) 
  
  Open_MainForm()
  
  DisableGadget(#NumInseeVerify, #True)
  
  Col=1

EndProcedure

start()

Repeat
  Event  = WaitWindowEvent(10)
  GEvent = EventGadget()
  TEvent = EventType()
  
  Select Event
    Case #WM_KEYUP, #WM_LBUTTONUP
      Col = StringGadgetCursorX(#NumInsee)
      ;SetWindowTitle(#Mainform,"Column : "+Str(Col))
     
      Select Col  
        Case 1
          SetGadgetText(#Help, "Sexe : 1 pour les hommes, 2 pour les femmes, 3 pour les personnes transgenres ou pour les personnes étrangères de sexe masculin en cours d'immatriculation en France") 
                
        Case 2,3
          SetGadgetText(#help, "Deux derniers chiffres de l'année de naissance ")
                
        Case 4,5  
          SetGadgetText(#help, "Mois de naissance")
                
        Case 6,7
          SetGadgetText(#help, "Département de naissance métropolitain (2A ou 2B pour la Corse)")
                
        Case 8,9,10
          SetGadgetText(#Help, "Numéro d’ordre de la commune de naissance dans le département")
               
        Case 11,12,13
          SetGadgetText(#help, "Numéro d’ordre de l’acte de naissance dans le mois et la commune (ou le pays)")
                
        Case 14
          SetGadgetText(#help, "Clé de contrôle")
          SetActiveGadget(#NumInseeKey)
                    
      EndSelect
              
    Case #PB_Event_Gadget
      Select GEvent
        Case #NumInsee, #NumInseeKey
          
          NumInsee = GetGadgetText(#NumInsee)
          NumInseeKey = Val(GetGadgetText(#NumInseeKey))

          If Tevent = #PB_EventType_Change
            Col = StringGadgetCursorX(#NumInsee)
                            
            ;On arrive à la colonne 8
            ;Si le 6eme caractere est un 2 alors le 7eme caractere est soit un A ou un B ou un chiffre
            If Col=8 And Mid(GetGadgetText(#NumInsee), 6, 1) = "2"
              If Mid(GetGadgetText(#NumInsee), 7, 1) <> "A" And Mid(GetGadgetText(#NumInsee), 7, 1) <> "B" Or Not MatchRegularExpression (*RegMatch, Mid(GetGadgetText(#NumInsee), 7, 1))
                MessageRequester("Erreur","Erreur dans le département de naissance")
                keybd_event_(#VK_BACK,0,0,0) ;On efface le dernier caractére 
              EndIf
          
            ;Pour toutes les autres positions le caractére doit etre numérique
            ElseIf Col<>1 And Not MatchRegularExpression (*RegMatch, Mid(GetGadgetText(#NumInsee), Col-1, 1))
               MessageRequester("Erreur","Uniquement des chiffres !")
               keybd_event_(#VK_BACK,0,0,0) ;On efface le dernier caractére             
            EndIf 
        

            If Len(GetGadgetText(#NumInsee))=13 And Len(GetGadgetText(#NumInseeKey))=2
              SetGadgetText(#NumInseeVerify, "Vérifier")
              SetGadgetData(#NumInseeVerify, #False)
              
              DisableGadget(#NumInseeVerify, #False)
            EndIf
          
          
            If Len(GetGadgetText(#NumInsee))=13 And Len(GetGadgetText(#NumInseeKey))=0
              SetGadgetText(#NumInseeVerify, "Calculer")
              SetGadgetData(#NumInseeVerify, #True)

              If FindString(NumInsee, "2A") Or FindString(NumInsee, "2B")
                CaseCorse(NumInsee)              
              EndIf  
              
              DisableGadget(#NumInseeVerify, #False)
            EndIf
            
            If Len(GetGadgetText(#NumInsee))<13 
              SetGadgetText(#NumInseeVerify, "Calculer")
              SetGadgetData(#NumInseeVerify, #False)  
              DisableGadget(#NumInseeVerify, #True)
            EndIf
                        
          EndIf
        
        Case #NumInseeVerify
          
          If FindString(NumInsee, "2A") Or FindString(NumInsee, "2B")
            NumInsee = CaseCorse(NumInsee)
          EndIf

          If GetGadgetData(#NumInseeVerify) = #False
            If Not CheckInseeKey(NumInsee, NumInseeKey)
              MessageRequester("Erreur", "Vérifier les informations de la carte")    
            Else
              MessageRequester("Information", "Le numéro de la carte est correct")    
            EndIf  
              
          Else
            SetGadgetText(#NumInseeKey, Str(CheckInseeKey(NumInsee, NumInseeKey, #True)))
            SetGadgetText(#NumInseeVerify, "Vérifier")
            SetGadgetData(#NumInseeVerify, #False)  
          EndIf  
          SetActiveGadget(#NumInseeKey)
          
      EndSelect
      
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Dernière modification par falsam le jeu. 11/avr./2013 10:44, modifié 4 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Controle Vitale

Message par Backup »

code sympath , sympath au sens ou l'on comprends a quoi correspondent les chiffres d'un numero de Secu
sympath, car bien présenté , et bien codé

mais .. au fond ce code sert a quoi ?

j'espere pas a ça :
MLD a écrit : je vais avec ton logiciel pouvoir imprimer de fausse carte VITAL sans puce et les vendres a la sauvette a la sortie du port de St Malo, aux Anglais :mrgreen: :mrgreen: :lol: :lol: :oops:
:mrgreen:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Controle Vitale

Message par Backup »

dans le meme esprit Comtois avait fait un code pour vérifier le numero de carte bleue Visa ou Mastercard
je le remet ici :)

Code : Tout sélectionner

; Verification de la carte bancaire : algorithme de Luhn
OpenConsole()
ok=#True
Print("Type carte , [1] = Visa , [2] = Mastercard =>")
Type = Val(Input())
PrintN("")
Print("Numero de la carte =>")
NumeroCarte.s=Input()

; test mastercard
If Type=2
	; test  de longueur
	If Len(NumeroCarte.s)<>16
		PrintN("Votre numero de carte n'est pas valable")
		ok=#False
	EndIf
	; test le préfixe
	If ok=#True
		prefix=Val(Mid(NumeroCarte.s,1,2))
		If prefix<>51 And prefix<>52 And prefix<>53 And prefix<>54 And prefix<>55
			PrintN("Votre numero de carte n'est pas valable")
			ok=#False
		EndIf
	EndIf
EndIf ; fin test master card
; test visa
If Type=1 
	; test la longueur
	If Len(NumeroCarte.s)>16 Or Len(NumeroCarte.s)<13
		PrintN("Votre numero de carte n'est pas valable")
		ok=#False
	EndIf
	; test le préfixe
	If ok=#True
		prefix=Val(Mid(NumeroCarte.s,1,1))
		If prefix<>4
			PrintN("Votre numero de carte n'est pas valable")
			ok=#False
		EndIf
	EndIf
EndIf ; fin test visa

;Algorithme de Luhn

If Val(NumeroCarte.s)  ; si c'est bien un numéro
	If ok=#True  ; si les tests précédents ont été effectués avec succès
		;debut de l'algo
		totalcarte=0
		increment=0
		For i=Len(NumeroCarte.s) To -1 
			numero=val(Mid(NumeroCarte.s,i,1))
			increment+1
			If increment % 2 <> 0  ; nombre impaire
				totalcarte + numero ; ajout normal dans la somme
				Else ; nombre impaire
				numero=numero*2
				If numero>=10
					totalcarte=totalcarte+1+numero-10
					Else
					totalcarte=totalcarte+numero
				EndIf
			EndIf
		Next
		; division du total
		If totalcarte % 10 <>0
			PrintN("Votre numero de carte n'est pas valable")
			ok=#False
		EndIf
	EndIf
	Else
	PrintN("Votre numero de carte n'est pas valable")
	ok=#False
EndIf
; Fin de vérification carte bancaire si ok=true à ce niveau la carte est ok
If ok
	PrintN("Votre numero de carte est valable")
EndIf
Input()
CloseConsole(); EPB
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Controle Vitale

Message par falsam »

Un autre moyen de vérifier le code d'une carte bancaire en plus court.

Code : Tout sélectionner

EnableExplicit

Procedure validCard(number$)
  Protected i,u,digit$,new$,sum
  For i=Len(number$) To 1 Step -1
    digit$ = Mid(number$,i,1)
    If u%2
      digit$ = Str(Val(digit$)*2)
    EndIf
    new$ = digit$+new$
    u+1
  Next
  
  For i=1 To Len(new$)
    sum = sum + Val( Mid(new$,i,1))
  Next
  
  If sum%10 = 0
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Debug validCard("4972038418246688")
Debug validCard("4970427123473416")
Debug validCard("4610337343106431")
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Controle Vitale

Message par Backup »

heu, j'espere que ce ne sont pas tes numero de carte la ?
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Controle Vitale

Message par falsam »

A propos du contrôle de la carte vitale :
Dobro a écrit : ...mais .. au fond ce code sert a quoi ?
Tu peux par exemple t'en servir dans le cadre d'un développement d'un logiciel de paie, médicale, et par extension tous logiciels exploitant un fichier de personnes associées à des numéros de sécurité sociale dont la validité doit être controlée.

[re-edit]
A propos du controle carte bancaire :
Dobro a écrit :heu, j'espere que ce ne sont pas tes numero de carte la ?
Non .... hahaha :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Controle Vitale

Message par Anonyme2 »

Le message "Le numéro de la carte est correcte" serait à remplacer par "Le numéro de la carte est correct"
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Controle Vitale

Message par falsam »

Denis a écrit :Le message "Le numéro de la carte est correcte" serait à remplacer par "Le numéro de la carte est correct"
Merci Denis. Le code est mis à jour.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Controle Vitale

Message par Micoute »

Bonjour à tous,

Falsam, ton programme est très esthétique, mais ne tient pas compte de l'exception Corse.

désolé de te dire ça, mais l'erreur est humaine et ta technique est bien meilleure que la mienne !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Controle Vitale

Message par falsam »

Micoute a écrit : ... mais ne tient pas compte de l'exception Corse.
Bonjour Micoute. Comme je l'ai spécifié plus haut, je n'ai pas pu tester les numéros corse, n'en ayant pas en ma possession.

Tu pourrais développer un peu plus cette remarque. Dans mon code je tiens bien compte de l'exception Corse.
:arrow: Le code controle qu'on puisse bien saisir 2A ou 2B en position [6-7] du code Insee et PAS AILLEURS

:arrow: Lorsque l'utilisateur verifie ce numéro Insee, Je controle si ce numéro comporte le string "2A ou "2B".

Code : Tout sélectionner

Case #NumInseeVerify
   If FindString(NumInsee, "2A") Or FindString(NumInsee, "2B")
      CaseCorse(NumInsee)
   EndIf
:arrow: Si exception Corse, je fais appel à la procédure CaseCorse(NumInsee)
■ Cas du département 2A : Je remplace le 2A par 19.
■ Cas du département 2B : Je remplace le 2B par 18.

Pour finir, je vérifie ou calcule la clé INSEE.

La séquence est tellement simple que je ne vois pas ou il y aurait une erreur.
Dernière modification par falsam le jeu. 11/avr./2013 10:31, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Controle Vitale

Message par Micoute »

Bonjour Falsam,

Ton erreur vient du fait que tu calcules ton numéro insee avec 2A ou 2B alors qu'il faut mettre 20 pour faire le calcul, c'est d'ailleurs pour cette raison que j'ai fait d'une manière différente, comme ça, du fait que GetGagetText(#String_Departement) et Departement$ sont différents, je peux d'une part, afficher le code insee et de l'autre calculer avec Val(Departement$).

Essayes de mettre un debug NumInsee dans ton code et tu comprendras.

Essayes cette adresse : http://mon-convertisseur.fr/calculateur ... ociale.php
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Controle Vitale

Message par falsam »

Micoute a écrit :Ton erreur vient du fait que tu calcules ton numéro insee avec 2A ou 2B alors qu'il faut mettre 20 pour faire le calcul,
Non c'est faux. J'ai simplement fait une erreur de déclaration de variable dans la procédure CaseCorse()

j'ai modifié le code en conséquence.

PS J'ai vérifié avec ton lien et je trouve le même résultat.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Controle Vitale

Message par Micoute »

Merci infiniment pour ce travail digne d'éloge ! :oops:
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Controle Vitale

Message par falsam »

Micoute a écrit :Merci infiniment pour ce travail digne d'éloge ! :oops:
Monsieur, arrêtons les flatteries s'il vous plait ! Merci plutôt de m'avoir fait remarquer que l'exception Corse ne fonctionnait pas :D
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
MLD
Messages : 1105
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Controle Vitale

Message par MLD »

@ Falsam

oui oui l'on ne se débarasse pas de moi facilement.

Hé dans ton programme tu a oublier de dessin de la puce, couleur doré. :mrgreen: :lol:

@ Micoute

Le logiciel de Falsam donne le bon numéro de clef

J'ai regardé to code.

1° Tu aditionne un peu les carottes avec le caviard

2° Vu la longuer du chiffre, il faut utilisé StrD, et ValD au lieu de Str et Val.

Code : Tout sélectionner

Enumeration
   #Fenetre_principale
EndEnumeration
Enumeration
   #Text_0
   #Text_1
   #Text_2
   #Text_3
   #Text_4
   #Text_5
   #Text_6
   #Text_7
   #Text_8
   #Text_9
   #Text_10
   #Text_11
   #Text_12
   #Text_13
   #Text_14
   #Text_15
   #Text_16
   #Text_17
   #Text_18
   #Text_19
   #Text_20
   #Texte_21
   #Texte_22
   #String_Sexe
   #String_Annee
   #String_Mois
   #String_Departement
   #String_Commune
   #String_Numero
   #String_Cle
   #String_Numero_complet
   #Bouton_Sexe
   #Bouton_Annee
   #Bouton_Mois
   #Bouton_Departement
   #Bouton_Commune
   #Bouton_Numero
   #Bouton_Decoder
   #Texte_Trait    
   #Texte_Trait2
   #Texte_Trait3
   #Texte_Trait4
   #Texte_Trait5
   #Texte_Trait6
   #Texte_Trait7
EndEnumeration
Global.s Trait =  "——————————————————————————————————————————————————————————————————————"
Procedure OpenWindow_Fenetre_principale()
   If OpenWindow(#Fenetre_principale, 0, 0, 420, 385, "Calcul de la clé du code Insee", #PB_Window_SystemMenu|#PB_Window_SizeGadget|
                                                                                         #PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
      TextGadget(#Text_0, 5, 5, 285, 15, "Code sexe")
      TextGadget(#Text_1, 5, 20, 285, 15, "[1 = homme, 2 = femme, 3 = numéro temporaire")
      TextGadget(#Texte_Trait, 0, 30, 420, 10, Trait)
      TextGadget(#Text_2, 5, 40, 285, 15, "Année de naissance")
      TextGadget(#Text_3, 5, 55, 285, 15, "[2 derniers chiffres du millésime : 2013 : 13")
      TextGadget(#Texte_Trait2,0,65, 420, 10, Trait)
      TextGadget(#Text_4, 5, 75, 285, 15, "Mois naissance")
      TextGadget(#Text_5, 5, 90, 285, 15, "[sur 2 chiffres : janvier = 01, décembre = 12]")
      TextGadget(#Text_6, 5, 105, 285, 15, "20 et au delà : pièce d'état civil incomplète")
      TextGadget(#Texte_Trait3, 0, 115, 420, 10, Trait)            
      TextGadget(#Text_7, 5, 125, 285, 15, "Code département de naissance")
      TextGadget(#Text_8, 5, 140, 285, 15, "[sur 2 chiffres ou lettres, exemples:")
      TextGadget(#Text_9, 5, 155, 285, 15, "75 pour Paris")
      TextGadget(#Text_10, 5, 170, 285, 15, "99 pour l'étranger")
      TextGadget(#Text_11, 5, 185, 285, 15, "2A pour la Corse du Sud")
      TextGadget(#Text_12, 5, 200, 285, 15, "2B pour la Haute Corse")
      TextGadget(#Text_13, 5, 215, 285, 15, "outre mer : département sur 3 chiffres (1 sur champ suivant)]")
      TextGadget(#Texte_Trait4, 0, 225, 420, 10, Trait)            
      TextGadget(#Text_20, 5, 235, 285, 15, "Code Insee commune de naissance")
      TextGadget(#Texte_21, 5, 250, 285, 15, "[sur 3 chiffres (2 pour l'outre mer)]")
      TextGadget(#Texte_22, 5, 265, 285, 15, "990 à 999 : pupille de l'Etat ou lieu de naissance inconnu")
      TextGadget(#Texte_Trait5, 0, 275, 420, 10, Trait)            
      TextGadget(#Text_14, 5, 285, 285, 15, "Numéro d'ordre")
      TextGadget(#Text_15, 5, 300, 285, 15, "[sur 3 chiffres]")
      TextGadget(#Texte_Trait6, 0, 310, 420, 10, Trait)            
      TextGadget(#Text_16, 5, 320, 285, 15, "Clé de contrôle")
      TextGadget(#Text_17, 5, 335, 285, 15, "[2 chiffres]")
      TextGadget(#Texte_Trait7, 0, 345, 420, 10, Trait)            
      TextGadget(#Text_18, 5, 355, 285, 15, "Numéro de sécurité sociale complet")
      TextGadget(#Text_19, 5, 370, 285, 15, "[15 chiffres]")
      
      StringGadget(#String_Sexe, 290, 5, 14, 20, "", #PB_String_Numeric)
      StringGadget(#String_Annee, 290, 40, 18, 20, "", #PB_String_Numeric)
      StringGadget(#String_Mois, 290, 75, 18, 20, "")
      StringGadget(#String_Departement, 290, 125, 18, 20, "", #PB_String_UpperCase)
      StringGadget(#String_Commune, 290, 235, 25, 20, "", #PB_String_Numeric)
      StringGadget(#String_Numero, 290, 285, 25, 20, "", #PB_String_Numeric)
      TextGadget(#String_Cle, 290, 320, 20, 20, "", #PB_String_ReadOnly)
      StringGadget(#String_Numero_complet, 290, 355, 120, 20, "")
      ButtonGadget(#Bouton_Sexe, 325, 5, 80, 20, "Changer")
      ButtonGadget(#Bouton_Annee, 325, 40, 80, 20, "Changer")
      ButtonGadget(#Bouton_Mois, 325, 75, 80, 20, "Changer")
      ButtonGadget(#Bouton_Departement, 325, 125, 80, 20, "Changer")
      ButtonGadget(#Bouton_Commune, 325, 235, 80, 20, "Changer")
      ButtonGadget(#Bouton_Numero, 325, 285, 80, 20, "Changer")
      ButtonGadget(#Bouton_Decoder, 325, 320, 80, 20, "Décoder la clé")
      
      SetActiveGadget(#String_Sexe)
      
      SetGadgetAttribute(#String_Sexe, #PB_String_MaximumLength, 1)
      SetGadgetAttribute(#String_Annee, #PB_String_MaximumLength, 2)
      SetGadgetAttribute(#String_Mois, #PB_String_MaximumLength, 2)
      SetGadgetAttribute(#String_Departement, #PB_String_MaximumLength, 2)
      SetGadgetAttribute(#String_Commune, #PB_String_MaximumLength, 3)
      SetGadgetAttribute(#String_Numero, #PB_String_MaximumLength, 3)
   EndIf
EndProcedure

OpenWindow_Fenetre_principale()

Repeat
   Select WaitWindowEvent()
      Case #PB_Event_Gadget
         Select EventGadget()
            Case #String_Sexe
               text.s = GetGadgetText(#String_Sexe)
               If text.s < "1" Or text.s > "3"
                  Beep_(880,100)
                  text2.s = Left(text.s,Len(text.s)-1)
                  SetGadgetText(#String_Sexe, text2.s)
               EndIf
            Case #String_Mois
               text.s = GetGadgetText(#String_Mois)
               If text.s > "12"
                  Beep_(880,100)
                  text2.s = Left(text.s,Len(text.s)-2)
                  SetGadgetText(#String_Mois, text2.s)
               EndIf
            Case #String_Departement
               text.s= GetGadgetText(#String_Departement)
               If Len(text.s) < 3
                  Select Left(text.s, 1)
                     Case "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","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"
                        Beep_(880,100)
                        text.s= GetGadgetText(#String_Departement)
                        text2.s= Left(text.s,Len(text.s)-1)
                        SetGadgetText(#String_Departement, text2.s)
                     Case "2"
                        If (Asc(Right(text.s,1))>47 And Asc(Right(text.s,1))<58 ) Or  (Asc(Right(text.s,1))=65 Or Asc(Right(text.s,1))=66)
                           text.s= GetGadgetText(#String_Departement)
                        Else 
                           Beep_(880,100)
                           text.s= GetGadgetText(#String_Departement)
                           text2.s= Left(text.s,Len(text.s)-1)
                           SetGadgetText(#String_Departement, text2.s)
                        EndIf
                        
                     Case "1" , "3" , "4", "5", "6", "7", "8", "9"
                        If (Asc(Right(text.s,1))>47 And Asc(Right(text.s,1))<58 )
                           text.s= GetGadgetText(#String_Departement)
                        Else 
                           Beep_(880,100)
                           text.s= GetGadgetText(#String_Departement)
                           text2.s= Left(text.s,Len(text.s)-1)
                           SetGadgetText(#String_Departement, text2.s)
                        EndIf
                        
                  EndSelect
               EndIf
            Case #Bouton_Decoder
               If UCase(Right(GetGadgetText(#String_Departement),1))= "A" 
                  Departement$ = "20"
                  Resultat$ = GetGadgetText(#String_Sexe) + GetGadgetText(#String_Annee) + GetGadgetText(#String_Mois) +
                                 Departement$ + GetGadgetText(#String_Commune) + GetGadgetText(#String_Numero)
                  resultchiffre.d = ValD(Resultat$) 
                  resultchiffre = (resultchiffre - 1000000)
               ElseIf UCase(Right(GetGadgetText(#String_Departement),1))= "B" 
                  Departement$ = "20"
                  Resultat$ = GetGadgetText(#String_Sexe) + GetGadgetText(#String_Annee) + GetGadgetText(#String_Mois) +
                                 Departement$+GetGadgetText(#String_Commune)+GetGadgetText(#String_Numero)
                  resultchiffre.d = ValD(Resultat$)
                  resultchiffre = (resultchiffre - 2000000)
               Else
                  Resultat$ = GetGadgetText(#String_Sexe)+GetGadgetText(#String_Annee)+GetGadgetText(#String_Mois) +
                                 GetGadgetText(#String_Departement)+GetGadgetText(#String_Commune)+GetGadgetText(#String_Numero)
                 resultchiffre.d = ValD(Resultat$)
               EndIf
               SetGadgetText(#String_Cle, StrD(97 - Mod(resultchiffre, 97)))
               SetGadgetText(#String_Numero_complet, GetGadgetText(#String_Sexe) + " " + GetGadgetText(#String_Annee) + " " +
                                                     GetGadgetText(#String_Mois) + " " + GetGadgetText(#String_Departement) + " " + 
                                                     GetGadgetText(#String_Commune) + " "+GetGadgetText(#String_Numero) + " [" + GetGadgetText(#String_Cle) + "]")
            Case #Bouton_Sexe
               SetGadgetText(#String_Sexe, "")
               SetActiveGadget(#String_Sexe)
            Case #Bouton_Annee
               SetGadgetText(#String_Annee, "")
               SetActiveGadget(#String_Annee)
            Case #Bouton_Mois
               SetGadgetText(#String_Mois, "")
               SetActiveGadget(#String_Mois)
            Case #Bouton_Departement
               SetGadgetText(#String_Departement, "")
               SetActiveGadget(#String_Departement)
            Case #Bouton_Commune
               SetGadgetText(#String_Commune, "")
               SetActiveGadget(#String_Departement)
            Case #Bouton_Numero
               SetGadgetText(#String_Numero, "")
               SetActiveGadget(#String_Numero)
         EndSelect
         
      Case #PB_Event_CloseWindow
         Select EventWindow()
            Case #Fenetre_principale
               CloseWindow(#Fenetre_principale)
               Break
         EndSelect
   EndSelect
ForEver


voila le code est Ok, Pour la corse, pas fait d'éssais. :wink:
Mon but : Simplement de te monter ou il y a un problème, pas de faire ton logiciel a ta place.
Il faut bien que tu transpire un peu; :wink: :lol:
Dernière modification par MLD le jeu. 11/avr./2013 13:02, modifié 1 fois.
Répondre