首页 > 解决方案 > 使用条件 MS 访问进行序列化的问题

问题描述

嗨,伙计们,很高兴来到这里。我在 MS Access 中使用条件进行序列化时遇到问题。假设我有许多机器工作 2 班。每个班次我都会收到每台机器的停机时间报告,同一班次中的同一台机器可能有不止一个问题。我的目标是计算这些问题并为它制作一个序列化的序列。例如,我在 Excel 中使用 countifs 公式制作并且效果很好 - 见图。4个条件(PoNumber-Shift-MachineNumber-Zdate) 计数结果

我尝试了我在 Access 中所知道的一切,但被卡住了。我尝试了 Count(IIf()) 但没有得到想要的结果,这样做的方法是一个记录集函数,我没有能力做到这一点。任何帮助赞赏的家伙。

编辑#1:伙计们,我以前尝试过以下

SELECT TblDownTime.PONumber, TblDownTime.Zdate, TblDownTime.Shift, TblDownTime.MachineNumber AS MachineNum, Count(TblDownTime.Shift) AS CountOfShift
FROM TblDownTime
GROUP BY TblDownTime.PONumber, TblDownTime.Zdate, TblDownTime.Shift, TblDownTime.MachineNumber
HAVING (((TblDownTime.PONumber)=[Forms]![FrmDownTime]![PONum]) AND ((TblDownTime.Zdate)=[Forms]![FrmDownTime]![Zzdate]) AND ((TblDownTime.Shift)=[Forms]![FrmDownTime]![Shift]) AND ((TblDownTime.MachineNumber)=[Forms]![FrmDownTime]![MachineNumber]));

这是一个查询,它应用我的条件并在表单中返回每个停机原因的最后一个序列作为变量 (Sr)。然后在表单中的 MachineNumber 字段中更新后Me.Serial = Sr+1。这种方式适用于一条一条记录,但是当我尝试粘贴 20 条记录时,它计算错误并有时给我重复。所以这不是最好的方法。我需要一种可以很好地同时粘贴多条记录的方法。再次感谢。

编辑#2 我使用生成的序列号格式化为“Num”&Serial 类似于 Num1,Num2 以在以下查询中使用

SELECT TblDownTime.PONumber, TblDownTime.Zdate, TblDownTime.Shift, TblDownTime.MachineNumber, 
IIf([SerialFormat]="Num1" And [MachineNumber]=[MachineNumber],[ReasonCode],"") AS Code1, 
IIf([SerialFormat]="Num1" And [MachineNumber]=[MachineNumber],[Reason],"") AS Reason1, 
IIf([SerialFormat]="Num1" And [MachineNumber]=[MachineNumber],[DepartmentResponsible],"") AS Dept1, 
IIf([SerialFormat]="Num1" And [MachineNumber]=[MachineNumber],[StoppedFrom],"") AS From1, 
IIf([SerialFormat]="Num1" And [MachineNumber]=[MachineNumber],[StoppedTo],"") AS To1, 
IIf([SerialFormat]="Num1" And [MachineNumber]=[MachineNumber],[TotalDownTime/Min],"") AS TotalDownTime1
FROM TblDownTime
WHERE (((IIf([SerialFormat]="Num1" And [MachineNumber]=[MachineNumber],[ReasonCode],""))<>""));

明天我会在评论中尝试另一种方式,如果有人帮助我使用直接在桌面上运行的记录集功能,我将不胜感激,我会在我的表单中的 OnClose 事件中使用它。非常感谢

标签: ms-accesssequence

解决方案


这是一个需要考虑的过程。从最能满足您需求的任何活动中致电。

Sub MakeNum()
Dim rs As DAO.Recordset, intS As Integer, strG As String
Set rs = CurrentDb.OpenRecordset("SELECT PONumber & MachineNumber & ZDate & Shift AS Grp, ReasonSerial " & _
                 "FROM tblDowntime WHERE ReasonSerial Is Null ORDER BY PONumber, MachineNumber, ZDate, Shift, ID")
strG = rs!grp
While Not rs.EOF
    If strG = rs!grp Then
        intS = intS + 1
        rs.Edit
        rs!ReasonSerial = intS
        rs.Update
        rs.MoveNext
    Else
        intS = 0
        strG = rs!grp
    End If
Wend
End Sub

它只编辑 ReasonSerial 为 Null 的新记录。如果您需要重新计算所有记录的序列,则在过程开始时包含一个 UPDATE:
CurrentDb.Execute "UPDATE tblDowntime SET ReasonSerial=Null"


推荐阅读