IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modélisation Discussion :

Créer une base multidimensionnelle


Sujet :

Modélisation

  1. #41
    Membre du Club
    Homme Profil pro
    Développeur Info-Indus
    Inscrit en
    Avril 2015
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Info-Indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 202
    Points : 42
    Points
    42
    Par défaut
    À raison de 3000 lignes ajoutées par fichier .stat, il faudra sans doute prévoir une purge périodique de tInput.
    En réalité le fichier que je t'es transmis de 3000 lignes n'est pas très gros.. Il y en a des plus conséquent.
    Mais oui une purge ne peut être que bénéfiques. Sur la même base que l'importation (tache planifié-->batch-->macro...)

    J'ai une petite question: On je peux trouver les différents tutoriels que tu as créée ?
    J'ai trouvé celui permettant de créer une interface Acces pour un procédé industriel.. mais je n'en trouve pas d'autre..

    Merci

  2. #42
    Membre du Club
    Homme Profil pro
    Développeur Info-Indus
    Inscrit en
    Avril 2015
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Info-Indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 202
    Points : 42
    Points
    42
    Par défaut
    Bonjour Claude,

    Merci pour les liens vers tes publications.

    Je suis entrain d'essayer d'effectuer des modifications sur ta base de données afin qu'elle puisse non pas seulement me traiter un seul fichier mais tout le contenu d'un répertoire. Voila le code que j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Dim Rep
    Dim oFSO, oFic
    Dim iFic As Integer
     
    Set oFSO = CreateObject("Scripting.FileSystemObject")
     
    Rep1 = "Chemin du répertoire ou se situe mes fichiers"
     
    If oFSO.FolderExists(Rep1) Then
        For Each oFl In oFSO.GetFolder(Rep1).Files
     
    	'Intructions
     
    End If
    Next
    Je me suis inspiré de code trouvé sur le net que j'ai plus ou moins adapté à ma situation...

    Je me rend compte que pour récupérer le nom de mes fichiers, soit la date du jour, je vais avoir quelques difficultés mais j'y travail.
    A plus tard.

  3. #43
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Bonjour,

    Si tu attends un peu, je te ferai une proposition de code pour lire un à un les fichiers .stat qui seront dans le sous-répertoire.

    Mais avant, j'attendais que tu confirmes que les données dans la base en P.J. du billet 38 ont l'air qui convient.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  4. #44
    Membre du Club
    Homme Profil pro
    Développeur Info-Indus
    Inscrit en
    Avril 2015
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Info-Indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 202
    Points : 42
    Points
    42
    Par défaut
    Oui, désolé j'ai oublié de te le confirmer.
    En effet, les données conviennent. j'ai suffisamment d'informations sur les erreurs pour pouvoir les traiter ensuite.
    Merci.

  5. #45
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    OK, je te reviens quand j'aurai testé.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  6. #46
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Voici.

    Pour mon test, j’ai éclaté le .stat original en 2 : 20150415.stat et 20150416.stat, pour vérifier que cela fonctionne avec plusieurs fichiers à traiter.
    N.B. Après l’exécution les fichiers .stat sont renoommés en .txt.

    Si tu exécutes avec les données du test, tu dois obtenir 4548 enregistrements dans tInput.

    Essaie de ton côté avec plusieurs fichiers réels.

    Dis-moi si tu comprends le code, j’ai mis des commentaires qui devraient au moins te permettre de « sentir » ce qu’on y fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    Option Compare Database
    Option Explicit
     
    Public Sub Importer()
     
      On Error GoTo GestionErreurs
      Dim obFSO As Scripting.FileSystemObject
      Dim obRep As Scripting.Folder
      Dim obFichier As Scripting.File
      Dim sDateJour As String
      Dim dDatejour As Date
      Dim rst As Recordset
      Dim tbl() As String  'pour splitter l'enregistrement
      Dim Composant() As String 'pour séparer le composant d'avec le N° de carte
      Dim Panneau As Long
      Dim Produit As String
      Dim sSql As String
      Dim i As Integer
        Set obFSO = New Scripting.FileSystemObject
        Set obRep = obFSO.GetFolder(CurrentProject.Path & "\Donnees")
        'Boucle sur les fichiers
        For Each obFichier In obRep.Files
          If Right(obFichier.Name, 4) <> "stat" Then GoTo AuFichierSuivant
          'Capter la date du fichier
           sDateJour = Left(obFichier.Name, 8)
          'Renommer le fichier
          obFichier.Name = Left(obFichier.Name, Len(obFichier.Name) - 4) & "txt"
          'Importer
          DoCmd.SetWarnings False
          'Vidanger tInputBrut
          DoCmd.RunSQL "DELETE * FROM tInputBrut;"
          'Transférer les données dans la tInputBrut
          DoCmd.TransferText acImportDelim, "stat", "tInputBrut", obFichier, False
          'Formater la date
          dDatejour = DateSerial(Left(sDateJour, 4), Mid(sDateJour, 5, 2), Right(sDateJour, 2))
          'Vidanger tInput si c'est un remake pour cette date
          DoCmd.RunSQL "DELETE DateJour FROM tInput WHERE DateJour=#" & Format(dDatejour, "mm/dd/yy") & "#;"
          'Créer un recordset avec tInputBrut
          Set rst = CurrentDb.OpenRecordset("tInputBrut")
          rst.MoveFirst
          'Lire chaque enregistrement l'un après l'autre
          Do While Not rst.EOF
              'ne laisser qu'un espace entre les champs
              rst.Edit
              For i = 1 To 10
                  rst(1) = Replace(rst(1), "  ", " ")
              Next i
              'Spliter les champs
              tbl = Split(rst(1), " ")
              'Traiter suivant la nature de cet enregistrement
              Select Case tbl(0)
                  Case "#"        'c'est donc un enregistrement pour lequel on ne fait rien
                  Case Is < "a"   'c'est donc un enregistrement dont le 1er champ est numérique => panneau
                      Panneau = tbl(0)
                      Produit = tbl(2)
                  Case Else       'c'est donc un enregistrement qui décrit une erreur
                      'Spliter Composant/N° carte
                      Composant = Split(tbl(0), "-")
                      'Construire le SQL de la requête pour ajouter dans tInput
                      sSql = "INSERT INTO tInput ( DateJour, Produit, Panneau, NumCarte, Composant, Boitier, Erreur, Fenetre, Operateur ) " _
                            & "SELECT #" & Format(dDatejour, "mm/dd/yy") & "# As Expr1, " _
                               & """" & Produit & """ As Expr2, " _
                               & Panneau & " AS Expr3, " _
                               & Composant(1) & " As Expr4, " _
                               & """" & Composant(0) & """ As Expr5, " _
                               & """" & tbl(1) & """ As Expr6, " _
                               & tbl(5) & " As Expr7, " _
                               & """" & tbl(2) & tbl(3) & """ As Expr8, " _
                               & """" & tbl(6) & """ As Expr9;"
                      'Exécuter la requête
                      DoCmd.RunSQL sSql
              End Select
              'Lire le suivant et boucler
              rst.MoveNext
              Loop
              'clore le recordset
              rst.Close
              Set rst = Nothing
     
    AuFichierSuivant:
        Next obFichier
    Fin:
      Set obFSO = Nothing
      Set obRep = Nothing
      DoCmd.SetWarnings True
    GestionErreurs:
      Select Case Err.Number
        Case 0 ' pas d'erreur
          Exit Sub
        Case Else
          MsgBox "Erreur dans Importer : " & Err.Number & "-" & Err.Description & ".", vbCritical
      End Select
     
    End Sub
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  7. #47
    Membre du Club
    Homme Profil pro
    Développeur Info-Indus
    Inscrit en
    Avril 2015
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Info-Indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 202
    Points : 42
    Points
    42
    Par défaut
    Bonjour Claude,

    Je suis actuellement entrain de tester pour l'import de plusieurs fichiers .stat à la suite. Mais je suis confronté à un petit problème, en effet ma base à du mal a tourner. Après l'importation de quelques fichiers .stat ma bd plante :

    Pièce jointe 184077

    Rectification: L’exécution plante, mais j'arrive à reprendre en faisant "CTRL + Pause".
    Au final j'arrive à exécuter la fonction dans son intégralité, ça prend du temps et ça plante, il faut également relancer l’exécution à chaque fois .. Mais ça fonctionne !!
    Si on imagine lancer cette base de donnée et son processus via un batch le fait de devoir relancer l’exécution avec "CTRL + Pause", ne va pas être problématique ?

  8. #48
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Bonjour,

    Pas normal.

    Avec quelle version d'Access travailles-tu ?

    Peux-tu m'envoyer par e-mail les fichiers avec lesquels tu as le problème, pour que je puisse provoquer l'incident chez moi et examiner sur pièces.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  9. #49
    Membre du Club
    Homme Profil pro
    Développeur Info-Indus
    Inscrit en
    Avril 2015
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Info-Indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 202
    Points : 42
    Points
    42
    Par défaut
    Je t'envoie ça,
    J'utilise une version Access2010.
    En principe les fichiers que je compile sur mon PC son du type .accdb. Mais ceux que tu m'envoie son créés avec une version ultérieur par conséquent ils sont du type .mdb.
    Mais j'arrive quand même à les ouvrir sans modifier leurs extensions. Malgré tout, comme je te l'ai dit ça a du mal à mouliner...

  10. #50
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    J'utilise une version Access2010
    Essaie de convertir mon fichier en .accdb. (Fichier/Enregistrer et publier)

    Qu'appelles-tu lent ?
    Pour info importer 50 000 enregistrements ça demande chez moi 1 min 10 sec.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  11. #51
    Membre du Club
    Homme Profil pro
    Développeur Info-Indus
    Inscrit en
    Avril 2015
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Info-Indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 202
    Points : 42
    Points
    42
    Par défaut
    Oui effectivement c'est bien ça.
    En réalité je trouvais l'exécution lente car je m'attendais à un temps d'exécution de quelques secondes. Mais il est vrai que nous traitons un certain nombres de lignes et que cela demande un peu de temps. Ceci dit c'est un temps d'exécution très honnête et raisonnable.

    Si tu me le permet je vais tenter de complexifié la chose.

    Penses-tu qu'il est possible de modifier la structure de la base??

    En effet, je n'y avais pas pensé pendant que nous définissions les données à récupérer (et j'en suis sincèrement désolé). Mais il serait intéressant de récupérer de nouvelles informations:
    Entouré en rouge: Le nombre de bons composants (BCompo)
    Fléché en rouge: Le nombre de mauvais composants (MCompo)
    Entouré en bleu: Le nombre de bonne fenêtres (BFenetre)
    Fléché en bleu: Le nombre de mauvaises fenêtres (MFenetre)

    Pièce jointe 184096

    Ces données sont vraies pour chaque panneaux et non-pas pour les erreurs.. Je me disais donc que l'ajout d'une table pourrait être judicieux. Cette nouvelle table serait liée à "tInput" aux champs (Produits*Panneau).
    Cela permettrait en fait d'avoir les ratios de "bon composants" & "bonnes fenêtres" et ce par panneau.. (le nom du panneau n'étant pas explicite, l'idéal serait de faire référence dans la foulé au nom de produit). D'où la notion de base multidimensionnelle, enfin je sais pas si c'est vraiment "multidimensionnelle" mais dans la conception que je me fait (qui dit en passant doit être fausse), je vois des tables liées entre elles. Dans une "tInput" les infos sur les erreurs rencontrés, dans l'autre, les infos concernant les produits (bons composants, bonnes fenêtres..).. Après je penses que tu es bien placé pour me dire si mon raisonnement est juste ou pas.

    La structure de la base a-t-elle réellement besoin d'être modifiée ? Si oui, cela me permettra-t-il d'effectuer des analyse plus poussées (sur les panneaux, les produits)?

  12. #52
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Changer la structure de la table tImput n’est pas un gros problème.

    Par contre, je ne comprends pas trop ce que tu expliques ici :
    Ces données sont vraies pour chaque panneaux…

    Je vais ajouté ces 4 données et nous verrons ensuite quelles infos, il faut en tirer.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  13. #53
    Membre du Club
    Homme Profil pro
    Développeur Info-Indus
    Inscrit en
    Avril 2015
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Info-Indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 202
    Points : 42
    Points
    42
    Par défaut
    Je veux dire par là que ces données ne concernent pas une erreur.
    En réalité le nombre de bon et de mauvais composants ou de bonnes et de mauvaises fenêtres, ce sont des informations propres aux panneaux.

    Je m'explique:

    Exemple:

    Il est incorrect voire illogique de dire qu'une erreur sur un composant a 300 bons composants et 2 mauvais.
    En revanche,
    Dire qu'un panneau après inspections a 300 bons composants et 2 mauvais, c'est intéressant.
    Idem pour les fenêtres, ce sont des informations propres aux panneaux, voire aux produits.

    C'est la raison pour laquelle je disais qu'il fallait peut être une nouvelle table, pour séparer les informations relatives aux composants de celles relatives aux produits ou aux panneaux.

    Voici un exemple d'analyse que l'on pourrait imaginer pour un panneau:

    "Pour le produit CMS835_F1_O, panneau 1688, nous avons X bons composant (composant n'étant pas concernés par des erreurs) et Y mauvais composants (composant étant concernés par des erreurs)."

    Après on pourrait aller encore plus loin et se demander quels sont les composants en question mais je pense que là ça devient très dur, en tout cas pour moi. A ce niveau des liens entre les tables types INNER JOIN doivent être la solutions. Et puis cela n'entre plus dans la structure même de la table mais dans son analyse avec les requêtes.


    Est ce que tu comprends où je veux en venir ?

  14. #54
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Voici.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  15. #55
    Membre du Club
    Homme Profil pro
    Développeur Info-Indus
    Inscrit en
    Avril 2015
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Info-Indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 202
    Points : 42
    Points
    42
    Par défaut
    Merci,

    Effectivement tu as compris lesquelles informations je ciblais.
    Ce que je t'expliquais c'était pour éviter tout simplement la redondance d'informations et pour diminuer le volume de la base.

    Plutôt que d'avoir pour toutes les erreurs BCompo, MCompo, BFenetre, MFenetre, j'imaginais qu'on pouvais avoir une seule fois ces infos pour chaque Produit/Panneau dans une table à part et faire appel à cette table lorsque l'on désire avoir ces infos.
    Mais je vais tester la base que tu m'a envoyé.

    Merci encore une fois de m'accorder de ton temps.

  16. #56
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Compris !

    Comment sont déterminés les N° de panneaux ? A-t-on la garantie qu'on ne retrouve jamais deux N° identiques ?

    En d'autres mots, peut-on choisir Panneau comme clé ?
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  17. #57
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Bonjour,

    J’ai fait l’impasse et supposé que le N° est unique.

    On aurait cette structure





    L’import est un peu plus long

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    Option Compare Database
    Option Explicit
     
    Public Sub Importer()
      On Error GoTo GestionErreurs
      Dim obFSO As Scripting.FileSystemObject
      Dim obRep As Scripting.Folder
      Dim obFichier As Scripting.File
      Dim sDateJour As String
      Dim dDatejour As Date
      Dim rst As Recordset
      Dim tbl() As String  'pour splitter l'enregistrement
      Dim Composant() As String 'pour séparer le composant d'avec le N° de carte
      Dim Panneau As Long
      Dim sSql As String
      Dim i As Integer
        Set obFSO = New Scripting.FileSystemObject
        Set obRep = obFSO.GetFolder(CurrentProject.Path & "\Donnees")
        'Boucle sur les fichiers
        For Each obFichier In obRep.Files
          If Right(obFichier.Name, 4) <> "stat" Then GoTo AuFichierSuivant
          'Capter la date du fichier
           sDateJour = Left(obFichier.Name, 8)
          'Renommer le fichier
          obFichier.Name = Left(obFichier.Name, Len(obFichier.Name) - 4) & "txt"
          'Importer
          DoCmd.SetWarnings False
          'Vidanger tInputBrut
          DoCmd.RunSQL "DELETE * FROM tInputBrut;"
          'Transférer les données dans la tInputBrut
          DoCmd.TransferText acImportDelim, "stat", "tInputBrut", obFichier, False
          'Formater la date
          dDatejour = DateSerial(Left(sDateJour, 4), Mid(sDateJour, 5, 2), Right(sDateJour, 2))
          'Créer un recordset avec tInputBrut
          Set rst = CurrentDb.OpenRecordset("tInputBrut")
          rst.MoveFirst
          'Lire chaque enregistrement l'un après l'autre
          Do While Not rst.EOF
              'ne laisser qu'un espace entre les champs
              rst.Edit
              For i = 1 To 10
                  rst(1) = Replace(rst(1), "  ", " ")
              Next i
              'Spliter les champs
              tbl = Split(rst(1), " ")
              'Traiter suivant la nature de cet enregistrement
              Select Case tbl(0)
                  Case "#"        'c'est donc un enregistrement pour lequel on ne fait rien
                  Case Is < "a"   'c'est donc un enregistrement dont le 1er champ est numérique => panneau
                     Panneau = tbl(0) 'Mémoriser car nécessaire pour les enregistrements tErreurs
                      'Construire le SQL de la requête pour ajouter dans tPanneaux
                       sSql = "INSERT INTO tPanneaux ( tPanneauxPK,DateJour, Produit, BCompo,MCompo,BFenetre,MFenetre ) " _
                            & "SELECT " & tbl(0) & " As Expr0, " _
                               & "#" & Format(dDatejour, "mm/dd/yy") & "# As Expr1, " _
                               & """" & tbl(2) & """ As Expr2, " _
                               & tbl(4) & " As Expr10, " _
                               & tbl(5) & " As Expr11, " _
                               & tbl(6) & " As Expr12, " _
                               & tbl(7) & " As Expr13 ;"
                      'Exécuter la requête pour ajouter dans tPanneaux
                      DoCmd.RunSQL sSql
                  Case Else       'c'est donc un enregistrement qui décrit une erreur
                      'Spliter Composant/N° carte
                      Composant = Split(tbl(0), "-")
                      'Construire le SQL de la requête pour ajouter dans tErreurs
                      sSql = "INSERT INTO tErreurs ( tPanneauxFK, NumCarte, Composant, Boitier, Erreur, Fenetre, Operateur ) " _
                            & "SELECT " & Panneau & " As Expr1, " _
                               & Composant(1) & " As Expr4, " _
                               & """" & Composant(0) & """ As Expr5, " _
                               & """" & tbl(1) & """ As Expr6, " _
                               & tbl(5) & " As Expr7, " _
                               & """" & tbl(2) & tbl(3) & """ As Expr8, " _
                               & """" & tbl(6) & """ As Expr9;"
                      'Exécuter la requête pour ajouter dans tErreurs
                      DoCmd.RunSQL sSql
              End Select
              'Lire le suivant et boucler
              rst.MoveNext
              Loop
              'Clore le recordset
              rst.Close
              Set rst = Nothing
    AuFichierSuivant:
        Next obFichier
    Fin:
      Set obFSO = Nothing
      Set obRep = Nothing
      DoCmd.SetWarnings True
    GestionErreurs:
      Select Case Err.Number
        Case 0 ' pas d'erreur
          Exit Sub
        Case 94 ' enregistrement Nul Nul...
          Resume Next
        Case Else
          MsgBox "Erreur dans Importer : " & Err.Number & "-" & Err.Description & ".", vbCritical
      End Select
    End Sub



    N.B. Des erreurs avec deux numéros autres que ceux annoncés (600 et 99)






    La suite : exploiter les données

    Imagine que tu rentres de vacances.
    Tu veux voir ce qui s’est passé pendant ton absence.
    Essaie de me faire comprendre le cheminement de ton analyse des erreurs.
    Quel niveau de synthèse voudrais-tu voir d’abord ? Comment vas-tu déceler que quelque chose d’anormal s’est passé et quels types d’information te seraient nécessaires pour cerner le problème ?
    Ceci nous permettra de mettre au point un formulaire de recherche multicritère pour t’aider à mener ton enquête.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  18. #58
    Membre du Club
    Homme Profil pro
    Développeur Info-Indus
    Inscrit en
    Avril 2015
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Info-Indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 202
    Points : 42
    Points
    42
    Par défaut
    Bonjour Claude,

    Désolé de ne pas avoir répondu hier soir.
    C'est à dire que je ne peux pas garantir à 100% que le numéro de panneau est unique, cependant j'ai envoyé un mail au fournisseur de la machine afin qu'il puisse m'informer à ce sujet.
    Voici la réponse du fournisseur de la machine:

    "Le code du numéro de panneau est un chiffre incrémenté à chaque nouvelle inspection. Il correspond au nombre/numéro de carte inspectée dans la journée. L’identifiant du panneau est donné dans la 4ième colonne (000126579).
    Il peut y avoir plusieurs fois le même identifiant de panneau si le même panneau est inspecté plusieurs fois dans la journée."

    Je pense donc qu'il faut changé le numéro qui identifie le panneau et prendre le numéro dans la quatrième colonne:
    ex: (000126579), pour la ligne ciblé par mon marquage en rouge


    Pièce jointe 184202

    J’ai fait l’impasse et supposé que le N° est unique.

    On aurait cette structure
    A première vue la structure à l'air correcte.

    N.B. Des erreurs avec deux numéros autres que ceux annoncés (600 et 99)
    Les valeurs que peut prendre le champ "Erreur" sont renseignées par les opérateurs via un clavier numérique sur lequel chaque touche correspond à un numéro, il arrive parfois que les opérateurs commettent des fautes de frappes. Peu importe la valeur de ce champ, il faut le récupérer tel quel.

    La suite : exploiter les données

    Imagine que tu rentres de vacances.
    Tu veux voir ce qui s’est passé pendant ton absence.
    Essaie de me faire comprendre le cheminement de ton analyse des erreurs.
    Quel niveau de synthèse voudrais-tu voir d’abord ? Comment vas-tu déceler que quelque chose d’anormal s’est passé et quels types d’information te seraient nécessaires pour cerner le problème ?
    Ceci nous permettra de mettre au point un formulaire de recherche multicritère pour t’aider à mener ton enquête.
    Les analyses ont pour vocations d'être mensuelles et annuelles.
    Exemple d'analyses statistiques:

    Analyse des défauts par panneau:


    --> Traitements des faux défauts (identifier par Erreur= 2, 4 ou 7)
    Pour les faux défauts, il faut récupérer le boitier et la fenêtre, les champ (boitier & fenêtre) permettent de repérer le programme en cause dans le but d'améliorer l'algorithme de contrôle présent dans la machine afin de réduire le nombre de faux défauts.
    --> Traitements des vrais défauts (identifier par Erreur= 1, 5, 6 ou 99)
    Pour les vrais défauts il faut récupérer le boitier et le composant, les champs (boitier & composant) permettent de repérer quels sont les composants qui génèrent le plus de vrais défauts pour agir en amont sur la ligne de production et éventuellement détecter une anomalie sur des process plus haut dans la chaîne de production.

    J'ajoute que certains défauts peuvent être identifié par la valeur 600, en conclusion ils prennent des valeurs numériques. La classification des défauts pour déterminer si ils sont vrai ou faux, se fera je pense dans un second temps lors de l'élaboration des requêtes.

    Après en terme d'analyse,
    il serait intéressant d'une part avoir, pour le traitements des vrais défauts, un pareto pour déterminer les composants les plus touchés par les défauts. Sachant que pour identifier un composant il faut se munir de la clé (Produit, Boitier, Composant).
    D'autre part, pour le traitements des faux défauts, un pareto pour déterminer l'algorithme le moins bien "réglé". Sachant qu'un algorithme est identifié par la clé (Produit, Boitier, Fenêtre).
    Connaitre le top3 ou top10 des produits qui ont le plus de mauvais composant MCompo par rapport à BCompo.

    N.B.: J'ajoute en pièce jointe un exemple de fichier excel utilisé pour l'analyse de la qualité. Certes avec les données d'entrées dont je dispose on ne pourra pas être aussi précis que dans ce fichier, par exemple la nature du défaut.. Mais on peut remplacer la nature du défaut par le code "Erreur". Egalement en ce qui concerne l'identifiant des composant, on ne pourra pas clairement avoir une référence comme dans le fichier mais la clé (Produit, Boitier, Composant) nous permettra quand même d'identifié plus ou moins bien le composant en question. Ce fichier t'aidera à comprendre ce que j'aimerais tirer de cette base je l'espère.

    fichier excel: Pièce jointe 184204

  19. #59
    Membre du Club
    Homme Profil pro
    Développeur Info-Indus
    Inscrit en
    Avril 2015
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Info-Indus
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 202
    Points : 42
    Points
    42
    Par défaut
    J'ai jeté un œil à la dernier base que tu m'as envoyé.
    Mis à part l'identifiant du panneau qui n'est pas le bon (Cf message précédent), elle est très bien. J'ai commencé à me renseigner sur l'élaboration des requête pour obtenir je l’espère des résultats d'analyse.
    Après réflexion je me rend compte que si le numéro de Panneau apparaît plusieurs fois alors cela posera problème si l'on veut savoir quel panneau correspond à quel produits.

    Très fort !! On peut voir les erreurs par panneau !!
    Pièce jointe 184228

    En revanche l'ID du panneau dans la base ne correspond à l'ID des panneaux dans les fichiers .stat.
    Est-ce normal ?

  20. #60
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Attends un peu, on va y aller ensemble pour l'analyse.

    Je sèche actuellement pour l'alimentation de plusieurs journées à la fois. Il y a un bogue : la date reste celle du 1er jour... et je ne trouve pas pourquoi.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

Discussions similaires

  1. Créer une base de données multidimensionnelle pour analyse OLAP
    Par Borowsky dans le forum Conception/Modélisation
    Réponses: 6
    Dernier message: 12/01/2010, 13h26
  2. Comment créer une base de donnée Access ?
    Par Soulama dans le forum Bases de données
    Réponses: 1
    Dernier message: 24/10/2005, 15h56
  3. Créer une base Access avec Delphi
    Par Oluha dans le forum Bases de données
    Réponses: 3
    Dernier message: 11/10/2005, 17h55
  4. créer une base de donnée à partir d'un script
    Par illegalsene dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/08/2005, 15h08
  5. [débutant] Comment créer une base ?
    Par laffreuxthomas dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 14/12/2004, 23h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo