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

Développement SQL Server Discussion :

Requête SQL Balance Agée SAGE 100C


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé
    Profil pro
    maçon
    Inscrit en
    Novembre 2004
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : maçon

    Informations forums :
    Inscription : Novembre 2004
    Messages : 292
    Par défaut Requête SQL Balance Agée SAGE 100C
    Bonjour ,
    Je cherche à faire une requête pour extraire la balance agée du logiciel Sage100C V10.
    Nous utilisons MSSQL Serveur sur un serveur Windows 2022 :
    Voici la requête que j'ai faite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select fe.CT_Num ,
    SUM(CASE WHEN DATEDIFF(DAY, fe.EC_Echeance, GETDATE()) <=0 THEN fe.EC_Montant ELSE 0 END) AS 'NonEchu',
    SUM(CASE WHEN DATEDIFF(DAY, fe.EC_Echeance, GETDATE()) BETWEEN 1 AND 30 THEN fe.EC_Montant ELSE 0 END) AS Ech30,
    SUM(CASE WHEN DATEDIFF(DAY, fe.EC_Echeance, GETDATE()) BETWEEN 31 AND 45 THEN fe.EC_Montant ELSE 0 END) AS Ech45,
    SUM(CASE WHEN DATEDIFF(DAY, fe.EC_Echeance, GETDATE()) BETWEEN 46 AND 60 THEN fe.EC_Montant ELSE 0 END) AS Ech60,
    SUM(CASE WHEN DATEDIFF(DAY, fe.EC_Echeance, GETDATE()) > 60 THEN fe.EC_Montant ELSE 0 END) AS Echsup60
    from F_ECRITUREC fe 
    where fe.JM_Date between '20250101' and '20251030'
    and fe.cg_num like '411%'
    and fe.EC_Sens = 0
    and fe.EC_StatusRegle = 0
    group by fe.CT_Num
    Où :

    fe.ec_ECHEANCE est la date d'échéance
    fe.CT_NUM = n° du tiers client
    fe.cg_num = Compte comptable
    fe.EC_Montant = Montant de l'écriture
    F_ECRITUREC =Table des ecritures

    Toutefois lorsque je sors l'état d'impression "Balance agée" du logiciel , les valeurs sont différentes .
    Est ce que quelqu'un connaissant le logiciel pourrait m'aiguiller et me dire où est mon erreur .
    D'avance merci

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    981
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 981
    Par défaut
    Bonjour,

    L'outil "SQL profiler" permet de "sniffer" les ordres SQL entrants.
    Il suffit de paramétrer une trace (bien filtrer pour ne pas en récupérer trop) et de lancer la capture le temps de l'action ciblée.
    Ensuite vient le temps de la lecture du résultat.

    Faire une "bonne" trace n'est pas si simple ; attendez vous à en avoir trop ou pas ce qui est cherché ou pas assez.
    Prévoyez de faire plusieurs tentatives - le mieux étant de le faire en période de faible activité.
    Le savoir est une nourriture qui exige des efforts.

  3. #3
    Membre chevronné
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Janvier 2007
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 231
    Par défaut
    Bonjour,

    juste comme ça, il ne manquerait pas le 31/10 par hasard ?

  4. #4
    Membre éclairé
    Profil pro
    maçon
    Inscrit en
    Novembre 2004
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : maçon

    Informations forums :
    Inscription : Novembre 2004
    Messages : 292
    Par défaut
    Bonjour,
    Merci Michel Priori pour votre excellente idée.
    J'ai mis une trace et j'ai pu récupérer la procédure qui génère la balance agée SAGE

  5. #5
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    981
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 981
    Par défaut
    Citation Envoyé par olaxius Voir le message
    Bonjour,
    Merci Michel Priori pour votre excellente idée.
    J'ai mis une trace et j'ai pu récupérer la procédure qui génère la balance agée SAGE
    Ok,
    Mais, du coup, en quoi la requête "maison" était elle erronée ?
    Le savoir est une nourriture qui exige des efforts.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 673
    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 673
    Billets dans le blog
    10
    Par défaut
    Cette restriction m'interpelle :

    where fe.JM_Date between '20250101' and '20251030'
    Est-ce que le logiciel SAGE stocke les dates dans des colonnes de type (var)char ?

  7. #7
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    981
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 981
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Cette restriction m'interpelle :

    where fe.JM_Date between '20250101' and '20251030'
    Est-ce que le logiciel SAGE stocke les dates dans des colonnes de type (var)char ?

    Non
    La conversion d'un texte vers date est implicite ; il suffit que le texte suive le format 'yyyymmdd hh:mm:ss.mmm' (format ISO) pour ne pas avoir de problème d'interprétation.
    Sinon, effectivement il faut passer par la fonction CONVERT pour faire la transcription d'un littéral en date.
    voir ici : https://learn.microsoft.com/fr-fr/sq...l-server-ver17
    Le savoir est une nourriture qui exige des efforts.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 673
    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 673
    Billets dans le blog
    10
    Par défaut
    Certes, mais en ce cas :
    • les dates ne sont pas fiabilisées par le SGBD, on peut donc trouver des valeurs aberrantes si l'application a des failles, ce qui n'arrive jamais avec des colonnes de type date ;
    • si la conversion est opérée dans une restriction ou une jointure de la table accédée, les index ne sont pas éligibles, tant pis pour les performances ;
    • l'espace de stockage est pénalisé, en interne, un type date ne nécessite que 3 octets, contrairement à un type (var)char.

  9. #9
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    981
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 981
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Certes, mais en ce cas :
    • les dates ne sont pas fiabilisées par le SGBD, on peut donc trouver des valeurs aberrantes si l'application a des failles, ce qui n'arrive jamais avec des colonnes de type date ;
      [...]
    • l'espace de stockage est pénalisé, en interne, un type date ne nécessite que 3 octets, contrairement à un type (var)char.

    Je ne comprend pas.
    L'écriture de la clause Where ne présuppose pas du type de la colonne.

    En supposant que la colonne fe.JM_Date soit du type DATE (ou DATETIME ou ...), comment aurais tu écrit la clause where ?

    Citation Envoyé par escartefigue Voir le message
    • si la conversion est opérée dans une restriction ou une jointure de la table accédée, les index ne sont pas éligibles, tant pis pour les performances ;
    Tu es sûr de ton coup sous SQL server ?
    Le savoir est une nourriture qui exige des efforts.

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 673
    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 673
    Billets dans le blog
    10
    Par défaut
    Ce que je veux dire c'est que si la colonne n'est pas une date, alors le transtypage, qu'il soit explicite ou implicite, provoque les effets que j'ai cités.

    Si quelqu'un à une instance SQL server sous la main, il pourra vérifier la différence en matière de chemin d'accès entre :

    where cast(ma_colonne en date)=valeur et where (ma_colonne)=cast(valeur en date)
    Avec un index sur ma_colonne indexée

    La première syntaxe n'est pas sargable (index non éligible), la deuxième l'est

  11. #11
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    981
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 981
    Par défaut
    Re,

    Nom : Capture d’écran du 2025-11-06 09-24-41.png
