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 :

Déclencheur je présume


Sujet :

SQL Firebird

  1. #1
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut Déclencheur je présume
    Bonjour
    j'ai une table mouvement avec les champs suivants :
    id_mouv, date_mouv, recette, depense et solde.

    je voudrais qu'à l'ouverture d'une nouvelle ligne, donc à l'ajout d'un enregistrement, récupérer du solde et l'ajouter à la nouvelle recette.
    J'ai essayé de faire ça en utilisant un déclencheur mais je n'ai pas eu le résultat escompté.

    voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE OR ALTER trigger tb_mouvements_bi0 for tb_mouvements
    active before insert position 0
    AS
    DECLARE VARIABLE s DECIMAL(18,0);
    begin
      /* Trigger text */
      SELECT solde_journee FROM tb_mouvements ORDER BY 1 DESC into :s;
      if (inserting) then
        new.solde_journee =  new.solde_journee + s;
    end
    des idées ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Bonjour

    j'ai essayé de faire ça mais j'ai eu une erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE OR ALTER trigger tb_mouvements_bi0 for tb_mouvements
    active after update position 0
    AS
    declare variable id_m int;
    declare variable s float;
    begin
      /* Trigger text */
        SELECT MAX(id_mouv), sum(solde_journee) from tb_mouvements
        group by solde_journee
        INTO id_m,  :s;
     
        UPDATE tb_mouvements
        SET SOLDE_CUMULE = NEW.SOLDE_CUMULE + s;
    end
    je commece par récupérer le dernier enregistrement en utilsant max, puis le montant de la journée en utilisant sum. Après récupération des données, j'essai de faire une mise à jour sur la table en utilisant update mais là je reçois une erreur sur lavariable s :

    Column does not belong to referenced table.
    Dynamic SQL Error.
    SQL error code = -206.
    Column unknown.
    S.
    At line 13, column 43.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  3. #3
    Membre confirmé Avatar de licardentaistor
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2021
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2021
    Messages : 316
    Points : 453
    Points
    453
    Par défaut
    salut,

    regarde ici : https://www.mysqltutorial.org/mysql-...nsert-trigger/

    tu as normalement tous ce qu'il te faut

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Si tu commençais par donner la structure de la table ?
    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 émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Si tu commençais par donner la structure de la table ?
    je l'avais donné dans le 1er post

    en fait, j'ai remodelé un peu la chose, j'ai ajouté un champ solde_cumulé afin d'alleger le traitement.

    voici la structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE TB_MOUVEMENTS (
        ID_MOUV        INTEGER NOT NULL,
        DATE_MOUV      DATE,
        RECETTE        DOUBLE PRECISION,
        DEPENSE        DOUBLE PRECISION,
        SOLDE_JOURNEE  COMPUTED BY (recette - depense),
        SOLDE_CUMULE   DOUBLE PRECISION
    );
    et le déclencheur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE OR ALTER trigger tb_mouvements_bi0 for tb_mouvements
    active after update position 0
    AS
    declare variable id_m int;
    declare variable s float;
    begin
      /* Trigger text */
        SELECT MAX(id_mouv), sum(solde_journee) from tb_mouvements
        group by solde_journee
        INTO id_m, :s;
     
        UPDATE tb_mouvements
        SET SOLDE_CUMULE = NEW.SOLDE_CUMULE + s;
    end
    à l'éxécution il reconnait pas la variable s dans la dernière instruction :
    Column does not belong to referenced table.
    Dynamic SQL Error.
    SQL error code = -206.
    Column unknown.
    S.
    At line 13, column 43.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Quelques questions maintenant que je vois la structure :
    Tout d'abord, je ne pense pas qu'il n'y ait qu'un seul mouvement par journée ?
    Ensuite, si le solde cumulé est ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        UPDATE tb_mouvements
        SET SOLDE_CUMULE = NEW.SOLDE_CUMULE + :s;
    (manque un : )
    toutes les lignes seront modifiées, cela me semble donc une colonne inutile, voire dangereux dans un contexte multi-user.

    J'imagine que SOLDE_CUMULE est le SOLDE_CUMULE d'une journée et non de l'ensemble des jours ?
    Donc, SOLDE_CUMULE étant un champ calculé , AMHA n'est pas à mettre dans la table, il serait préférable, si c'est ce qui est souhaité, utiliser une CTE pour obtenir le solde.

    ie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WITH SC AS (SELECT DATE_MOUV,SUM(recette - depense) SOLDEJOUR FROM TB_MOUVEMENTS GROUP BY DATE_MOUV)
    SELECT  M.DATE_MOUV,COALESCE(M.RECETTE,0) RECETTE,COALESCE(M.DEPENSE,0) DEPENSE,(COALESCE(M.RECETTE,0)-COALESCE(M.DEPENSE,0),SC.SOLDEJOUR
    FROM TB_MOUVEMENTS M JOIN SC ON SC.DATE_MOUV=M.DATE_MOUV
    Un autre truc m'inquiète
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      SELECT MAX(id_mouv), sum(solde_journee) from tb_mouvements
        group by solde_journee
        INTO id_m, :s;
    ce groupement n'est certainement pas bon, GROUP BY DATE_MOUV me semble plus juste et le MAX(id_mouv) ne semble ne pas servir
    et le UPDATE manque d'une clause WHERE
    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 émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Quelques eclaircissements

    1. Ce que je voudrais c'est avoir un solde après chaque transaction faite, c'est pourquoi j'avais pensé à mettre deux champs solde_journée qu'on pourrait changer par solde_transaction (plus explicite) et qui devrait à mon sens être un champs calculé (recette - dépense).
    2. mon problème est le suivant, à la demande de l'utilisateur je voudrais imprimé un hostorique où l'on peut voir le mouvement, c'est pourquoi j'avais songé à mettre un champs sode_cumulé, je pensais que cela allait alleger le serveur puique le calcul se faisait à chaque transaction.



    j'espère que j'ai été clair.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    Une colonne calculée telle que le solde cumulé n'a rien à faire dans une table.
    Imaginez que le montant journalier des ventes d'une ligne remontant à il y a 3 ans soit erroné et qu'il faille donc le corriger, il faudra en ce cas modifier toutes les lignes postérieures à cette date pour en recalculer le solde ! C'est aberrant.
    Toute valeur calculée doit l'être au moment où on en a besoin, il ne faut jamais la stocker.
    Si le calcul est redondant, on peut le faire dans une vue ou une fonction pour se faciliter la tâche.

  9. #9
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Une colonne calculée telle que le solde cumulé n'a rien à faire dans une table.
    Imaginez que le montant journalier des ventes d'une ligne remontant à il y a 3 ans soit erroné et qu'il faille donc le corriger, il faudra en ce cas modifier toutes les lignes postérieures à cette date pour en recalculer le solde ! C'est aberrant.
    .
    j'imagine que ce que vous dites est juste mais je suis parti d'une supposition que les jounées une fois cloturées devraient être scellées.
    La demande d'un historique de quelques annnées va prendre beacoup de temps pour le calcul n'est ce pas ?
    il faut un compromis que je n'arrive pas à trouvé pour le moment.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Au point 1 : oui, Firebird permet des champs calculés (COMPUTED) mais uniquement sur la ligne et pas toujours nécessaire puisque
    SOLDE_JOURNEE COMPUTED BY (recette - depense) = RECETTE-DEPENSE AS SOLDE_JOURNEE et non pas ce qui semble être voulu

    ceci serait plus juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE VIEW MOUVEMENTS (ID_MOUV,DATE_MOUV,RECETTE,DEPENSE,SOLDE_JOURNEE)
    AS
    SELECT M.ID_MOUV,M.DATE_MOUV,M.RECETTE,M.DEPENSE,(SELECT SUM(RECETTE-DEPENSE) FROM TB_MOUVEMENTS T WHERE T.DATE_MOUV=M.DATE_MOUV AND T.ID_MOUV< M.ID_MOUV) SOLDE_JOURNEE  FROM TB_MOUVEMENTS M 
    ORDER BY M.ID_MOUV;
    (bien que je n'aime pas trop les SELECTs au sein d'un SELECT) un SELECT sur MOUVEMENTS sera alors facile

    Au point 2 : imprimer un historique n'implique pas forcément des ajouts de champ ! le plus souvent le générateur d'état (Rave,Quickreport, FastReport) permet le plus souvent ce genre de chose. Et

    sinon une simple UNION comme celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DATE_MOUV,0 AS ID_MOUV,0 AS IDREC,SUM(RECETTE),SUM(DEPENSE),SUM(RECETTE-DEPENSE) FROM TB_MOUVEMENTS GROUP BY DATE_MOUV -- Total journee
    UNION 
    SELECT DATE_MOUV,ID_MOUV,1,RECETTE,DEPENSE,RECETTE-DEPENSE FROM TB_MOUVEMENTS  -- mouvement du jour en ordre
    permets d'avoir les totaux de la journée avant le détail

    Une CTE Récursive me semble aussi être une autre solution

    NB. Je suis étonné de voir RECETTE et DEPENSE dans une même ligne
    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

  11. #11
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    NB. Je suis étonné de voir RECETTE et DEPENSE dans une même ligne
    Quelle est ta suggestion si possible ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Généralement un mouvement est en entrée ou en sortie (credit ou débit, + ou - etc..) une colonne qui indique le type et un montant suffisent
    donc une structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE TB_MOUVEMENTS (
        ID_MOUV        INTEGER NOT NULL,
        DATE_MOUV    DATE,
        SENS             CHAR(1) NOT NULL, 
        MONTANT       DOUBLE PRECISION,
     
       CONSTRAINT PK_MOUVEMENT PRIMARY KEY ID_MOUV
    Voir ce dépot Gestion des comptes Personnels
    où il y a un bdd contenant une table de ce genre
    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

  13. #13
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Généralement un mouvement est en entrée ou en sortie (credit ou débit, + ou - etc..) une colonne qui indique le type et un montant suffisent
    Exactement, suite à tes orientations j'ai déjà fait les changements et voilà ma nouvelle structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    CREATE GENERATOR GEN_TB_MOUVEMENTS_ID;
     
    CREATE TABLE TB_MOUVEMENTS (
        ID_MOUV    INTEGER NOT NULL,
        DATE_MOUV  TIMESTAMP NOT NULL,
        NATURE_OP  VARCHAR(1),
        MONTANT    DOUBLE PRECISION
    );
     
     
    ALTER TABLE TB_MOUVEMENTS ADD CHECK (nature_op in ('D', 'R'));
    ALTER TABLE TB_MOUVEMENTS ADD CONSTRAINT PK_TB_MOUVEMENTS PRIMARY KEY (ID_MOUV);
     
    SET TERM ^ ;
     
    /* Trigger: TB_MOUVEMENTS_BI */
    CREATE OR ALTER TRIGGER TB_MOUVEMENTS_BI FOR TB_MOUVEMENTS
    ACTIVE BEFORE INSERT POSITION 0
    as
    begin
      if (new.id_mouv is null) then
        new.id_mouv = gen_id(gen_tb_mouvements_id,1);
    end
    ^
    SET TERM ; ^
    là je reviens à ma 1ère question, comment puis-je avoir le solde des opérations entre deux dates p.e ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    De la même façon qu'indiqué #10 en adaptant bien sûr le calcul en fonction de la colonne NATURE_OP
    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

  15. #15
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    De la même façon qu'indiqué #10 en adaptant bien sûr le calcul en fonction de la colonne NATURE_OP
    c'est ce que j'essai de faire mais l'adaptation m'est difficile.

    Voici un jeu de données :

    ID_MOUV DATE_MOUV NATURE_OP MONTANT
    13 21/08/2023 14:25:13 R 400
    14 21/08/2023 14:26:17 D 150
    15 21/08/2023 14:26:35 D 800
    16 21/08/2023 14:26:45 R 550
    17 21/08/2023 15:09:38 D 180
    18 21/08/2023 15:09:55 R 360

    A partir de ce jeu, je voudrais avoir un historique tel que celui-ci :

    ID_MOUV DATE_MOUV NATURE_OP MONTANT SOLDE
    13 21/08/2023 14:25:13 R 400 +400
    14 21/08/2023 14:26:17 D -150 +250
    15 21/08/2023 14:26:35 D -800 -550
    16 21/08/2023 14:26:45 R 550 0
    17 21/08/2023 15:09:38 D -180 -180
    18 21/08/2023 15:09:55 R 360 +180

    des idées ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Déjà, les colonnes sont changées puisque maintenant DATE_MOUV est devenu un TimeStamp => Plus difficile de faire un groupement par journée il va falloir utiliser un CAST

    Pour le signe et la tranche de date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ID_MOUV, DATE_MOUV, NATURE_OP,IIF(NATURE_OP='R',MONTANT,MONTANT*-1) MONTANT FROM TB_MOUVEMENTS
    WHERE CAST(DATE_MOUV AS DATE) BETWEEN :DEBUT AND :FIN

    Mais je le répète, c'est au générateur d'état de faire le calcul du solde.

    comment puis-je avoir le solde des opérations entre deux dates p.e ?
    Quel est le solde initial ? ce n'est pas pris en compte dans la demande

    c'est ce que j'essai de faire mais l'adaptation m'est difficile.
    mais je ne vois aucun essai, est-ce à dire qu'il faut que je fasse tout le boulot ? Déjà que je change votre structure gratuitement

    Enfin, si c'est bien de fournir un jeu d'essai et le résultat attendu, vous voudriez que je fasse la saisie alors que vous auriez pu me fournir un script (je bosse moi) !
    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

  17. #17
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Déjà que je change votre structure gratuitement
    Je ne vais répondre qu'à ceci, oui effectivement j'ai vu que vous avez changer la structure mais s'était une pure coincidence car je l'avais déjà fait hier.
    Par contre, je croyais que s'était un site d'entraide !
    Pour le mot "j'avais fait des essais voulait tout simplement dire que j'ai fais des requêtes sans arriver au résultat escompté donc pas la peine de noyer la discussion avec des codes inutiles.

    Je finirais par vous dire grand merci et un autre merci pour ne pas répondre à mes posts puisque votre esprit est allé loin très loin dans la réflexion de la gratuité.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  18. #18
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Just-Soft Voir le message
    s'était une pure coincidence car je l'avais déjà fait hier.
    À d'autres, c'est moi qui vous l'ai suggéré à 12:21


    Je finirais par vous dire grand merci et un autre merci pour ne pas répondre à mes posts puisque votre esprit est allé loin très loin dans la réflexion de la gratuité.
    C'est noté, si vous n'êtes pas capable de comprendre qu'une phrase comme
    c'est ce que j'essai de faire mais l'adaptation m'est difficile.
    sans indiquer où vous en êtes dans vos essais fait ressembler à une impression de "faites le job à ma place" qui pousse à voir rouge
    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

  19. #19
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    "faites le job à ma place" qui pousse à voir rouge
    J'ai dis merci mais je crois que vous poussez le bouchon un peu même trop loin Monsieur.
    Poser vos armes on est des adultes et ce n'est pas parceque vous êtes modérateur que vous méprisez les gens.
    Alors prière d'être aimable et gentil car vous ne faites pas le job pour moi, une requête n'est pas un job.
    Je vous prie d'arrêter ça et merci encore pour votre aide.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  20. #20
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Je suis têtu.
    voilà ce que j'aurais voulu comme jeu d'essai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO TB_MOUVEMENTS (ID_MOUV, DATE_MOUV, NATURE_OP, MONTANT, SOLDE) VALUES ('13', '20.08.2023, 14:25:13.000', 'R', '400', '400');
    INSERT INTO TB_MOUVEMENTS (ID_MOUV, DATE_MOUV, NATURE_OP, MONTANT, SOLDE) VALUES ('14', '21.08.2023, 14:26:17.000', 'D', '-150', '250');
    INSERT INTO TB_MOUVEMENTS (ID_MOUV, DATE_MOUV, NATURE_OP, MONTANT, SOLDE) VALUES ('15', '21.08.2023, 14:26:35.000', 'D', '-800', '-550');
    INSERT INTO TB_MOUVEMENTS (ID_MOUV, DATE_MOUV, NATURE_OP, MONTANT, SOLDE) VALUES ('16', '21.08.2023, 14:26:45.000', 'R', '550', '0');
    INSERT INTO TB_MOUVEMENTS (ID_MOUV, DATE_MOUV, NATURE_OP, MONTANT, SOLDE) VALUES ('17', '21.08.2023, 15:09:38.000', 'D', '-180', '-180');
    INSERT INTO TB_MOUVEMENTS (ID_MOUV, DATE_MOUV, NATURE_OP, MONTANT, SOLDE) VALUES ('18', '21.08.2023, 15:09:55.000', 'R', '360', '180');
    et Je prouve que c'est possible avec une Version FB3 et plus
    Nom : Capture.PNG
Affichages : 55
Taille : 10,1 Ko
    la piste : les fonctions de fenêtrage

    Avec des excuses de votre part, vous aurez même droit au SQL
    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

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Erreur dans le déclencheur on-check-delete-master
    Par rvfranck dans le forum Oracle
    Réponses: 4
    Dernier message: 19/11/2004, 10h53
  2. déclencheurs qui ne se lancent pas - pb messages
    Par marie253 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 31/08/2004, 15h19
  3. déclencheur et message d'erreur
    Par marie253 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/08/2004, 16h00
  4. Comment mettre à jour une ligne sans doublon via déclencheur
    Par fuelcontact dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/08/2004, 15h56
  5. déclencheur/trigger
    Par seb92 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/07/2004, 17h12

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