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 :

SAGE Comptabilité - calculer le prochain numéro de pièce


Sujet :

Développement SQL Server

  1. #1
    Invité
    Invité(e)
    Par défaut SAGE Comptabilité - calculer le prochain numéro de pièce
    Bonjour,

    J'utilise le produit Sage Comptabilité version 16.05 pour MS SQL Server, je dois générer des écritures comptables pour régler des factures fournisseurs, je rencontre un problème pour calculer le prochain numéro de pièce, qui ne respecte pas la logique dans l'ERP.

    J'ai essayé cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select isnull(max(convert(int,ec_piece)),'0')
    from F_ECRITUREC
    where JO_NUM=%1 AND ISNUMERIC(ec_piece)=1
    où notre client nous affirme que la requête a remonté la valeur 587 et non 209

    Sur une autre base, j'ai essayé la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select isnull(max(convert(int,ec_piece)),'0')
    from F_ECRITUREC
    where JO_NUM=%1 AND ISNUMERIC(ec_piece)=1
    AND year(JM_DATE)=2016
    J'ai obtenu 3667 comme valeur retournée, en compta, j'ai obtenu 3734

    Auriez-vous une idée?

    Merci

    PS : je ne suis pas en ODBC, il ne sera pas vendu à notre client

  2. #2
    Membre très actif Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 333
    Par défaut
    Bonjour,
    ton problème n'est pas très clair.
    Déjà commence par poster tes scripts ddl pour la table concernées.
    c'est quoi ce JO_num = %1 ?
    ce que tu veux faire c'est récupérer l'identifiant suivant en respectant une logique de '+1' pour insérer l'enregistrement avec le bon identifiant?
    l'insertion se fait via l'applicatif si j'ai bien compris?
    Sage n'utilise pas les identity?
    Cordialement,

  3. #3
    Invité
    Invité(e)
    Par défaut
    J'exécute mes requêtes depuis une application que je développe, depuis windev, je remplace les %1 par la valeur concernée.
    Le champ EC_PIECE est de type chaine, mais en pratique, il ne contient que des caractères numériques, et il n'est pas de type identity, contrairement au champ cbmarq (que l'on retrouve dans la plupart des tables SAGE).

    Dans mon cas, j'essaye de récupérer le plus grand numéro de pièce, puis dans l'application, j'incrémente la valeur pour avoir le nouveau numéro de pièce (je fais appel à la fonction ChaîneIncrémente dans windev).

    N'ayant pas de formation en comptabilité, je pense que c'est justement ce qui me manque pour comprendre la logique à adopter.

    Par "script ddl", tu parles de la structure de la table?

  4. #4
    Membre très actif Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 333
    Par défaut
    dans les règles de postage du forum, le 2ème post (de sql pro) explique comment générer les scripts ddl et jeu de données.
    si tu veux qu'on t'aide, il nous le faut.

    Cordialement,

  5. #5
    Invité
    Invité(e)
    Par défaut
    C'est un peu hors sujet, vu que c'est une table de la gamme SAGE, il existe même de la documentation en ligne pour comprendre l'ensemble des tables.
    Je n'ai pas trouvé pour la version 16.05 de SAGE mais pour la version 17, mais d'une version à une autre, la structure des tables ne change pas beaucoup (par ailleurs, les versions 16.XX vont être arrêtées l'année prochaine).

  6. #6
    Membre très actif Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 333
    Par défaut
    C'est un peu hors sujet, vu que c'est une table de la gamme SAGE
    absolument pas. la documentation sage ne me parle pas(en plus elle est imbuvable!), un create table oui.
    si en plus tu sais nous donner un set de données on va pouvoir tester tes requetes et au besoin les améliorer.
    Cordialement,

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    En plus de ce que vous demande Bernardos, il y a deux éléments dans votre requête qui vont vous conduire à des problèmes de performances :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AND ISNUMERIC(ec_piece)=1
    AND year(JM_DATE)=2016
    Dans tous les cas, l'application d'une fonction native sur une colonne d'une table implique au mieux que le moteur va lire l'ensemble d'un index non-cluster qui supporterait la requête, ou au pire de la table dans son intégralité. C'est que l'on pourrait appeler la cherchabilité d'un prédicat; on le retrouve dans la littérature sous l'acronyme SARG.

    En ce qui concerne ISNUMERIC, il s'agit en plus d'un défaut de modélisation, mais comme il s'agit de SAGE, on ne peut pas le modifier; peut-être est-il possible d'ajouter une colonne calculée ?
    En ce qui concerne JM_DATE, on peut remplacer YEAR() par le prédicat suivant : AND JM_DATE >= '20160101' AND JM_DATE < '20170101', l'idéal étant que les valeurs soient des variables pour la réutilisabilité du plan que la requête générera. Dans ce cas la colonne est "libre", d'un côté du prédicat, tandis que de l'autre on a une valeur : dans ce cas une recherche directe (par opposition à une lecture complète) peut être utilisée, délivrant de meilleures performances.

    @++

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/08/2010, 15h24
  2. Réponses: 1
    Dernier message: 05/08/2010, 13h04
  3. Calcul d'un numéro de semaine
    Par oliviergot dans le forum SQL
    Réponses: 4
    Dernier message: 22/04/2009, 14h15
  4. Faire des calculs sur le numéro de semaine ISO
    Par Fiona08 dans le forum SQL
    Réponses: 13
    Dernier message: 20/10/2008, 11h28
  5. calcul du prochain jour
    Par Melvine dans le forum Langage
    Réponses: 2
    Dernier message: 08/10/2007, 10h26

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