Affichages : 44
Taille : 24,9 Ko

    Nom : Capture d’écran du 2025-11-06 09-26-02.png
Affichages : 42
Taille : 12,3 Ko
    Le savoir est une nourriture qui exige des efforts.

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 673
    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 673
    Billets dans le blog
    10
    Par défaut
    Du coup la conversion implicite ne provoque pas le phénomène serait-ce un apport d'une version récente de SQL serer ?
    Saurais tu refaire la même requête avec une conversion explicite type where cast(ma_colonne en date)=valeur je pense que là il n'y aura pas de miracle.

  13. #13
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    981
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 981
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Saurais tu refaire la même requête avec une conversion explicite type where cast(ma_colonne en date)=valeur je pense que là il n'y aura pas de miracle.
    \o/ et le miracle fut !
    Nom : Capture d’écran du 2025-11-07 08-12-15.png
Affichages : 24
Taille : 18,9 Ko


    Ce qu'on apprend dans le plan d'exécution :

    Le littéral est automatiquement considéré comme une variable :
    Nom : Capture d’écran du 2025-11-07 08-15-18.png
Affichages : 23
Taille : 7,2 Ko


    et que l'instruction CAST est traduite en CONVERT
    Nom : Capture d’écran du 2025-11-07 08-23-34.png
Affichages : 23
Taille : 48,3 Ko
    Images attachées Images attachées  
    Le savoir est une nourriture qui exige des efforts.

  14. #14
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 673
    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 673
    Billets dans le blog
    10
    Par défaut
    Ce n'est pas du tout la même chose, dans la première requête on avait un index seek c'est à dire l'utilisation de la recherche par index, alors que là on a un index scan, c'est à dire un parcours séquentiel de l'index.
    Pas de miracle donc

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/10/2023, 13h46
  2. Requête SQL Balance Comptable SAGE i7 Ligne 1000
    Par MSMILEO dans le forum Langage SQL
    Réponses: 1
    Dernier message: 16/06/2022, 09h42
  3. Balance agée Sage
    Par ndmims dans le forum Développement
    Réponses: 1
    Dernier message: 13/08/2020, 19h30
  4. Réponses: 4
    Dernier message: 11/06/2009, 17h03
  5. Requte Sql Avancée, question ... ? Estce possible ?
    Par plex dans le forum Administration
    Réponses: 8
    Dernier message: 14/12/2005, 16h13

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