[..] Requêtes SQL

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Hugues
Niveau 8
Niveau 8
Messages : 597
Enregistré le : ven. 21 sept. 2012 18:12
Status : Hors ligne

Re: [..] Requêtes SQL

#21

Message par Hugues »

J'ai parlé trop vite, je viens de réussir à l'instant...
SELECT CASE WHEN [ArchitectureId] > 0 THEN [LineName] END [Ligne],
       [CellNumber] || ' ' || [CellName] [Cellule]
FROM   [Architecture]
       NATURAL JOIN [Line]
       NATURAL JOIN [Cells]
ORDER  BY [LineId]
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2282
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Requêtes SQL

#22

Message par jchd »

Très bien. Je te laisse mariner un moment dans tout ça, il te faut un petit temps pour t'y faire et c'est normal.

Au passage, Expert décore les noms de schéma (tables, colonnes, vues, ...) avec soit des doubles quotes "abc" soit des crochets droits [abc]. Tu peux aller dans les options pour choisir plutôt "abc" qui est je trouve plus standard et plus facile à lire et éventuellement à composer si espace(s) dans le nom, par exemple "Un nom de table sacrément compliqué contenant ∌↻╩ựຣփЊЖ est un nom de table comme un autre". Ces doubles quotes (ou crochets) ne sont pas nécessaires si le nom ne comporte pas d'espace.

