Un travail énoooorme en effet
Y a plus qu'à lui envoyer un enoooorme camion par la poste en remerciement, un modèle camping car capitonné histoire de pouvoir faire le tour du Canada avec
Un travail énoooorme en effet
Y a plus qu'à lui envoyer un enoooorme camion par la poste en remerciement, un modèle camping car capitonné histoire de pouvoir faire le tour du Canada avec
Bonjour escartefigue, il y a un travail énorme dans cette base de données, fsmrel a touché à presque toutes les facettes de SQL Server. Je suis vraiment impressionné, on pense à quelque chose et hop, c'est utilisé dans la base de données et en plus tellement bien documenté. À l'origine je ne pensais pas que l'on pouvait dédier autant de travail au moteur de la base de données. À l'origine, je dédiais 85% de la charge de travail à l'intérieur de mon interface graphique, ça fonctionnait pour des petites bases de données mais côté traffic réseau et sécurité, c'était une autre histoire.... Jusqu'à maintenant fsmrel dédie 100% de la charge de travail à SQL Server, je ne pensais pas que l'on pouvait aller aussi loin dans la programmation SQL. Dommage que je n'ai pas connu fsmrel il y a 20 ans, j'aurais peut-être fait carrière dans les bases de données. Dans le temps on nous enseignait la méthode Merise mais on nous apprenait à géré 75% à 85% de la base de données avec le Visual Basic ou le C#. J'imagine le nombre de bases de données à l'intérieur des entreprises qui devraient tout simplement être refaites à partir de Zéro. Encore la semaine dernière une grosse entreprise ici a eu son système informatique planté. C'est devenu un rituel pour la majorité des petites et moyennes entreprises de voir leur parc informatique planté car leurs administrateurs en informatique ne se recyclent pas, ils refusent tout changement, ils savent tout et les autres ne savent rien... Dommage que je ne suis plus dans le domaine informatique et surtout plus jeune pour étudier. Lorsque je concevais des systèmes informatiques pour les petites entreprises dans le temps, j'étais tellement avant gardiste que je déclarais que nous étions au minimum 25 en arrière sur la technologie et là je me faisait garrocher des tomates.. Et je suis persuadé que nous sommes 25 ans en arrière encore de nos jours. Il est quasi impossible de changer la mentalité des entreprises, si ça fonctionne, on reste ça comme ça. Point... Il y a tellement de traffic sur les réseaux d'entreprises à cause des bases de données déficientes et du matériel non optimisé.
Merci les enfants !
Une telle colonne n’est pas essentielle, mais je suppose qu’elle vous facilitera la vie : je vais donc m’employer à la mettre en place, mais il faudra que je voie les impacts : par exemple, si cette colonne prend la valeur 'manufacturier' dans la table CONTACT, la valeur prise par la clé primaire ContactId devra être une valeur de la clé primaire de la table MANUFACTURIER, mais surtout pas des tables HEADQUARTERS, SHOP, etc. ! Autrement dit : triggers en vue ! Je reprends mes palmes, mon masque et mon tuba et plonge (si je me perds, le ferry du Capitaine viendra me repêcher ;-) )Envoyé par ordigil
On peut attendre un peu. En effet c'est pour me faciliter la tâche de la programmation de l'interface web. Mais ne changez rien pour l'instant, je veux que vous ayez accès au site web en premier pour voir comment je pourrait faire différemment... Je veux que les choix dans mes combobox se remplissent automatiquement mais c'est assez difficile à mettre en oeuvre pour l'instant. Peut-être en ajoutant une autre vue ça règlerait le problème plus efficacement.
fsmrel, PHP refuse d'être copain copain avec vous hahaha. Ça devrait fonctionner maintenant. Pour l'instant plusieurs choses ne sont pas fonctionnelles sur le site web mais essayez quand même de changer les valeurs des colonnes et vous comprendrez mon petit problème. Vous verrez tous les message d'erreurs. Lorsqu'on se sera mis d'accord, je commencerai à programmer les combobox... Mais pour l'instant c'est préférable que vous essayer sans combobox...
Ce n'est malheureusement pas l'apanage des PME, j'interviens essentiellement chez des grands voire très grands comptes chez qui on rencontre exactement les mêmes travers.
Le manque de formation est en cause mais aussi les délais d'étude riquiquis qui pénalisent la phase de conception et font bondir les coûts de maintenance aussi vite que l'insatisfaction des clients
Les décideurs savent trouver des budgets pour faire de beaux écrans et de l'informatique mobile : on paye des ergonomes, des designer et toute une armée de mexicains pour faire du beau, par contre, pour modéliser une BDD dans les règles de l'art et la faire fonctionner comme il faut c'est beaucoup plus compliqué d'aligner les sous, comme ça ne se voit pas, ça n'est pas vendeur et donc tout le monde s'en cogne ou à peu près
Bonjour Ordigil,
Je réponds tardivement, mais hier, mon écran est tombé malade pendant que je manipulais les différentiels sur le WEB...
Aujourd’hui il a l’air d’avoir recouvré un minimum de santé, mais il faudra que je fasse l’acquisition d’un nouvel écran...
Pouvez-vous être plus précis ? Quelles opérations (insert, update) posent problème ? sur quelles vues ? S’agit-il de messages spécifiques de SQL Server ? De messages que j’ai codés ?Envoyé par ordigil
Par exemple, j’ai tenté de créer un headquarters en double, 'Daimler', d’où le message d’erreur suivant :
Souhaitez-vous que le message affiché se résume à ma partie ?
Par ailleurs, je rappelle que tous les triggers ne sont pas encore en place, notamment ceux qui concernent l’instruction UPDATE (voyez ici), d’où insultes de la part de SQL Server, du genre :
Par ailleurs, bien que je fasse particulièrement attention, je n’ai peut-être pas mis à niveau tous les triggers de votre côté.Envoyé par SQL Server
Bonjour fsmrel :-):-):-)
Pour l'instant avoir les messages d'erreurs complets ça m'aide à débugger le site web. Je pourrais configurer PHP pour qu'il me donne beaucoup plus de détails sur les erreurs mais j'exposerais toute ma configuration et tout et tout et tout sur internet alors je lui demande seulement d'afficher le minimum. Si je lui demandais d'afficher plus, je devrais mettre le site web seulement en réseau local pour le développer mais je veux que vous puissiez accéder au site web pendant que je le conçois. Donc pour les messages d'erreurs, nous pourrons les mettre plus "Friendly" pour l'utilisateur final lorsque tout fonctionnera parfaitement…
Pour l'instant je ne sais pas quels sont les triggers à jour et ceux qui ne le sont pas alors difficile pour moi de faire les tests de triggers sur le site WEB. Prenez en considération que j'utilise "DZINDZIO_TRUCKS_MANAGEMENT_GILLES" pour le site web alors lorsque vous faites des changements dans "DZINDZIO_TRUCKS_MANAGEMENT_TEMP" vous me le dites et je mettrai à jour "DZINDZIO_TRUCKS_MANAGEMENT_GILLES" pour vérifier les mise à jour de vos triggers.
On continue comme on le fait présentement, vous faites un travail énorme et malheureusement je ne peux plus aider à grand chose dans la base de données car ce serait contreproductif. On continue comme vous imaginez la base de données en gardant à l'esprit que nous sommes dans un environnement de garages de fond de cour. Vous comprenez parfaitement la relation entre les divers composants majeurs des camions alors je n'ai plus un mot à dire sur la base de données L'important est le résultat final adapté pour des individus qui n'ont aucune idée du fonctionnement d'un ordinateur à l'exception du bouton ON/OFF… La plus grosse catastrophe à été l'arrivé des "Tabettes" qui fonctionnent comme des demi-ordinateurs et qui sont lents comme des tortues. Ça tué le marché des ordinateurs portables "Laptop" qui sont appelé à disparaître. Je ne comprend pas les gens qui achètent des Tablettes, on a aujourd'hui des Laptop aussi petits que les Tablettes et 10 fois plus performants pour le même prix. Mais bon, les gens ne comprennent pas qu'ils se font baiser.
Bonjour Ordigil,
L’état des triggers (avec date de mise à niveau) reste encore celui que j’ai fourni ici.Envoyé par ordigil
Bien sûr.Envoyé par ordigil
Bonjour fsmrel,
Désolé si je semble absent dans notre forum mais vous m'avez donné de la lecture alors je lis hahaha
Je n'ai pas encore trouvé la solution idéale pour le site WEB et les combobox... Si je conçois une liste en hard, si l'utilisateur final ajoute disant un Manufacturier ou un Modèle, ils n'apparaitront pas dans les liste de sélection des combobox. Par contre si je laisse SQL Server remplir la liste de choix automatiquement, l'utilisateur se retrouvera avec des choix qui n'auront aucun rapport puisque nous avons tout mis dans la Table CONTACT... D'où ma dernière question si on devrait ajouter une colonne supplémentaire dans la Table CONTACT. C'est une question car je ne sais pas si vous avez autre chose à proposer pour compenser cette lacune.... Peut-être que moi je ne vois pas la bonne façon de procéder..
Je n'arriverai pas à faire ça tout seul. Il faudrait que j'écrive tout sur les murs ou que j'aie un écran géant pour tout voir en même temps
CREATE PROCEDURE BILOCATION_CONTROLE_PROC ( @ComposantPrevuId AS INT -- identifiant du composant à installer , @LocalisationPrevueId AS INT -- identifiant du camion ou du local objet de l'installation , @InstallPrevue AS DATE -- date prévue d'installation (9999-12-31 si non connue) , @DesInstallPrevue AS DATE -- date prévue de désinstallation (9999-12-31 si non connue) , @TypeOperation AS CHAR(1) -- type de mise à jour : 'i' si INSERT, 'u' si 'UPDATE' , @ComposantType AS CHAR(1) -- type de composant ('c', 't', 'x', 'a') , @BilocationEffective AS CHAR(1) = 'n' OUTPUT -- 'n' si pas de chevauchement de périodes ; 'y' si chevauchement , @TypeLocalisation AS CHAR(1) = '?' OUTPUT -- 'camion' ou 'local' ou 'axle' ou inconnu , @LocalisationEnCours AS VARCHAR(32) = '?' OUTPUT -- Camion VIN ou Local Code ou axle serial number hébergeant déjà le composant , @InstallDejaFaite AS DATE OUTPUT -- Date d'installation en cours , @DesInstallDejaFaite AS DATE OUTPUT -- Date de désinstallation correspondante ) AS BEGIN DECLARE @N AS INT ; DECLARE @LocalisationEnCoursId AS INT ; DECLARE @TypeLocalisationCamion AS CHAR(1) = 'c' DECLARE @TypeLocalisationLocal AS CHAR(1) = 'l' DECLARE @TypeLocalisationAxle AS CHAR(1) = 'a' DECLARE @Infini AS DATE = '9999-12-31' DECLARE @TypeOperInsert AS CHAR(1) = 'i' DECLARE @TypeOperUpdate AS CHAR(1) = 'u' ---- pour debug ---- SELECT 'BILOCATION_CONTROLE_PROC (entrée !)' ---- pour debug ---- SELECT @TypeOperation as '@TypeOperation (BILOCATION_CONTROLE_PROC)' ---- pour debug ---- SELECT @ComposantType as '@ComposantType' ---- pour debug ---- SELECT @LocalisationPrevueId as '@LocalisationPrevueId (BILOCATION_CONTROLE_PROC)' ---- pour debug ---- SELECT @InstallPrevue as '@InstallPrevue (BILOCATION_CONTROLE_PROC)' ---- pour debug ---- SELECT @DesInstallPrevue as '@DesInstallPrevue (BILOCATION_CONTROLE_PROC)' SET @BilocationEffective = 'n' --------------------------------------------------------------- -- Le contrôle nécessite que la date prévue d'installation -- soit antérieure à celle de désinstallation. -- L'objet n'est pas de signaler une erreur éventuelle, -- ceci est du ressort des autres contraintes. --------------------------------------------------------------- IF @DesInstallPrevue <= @InstallPrevue AND @InstallPrevue <> @Infini BEGIN ---- select 'antériotité !' RETURN END ------------------------------------------------------------------------ -- Le curseur utilisé pour comparer la période prévue -- d'installation avec chaque installation effective -- pour un camion (ou un local) et un composant donnés. -- En effet, un composant a pu être installé plus -- d'une fois sur un camion (ou dans un local) : ne pas -- mélanger leurs périodes ! -- -- Le SELECT est composé de 2 subselects. -- Le 1er subselect permet de traiter des moteurs, transmissions et essieux -- installés sur des camions ou dans des locaux, ainsi que des -- différentiels dans les locaux (un difféntiel n'est -- jamais directement installé sur un camion). -- Le 2e subselect permet de prendre en compte les différentiels -- installés sur des essieux. ------------------------------------------------------------------------- DECLARE theCurseur CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR SELECT LocalisationId, ComposantInstallationDate, ComposantDesInstallationDate FROM COMPOSANT_AFFECTATION AS x JOIN COMPOSANT AS y ON x.ComposantId = y.ComposantId WHERE x.ComposantId = @ComposantPrevuId AND ComposantType = @ComposantType UNION ALL SELECT AxleId, DiffInstalDate, DiffDesInstalDate FROM DIFF_AXLE AS x JOIN DIFFERENTIAL AS y ON x.DiffId = y.DiffId WHERE x.DiffId = @ComposantPrevuId ; OPEN theCurseur ---- pour debug ---- select 'open csr' ---------------------------------------------------------------------- -- Lecture de la 1re ligne du curseur (table COMPOSANT_AFFECTATION) ---------------------------------------------------------------------- FETCH theCurseur INTO @LocalisationEnCoursId, @InstallDejaFaite, @DesInstallDejaFaite ---- pour debug ---- select @LocalisationEnCoursId as '@LocalisationEnCoursId' ---- pour debug ---- select '' as lieu, * from local where LocalisationId = @LocalisationEnCoursId ---- pour debug ---- select @@FETCH_STATUS as ' @@FETCH_STATUS' WHILE @@FETCH_STATUS = 0 AND @BilocationEffective = 'n' ------------------------------------------------------------- -- tant que le curseur produit, -- on traite le tuple lu. ------------------------------------------------------------- BEGIN ----------------------------------------------- -- On cherche les bilocations -- avec les autres objets (camions ou locaux) ----------------------------------------------- ---pour debug ---- select @InstallDejaFaite as '@InstallDejaFaite' ---pour debug ---- select @DesInstallDejaFaite as '@DesInstallDejaFaite' IF @TypeOperation = @TypeOperUpdate AND @LocalisationPrevueId = @LocalisationEnCoursId BEGIN ---------------------------------------------------------------------- -- (γ > ⍺ ∔ ⍺ = ∞) ∙ δ ≤ β ∔ γ = ⍺ ∙ δ < β ∔ δ ≤ ⍺ ∔ γ ≥ β ----------------------------------------------------------------------- IF NOT ( (@InstallPrevue > @InstallDejaFaite OR @InstallDejaFaite = @Infini) AND @DesInstallPrevue <= @DesInstallDejaFaite OR @InstallPrevue = @InstallDejaFaite AND @DesInstallPrevue < @DesInstallDejaFaite OR @DesInstallPrevue <= @InstallDejaFaite OR @InstallPrevue >= @DesInstallDejaFaite ) BEGIN SET @BilocationEffective = 'y' END END ELSE BEGIN ------------------------------------------------------------- -- δ ≤ ⍺ ∙ ⍺ ≠ ∞ ∙ δ ≠ ∞ ∔ γ ≥ β ∙ β ≠ ∞ ∙ γ ≠ ∞ ------------------------------------------------------------- IF NOT (@DesInstallPrevue <= @InstallDejaFaite AND @InstallDejaFaite <> @Infini AND @DesInstallPrevue <> @Infini OR @InstallPrevue >= @DesInstallDejaFaite AND @DesInstallDejaFaite <> @Infini AND @InstallPrevue <> @Infini) BEGIN SET @BilocationEffective = 'y' END END ----ENDIF --- pour debug --- select @BilocationEffective as '@BilocationEffective' ---------------------------------------------------------- -- Tentative de bilocation. -- L'affectation en cours concerne soit un camion, -- soit un local, soit un essieu (pour un différentiel). ---------------------------------------------------------- IF @BilocationEffective = 'y' BEGIN SET @TypeLocalisation = '?' SET @LocalisationEnCours = '?' IF EXISTS (SELECT '' FROM CAMION WHERE CamionId = @LocalisationEnCoursId) BEGIN SET @TypeLocalisation = @TypeLocalisationCamion ; SET @LocalisationEnCours = (SELECT CamionVIN FROM CAMION WHERE CamionId = @LocalisationEnCoursId) END ELSE BEGIN IF EXISTS (SELECT '' FROM LOCAL WHERE LocalisationId = @LocalisationEnCoursId) BEGIN SET @TypeLocalisation = @TypeLocalisationLocal ; SET @LocalisationEnCours = (SELECT LocalCode FROM LOCAL WHERE LocalisationId = @LocalisationEnCoursId) END ELSE IF EXISTS (SELECT '' FROM AXLE WHERE ComposantId = @LocalisationEnCoursId) BEGIN SET @TypeLocalisation = @TypeLocalisationAxle ; SET @LocalisationEnCours = (SELECT AxleSerialNumber FROM AXLE WHERE ComposantId = @LocalisationEnCoursId) END END END --- pour debug --- select @LocalisationEnCours as '@LocalisationEnCours' --- pour debug --- select @TypeLocalisation as '@TypeLocalisation' -------------------------------------------- -- On entame le tour de manège suivant, -- à cheval sur le curseur. -------------------------------------------- ---- pour debug --- select 'fetch suivant' IF @BilocationEffective = 'n' BEGIN FETCH theCurseur INTO @LocalisationEnCoursId, @InstallDejaFaite, @DesInstallDejaFaite ---- pour debug ---- select @@FETCH_STATUS as ' @@FETCH_STATUS' END -- LOOP -- c'est reparti pour un tour -------------------------------------------- -- Fin des tours de manège -------------------------------------------- END CLOSE theCurseur DEALLOCATE theCurseur ---- pour debug ---- SELECT 'BILOCATION_CONTROLE_PROC (sortie !)' END -- fin procédure
A propos des combos.
Le domaine des combos n’est pas le mien, mais il faudrait déjà qu’on se mette d’accord sur certains points touchant aux généralités.
Partons par exemple du plus haut niveau « hiérarchique » : tout en haut sont les headquarters. Ceux-ci ont des propriétés qui leurs sont propres et ne sont pas sujettes à combo : Contact Name, Civic Number, Street Name, Phone Number, etc. Par contre, le type de contact ne peut pas être inventé par l’utilisateur et doit être choisi dans la liste fournie par la table CONTACT_TYPE : cette table fait donc l’objet d’une combo.
La propriété Province peut faire l’objet d’une combo. A cette occasion, je me rends compte que la table CONTACT viole la troisième forme normale, car il existe des dépendances fonctionnelles telles que PostalCode → Province (un code postal ne fait mention que d’une seule province), et en principe PostalCode → City. Je propose — et ce n’est pas le Capitaine qui me contredira — qu’on mette en oeuvre une table CITY pour régulariser la situation (et faciliter la « comboïsation »). A défaut, on contrôlera les dépendances fonctionnelles par un trigger plaqué sur la table CONTACT...
En descendant dans la hiérarchie, on rencontre la table MANUFACTURER. Comme pour les headquarters, les manufacturiers ont leurs propriétés propres non sujettes à combo (Contact Name, Civic Number, Street Name, Phone Number, etc.), par contre un manufacturier fait référence à un headquarters, donc en toute logique, les noms de ces derniers doivent faire l’objet d’une combo : la vue HEADQUARTERS_V est donc partie prenante dans cette histoire.
En descendant à nouveau dans la hiérarchie, on rencontre les tables TRUCK_MODEL et COMPONENT_MODEL. Un modèle de camion fait référence à un manufacturier, donc les noms des manufacturiers devraient faire l’objet d’une combo : la vue MANUFACTURER_V est impliquée. De même, un modèle de composant fait référence à un manufacturier, donc la combo à l’usage des modèles de camions est partie prenante. Comme on a quatre catégories de composants (cf. colonne ModelCategory de la table COMPONENT_MODEL et de la vue COMPONENT_MODEL_V), ces catégories (engine, transmission, axle, differential) devraient faire l’objet d’une combo.
En continuant à descendre dans la hiérarchie, on en arrive par exemple aux camions : clairement, les paires manufacturiers/modèles de camions devraient en l’occurrence faire l’objet d’une combo. Même chose pour la couleur des camions.
De même on en arrive aux composants : là encore, les paires manufacturiers/modèles de composants devraient faire l’objet d’une combo. Pour chaque catégorie de composant on devrait avoir une combo des propriétés-types (Max Horse Power, Engine Max RPM, Engine Max Torque pour les camions, Speed, Torque, Type (primary, auxiliary) pour les transmissions, etc.), sachant toutefois que pour le moment, seules les transmissions disposent des propriétés-types (table COMPONENT_MODEL_TRANSMISSION, vue COMPONENT_MODEL_TRANSMISSION_V).
Etc.
Au besoin on peut faire des vues sur des vues.
Exemple des noms des headquarters en vue d’une combo d’iceux :
Un select =>CREATE VIEW HEADQUARTERS_NAMES_V (ContactName) AS SELECT ContactName FROM HEADQUARTERS_V ;
ContactName ----------- Daimler Navistar Paccar Compagnie internationale DAC Compagnie internationale Naudin Eaton Meritor Inc. Mercedes Benz Timkem
Dans ces histoires de combos, est-ce que PHP (ou autre trouble-fête furonculosé) se mêle de ficher la zoubia ?
Je ne saisis pas exactement.....
Chaque ville ou village à son propre code postal
Par contre à l'intérieur d'une même province nous avons des villages différents qui porte le même nom et nous avons aussi dans différentes provinces des noms de villages qui se répètent... Il faut donc toujours faire sur du code postal pour la livraison de courrier de marchandise. Il y a même à l'intérieur d'une même ville des rues différentes qui portent le même nom. Comme à Montréal, il y a eu regroupement de plusieurs villes alors maintenant différent quartiers de Montréal se retrouvent avec des noms de rues identiques, ça devient mêlant pour faire les livraisons hahaha...
Lorsque je parle de Combo, je parle disons pour la vue CAMIN_LOCALISATION_V
L'utilisateur aura à choisir le manufacturier et le modèle. Je peux mettre le Manufacturier dans un Combo et le Modèle dans un autre Combo. Je peux aussi chaîner les deux Combo entre eux... Là l'utilisateur n'a pas le choix, il ne peut pas créer de Manufacturier ou de Modèle à la volée, il doit choisir un manufacturier qui existe dans la Manufacturer_v. Le problème c'est que la vue MANUFACTURER_V ne contient pas seulement des Manufacturiers. Le problème du problème est que si je code en hard les choix des manufacturiers dans un combo, si le client ajoute un nouveau manufacturier, le nouveau manufacturier ne sera pas inclus dans le combo. Donc, je peux créer un combo pour des choix soft qui se remplit automatiquement d'après la vue MANUFACTURER_V mais là il se retrouvera avec des choix qui n'ONT rien à voir avec des manufacturiers de camions, ils aura dans le combo tout ce que contient la vue MANUFACTURER_V. Est-ce que vous saisissez ce que j'essaie d'expliquer ? Je ne veux pas que dans le combo Manufacturier d'un camion que le client choisisse Timken, Timken n'est pas un manufacturier de camion, il est un manufacturier de pièces de camions. Donc si je laisse le combo Manufacturer se remplir automatiquement, je dois lui indiquer comment se remplir automatiquement d'après la vue MANUFACTURER_V.
Je reprendrai votre message demain. En attendant, j'ai modifié mon message précédent, puisque le même nom de ville peut faire référence à plus d'une province.Envoyé par ordigil
Traitons déjà celui-ci :
D’accord pour ajouter un colonne pour le type de contact (headquarters, manufacturier, shop, anonyme), mais avec cet ajout de colonne, on devra s’assurer de la cohérence des données (un trigger s’en chargera).Envoyé par ordigil
En attendant, voici comment procéder pour la mise en oeuvre :
on n’insérera dans la table HEADQUARTERS que des lignes pour lesquelles la nouvelle colonne ContactTypeId (cf. ci-dessous) fait référence à la colonne ContactTypeId de la table CONTACT_TYPE telle que celle-ci a la valeur 'h', même principe pour les tables MANUFACTURER et SHOP.
Cette typologie fera donc l’objet d’une table CONTACT_TYPE :
Colonnes de la table CONTACT_TYPE :
— ContactTypeId :
Pour mise en oeuvre d’une clé primaire artificielle (IDENTITY).
— ContactTypeName :
Nom du type de contact : {'Headquarters', 'Manufacturer', 'Shop', 'Anonymous'} où 'Anonymous' est utilisé pour des contacts qui ne sont pas des types de contact spécifiques (autres donc que Headquarters, Manufacturer, Shop), liste pouvant être complétée par de nouveaux types de contacts spécifiques.
— ContactTypeShort :
Synonyme abrégé du nom du type de contact : 'h' pour 'Headquarters', 'm' pour 'Manufacturer', 's' pour 'Shop', 'z' pour 'Anonymous'.
Pour créer la table CONTACT_TYPE :
Pour les valeurs :CREATE TABLE CONTACT_TYPE ( ContactTypeId INT IDENTITY NOT NULL , ContactTypeName VARCHAR(32) NOT NULL , ContactTypeShort CHAR(1) NOT NULL , CONSTRAINT CONTACT_TYPE_PK PRIMARY KEY (ContactTypeId) , CONSTRAINT CONTACT_TYPE_NAME UNIQUE (ContactTypeName) , CONSTRAINT CONTACT_TYPE_SHORT UNIQUE (ContactTypeShort) ) ;
Pour connecter la table CONTACT :SET IDENTITY_INSERT CONTACT_TYPE OFF ; DBCC CHECKIDENT (CONTACT_TYPE, RESEED, 1) ; INSERT INTO CONTACT_TYPE (ContactTypeName, ContactTypeShort) VALUES ('Headquarters', 'h') , ('Manufacturer', 'm') , ('Shop', 's') , ('Anonymous', 'z') ;
(1) Ajout de la colonne ContactTypeId (NULL) :
ALTER TABLE CONTACT ADD ContactTypeId INTEGER ;
(2) Valorisation de la colonne ContactTypeId de la table CONTACT à partir du contenu des tables HEADQUARTERS, MANUFACTURER, SHOP :
----------------------------------------------------------------- -- mise à jour de la colonne ContactTypeId de la table CONTACT ------------------------------------------------------------------ UPDATE CONTACT SET ContactTypeId = (SELECT ContactTypeId FROM CONTACT_TYPE WHERE ContactTypeShort = 'h') WHERE ContactId IN (SELECT HeadquartersId FROM HEADQUARTERS) ; UPDATE CONTACT SET ContactTypeId = (SELECT ContactTypeId FROM CONTACT_TYPE WHERE ContactTypeShort = 'm') WHERE ContactId IN (SELECT ManufacturerId FROM MANUFACTURER) ; UPDATE CONTACT SET ContactTypeId = (SELECT ContactTypeId FROM CONTACT_TYPE WHERE ContactTypeShort = 's') WHERE ContactId IN (SELECT shopId FROM SHOP) ;
(3) La colonne ContactTypeId passe à NOT NULL et on met en oeuvre la clé étrangère connectant CONTACT sur CONTACT_TYPE :
Maintenant, concernant la combo des types de contacts :--------------------------- -- NOT NULL --------------------------- ALTER TABLE CONTACT ALTER COLUMN ContactTypeId INT NOT NULL ; ---------------------------------------------------- -- on claque la clé étrangère ---------------------------------------------------- ALTER TABLE CONTACT ADD CONSTRAINT CONTACT_CONTACT_TYPE_FK FOREIGN KEY (ContactTypeId) REFERENCES CONTACT_TYPE (ContactTypeId)
On pourrait mettre en oeuvre une procédure stockée, que vous appelleriez en lui passant en paramètre le type de contact et les valeurs des colonnes habituelles de la table CONTACT fournies par l’utilisateur. Cette procédure se chargerait alors de faire la mise à jour de la vue correspondante : HEADQUARTERS_V, MANUFACTURER_V, SHOP_V (voire une nouvelle vue CONTACT_ANONYMOUS si Contact Type anonyme).
Si tout cela vous convient, je mettrai DZINDZIO_TRUCKS_MANAGEMENT_TEMP à niveau.
Oh wowwwwwww je n'avais même pas penser qu'on pouvait automatiser le processus hahaha Vous pensez vraiment à tous. Il faut aussi donner à l'utilisateur un moyen d'ajouter d'autres contacts en plus des Headquarters, Manufacturer et Shop... Genre : PartStore, PartManufacturer, Customer, etc...
Oui vous pouvez y aller avec la mise à niveau de DZINDZIO_TRUCKS_MANAGEMENT_TEMP. Je mettrai ensuite à jour ..._GILLES et je ferai une première tentative avec un Combobox.
Bonsoir Ordigil,
J’ai donc effectué les opérations suivantes :Envoyé par ordigil
(1) Création de la table CONTACT_TYPE avec les valeurs suivantes :
(2) Mise à niveau de la table CONTACT : création de la colonne ContactTypeId pour établir la relation avec la table CONTACT_TYPE.ContactTypeName ContactTypeShort --------------- ---------------- Headquarters h Manufacturer m Shop s Anonymous z
(3) Valorisation de la colonne ContactTypeId de la table CONTACT.
(4) Mise à niveau de la table CONTACT : mise en oeuvre de la clé étrangère {ContactTypeId} en relation avec la clé primaire {ContactTypeId} de la table CONTACT_TYPE.
(5) Création de la vue CONTACT_TYPE_V :
(6) Création des triggers de la vue CONTACT_TYPE :CREATE VIEW CONTACT_TYPE_V (ContactTypeName, ContactTypeShort) AS SELECT ContactTypeName, ContactTypeShort FROM CONTACT_TYPE ;
— CONTACT_TYPE_INSERT_TR
— CONTACT_TYPE_UPDATE_TR
(7) Création d’une vue CONTACT_TYPE_COMBO_V vous permettant de tester une combo façon « Hello World ! » :
=>CREATE VIEW CONTACT_TYPE_COMBO_V (ContactTypeName) AS SELECT ContactTypeName FROM CONTACT_TYPE ;
ContactTypeName --------------- Headquarters Manufacturer Shop Anonymous
Reste à faire : assurer la cohérence du contenu des tables HEADQUARTERS, MANUFACTURER, SHOP par rapport à la table CONTACT_TYPE.
Merci de secouer tout ça…
Bonjour fsmrel ;-)
J'ai l'air un peu silencieux mais je regarde ce que vous avez fait. J'ai un problème sur le site web pour la mise à jour de la vue CAMION_LOCALISATION_V. Ça fonctionne à l'aide de vos triggers en passant par MSSMS mais en passant par le site web ça ne fonctionne pas. :-(
Ça ça passe haut la main dans MSSMS mais sur le sur web c'est une autre histoire, ça ne passe pas. Si je veux que ça fonctionne, je dois tout refaire le site WEB différemment à partir de zéro car mon modèle de développement du site WEB ne fonctionne plus avec la façon que la base de données fonctionne… Je vais regarder si je peux arriver à quelque chose en concevant le site WEB avec Visual Studio.. Je pense que je n'ai plus le choix que d'utiliser à fond du JScript. Des centaines d'heures de plaisir assurées hahaha. Mes combo box ne fonctionnent pas du tout pour l'instant et ne fonctionneront jamais de la façon je que procède présentement, sans clé primaire ça ne fonctionnera jamais alors je dois tout refaire à partir de zéro. Et je dois aussi penser aux vues TRUCK_PURCHASE et TRUCK_SALE, un camion ne peut pas entrer la base de données comme par magie, il doit passer par TRUCK_PURCHASE. Donc pour l'instant le site web n'est d'aucune utilité pour vous, on arrive à rien en passant par le site WEB. Je vais essayer autre chose…
USE [DZINDZIO_TRUCKS_MANAGEMENT_TEMP] GO BEGIN TRANSACTION SELECT * FROM CAMION_LOCALISATION_V UPDATE [dbo].[CAMION_LOCALISATION_V] SET [Manufacturer] = 'Kenworth' ,[Model] = 'T600' WHERE VIN ='vin17' GO SELECT * FROM CAMION_LOCALISATION_V ROLLBACK
En fait, la cohérence est assurée de facto : supposons qu’on veuille créer le Shop 'Escartefigue'. On exécute pour cela l’instruction :Envoyé par fsmrel
La mise à jour de la table CONTACT est effectuée au moyen du trigger SHOP_INSERT_TR :INSERT INTO SHOP_V (ContactName) SELECT 'Escartefigue' ;
Où l’on voit que la colonne ContactTypeId est donc forcément en phase avec le type 'Shop' de la table CONTACT_TYPE.INSERT INTO CONTACT (ContactName , ContactTypeId , CivicNumber, StreetName, City, Province, PostalCode , PhoneNumber, WattLine, FaxNumber, CellNumber , WebSite, FirstContactName) SELECT ContactName , (SELECT ContactTypeId FROM CONTACT_TYPE WHERE LOWER(ContactTypeName) = 'shop') , COALESCE (CivicNumber, '-') , COALESCE (StreetName, '-') , COALESCE (City, '-') , COALESCE (Province, '---') , COALESCE (PostalCode, '--- ---') , COALESCE (PhoneNumber, '000-000-0000') , COALESCE (WattLine, '000-000-0000') , COALESCE (FaxNumber, '000-000-0000') , COALESCE (CellNumber, '000-000-0000') , COALESCE (WebSite, '-') , COALESCE (FirstContactName, '-') FROM INSERTED ;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager