none
Ou est ce que il faut placer la "logique metier"? RRS feed

  • Question

  • Bonjour,
    je veut concevoir une application VB.Net/MySQL pour la gestion de stock.
    Sur la base j'ai deux tables
    Stock(Ref,Quantité))
    Mouvement(Ref,Date, Quantité, entré/sortie)
    A chaque fois j'ai une entrée ou une sortie de stock j'insère la ligne correspondante dans la table mouvement . Les quantités dans la tables Stock doivent se mettre a jour conformément aux lignes ajoutés.

    J'ai deux choix (a ma connaissance) pour concevoir cette application:
    1- Créer un trigger sur la table Mouvement qui met a jour les quantité de la table Stock
    2- Gérer le problème avec des fonctions locales (dans l'application .Net)

    Un deuxième besoin c'est de déterminer est ce que le stock est "suffisant" ou non.
    Je dois avoir un fonction qui a comme entrée une liste des éléments (Ref,Qty)
    et qui renvoie une valeur booléenne pour dire est ce que le stock est suffisant ou non.
    Toujours le même soucis: ou mettre la fonction
    1- Une fonction dans la base de donnée en PL/SQL
    2- Une fonction locale en .Net qui charge la table stock entière et effectue la vérification.

    Merci d'avance pour vos conseils
    dimanche 18 septembre 2011 23:08

Réponses

  • Bonjour,

    Pour palier au problème des accès concurrents portentiel entre t1 et t3, vous devez :

    1/Lorsque vous récupérer la quantité disponible la stocker dans l'application (par exemple 10)
    2/Lorsque vous allez mettre à jour les quantités disponible, vous devez executer la requête suivante :

    UPDATE Table SET Quantité = <NouvelleQuantité> WHERE Id = <Id de la ligne à modifier> AND Quantité = <AncienneQuantité>
    

    L'instruction UPDATE va vous retourner le nombre de ligne modifiée, si ce nombre est à égale à :

    • 1 => Tout est OK
    • 0 => La quantité a été modifié par quelqu'un d'autre

    Est-ce que cela répond à votre problème ?

    Pour information : Un SGBD coute cher ! Rentabilisez le en le laissant se charger de vérouiller les lignes/tables nécessaire... Ne gérer jamais vous même le verrouillage des lignes !!

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    mercredi 21 septembre 2011 20:33
    Modérateur
  • Bonjour,

    Pourquoi faire n aller-retours ? Il suffit de faire une requête qui récupère tous les articles dont vous avez besoin.

    Normalement depuis 15 ans on n'utilise plus la stratégie "j'empêche les autres de modifier la table". Cela est trop compliqué à gérer et destiné à des technologies de l'avant guerre comme COBOL ou Windev. De plus cela vous évitera de redémarrer le SGBD toutes les heures parcequ'un un utilisateur a bloqué une ligne en allant au toillettes, à la pause déjeuner ou à la photocopieuse...

    Vous devez :

    • Récupérer toutes les quantités dont vous avez besoin en une seule requête (Un SGBD c'est un gros logiciel qui coute cher, pensez à le rentabiliser en lui posant la question : "Donne moi toutes les quantités disponibles des produits suivants...", il est conçu pour çà).
    • Vous demander à l'utilisateur si tout est OK
    • Si oui, vous mettez à jour toutes les quantités dans le stock (dans une transaction bien évidemment). Si vous détectez qu'une quantité a été modifié entre temps, vous annulez la transaction, récupérez à nouveau les nouvelles quantités, et vous demandez à nouveau à l'utilisateur de confirmer ces nouvelles quantités... Et ainsi de suite...

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    • Marqué comme réponse AmineTn jeudi 22 septembre 2011 20:47
    jeudi 22 septembre 2011 20:38
    Modérateur

Toutes les réponses

  • Bonjour,

    Le choix entre trigger/procédure stockée et code .NET dépend de :

    • Etre indépendant de la base de données (préférez tout en .NET)
    • Problème de performance (préférez un trigger)

    Au début des développements "standard", je demande toujours à mes développeurs de faire tout en .NET (au niveau maintenance et évolution c'est beaucoup plus facile). Après, en cas de problème de performance, je traite au cas par cas et je n'hésite pas à convertir une bout de code .NET en procédure stockée/trigger.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    lundi 19 septembre 2011 09:40
    Modérateur
  • Bonjour,

    Merci pour la réponse, mon majeur probleme c'est le temps d'allé retour de requetes non pas de point de vue performance mais 

    Si par exemple un client veut lancer une commande , la panier est composé d'une liste de (Reference, Quantité), l'operation se deroule comme suit:

    1. Lancement de commande
    2. Verification de la disponibilité des articles en quantités suffisantes
    3. Mise a jour de la table (mise ajour des quantités restantes))

    Le probleme apparait lorque un client verifie la disponibilité et avant que la mise a jour des tables soit effectué le contenu de la table est mis a jour ce qui pourra rendre la disponibilité plus vraie. Ce probleme apparait surtout dans le cas ou la logique metier est au niveau client. parce que l'instant t1 et t3 sont séparé par le temps d'allé retour de requetes. et étant donné que la base de donnée est hebergé sur internet cet inetrvalle peut etre assez important ce qui rendra le probleme assez fréquent.

    Ceci est shématisé dans ce diagramme de séquence.

     

    Pourtant dans ce cas l'intervalle t2-t1 est relativement court en plus on peut verrouiller le lignes en question.
    Qu'en pensez vous?
    mardi 20 septembre 2011 14:29
  • Bonjour,

    Pour palier au problème des accès concurrents portentiel entre t1 et t3, vous devez :

    1/Lorsque vous récupérer la quantité disponible la stocker dans l'application (par exemple 10)
    2/Lorsque vous allez mettre à jour les quantités disponible, vous devez executer la requête suivante :

    UPDATE Table SET Quantité = <NouvelleQuantité> WHERE Id = <Id de la ligne à modifier> AND Quantité = <AncienneQuantité>
    

    L'instruction UPDATE va vous retourner le nombre de ligne modifiée, si ce nombre est à égale à :

    • 1 => Tout est OK
    • 0 => La quantité a été modifié par quelqu'un d'autre

    Est-ce que cela répond à votre problème ?

    Pour information : Un SGBD coute cher ! Rentabilisez le en le laissant se charger de vérouiller les lignes/tables nécessaire... Ne gérer jamais vous même le verrouillage des lignes !!

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    mercredi 21 septembre 2011 20:33
    Modérateur
  • Merci pour

    la réponse.

    Pour palier au problème des accès concurrents portentiel entre t1 et t3, vous devez :

    1/Lorsque vous récupérer la quantité disponible la stocker dans l'application (par exemple 10)
    2/Lorsque vous allez mettre à jour les quantités disponible, vous devez executer la requête suivante :

    UPDATE Table SET Quantité = <NouvelleQuantité> WHERE Id = <Id de la ligne à modifier> AND Quantité = <AncienneQuantité>
    
    L'instruction UPDATE va vous retourner le nombre de ligne modifiée, si ce nombre est à égale à :
    • 1 => Tout est OK
    • 0 => La quantité a été modifié par quelqu'un d'autre

    Est-ce que cela répond à votre problème ?

    Ca m'inspire déja l'idée mais elle resout pas le probleme : par exemple dans le cas ou la je doit le panier contient 2 elements et que entre la verification et la mise à jour des quantités une valeur de quantité a été modifé , le permier element vas etre affecté par la requete update. Moi je veut que la reponse soit en tout ou rien (transaction).

    Pour information : Un SGBD coute cher ! Rentabilisez le en le laissant se charger de vérouiller les lignes/tables nécessaire... Ne gérer jamais vous même le verrouillage des lignes !!

    J'utilise MySQL comme SGBD, est ce qu'il peut gerer le verrouillage tout seul?
    mercredi 21 septembre 2011 21:31
  • Bonjour,

    Dans ce cas, il suffit de créer une transaction côté C#... Et si la commande UPDATE vous retourne 0 (donc la quantité a été modifié), vous pouvez annuler la transaction.

    MySQL n'est pas SGBD. C'est un truc gratuit qui permet de faire mumuse avec du SQL et qui n'est pas destiné à des applications professionnelle. Cette article vous expliquera en détail pourquoi : http://blog.developpez.com/sqlpro/p9136/langage-sql-norme/mysql-un-sgbdr-poudre-aux-yeux/

    Préférez SQL Server, Oracle, PostGrestSql, DB2, bref tout logiciel qui se dit SGBD. Pour information, SQL Server existe en une édition gratuite.

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    mercredi 21 septembre 2011 21:39
    Modérateur
  • Bonjour et merci encore.

    Je vois mieux le probleme maintenant.

    Encore deux détails:

    1. En créant une transaction du coté du C# est ce que le sgbd ( je vais passer à SQL Server) gere lui meme le verrouillage?
    2. Le temp qui sépare l'accés le debut de transaction et sa validation peut aller à quelques secondes (le serveur est distant et il y a un allé retour-voir image jointe case1 en haut) entre temps je suppose que ces lignes sont verrouillés et donc impossible d'effectuer des operations sur les données en questions, je vois que c un peu contraignant. c'est pour ça que je pense que je vais mettre certains procedures dans serveur pour reduire le temps d'indisponibilité des données. Qu'en pensez vous?

     

     

    jeudi 22 septembre 2011 08:04
  • Bonjour,

    1. Oui...

    Une chose que je n'arrive pas à comprendre c'est que vous devez :

    • Récupérer la disponibilité d'une quantité en stock
    • L'afficher au client
    • Après acceptation, mettre à jour la quantité dans le stock

    Je ne vois donc pas l'utilité (dans un premier temps) la création d'une procédure stockée. Deplus il est fortement déconseillé de faire une transaction entre l'étape 1 et 3 (l'utilisateur peut très bien aller aux toilettes durant l'étape 2...).

    Pouvez-vous me corriger si je me trompe dans votre scénario fonctionnel...

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    jeudi 22 septembre 2011 19:22
    Modérateur
  • Une chose que je n'arrive pas à comprendre c'est que vous devez :
    • Récupérer la disponibilité d'une quantité en stock
    • L'afficher au client
    • Après acceptation, mettre à jour la quantité dans le stock

    Bonsoir

    Pas tout a fait , c'est plutot:

    • L'utilisateur lance la commande
    • Connexion et chargement des valeurs de quantités (ca fait déja n allés retours à la base de donnée, avec n le nombre d'articles dans la commande)
    • Comparaison en local avec les valeurs demandés 
    • Mise a jour des valeurs ( un deuxieme groupe d'allés retours)

    Tout cela doit se faire en un seule transaction et donc garder les données en question indisponibles pour une durée considerable.

    Il se peut que je vois pas correctement les chose, par ce que c'est la premiere fois que je travaille avec des choses pareilles

    Cordialement

    jeudi 22 septembre 2011 20:24
  • Bonjour,

    Pourquoi faire n aller-retours ? Il suffit de faire une requête qui récupère tous les articles dont vous avez besoin.

    Normalement depuis 15 ans on n'utilise plus la stratégie "j'empêche les autres de modifier la table". Cela est trop compliqué à gérer et destiné à des technologies de l'avant guerre comme COBOL ou Windev. De plus cela vous évitera de redémarrer le SGBD toutes les heures parcequ'un un utilisateur a bloqué une ligne en allant au toillettes, à la pause déjeuner ou à la photocopieuse...

    Vous devez :

    • Récupérer toutes les quantités dont vous avez besoin en une seule requête (Un SGBD c'est un gros logiciel qui coute cher, pensez à le rentabiliser en lui posant la question : "Donne moi toutes les quantités disponibles des produits suivants...", il est conçu pour çà).
    • Vous demander à l'utilisateur si tout est OK
    • Si oui, vous mettez à jour toutes les quantités dans le stock (dans une transaction bien évidemment). Si vous détectez qu'une quantité a été modifié entre temps, vous annulez la transaction, récupérez à nouveau les nouvelles quantités, et vous demandez à nouveau à l'utilisateur de confirmer ces nouvelles quantités... Et ainsi de suite...

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte .NET/Consultant/Formateur chez Winwise
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5
    • Marqué comme réponse AmineTn jeudi 22 septembre 2011 20:47
    jeudi 22 septembre 2011 20:38
    Modérateur
  • Pourquoi faire n aller-retours ? Il suffit de faire une requête qui récupère tous les articles dont vous avez besoin.


    Oui vous avez raison, parfois je dis du n'importe quoi...

    Merci bien pour les indications

    Je vois mieu les choses maintenant.

    jeudi 22 septembre 2011 20:47
  • Pour ceux qui font la meme confusion je recommande http://msdn.microsoft.com/fr-fr/library/aa0416cz.aspx
    vendredi 23 septembre 2011 11:43