(Je n'avais pas osé mettre des mots anglais de mon propre chef...)

Si tu veux voir (par simple curiosité) du SQL qui perfore, jette un oeil à cet ancien post : https://www.autoitscript.com/forum/topi ... nt=1232364

Un poil moins complexe, mais demande un bon fauteuil quand même : https://www.autoitscript.com/forum/topi ... nt=1233132

Ces deux trucs sont un peu extrêmes, je te l'accorde, mais même un simple petit moteur comme SQLite permet bien plus de choses que tu ne vois implémentées dans la base que j'ai proposé comme maquette. Tu ne le sais certainement pas, mais tu es environné de SQLite : dans ta télé connectée, ton smartphone, ta box, ton GPS, ton routeur (souvent), toute copie de FireFox et de plein de softs Adobe et autres, Windows 8+, ... Et en plus, toute base est portable telle quelle sur toute plate-forme existante,c'est magique !
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Hugues
Niveau 8
Niveau 8
Messages : 597
Enregistré le : ven. 21 sept. 2012 18:12
Status : Hors ligne

Re: [..] Requêtes SQL

#23

Message par Hugues »

C'est encore moi :mrgreen:, j'ai entrevu tes posts et je dois dire que... bin c'est bien compliqué ^^

Pour la gestion de mon "parc", je dois dire que je me suis franchement inspiré de tes bases et je pense que je vais statuer sur cette partie (elle évoluera sûrement avec la suite... :( ) :mrgreen:.

Maintenant, il faut que je sache à l'instant "t", quels équipements sont montés sur quelles stations, quels équipements sont en stock, quels équipements sont en réparation au sein de l'entreprise, quels équipements sont en réparation à l'extérieur, et évidemment leur historique de réparation (ce qui a été remplacé), et enfin si par réparable, la mise au rebut de l'équipement.

Voilà, en fait je me répète souvent dans mes postes :lol:

Donc, je vais me pencher sur cette douloureuse deuxième partie...

Bref, je vais aller acheter du café et du doliprane... :lol:
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2282
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Requêtes SQL

#24

Message par jchd »

Bonsoir,

Je ne me suis pas trop lancé dans la gestion de la maintenance car tu me disais avoir dû modifier pas mal de choses, outre les noms du schéma.

L'idée sur laquelle je suis parti est que la mintenance regroupe tout l'historique, idéalement : entrée en stock, installation sur un poste, retrait car panne ou autre, installation d'un autre équipement en remplacement, mise en atelier de réparation ou retour fournisseur (ou déchetterie) de l'équipement retiré. Comme tout doit être daté, on devrait pouvoir retracer tout l'historique du parc complet (une fois renseigné) à n'importe quelle date et même à la seconde près si on veut gérer ça au chrono.

Des requêtes plus spécialisées permettent de voir tout ce qui est en stock, en atelier mécanique, etc. Ca ou, pourquoi pas, tout le parc Staübli connu dans la boutique et où il est, dans quel état, etc. De la même façon, extraire l'historique des maintenances sur un poste, sur un type d'équipement, sur une ligne ou bien encore comparer les taux de panne des poignets de robot sur les derniers 18 mois, en fonction des outils qu'ils emploient(*). Les possibilités là sont énormes et flexibles si on met en place ce qu'il convient.

En fait, là-dedans il n'y a rien de vraiment compliqué en soi. La complexité résulte de la juxtaposition ou plutôt la mise en relation de choses simples et mieux elles sont délimitées et leurs relation claires, plus facile en est l'articulation.

La transcription dans un paradigme calculatoire (un langage de programmation si tu préfères) est d'autant facilitée par le fait que ce langage permet facilement la manipulation de données ayant des relations entre elles et, de ce point de vue, SQL est très fort. Il te permet de lui demander ce que tu souhaites obtenir alors qu'avec un langage procédural tu es contraint de décrire dans tous les détails la façon d'obtenir ce que tu souhaites. La nuance est importante dès que les informations manipulées sont non triviales en volume et/ou en diversité. Ainsi, si le moteur SQL (son "query planner") estime qu'il doit créer une table intermédiaire (ou plusieurs) avec des index temporaires pour réaliser l'opération que tu demandes, cela restera transparent pour toi, ce qui n'est pas du tout le cas avec un langage de programmation procédural ou même fonctionnel, où l'on doit tout se cogner à la mimine.

(*) Si tu devais coder en AutoIt un truc pareil, tu pourrais y passer un certain temps ! Et si ton boss ajoute "un rapport par ligne et un autre toutes lignes confondues", ton algo procédural est par terre alors qu'il suffit d'ajuster un peu la requête SQL pour faire les deux.

Après il ne faut pas tomber dans un dogmatisme imbécile : il y a des choses qu'il convient de faire en code, d'autres en regexp, d'autres en SQL, etc.

Donc, montre-moi où tu es es quand tu estimeras que les briques élémentaires sont en place (ou dis-moi où ça coince) et on pourra avancer vers des points plus concrets. N'oublie pas que je t'ai passé mes coordonnées et qu'on peut se prendre un moment au téléphone pour progresser plus vite.

Over.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Hugues
Niveau 8
Niveau 8
Messages : 597
Enregistré le : ven. 21 sept. 2012 18:12
Status : Hors ligne

Re: [..] Requêtes SQL

#25

Message par Hugues »

Une problématique vient subitement de me "sauter au visage".
Je veux savoir à l'intant "t" où se trouve mon matériel, oui mais...

Hypothèse:
J'ai un équipement qui me génère des défauts, je ne le remplace pas par un autre qui est en stock, mais je l'inverse avec celui d'une autre station. Plus de défauts...

La personne qui est intervenue ne pensera pas à modifier (pour "x" raisons ou par flemmardise :( ) l'emplacement des équipements, donc pas de mise à jour, donc la configuration est faussée... :( .

Donc après réflexion pour simplifier les choses (enfin je pense), pour l'emplacement des équipements:

-Faire un inventaire de l'emplacement des équipements avant diffusion de mon application, cela me donnera un aperçu + ou - fiable.

-Mon équipement est soit en ligne, soit hors ligne.

S'il est en ligne alors:
  • -Sur quelle station?
S'il est hors ligne alors (devra être liée avec la saisie maintenance je pense)
  1. 1./Est-il en stock?
  • 2./Est-il en réparation interne?
  • 3./Est-il en réparation fournisseur?
  • 4./Est-il en prêt pour un autre site?
  • 5./Est-il rebuté?
-Que pour tout cela, tout ça correctement saisi par le régleur ou technicien via l'application...

Je galère à trouver le lien entre les tables pour faire cette structure et me créer une vue "où sont mes équipements"...

EDIT (16:00) je sais récupérer l'ensemble uniquement avec 1 seule valeur de location mais je ne parviens ni à récupérer le nom de la location, ni faire une requête "globale" sans avoir à faire WHERE [Location] = x
SELECT [Description],
       [Reference],
       [Version],
       [Location],
       [LineName] || '_' || [CellNumber] || ' ' || [CellName] [Emplacement]
FROM   [Arch_Equipment]
       LEFT JOIN [Architecture] ON [Architecture_ArchitectureId] = [ArchitectureId]
       NATURAL JOIN [Line]
       NATURAL JOIN [Cells]
       JOIN [Equipments] [E] ON [E].[EquipmentId] = [Arch_EquipId]
WHERE  [Location] = - 4
Je ne me lance sûrement pas dans la partie maintenance tant que je ne pars pas avec une structure des équipements "nickel".

Si tu pouvais me conseiller stp :mrgreen:

Ci-joint ma base:

DemoSQLite_hugues

Merci par avance.
Modifié en dernier par Hugues le ven. 25 nov. 2016 18:58, modifié 3 fois.
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1037
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] Requêtes SQL

#26

Message par walkson »

A tout hasard (j'ai pas tout suivi)
SELECT [Description],
           [Reference],
           [Version],
           [LocationId],
           [LineName] || '_' || [CellNumber] || ' ' || [CellName] [Emplacement]
    FROM   [Arch_Equipment]
           LEFT JOIN [Architecture] ON [Architecture_ArchitectureId] = [ArchitectureId]
           NATURAL JOIN [Line]
           NATURAL JOIN [Cells]
           JOIN [Equipments] [E] ON [E].[EquipmentId] = [Arch_EquipId]
    WHERE  [LocationId] = - 4

De renommer la base en xls, comme j'ai fait, permet de l'avoir sur le forum et de ne pas la perdre dans le temps pour ceux que le sujet intéresse
Fichiers joints
FKznIUULjdI_Demo.SQLite.xls
(480 Kio) Téléchargé 132 fois
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2282
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Requêtes SQL

#27

Message par jchd »

Hugues,

Tu as remplacé une table qui te donnait, dans mon schéma, l'information que tu souhaites maintenant : "Parc" et sa vue associée (pour la lisibilité seulement) "LeParc".

Dans ta version au lieu de considérer "ce qui n'est pas installé sur une ligne" comme "installé sur une lligne virtuelle disposant de stations virtuelles ou non (réparation, stock, ...)" tu as dissocié ces notions, donc tu vas te compliquer la vie avec une indirection supplémentaire qui n'a pas de bonne raison d'être.

Dans "Parc" ou son équivalent sous un autre nom, tu dois insérer les équipements physiques et leur emplacement individuel au moment où tu saisis cette information. Pour un échange (en vue essai) de deux équipements interchangeables entre deux stations (virutelles ou réelles), tu fais une maintenance (deux évènements en fait) pour retirer les deux et une installation (deux, en fait) en les croisant. Ainsi ton parc est à jour.
Maintenant si tout le monde peut jouer avec la base au travers d'applis en libre-service et sans contrôle strict de la régularité des mouvements ou sans effectuer les modifications qui s'imposent, ta base sera très vite complètement déconnectée du réel et absolument inutile.

Autre point : dans ta demo, tu n'as mis aucun type et aucune clé étrangère, si bien qu'on peut lier des entités qui n'existent pas. Compare avec le schéma que j'avais pondu et tu verras ce que je veux dire : il te manque les types de données et au moins les CONSTRAINT ... REFERENCES ...
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Hugues
Niveau 8
Niveau 8
Messages : 597
Enregistré le : ven. 21 sept. 2012 18:12
Status : Hors ligne

Re: [..] Requêtes SQL

#28

Message par Hugues »

Re,

Il est vrai qu'en prenant du recul, j'ai clairement mal analysé la base que tu as créé... :oops:

Finalement j'ai fait un copier/coller de ta base (rajout d'une colonne ou deux, et renommer le nom des tables/colonnes en anglais, je ne sais pas si le nom est percutant pour quelqu'un d'autre que moi... ne pas hésiter à faire des remarques :mrgreen:, ce qui est naturel pour moi ne l'ai pas pour les autres).

Ci-joint ma nouvelle base:
DemoRelease.

De plus, tout le monde n'aura pas "accès libre" à la base. Dans le concept de base j'aurai une interface graphique avec niveau d'accès bien sûr.

Le but de l'application est tu l'as tout de suite compris; j'ai un équipement défectueux sur une station x, ligne x, je le remplace par un autre. La personne qui a effectué l'opération de "maintenance", saisie son intervention via une application "Autoit" qui va renseigner dans ma base:
-Quelle ligne, quelle station, quand, quel équipement enlevé, quel equipement mis en place, son emplacement physique dans la station, son numéro de série, qui est intervenu, est un commentaire...(j'espère ne rien avoir oublié)

Une fois tout ces champs saisis, j'enregistre tout ça dans ma base ^^, ensuite dans la foulée je génère une page HTML pour être imprimée et jointe à l'équipement déféctueux et part pour réparation (soit interne ou externe) et mise à jour de mon parc bien sûr.

Si l'équipement est réparable alors, je saisi les opérations effectuées sur mon matériel pour avoir un historique (un peu le but du jeu...) et remise à jour du parc (passage de réparation à Stock), sinon mise au rebut direct (dans les 2 cas, saisie uniquement par la maintenance).

Voilà le concept, maintenant il faut que je me m'améliore sur les liaisons entre tables sinon, comme tu le dis cela va vite être une cacophonie de données...

Merci pour votre patience ^^
Hugues
Niveau 8
Niveau 8
Messages : 597
Enregistré le : ven. 21 sept. 2012 18:12
Status : Hors ligne

Re: [..] Requêtes SQL

#29

Message par Hugues »

Bon j'avance à petit pas, je pense que pour la structure de la base de données pour mes besoins va rester comme ça (presque celle initiale :oops: )

DemoFinal

J'ai ma table "maintenance" dans laquelle chaque retrait d'équipement d'une station sera saisie.
J'ai une table "_Interventions" dans laquelle seront renseignés les interventions effectués sur cet équipement.

A moins que j'eu omis les oeufs de cailles, la base est pas mal...

En parrallèle, j'ai commencé l'interface graphique pour l'affichage de la ligne, de la station. Pour ça j'ai pas trop de soucis, par contre je voudrais qu'une fois que l'on ai sélectionné la ligne et la station, une combobox soit remplit avec les équipements qui lui sont "attribués".

Par SQL OK, mais par AutoIt pas OK du tout... :evil:

Je trouve pas la logique entre les tables... Je sais qu'il faut jouer sur les Id... Il faut que je récupère

Je remplis ma combo ligne comme ça:
$iRval = _SQLite_GetTable2d(-1, "SELECT * FROM Lines WHERE LineId BETWEEN '0' And '3' ;", $aLoadLine, $iRows, $iColumns)
   If $iRval = $SQLITE_OK Then
     For $i=1 To UBound($aLoadLine)-1
       GUICtrlSetData($ComboBoxLine, $aLoadLine[$i][1])
     Next
   EndIf
Ensuite ma combo station:
_SQLite_QuerySingleRow(-1, "SELECT LineId FROM Lines WHERE LineName = '" & GUICtrlRead($ComboBoxLine) & "';", $aRowSearch)
   ;_ArrayDisplay($aRowSearch)

   $_iRval = _SQLite_GetTable2d(-1, "SELECT LineName, Number, Name FROM LineConfig NATURAL JOIN Lines NATURAL JOIN Cells WHERE LineId='" & $aRowSearch[0] & "' ORDER BY LineId" & ";", $aCells, $_iRows, $_iColumns)
   If $_iRval = $SQLITE_OK Then
     ;_ArrayDisplay($aCells)
     For $i=1 To UBound($aCells)-1
       GUICtrlSetData($ComboBoxCell, $aCells[$i][1] & " " & $aCells[$i][2])
     Next
   EndIf
Et je voudrais alimenter ma combo equipment associés:
Func _SQLSearchAssociatedEquipment()
   $__iRval = _SQLite_GetTable2d(-1, "SELECT LineName, ConfigId, CASE WHEN ParcPosteId > 0 THEN Number ||' '|| Name ELSE Name END LineConfig, Description, Reference, parcserial FROM Parc LEFT JOIN LineConfig ON ParcPosteId = ConfigId NATURAL JOIN Lines NATURAL JOIN Cells JOIN Equipments E ON E.EquipId = ParcEquipId ORDER  BY LineConfig;", $__aResult, $__iRows, $__iColumns)
   If $__iRval = $SQLITE_OK Then
      _ArrayDisplay($__aResult)
   EndIf
EndFunc
Merci par avance pour votre aide.
Répondre