Conception de base de donnée

Conception de base de donnée - Divers - Programmation

Marsh Posté le 19-11-2018 à 09:52:52    

Bonjour à tous,
cela fait .... 15 ans que j'ai pas touché à de la base de données et j'aurais besoin de faire une petite base pas trop compliquée (je pense).
 
J'ai un stock de consommable moins de 100 ref (cartouches imprimantes, kit de maintenance, papier, etc) que je commande chez plusieurs fournisseurs (suivant la référence).
Bien entendu certains fournisseurs peuvent me vendre plusieurs référence.
 
j'ai besoin de savoir en temps réel ce que j'ai en stock, de pouvoir faire un inventaire si besoin en comparant mon stock a la base et d'être alerter lorsque certaines ref arrivent sous un seuil définit par ref.
car certaines ref (papier a entête) mettent un certains temps avant d'être livré.
il faut que je puisse suivre sur plusieurs années les dates à laquelle je fais des sorties et des entrées.
 
A la fin quand elle sera finie avec cette base, je pourrais faire des stats de conso par service et surtout faire des bons de commande rapidement....
 
j'ai donc fait un dictionnaire des données et mon MCD (sans les relations et les cardinalités)....
 
mais voila truc déjà très con...
est ce que je pars bien sur mon MCD et un autre truc con.... je sais plus les différents types de données existants...
 
voici mon MCD actuel
https://imageshack.com/a/img921/2066/bQ7jxW.jpg
 
et mon dictionnaire des données
https://imageshack.com/a/img921/6665/y9gys6.png
 
si vous avez des remarques sur le MCD je prends
pour les types de données j'aurais besoin d'un petit rappel
(et sur le Web pas facile de trouver les bonnes informations.
 
Merci

Reply

Marsh Posté le 19-11-2018 à 09:52:52   

Reply

Marsh Posté le 19-11-2018 à 23:06:03    

Déjà, il manque les relations entre tes tables sur ton MCD. Ca n'aide donc pas pour savoir si t'as bien fait les liens entre les tables :/
 
A priori, une commande est composée de plusieurs produits commandés. Il te faut donc une autre table (genre Lignecommande) avec une relation 1-n avec la table Commandes.
Je ne connais pas le type "caractère long". C'est un VARCHAR ? Le nb entre ( ), ça représente quoi ? Le nb de caractères ? Si oui, 999, c'est un peu violent, non ?
 
Perso, pour mes clés primaires, je préfère prendre un entier auto-incrémenté. Plus facile à gérer en tant que clé étrangère dans d'autres tables. Ca peut prendre aussi moins de place. Pour le champ qui doit être unique (genre, une réf constructeur), tu peux définir le champ avec un index unique.
Edit : je t'invite à regarder la forme 3NF de Codd ;) Ca t'évitera de faire d'éventuelles boulettes dans la construction de ton MCD.


Message édité par rufo le 19-11-2018 à 23:07:03

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 20-11-2018 à 10:23:46    

Merci Rufo
Edit :  
je me remets sur cette base que jeudi mais
ok pour les clefs primaires, effectivement cela sera mieux un entier auto-incrémenté que les ref
ok pour le rajoute de la table "ligne de commande
 
je vais lire la 3NF de Codd (pour le moment je ne sais pas de quoi tu parles...)
et....
au fait oui... le 999 c'était le nombre de caractère.... j'ai mis un chiffre pour le moment ne sachant pas...
 
Merci


Message édité par aculy le 20-11-2018 à 18:21:40
Reply

Marsh Posté le 22-11-2018 à 11:59:10    

j'ai rajouter ma lignecommande, j'ai mis des relations...
mais je sais pas si cette base est viable...
 
https://www.cjoint.com/c/HKwk6cRyNHJ

Reply

Marsh Posté le 22-11-2018 à 17:43:09    

Je suis très étonné de trouver une relation entre la lignecommande et la conso :/
De même, je suis étonné de ne pas trouver de relation entre lignecommande et produitfournisseur.
 
Il faudrait aussi un mécanisme pour transformer ta commande en entrée stock. Il devrait y avoir une relation 1-n entre ta commande et les entrées histoire de pouvoir gérer des commandes livrées en plusieurs fois.
 
Edit : ton truc ressemble fortement voire carrément à de la GMAO. T'as regardé si des outils en licence libre de ce genre existaient ? Ca éviterait de réinventer la roue :o


Message édité par rufo le 22-11-2018 à 17:45:08

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 22-11-2018 à 17:45:18    

alors je t avoue entre le moment ou j'ai posté cela et maintenant....
j'ai tout cassé et recommencé
cela me prends la tete de faire une BDD... cela fait trop longtemps que je n'en ai pas fait
faut que je me remette dans le bain et vite....

Reply

Marsh Posté le 22-11-2018 à 23:17:43    

Concevoir une BD (correctement), c'est un métier (c'est comme tout tu me diras).
Si ça peut t'aider : https://www.appvizer.fr/magazine/op [...] o-gratuits


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 23-11-2018 à 17:32:21    

