2010-07-12 5 views
1

J'ai passé des heures à essayer de comprendre celui-ci. Ceci est pour une usine de fabrication.MS Access convertir des informations de ligne à la colonne

Une personne sur le plancher de l'usine enregistre leurs activités sur les différentes machines utilisant un système informatique qui produit des données comme ceci:

Empnbr Datestamp Shift Machnbr Time 
00090 6/30/2010 1 0354 11:10 
00090 6/30/2010 1 S  12:00 
00098 6/30/2010 1 0920 7:00 
00098 6/30/2010 1 0143 7:30 
00098 6/30/2010 1 S  15:00 
00101 6/30/2010 1 0920 7:00 
00101 6/30/2010 1 0247 7:30 
00101 6/30/2010 1 0147 7:40 
00101 6/30/2010 1 S  15:00 
00107 6/30/2010 1 0585 7:00 
00107 6/30/2010 1 0143 12:00 
00107 6/30/2010 1 S  15:00 
00109 6/30/2010 1 0920 7:00 
00109 6/30/2010 1 0154 7:30 
00109 6/30/2010 1 0154 9:00 
00109 6/30/2010 1 0154 9:43 
00109 6/30/2010 1 0254 10:49 
00109 6/30/2010 1 0154 12:30 
00109 6/30/2010 1 S  15:00 
00111 6/30/2010 1 0591 5:00 
00111 6/30/2010 1 S  17:00 
00114 6/30/2010 2 0585 15:00 
00114 6/30/2010 2 S  23:00 

Le rapport que je suis en train d'écrire a besoin des informations sous une forme

Empnbr  Datestamp  Shift  Time Start  Time End  Machine 

Ceci me permettra de calculer le temps passé sur chaque machine par personne et par jour. Fondamentalement, Access doit voir le numéro d'un employé, l'horodatage et le changement et prendre la première fois qu'il voit. Ensuite, il doit prendre la prochaine fois qu'il voit et attribuer ce temps à la machine sur la première entrée. Cela continue à se produire jusqu'à ce que Access rencontre une machine "S" qui signifie la déconnexion.

Il est maintenant temps de prendre quelques Advil pour ce mal de tête - merci pour votre aide!

Répondre

0

J'utiliserais une table temporaire. Lorsque vous souhaitez afficher le rapport, utilisez le code VBA pour parcourir votre table d'entrée, générer les données du rapport et remplir la table temporaire. Ensuite, affichez votre rapport en utilisant les données de la table temporaire. La fonction pour remplir la table de rapports ressemblerait à quelque chose comme ceci:

Public Sub BuildReportTable() 
    Dim prevEmp As Integer 
    Dim prevDate As Date 
    Dim prevTime As Date 
    Dim prevMachine As String 
    Dim prevShift As Integer 
    Dim rs As Recordset 

    'Empty report table 
    CurrentDb.Execute "delete from tblHourReport" 

    'Open the data table 
    Set rs = CurrentDb.OpenRecordset("tblHours", dbOpenDynaset) 
    If Not rs.EOF Then rs.MoveFirst 

    'Loop over each data record and create the report record 
    prevEmp = 0 
    Do While Not rs.EOF 
     If prevEmp <> 0 And prevMachine <> "S" Then 
      DoCmd.SetWarnings False 
      DoCmd.RunSQL "insert into tblHourReport values (" _ 
       & prevEmp & ", '" _ 
       & prevDate & "', '" _ 
       & prevMachine & "', " _ 
       & prevShift & ", '" _ 
       & prevTime & "', '" _ 
       & rs!Time & "');" 
      DoCmd.SetWarnings True 
     End If 
     prevDate = rs!Date 
     prevShift = rs!shift 
     prevEmp = rs!employee 
     prevTime = rs!Time 
     prevMachine = rs!machine 
     rs.MoveNext 
    Loop 
End Sub 
0

Y at-il des raisons pour lesquelles une requête de regroupement ne conviendrait pas? Par exemple:

SELECT Empnbr, Datestamp, Shift, Machnbr, 
     Min(CDate([datestamp] & " " & [Time])) AS TimeStart, 
     Max(CDate([datestamp] & " " & [Time])) AS TimeEnd 
FROM MachineLog 
GROUP BY Empnbr, Datestamp, Shift, Machnbr 

EDIT re commentaire

Peut-être:

SELECT m.Empnbr, m.Datestamp, m.Shift, m.Machnbr, 
    Nz((SELECT Max(CDate([datestamp] & " " & [Time])) 
     FROM MachineLog x WHERE x.Empnbr=m.Empnbr 
     AND x.Machnbr<m.Machnbr),CDate([datestamp] & " 08:00")) AS st, 
    Max(CDate([datestamp] & " " & [Time])) AS TimeEnd 
FROM MachineLog m 
GROUP BY m.Empnbr, m.Datestamp, m.Shift, m.Machnbr 
+0

Parce que le temps final aura un numéro de machine. L'heure de début sur une machine est l'heure de fin de la machine précédente. – BenV

+0

J'ai ajouté une note. – Fionnuala

Questions connexes