Insertion clée composée

Fermé
ridasys21 Messages postés 11 Date d'inscription vendredi 30 avril 2010 Statut Membre Dernière intervention 17 juillet 2012 - Modifié par irongege le 1/06/2010 à 10:38
ridasys21 Messages postés 11 Date d'inscription vendredi 30 avril 2010 Statut Membre Dernière intervention 17 juillet 2012 - 2 juin 2010 à 19:51
Bonjour,

J'ai réalisé ma base de données avec succès et je trouve des problèmes au niveau des insertions surtout lorsqu'il sagit d'une clée composée.
Voila mon problème :

J'ai 3 tables : Article( idArt , libéllé_Art)
Commande( idCmd ,datCmd)
ComporterCmddArt(#idCmd,i#dArt,qté)

-Quand j'insère dans les 2tables Article et Commande ,j'arrive plus à récupérer leur id et par la suite je peux pas remplir la table ComporterCmddArt.

J'ai procédé de la manière suivante :
Après insertion d'une ligne dans la table Article je fais une seletion par libéllé_Art afin de récupérer idArt . De même pour la table commande(selection avec les autres atributs).
Commça je récupère idArt et idCmd mais cela me parait un peut lourd.

-Je veux savoir est ce qu'il y une solution optimisée pour résoudre ce problème ?



Je vous remercie de votre réponse.



A voir également:

8 réponses

Salut,

Idéalement, IdArt est le code article. Il est imprimé dans le catalogue, présent sur le site web, sur les tiroirs du rayonnage. C'est un élément manipulé par l'opérateur et c'est ce dernier qui le fourni au programme.

Au contraire, l'identifiant de la commande est souvent un numéro chrono (comme avec un carnet à souche). Donc ton programme calcule le n° de commande (qui servira dans idCmd) et le mémorise tant que l'opérateur n'en a pas fini avec la commande. Un fois que ta commande est enregistrée dans le système, tu pourras ultérieurement la retrouver par son n° client, sa date, un code article commandé mais surtout par son n° de commande : le jour où j'enverrai un email pour me plaindre de ce que tu ne m'as pas livré ma commande, ton réflexe va être de me demander le n° de ma commande... et si je te le fournis pas, tu pourras pas me renseigner rapidement...
0
ridasys21 Messages postés 11 Date d'inscription vendredi 30 avril 2010 Statut Membre Dernière intervention 17 juillet 2012 2
1 juin 2010 à 10:36
Bonjour,

Merci pour ces explications.
Je dévellope une application web qui fait le suivi du sycle d'approvisionnement .
Le idArt est de type varchar expemple : "12345.23456". Même le idCmd il est de type varchar.
A chaque fois je dois saisir une commande avec des articles, j'arrive plus à récuperer les valeurs des clé (idArt et idCmd) apres insertion dans les 2 table Commande et Article afin de les utiliser dans la table ComporterCmddArt.
0
Salut,

pourtant, l'idArt est fourni par un opérateur via un formulaire => il est mémorisable dans une variable.
et pour la commande, il y a bien un moment où tu crées l'entête de commandes avant de lui rajouter des items, cet idCmd devrait donc être facilement récupérable (en spécifiant son créateur par exemple) !
0
ridasys21 Messages postés 11 Date d'inscription vendredi 30 avril 2010 Statut Membre Dernière intervention 17 juillet 2012 2
2 juin 2010 à 11:51
Merci bien.

J'ai également un soucis lorsqu'il s'agit d'une clée étrangère.

Exemple: Article(idArt,idtype,libelle) Type(idtype,type)

-> idArt:on le saisit manuellement avec son libéllé
-> idtype: s'auto-incrémente, le type le saisit

idtype est une clée étrangère dans la table Article.

Pour remplir ces deux tables je procède la manière suivante:
Je remplis tout d'abord le type et je récupère idtype à l'aide: mysql_insert_ID(),
puis j'insère facilement dans la table Article.(idArt et idtype:connu).

-Est ce que cette méthode est optimisée ?
-Est ce qu'elle valable pour les une application web multi-utilisateur ?

Je vous serais reconnaissant car vous m'avez éclairsi pas mal de choses.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Salut

Vu qu'il n'existe pas 250 types d'articles différents, le nombre de lignes dans type est forcément restreint. De plus, il est un axe d'analyse de tes stocks, donc, chaque type devrait être connu par chaque utilisateur du logiciel. Et c'est un peu le même principe pour les familles de produits (la nomenclature la plus pointue est gérée par la douane et compte moins de 350 items).
Donc, ces axes ne sont pas à créer dynamiquement (à la volée) et doivent être disponibles avant la création de la ligne. Et comme ils sont disponibles, ils n'ont pas à être retrouvés avec mysql_insert_ID()

Si vraiment, tu veux faire économiser la mémorisation de la codification type article, famille produit, code tva etc aux opérateurs, le logiciel doit proposer des listes affichant les libellés

Ex: lors de la création de l'article, l'opérateur sélectionne le type "Consommable à date de péremption" et la famille "Phytosanitaire" dans les listes proposées (par le requetage sur la table type_article et sur la table famille_produit), la requête de création sera
insert into Article(idArt, idtype, libelle, famille)
select $idArticleSaisi, t.idtype, $txtDesignation, f.code_famille
from type_article t, famille_produit f
where t.libelle='Consommable à date de péremption'
and f.libelle='Phytosanitaire'

Les puristes objecteront qu'à la fin on a un produit cartésien... mais comme les tables entrant en jeu sont limitées (et les moteurs d'aujourd'hui performants), l'impact de cette horreur sera négligeable
0
ridasys21 Messages postés 11 Date d'inscription vendredi 30 avril 2010 Statut Membre Dernière intervention 17 juillet 2012 2
2 juin 2010 à 16:28
$idArtcleSaisi="A";
$txtDesignation="T";
Ce genre de requete (insert + select ), est ce qu'il concerne sql ?
J'ai assayé votre rêquete elle génère 2 erreurs:
"Unknown column 'Tet' in 'field list'"
"Unknown column 'T' in 'field list'"

->Le but de cette requete est de selectionner idtype et idfamille puis insérer le tout dans la table article. n'est ce pas ?

Merci.
0
Salut,

Je ne connais pas ta base ni ton application. Les manipulations que j'évoquais ainsi que la requête conséquente sont bien évidemment un exemple (c'était le but de Ex: en début du paragraphe)