je crois que je suis bon sur les tables...
 
https://www.cjoint.com/c/HKxqGdh4wdg

Reply

Marsh Posté le 26-11-2018 à 17:01:38    

Bonjour,
ma base fonctionne bien et fait presque tout ce que je veux (pour le moment).
Je fais maintenant de la mise en page pour mes datas facile (je n'ai pas encore commencer la partie commande avec les quantités et prix liés aux tarifs).
 
Et la un nouveau souci... :
j'ai créé un état pour avoir ma liste de fournisseur, jusque là pas trop de difficulté cela m'affiche bien la liste de ma table fournisseur,  
mais quand je lui demande de rajouter pour chaque fournisseur le ou les contacts, cela ne m'affiche plus que les fournisseurs ayant un contact.
Par exemple si j'ai pas de contact dans la table contact pour un fournisseur rien ne s'affiche pour celui-ci (ex :pour Amazon j'ai pas une personne physique en contact).
 
je continue de chercher mais si quelqu'un à une idée je suis preneur.
 
MERCI

Reply

Marsh Posté le 26-11-2018 à 17:39:38    

C'est parce que ta requête est construite via un INNER JOIN (équi-jointure) alors que tu devrais faire un LEFT JOIN.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 26-11-2018 à 17:39:38   

Reply

Marsh Posté le 28-11-2018 à 14:01:09    

Merci Rufo cela fonctionne niquel (DSL j'avais pas eu le temps de vérifier)...
Maintenant autre soucis, j'ai fait un peu de VB sur mes formulaires, bien entendu je les ai tester au fur et à mesure.
Mais d'un coup impossible de relancer la console VB, dès que je fais appel à la console cela plante ma base.
Un truc simple ouverture, fermeture de formulaire avec aller au dernier enregistrement ou enregistrer, suivant si on va sur un form ou si on en part.
Sur un autre poste informatique cela fonctionne bien pourtant du coup cela doit venir de mon PC mais je ne sais pas ou chercher...
si quelqu'un a une idée....
car la première fois j'ai refait ma base complète en me disant que j'avais du faire une erreur.
et j'ai pas envie de tout refaire....
 
Pour info: je bosse sur ACCESS 2010 avec un PC sous Windows 10.
et l'autre test a été fait sur un PC sous Windows 7....

Reply

Marsh Posté le 28-11-2018 à 14:15:23    

je viens de tester d'ouvrir ACCESS en choisissant l'option
"Exécuter ce programme en mode de compatibilité pour Windows 7"
.....
toujours pareil
 
je sèche

Reply

Marsh Posté le 28-11-2018 à 14:27:40    

Tu peux toujours essayer avec un VM Win7 sur le PC qui est en W10.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-11-2018 à 14:30:52    

alors.... se serait effectivement une super solution si est seulement si...  je pouvais faire mumuse avec mon poste au bureau....
je suis un simple utilisateur ou je bosse et je n'ai pas a dispo de VM sous Win7.....
et j'avais pris mon Pc portable perso en me disant que si besoin je pouvais bosser dessus... mais j'ai pas access .... j'ai beaucoup pleuré.....

Reply

Marsh Posté le 28-11-2018 à 14:39:49    

je viens de trouver ceci
"C:\Program Files (x86)\Microsoft Office\Office14\MSACCESS.EXE" "chemin de mon fichier" /decompile
je peux rouvrir ma base et cela refonctionne....
on va voir avec le temps

Reply

Marsh Posté le 29-11-2018 à 09:49:23    

je suppose qu'il est possible lorsque je fais un enregistrement dans une table que cela additionne ou supprime dans une autre table...
j'ai une table stock et 2 tables pour les E/S de Stocks
quand je fais une E ou S j'aimerais que cela change la valeur dans ma table Stock...
 
je cherche sur le net mais je pense que je ne trouve pas la bonne expression à écrire car tout ce que je trouve ne correspond pas à me recherche...

Reply

Marsh Posté le 29-11-2018 à 09:56:29    

Ca s'appelle les triggers.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 29-11-2018 à 15:59:43    

je vais regarde ça Merci

Reply

Marsh Posté le 29-11-2018 à 16:38:32    

je comprends pas comment fonctionne les "trigger"
pourtant je suis aller voir  
https://grenier.self-access.com/acc [...] cess-2010/
et d'autres trucs mais je comprends pas comment faire...
 
j'ai trouvé ceci
http://www.info-3000.com/access/macrodonnee/index.php
 
mais cela ne fonctionner pas  
alors j'ai essayer en faisant un truc du genre
 

Code :
  1. Private Sub Qt_input_AfterUpdate()
  2. stock.Qt_conso_stock = Qt_conso_stock + Qt_input
  3. End Sub


 
je continue de chercher du coup...


Message édité par aculy le 29-11-2018 à 16:39:16
Reply

Marsh Posté le 29-11-2018 à 18:11:19    

C'est ce qu'il me semblait : Access ne gère pas les triggers au sens SQL du terme mais les émule via des macros. Y'a pas à dire, c'est vraiment de la merde ce truc. :/
J'ai laissé tomber Access depuis la fin de mon projet de fins d'étude d'école d'ingé (soit 16 ans !). Déjà à l'époque, cette bouse m'avait bien fait chier : c'était pour une appli web genre Wordpress avec BD et on nous avait imposé Access comme "SGBD" (la bonne idée  :sarcastic: ). Du coup, je vais pas pouvoir t'aider plus. Regarde les applis libres existantes peut-être. Parce que te lancer dans le dév d'une appli web avec un vrai SGBD, ça me paraît overkill pour ton besoin. :(


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 29-11-2018 à 18:15:42    

lol oui je pense aussi
je continue de creuser
j'ai vu un truc ou il disait de passer d'essayer de cacher la valeur dans le formulaire puis de les additionner et de les reinjecter....
pas tout compris mais je verrais si c'est possible....
 
après je me dis que je m'y prends peut être mal a vouloir passer par 3 tables Stock/input/output  
peut etre que tout dans une table serait une solution avec des - et de + et ensuite de tout additionner....
 
je vais réfléchir d'ici lundi prochain...
 
 

Reply

Marsh Posté le 29-11-2018 à 21:49:25    

Non, je pense que c'est ce qu'il faut faire : les entrées, les sorties et le stock courant. Sinon, pour connaître la quantité en stock courante, va falloir reprendre à chaque fois toutes les entrées/sorties et calculer. Au bout d'un moment, ça risque de ramer et avec une bouse comme Access, ça risque d'arriver assez vite :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 30-11-2018 à 08:43:49    

ok donc je continue sur mon idée
Merci en tout cas a toi

Reply

Marsh Posté le 03-12-2018 à 17:21:35    

Est il possible dans Acces de
- Cacher des boutons en passant d'un formulaire a une autre sous condition (j'aimerais avoir un formulaire ou un bouton apparaît suivant si il vient de formsX ou formsY)
- Récupérer une donnée dans un formulaire quand on passe dans un autre (sachant que pour le moment j'avais voulu que dans le 2eme formulaire ce soit une liste déroulante)
- Faut'il créer plusieurs formulaires si les 2 cas précédent ne sont pas possible.... (si oui... 5 formulaires de plus a créer).
Merci

Reply

Marsh Posté le 03-12-2018 à 17:28:37    

Je pense qu'avec les variables globales, tu dois pouvoir faire ça facilement. Après, je ne sais pas si c'est le mieux.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 03-12-2018 à 17:49:46    

ok mais j'ai testé çà
avec un msbgox pour me retourner la valeur que j'ai dans ma premiere zone
 

Code :
  1. Private Sub input_Click()
  2. Dim var_test As Integer
  3.    
  4.     DoCmd.RunCommand acCmdSaveRecord
  5.     Forms.Stock_KN.Ref_conso = var_test
  6.     MsgBox var_test
  7.     DoCmd.OpenForm "Input_Stock", acNormal, , , acFormAdd
  8.     DoCmd.Close acForm, "Stock_KN"
  9.    
  10. End Sub


mais cela me retourne un 0....


Message édité par aculy le 03-12-2018 à 17:50:51
Reply

Marsh Posté le 03-12-2018 à 18:18:01    

Ben oui, tu n'affectes aucune valeur à var_test. Ligne 5 c'est pas plutôt var_test=...?

Reply

Marsh Posté le 03-12-2018 à 18:18:45    

oh le boulet.....
au moins cela ressort la bonne valeur...
par contre cela ne la remets pas dans l'autre formulaire...
 

Code :
  1. Private Sub input_Click()
  2. Dim var_test As String
  3.    
  4.     DoCmd.RunCommand acCmdSaveRecord
  5.     var_test = Forms.Stock_KN.Ref_conso
  6.     MsgBox var_test
  7.     DoCmd.OpenForm "Input_Stock", acNormal, , , acFormAdd
  8.     Forms.Input_Stock.Ref_input = var_test
  9.     DoCmd.Close acForm, "Stock_KN"
  10.    
  11. End Sub


 
j'ai une valeur non valide pour ce champ...
vais aller controler mes tables...


Message édité par aculy le 03-12-2018 à 18:26:30
Reply

Marsh Posté le 03-12-2018 à 20:40:16    

Je pensais à des variables globales qu'on met dans les modules.
 
Sinon, autre solution : tu passes par une table avec 2 champs (nom de la variable et sa valeur) et tu fais des requêtes pour alimenter ou lire cette table. Ca simule des variables globales et c'est sans doute plus propre.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 04-12-2018 à 11:59:18    

du coup ce que j'ai fait fonctionne
j'en avais besoin dans 3 formulaires et niquel.....
maintenant je bloque sur le dernier gros sujet...
additionner et soustraire dans ma table stock
quand je fais des entrées et sorties....
 
c'est mon gros point noir
je continu de chercher
 
encore MERCI Rufo pour les pistes que tu me donnes à chaque fois.

Reply

Marsh Posté le 04-12-2018 à 13:58:06    

Si les macros qui émulent les triggers ne fonctionnent pas, tu peux toujours ajouter le code VBA sur l'événement qui permet d'enregistrer une entrée ou sortie de stock. J'imagine que c'est un bouton "valider". Du coup, une fois la requête de MAJ de ta table entrées sou sorties faite, tu rajoutes une autre requête pour mettre à jour ta table stocks.


Message édité par rufo le 04-12-2018 à 13:58:17

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 04-12-2018 à 14:02:19    

j'ai testé effectivement de créer une requête que j'appel ensuite dans mon code VBA... (avant d'aller déjeuner)
 

Code :
  1. Private Sub input_Click()
  2.     Dim LeSQL As String
  3.         LeSQL = "UPDATE Stock_KN INNER JOIN Input_Stock ON Stock_KN.Ref_conso = Input_Stock.Ref_Input SET Stock_KN.Qt_conso_stock = Stock_KN.Qt_conso_stock+Input_Stock.Qt_input;"
  4.        
  5.         DoCmd.RunSQL LeSQL
  6.         DoCmd.RunCommand acCmdSaveRecord
  7.         DoCmd.GoToRecord , , acNewRec
  8. End Sub


 
la requête se lance
j'ai le message mais rien n’apparaît dans ma table...
je dois la relire pour voir si j'ai pas oublié un truc

Reply

Marsh Posté le 04-12-2018 à 15:51:59    

Je parie que le autocommit de la BD ou table n'est pas à true.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 04-12-2018 à 16:07:25    

ok je verrais cela..

Reply

Marsh Posté le 05-12-2018 à 11:22:22    

je ne trouve pas comment activer le autocommit...

Reply

Marsh Posté le 05-12-2018 à 12:17:48    

https://codekabinett.com/rdumps.php [...] ransaction
Le use transaction devrait être à Non. S'il est à Oui, ça explique ton pb.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 06-12-2018 à 09:34:06    

Salut Rufo,
j'ai pas les memes infos dans mes propriétés....
je regarde si cela n a pas bougé entre les versions.

Reply

Marsh Posté le 06-12-2018 à 10:01:48    

du coup j'ai essayé de faire comme ce qu'il explique dans le lien...
en adaptant avec mon code

Code :
  1. DAO.DBEngine.BeginTrans
  2.     CurrentDb.Execute "UPDATE Stock_KN SET Stock_KN.Qt_conso_stock = Stock_KN.Qt_conso_stock+Input_Stock.Qt_input WHERE Stock_KN.Ref_conso = Input_Stock.Ref_Input"
  3.     DAO.DBEngine.CommitTrans


et j'ai une erreur 3061 trop peu de paramètre. 2 attendu.
 
je lui dis pourtant de bien updater la table
lui dit le changement a faire
et la ou faut le faire.....

Reply

Marsh Posté le 07-12-2018 à 20:20:32    

Je pense qu'il manque l'instruction pour indiquer le début de la transaction.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 10-12-2018 à 09:15:37    

D'apres l'aide de ACCESS/VBA
 

Code :
  1. DAO.DBEngine.BeginTrans


 --> c'est pour débuter la transaction
 

Code :
  1. CurrentDb.Execute "UPDATE Stock_KN SET Stock_KN.Qt_conso_stock = Stock_KN.Qt_conso_stock+Input_Stock.Qt_input WHERE Stock_KN.Ref_conso = Input_Stock.Ref_Input"


--> je lance mon code pour faire ce que je veux
 

Code :
  1. DAO.DBEngine.CommitTrans


--> je dis que c'est fini et qu'il faut écrire
 
mais j'ai trouvé ... enfin une partie.. j'arrive a écrire dans ma table
ok c'est pas au bon endroit et cela ne fait pas ce que je veux tout a fait...
 
La table était vide et en mettant simplement un 0 cela incrémente (pas les bons chiffres mais cela se modifie...)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed