IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Firebird Discussion :

Procédure stockée pour le calcul de la paie sous forme de formule dans une table qui sera interprété via la pr


Sujet :

SQL Firebird

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2007
    Messages : 11
    Points : 10
    Points
    10
    Par défaut Procédure stockée pour le calcul de la paie sous forme de formule dans une table qui sera interprété via la pr
    Bonjour

    Pour ce qui serait intéressé par une procédure stockée pour le calcul de la paie sous forme de formule exemple (SB*TAUX/100), BDD utilisé Firebird 3.0.
    NB : à utilisé les fonctions externe 32 ou 64 bites de la librairies audfl.dll anciennement rfunc.dll. Utilisé la procédure stockée calc, le paramètre d'entré numéro du salarié.
    en pièce jointe la BDD au format sql à recréer chez vous au cas ou ! Merci de votre retour.
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    NB : à utiliser les fonctions externes 32 ou 64 bits de la bibliothèque audfl.dll anciennement rfunc.dll.
    un lien ce serait pas mal, donc acte : https://app.assembla.com/spaces/audfl_rfunc/documents

    À savoir : Les UDF sont dépréciées à partir de la version 4 UDFs are deprecated in Firebird 4

    Enfin beaucoup des fonctions UDF que vous déclarez sont inutiles (i.e FLOOR car déjà existantes en tant que fonctions internes (ici celles de FB2.5 https://firebirdsql.org/refdocs/lang...5-intfunc.html)

    J'avoue ne pas être allé plus loin dans l'étude de ce SQL, déjà deux freins !
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2007
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Il fallait allez plus loin, le meilleur est toujours pour la fin comme le dessert, dommage.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Ne soyez pas présomptueux !
    En m'y plongeant un peu plus je vois beaucoup plus de choses largement améliorables.

    Par exemple :

    vous auriez pu utiliser des Global Temporay Tables pour vos tables comme RUBRIQUE2 et certainement VALEUR et LIST_VAR_CALCUL et ainsi éviter des instructions de suppressions

    A mon avis ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FOR SELECT code,abrev_rub,nom,mode,formule from rubrique  order by code into :code_rub,:abrevrub,:nom_rub,:mod,:formu do 
    begin 
    insert into rubrique2 (code,abrev_rub,nom,mode,formule) values (:code_rub,:abrevrub,:nom_rub,:mod,:formu);
    end
    se simplifie en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into rubrique2 (code,abrev_rub,nom,mode,formule) SELECT code,abrev_rub,nom,mode,formule from rubrique
    A ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    code_p=(select code_poste from salarie where num_sal=:num_sal);
    indice=(select salaire from nomenclature where code_poste=:code_p);
    je préfére
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select code_poste from salarie where num_sal=:num_sal INTO :CODE_P);
    select salaire from nomenclature where code_poste=:code_p INTO :INDICE);
    un peu plus loin je lis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    :TX=(select taux from variabl where num_sal=:num_sal and code_rub=:code_rub);
    :NOMBR=(select NOMBRE from variabl where num_sal=:num_sal and code_rub=:code_rub);
    où une seule instruction suffit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TAUX,NOMBRE from variabl where num_sal=:num_sal and code_rub=:code_rub INTO :TX,:NOMBRE;
    et encore n'ai-je pas poussé plus loin
    Donc vous voyez que votre "repas" est pour moi déjà lègérement indigeste, n'y ajoutonns pas un dessert.

    Que vous soyez fier de votre code OK, mais qu'il ne soit pas au mieux ne fait pour moi aucun doute
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2007
    Messages : 11
    Points : 10
    Points
    10
    Par défaut rectif du code sql. merci pour votre aide
    Merci de m'avoir corrigé.

    Je n'ai pas la prétention d'être fière de mon code, loin de la. Merci pour vos correctifs. c'est plus le point de vu du concept, de l'idée qui m'intéresse que du code à proprement parlé. J'attendais plus un avis sur l'idée, pour saisir il faut voir la procédure stockée en lien avec les tables. C'est une "sorte" de moteur. C'est tout. Vous êtes plus attaché au détail qu'au global. "Le but étant plus loin que le moyen, pleurons sur ceux qui ne s'arrête qu'à ce dernier" (citation).Ne le prenez surtout pas mal. Je vous remercie encore pour vos correctifs.paie.sql

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Je ne suis pas sûr que vous ayez compris la raison de mon indication sur les tables temporaires GTT, aussi vais-je mettre un lien
    une table comme RUBRIQUE2 pourrait très bien être déclarée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE GLOBAL TEMPORARY TABLE RUBRIQUE2
    (
      CODE integer NOT NULL PRIMARY KEY,
      ABREV_RUB varchar(10),
      NOM varchar(150),
      "MODE" integer DEFAULT 0 NOT NULL,
      FORMULE varchar(500)
    ) ON COMMIT DELETE ROWS;
    évitant ainsi le DELETE FROM RUBRIQUE2; préalable au remplissage, bien sûr, il y a un inconvénient : impossible de vérifier que la table est remplie correctement durant le traitement donc pas de débug possible

    Chaque fois que j'ai lu un UPDATE sans clause WHERE j'ai frémi en me posant la question est-ce vraiment un UPDATE sur toutes les lignes de la table ?


    Il y a encore beaucoup d'élagages à faire !

    Tout d'abord supprimer toutes les déclarations de fonctions inutiles
    Ensuite remplacer des fonctions comme
    SUBSTR par la fonction interne SUBSTRING
    FloattoStr par un ROUND(variable,2) en effet d'après ce que j'ai lu vous utilisez floattostr pour de la concaténation

    en exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ALTER TRIGGER AJOUT_VARIABLE FOR VALEUR 
    ACTIVE AFTER INSERT POSITION 0
    AS
    DECLARE VARIABLE L INTEGER;
    begin
     L=CHAR_LENGTH(new.abrev_rub); -- d'ailleurs ce calcul est inutile ABREV_RUB est défini comme VARCHAR(10) donc 10 serait tout aussi efficace de même que toute valeur supérieure
     update liste_var_calcul set varliste=SUBSTRING(new.abrev_rub FROM 2 FOR :L)||'='||ROUND(new.montant,2)||iif(new.code=1,'',';')||varliste where numero=1;
    end
     ^
    Donc, sauf si je me trompe seul la fonction externe CALCEXPR est nécessaire

    Vous utilisez des mots clés comme MOD (nom d'une fonction interne) ou MODE (ça je n'ai pas trouvé pourquoi la syntaxe était relevée) chose à éviter

    NB : Le script d'ajout d'enregistrement pose un problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO "RUBRIQUE" ("CODE", "ABREV_RUB", "NOM", "MODE", "FORMULE")
    VALUES (2,':NHTT','NOMBRE D''HEURE THEORIQUE MENSUEL TRAVAILLE',0,:"FORMULE");
    Attends un paramètre à saisir nommé FORMULE ?
    le fait que tout soit entre " " me fait penser à une utilisation de IBexpert (que je n'utilise que très rarement) cette utilisation rend le nom des colonnes case-sensitive et rends le script moins lisible de mon point de vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO RUBRIQUE (CODE, ABREV_RUB, NOM, "MODE", FORMULE)
    VALUES (2,':NHTT','NOMBRE D''HEURE THEORIQUE MENSUEL TRAVAILLE',0,:"FORMULE");
    Enfin ce script manque cruellement de commentaires, imaginez que quelqu'un prenne votre suite

    Je pourrais continuer longtemps les critiques


    c'est plus le point de vu du concept, de l'idée qui m'intéresse que du code à proprement parlé. J'attendais plus un avis sur l'idée, pour saisir il faut voir la procédure stockée en lien avec les tables. C'est une "sorte" de moteur. C'est tout. Vous êtes plus attaché au détail qu'au global.
    On me propose un script sans commentaire, je l'épluche.
    Ce n'est pas du détail :
    - si cela permet d'éviter des UDF alors qu'il y a des fonctions internes
    - si cela permet d'éviter des variables
    - si cela permet d'utiliser les fonctionnalités comme les GTT
    - si cela permet d'éviter des requêtes SQL (toute la différence entre code_p=,indice= soit deux requêtes alors qu'une seule est nécessaire grâce au INTO

    L'idée d'utiliser une bibliothèque externe avec des UDFs ce n'est pas nouveau pour moi, encore moins un solveur d'expression (j'ai même fait mon propre solveur depuis des années pour des conversions de poids et mesure et en ai même proposé un autre dans mon étude sur l'évaluateur d'expressions des Livebindings Delphi)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2007
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Bonsoir,
    Merci pour tout vos commentaires. J'en tiendrai compte assurément.
    J'ai lu qu'avec firebird 4 on peut toujours utiliser des udfs, fichier .conf. J'utilise ibeasy++(marc-grange.com), il est complet et open source. Pour les commentaires une fois toutes les tables mises au point, les contrainte d'intégrité, les triggers, les proc stockée, ect... je vais mettre les commentaires pour chaque ligne de code. Floattostr() ne peut pas être remplacé par la fonction d'arrondie round(). Car la fonction calcexpr() attend 2 strings et retourne un double.
    pour utiliser un parseur de formule mathématique dans une application, c'est une manière de le faire à l'intérieur de la BDD. Le calculateur paie le met sous forme de formule et le tour et jouet. Le calcul de la paie est fait. Ca permet d'avoir dans une application que les masques de saisie ou les éditions, tout est dans la BDD. Quand à l'update sur la table rubrique2, c'est pour remplacer l'occurrence 'abrev_rub' dans le champ formule par sont montant. La table n'est pas grand et ne peu être grande. Elle correspond au rubrique de paie au pire sans ligne. Donc au niveau rapidité on ne s'en aperçoit même pas, vous pouvait en faire le test. Celà --> vers 0. Il faut en comprendre l'algorithme.

    - La proc stocké reçoit en paramètre d'entré le numéro du salarié;
    - on recherche le code du poste du salarié dans le fichier nomenclature 'code_poste', qui correspond à la nomenclature des postes de l'entreprise pour y récupérer le salaire mensuel que l'on place dans la variable indice.
    - on boucle dans le fichier rubrique chaque 'mode' est traiter séparément de 0 à 4, correspondant chacun à un état soit 5 états possible. il ne peut y avoir plus de 5 états quelque soit le cas vous pouvait vérifier.
    - le 0 correspond à l'évaluation directe de la formule, aucune saisie en amont n'est nécessaire.
    - le 1 correspond à la saisie d'un nombre (exemple : nombre de jours maladie, nombre de jour d'absence ect...) saisie dans le fichier des variables. La clé primaire est composé du numéro de salarié+ code_rubrique.
    - le 2 correspond à la saisie d'un TAUX (exemple ; Taux de prime, taux d'ancienneté ect...) toujours saisie dans le fichier des variables.
    - le 3 correspond à la saisie d'un NOMBRE et d'un TAUX (exemple : prime de panier, nombre de jours travaillé par un taux fixe 22*20 Euro par exemple) toujours saisie dans le fichier des variables.
    - le 4 correspond à la saisie d'un montant fixe (exemple retenue avance sur salaire) toujours saisie dans le fichier des variables.
    ect...ect.... pour chaque salarié. dans la formule on peut aussi utilisé tout les champs qui peuvent être nécessaire exemple sexe 'M' ou 'F' pour des conditions dans la formule avec la fonction IIF(). exemple : iif(salaire de poste>1500.00,1500.00*0.05,salaire de poste*0.05). Pour les rubriques plafonnées.
    voilà un peut la fonction de chaque fichier et l'algorithme de calcul de la paie.
    quelque soit la formule de calcul ça marche et dans n'importe quel pays. A charge pour le calculateur paie de maitriser sa paie. et d'enregistrer les rubriques de paie d'une manière algorithmique comme si il faisait une paie à la main, le salaire de base se trouvant avant le salaire de poste, la sécurité sociale ce trouvant après le salaire de poste ect...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2008R2] Procédure stockée pour calcul KPI
    Par cuteness10 dans le forum Développement
    Réponses: 5
    Dernier message: 27/04/2016, 16h23
  2. Réponses: 9
    Dernier message: 27/09/2007, 15h15
  3. procédure stockée pour renvoyer un état dans une application
    Par erickoffi dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 27/10/2005, 19h05
  4. Réponses: 5
    Dernier message: 04/10/2004, 18h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo