Changements récents - Rechercher:

Tutoriel Filemaker

  1. Structure
  2. Modèles
  3. Opérations diverses
  4. Calculs
  5. Scripts
  6. Privilèges d'accès

Filemaker avancé

  1. Partage des données
  2. Astuces et Exemples
  3. Développement

Règles de nommage

Versions de FileMaker Pro

Liens utiles Contact Commentaires

edit SideBar

Numérotation de factures

<==Fonctions d'obtention ^ Calculs

La numérotation correcte des factures est souvent un souci pour les développeurs en FileMaker Pro. Souvent, la numérotation mise en place commence à prendre méchamment de la bande au 1er janvier à 0 heure, moment où tous les compteurs doivent être remis à 1... Nous donnons ici une méthode. Ce n'est pas la seule, mais elle a le mérite de fonctionner correctement. Quelles sont les données de base ?

  • Les numéros sont continus tout au long de l'année,
  • Ils recommencent à 1 au 1er janvier de chaque année (ou au début de chaque exercice fiscal qui dure de toutes façons un an)
  • Une nouvelle facture créée doit être numérotée en ajoutant 1 au numéro de la dernière facture créée
  • Aucun numéro ne peut être altéré ou effacé, même en cas de suppression d'un enregistrement (ce qui devrait être rendu impossible)
  • Afin d'identifier l'année, on aimerait une numérotation du type :
    • 07/6543
    • 07/6544
    • 07/6545
    • ...
    • 08/0001
    • 08/0002
    • 08/0003
    • Etc.

On est clairement en face de deux cas différents :

  • Soit on génère la première facture de l'année => le n° doit être égal à 1
  • Soit on génère une autre facture => le n° doit être égal au dernier n° créé + 1

Va y avoir de la fonction Cas() dans l'air...

Afin de gagner en visibilité, et de suivre pazapa notre raisonnement, on va utiliser la fonction Définir(), décidément bien utile. Mais au préalable, on l'aura déjà deviné (enfin, espérons-le...), il nous faut un moyen pour aller "pêcher" le dernier n° de facture existant, si on veut pouvoir lui rajouter 1 !
Pour ce faire, ce n'est pas très compliqué. Dans notre fichier exemple nous allons créer un auto-lien de la table FAC_Factures vers elle-même. Quel type de lien ? Un lien qui affiche tous les enregistrements sauf la nouvelle facture que l'on vient de créer (de type "≠"). Donc, depuis l'ancre FAC__, on crée une OT fac_FAC__Numero, et le lien : zkp ≠ zkp :

Ainsi, à partir d'un enregistrement donné de la table FACtures, nous aurons bien par le lien tous les enregistrements de la même table portant un Zkp différent, donc un numéro de facture différent.

Dernière facture créée


On avance, mais on n'y est pas encore : comme dit plus haut, ce qui nous intéresse est le dernier n° de facture, soit le plus élevé. Réfléchissons :

  • Via notre lien, on a toutes les factures moins une : celle nouvellement créée.
  • Mais, peu importe le nombre d'enregistrements liés, si on effectue un calcul via ce lien, ce calcul sera fait sur le premier enregistrement lié, et tous les autres seront superbement ignorés !
  • Ce serait donc bien que ce premier enregistrement lié soit précisément celui qui porte le plus haut n° ! Dans ce cas, il suffirait de lui ajouter 1, et on obtiendrait immédiatement le nouveau n° de facture.
  • Rien de plus simple : il suffit de trier le lien sur le n° de facture, en ordre décroissant : le premier n° de la pile sera le n° le plus élevé, donc le dernier créé, donc celui qui nous intéresse !

Dans le lien, on clique donc sur "Trier les enregistrements" à droite (pour trier les enregistrements liés) et on met en place un tri sur le numéro de facture, par ordre décroissant.

'Au passage, notons à l'attention de ceux qui y auraient pensé, que la fonction Max(), qui aurait pu aller chercher le n° de facture maximum, ne marche pas dans ce cas, car le n° de facture est du texte... La structure du n° de facture étant aa/nnnn, l'ordre alphabétique fonctionne parfaitement

Donc, le premier enregistrement lié est celui qui porte le dernier n° de facture créé, soit celui qu'on cherche : fac_FAC__::NrFacture. Ce sera notre première variable de la fonction Définir() :

