【问题标题】:Problem With Making Sequenced Serial with condition MS Access使用条件 MS 访问进行序列化的问题
【发布时间】:2021-02-24 17:50:36
【问题描述】:

大家好,很高兴来到这里。我在 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)。然后在 Me.Serial = Sr+1 形式的 MachineNumber 字段中更新后。这种方式适用于一条一条记录,但是当我尝试粘贴 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],""))<>""));

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

【问题讨论】:

  • 这能回答你的问题吗? MS Access Restart Number Sequence
  • 不,这不是因为两个原因:首先我有 4 个可变条件其次我在更新 MachineNumber 后在表单中尝试了类似的想法,如果我当时输入一条记录,它计算得很好,但是例如,如果我试图复制和粘贴 30 条记录,它会计算错误并有时会出现一些重复,所以我不能这样做。感谢您的建议
  • 扩展 SQL 以使用 4 个链接字段而不是示例中的 1。表中有自动编号字段吗?建议的查询语法绝对适用于您的数据。事件中的代码是什么?记录需要提交到表格,然后可能刷新表格。表格不是您想要的最佳工具。报告最适合这种计算。
  • 计算这个序列和保存到表是不同的问题。建议不要保存到表中,特别是如果您想使用复制/粘贴,因为这将需要完全不同的方法来解决(VBA 打开记录集和循环记录以保存增量值),而不是在 MachineNumber AfterUpdate 事件中。
  • 请阅读我在问题中的编辑#1,关于它确实存在于表中的自动编号字段作为 ID,如果我在其他一些查询中不使用序列号,报告可能是个好主意我使用生成的序列并与“Num”配对,就像 Num1、Num2、Num3 等。最后我在其他查询中使用这个新形状作为一列,将所有问题集中在一行中,例如 MachineNumber M202 的列具有与问题第 1 列相同的数字将类似于 Num1 问题,开始时间和结束时间以及总停机时间都在一行中我希望我能解释更多

标签: ms-access sequence


【解决方案1】:

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

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"

【讨论】:

  • 干得好,兄弟,我感激不尽,非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 2015-10-03
相关资源
最近更新 更多