Cette requête exemple a, comme tu l'as compris, pour but de récupérer des valeurs avec un SELECT et de s'en servir pour faire un INSERT.
Pour en simplifier l'écriture, j'ai utilisé des alias dans la clause FROM ce qui me permet de simplifier l'écriture en préfixant les colonnes avec l'alias et non le nom de la table. Sans les alias, la requête aurait dû être
insert into Article(idArt, idtype, libelle, famille)
select $idArticleSaisi, type_article.idtype, $txtDesignation, famille_produit.code_famille
from type_article, famille_produit
where type_article.libelle='Consommable à date de péremption'
and famille_produit.libelle='Phytosanitaire'


Et bien évidemment, une telle requête ne peut fonctionner qu'à la condition de l'adapter à la base où on l'exécute, chose qui m'est impossible puisque je ne connais pas ta base. Il aurait fallu a minima qu'une table famille_produit(code_famille, libelle) existe, qu'une table type_article(idtype, libelle) existe et que article contienne idArt, libelle, idtype, famille pour que cette requête exemple ne renvoie pas une erreur...
0
ridasys21 Messages postés 11 Date d'inscription vendredi 30 avril 2010 Statut Membre Dernière intervention 17 juillet 2012 2
2 juin 2010 à 19:51
ça marche très très bien. Je ne sais pas comment vous remércier.
0