Definir([
NrFact = fac_FAC__Numero::NrFacture

Ce dernier n° créé étant obtenu, il nous faut maintenant l'analyser, pour pouvoir répondre à cette terrible question : était-ce le dernier n° de l'année précédente ou non ? Si oui, notre nouveau n° se termine par (000...) 1, sinon il est égal au dernier n° + 1. La question est finalement assez simple, dite ainsi. La traduire en calcul est un peu plus fin... En effet, tâchez d'ajouter le nombre 1 à du texte pour obtenir un nouveau texte censé représenter un n° de facture... Mais allons-y calmement, et tâchons SURTOUT de comparer des pommes avec des pommes, et des poires avec des poires ! Le reste est presque secondaire...

On contrôle donc que le début du n°, qui représente l’année, correspond bien à l’année en cours. Il faut donc dans un premier temps :

  • Extraire le début du n°, qui n’est que de 2 chiffres (p.ex. 07 ou 08)
  • Obtenir le n° correspondant de l’année en cours, en 2 chiffres également
  • Comparer les deux données, après s'être assuré qu'elles sont du même type

Extraction du début du n°


Ce dernier n° est en réalité... que du texte ! (sinon le n° de la facture 07/1234 serait le résultat de la division de 7 par 1234...).
On peut donc utiliser toute la panoplie des fonctions texte. Ici, pour extraire les 2 premiers caractères, on utilise la fonction Debut() sur notre première variable, "NrFact" :

Debut ( NrFact ; 2)

On va monter cela dans une 2e variable, simplement appelée "Debut" :

Definir([
NrFact = fac_FAC__Numero::NrFacture ;
Debut = Debut ( NrFact ; 2 ) ;

Extraction de l'année en cours


La fonction Obtenir ( DateActuelle) nous donne la date du jour, sous la forme 05/04/2008, p.ex. Il s’agit donc ici d’extraire les 2 derniers caractères de la date actuelle, par la fonction Fin() : Fin ( Obtenir (DateActuelle) ; 2 ). Néanmoins, nous obtiendrons un nombre, que l’on va comparer avec du texte. Il vaut donc mieux convertir le résultat en texte, via la fonction ObtenirTexte() :

ObtenirTexte ( Fin (Obtenir (DateActuelle) ; 2 ))

On monte le calcul dans une variable appelée Annee :

Definir([
NrFact = fac_FAC__Numero::NrFacture ;
Debut = Debut ( NrFact ; 2 ) ;
Annee = ObtenirTexte ( Fin (Obtenir (DateActuelle) ; 2 )) ;

Nous voici donc avec nos deux éléments de comparaison : Debut et Annee, de même type, donc comparables.

Dernier numéro


Il nous reste maintenant à obtenir le dernier n° de facture, sous forme de nombre, pour pouvoir l’incrémenter de + 1 si il ne s’agit pas de la 1ère facture de l’année. Par exemple, pour le n° 07/1234, on doit obtenir 1234.
Bien sûr, ceux qui font plus de 9999 factures dans l'exercice mettrons un nombre à 5 ou 6 chiffres, mais c'est rare chez les développeurs débutants.
Si nous extrayons comme précédemment, nous obtiendrons du texte. On utilise donc, en plus, la fonction ObtenirNombre() :

ObtenirNombre ( Fin ( NrFact ; 4))

que l'on va monter dans une variable appelée simplement Nr :

Definir([
NrFact = fac_FAC__Numero::NrFacture ;
Debut = Debut ( NrFact ; 2 ) ;
Annee = ObtenirTexte ( Fin (Obtenir (DateActuelle) ; 2 )) ;
Nr = ObtenirNombre ( Fin ( NrFact ; 4)) ;

Nouveau numéro


On peut, toujours au sein des variables, déjà effectuer la comparaison entre les années : si Debut = Annee, alors Nr de la nouvelle facture = Nr + 1, sinon Nr de la nouvelle facture = 1. Deux possibilités donc : on utilise la fonction Cas() :

Cas ( Debut = Annee ; Nr + 1 ; 1 )

Ce qui nous dit bien : si le contenu de notre variable Debut est égal au contenu de notre variable Année, alors on rajoute 1 au contenu de notre variable Nr, sinon, la variable prend la valeur 1.

On monte ce calcul dans une variable NouveauNr :

Definir([
NrFact = fac_FAC__Numero::NrFacture ;
Debut = Debut ( NrFact ; 2 ) ;
Annee = ObtenirTexte ( Fin (Obtenir (DateActuelle) ; 2 )) ;
Nr = ObtenirNombre ( Fin ( NrFact ; 4)) ;
NouveauNr = Cas ( Debut = Annee ; Nr + 1 ; 1 ) ;

Nouveau numéro de facture


Ce dernier calcul nous rendra quelque chose comme 4 ou 352, soit un nombre. Pour le mettre en forme, il nous faut 4 caractères. Une astuce de mise en forme pour obtenir 0004 à partir de 4 ou 0352 à partir de 352 :

Fin ( "0000" & NouveauNr ; 4 )

En langage humain, je concatène mes deux contenus (0000 et nouveau nombre) et je garde les 4 derniers caractères en partant de la fin. Ça marche à tous les coups (essayez...).

P.ex. : 0000352

On monte le tout dans une dernière variable, NouveauNrFact :

Definir([
NrFact = fac_FAC__Numero::NrFacture ;
Debut = Debut ( NrFact ; 2 ) ;
Annee = ObtenirTexte ( Fin (Obtenir (DateActuelle) ; 2 )) ;
Nr = ObtenirNombre ( Fin ( NrFact ; 4)) ;
NouveauNr = Cas ( Debut = Annee ; Nr + 1 ; 1 ) ;
NouveauNrFact = Fin ( "0000" & NouveauNr ; 4 )

Calcul final


On a défini notre dernière variable : il nous faut clôturer la zone des variables par un "]", puis, un peu compliqué, admettons-le, un ";" :

Definir([
NrFact = fac_FAC__Numero::NrFacture ;
Debut = Debut ( NrFact ; 2 ) ;
Annee = ObtenirTexte ( Fin (Obtenir (DateActuelle) ; 2 )) ;
Nr = ObtenirNombre ( Fin ( NrFact ; 4)) ;
NouveauNr = Cas ( Debut = Annee ; Nr + 1 ; 1 ) ;
NouveauNrFact = Fin ( "0000" & NouveauNr ; 4 ) ] ;

Voilà qui est fait. Reste à établir notre calcul final. Que contient-il ? Une simple concaténation :

  • les deux derniers caractères de l'année en cours, soit la variable Annee
  • un slash "/"
  • Le nouveau nr de facture en 4 digits, soit la variable NouveauNrFact

Donc, le calcul de concaténation est :

Annee & "/" & NouveauNrFact

Ainsi, la formule finale du calcul est :

Dans notre cas, on mettra ce calcul en auto-calcul, non modifiable, par sécurité, dans notre rubrique existante, NrFacture :

On laissera également cochée la case "Ne pas remplacer..."

L’auto-calcul ainsi établi, les N° de factures seront automatiquement incrémentés, et celui de la 1ère facture de l’année sera numéroté « 0001 » avec comme mantisse le n° de la nouvelle année en cours. On ne devra donc plus se préoccuper des changements d’année !

On peut bien sûr comparer avec un calcul établi sans la fonction Définir() :

ObtenirTexte ( Fin ( Obtenir (DateActuelle) ; 2 )) & "/" & Fin ( "0000" & Cas ( Debut ( fac_FAC__Numero::NrFacture ; 2) = ObtenirTexte ( Fin ( Obtenir (DateActuelle) ; 2 )) ; ObtenirNombre ( Fin ( fac_FAC__Numero::NrFacture ; 4) + 1 ) ; 1) ; 4)

Et si l'exercice fiscal de l'entreprise n'est pas au premier janvier ? Il suffira alors d'adapter ce que nous venons de voir en prenant en compte le mois, tout simplement.

Attention toutefois... Ce calcul étant fondé sur l'enregistrement précédent, il faut prendre soin de créer la première facture, quel que soit son numéro, pour qu'il fonctionne (ben oui, sinon les variables n'extraient rien de... rien). Pour cela il faut autoriser la modification, créer la première facture et son numéro, puis on peut à nouveau interdire les modifications dans la rubrique.

À vous de "jouer" le fichier avec deux numéros de factures

<==Fonctions d'obtention ^ Calculs
Éditer - Historique - Imprimer - Changements récents - Rechercher
Page mise à jour le 15 décembre 2008 à 09h11