3

我正在使用 MS-ACCESS 数据库。从我使用的项目中并提出了一些其他问题,表 NOEUDS 和 INFRA(应该更新):

表 INFRA:

RECNO   -   NOEUD   -   SECURISE    
00000008    C002         F    
00000005    C009         F    
00000001    C035         F    
00000002    C001         F    
00000003    C036         F    
00000006    C012         F    
00000007    C013         F

表NOEUDS:

NOEUD   TYPE_MAT  N_AMONT       
C021     COF       100          
C022     COF       229          
C023     COF       130          
C002     COF       111

我想创建一个查询,在 NOEUDS 上检查 INFRA 表中缺少的节点 C*,如果没有,则应插入一个新的。问题是 RECNO 字段用作控件并且不能复制(不是主键,因为所有数据库只是控制它的程序的存储库)。所有字段都是文本,因此 RECNO 是使用 HEX 数字的连续计数,如图所示。

我使用查询来选择:

SELECT (SELECT MAX(CINT(INFRA.RECNO))+1 AS N FROM INFRA), 
       NOEUDS.NOEUD, "F" AS Expr2
FROM NOEUDS
WHERE (((NOEUDS.NOEUD) Like "C*" 
       And (NOEUDS.NOEUD) Not In (SELECT NOEUD FROM INFRA)));

结果是:

9   C021   F    
9   C022   F    
9   C023   F

应该:

9   C021   F    
A   C022   F    
B   C023   F

我需要一些帮助,所以我可以在 00000019 传递到 0000001A 之后以十六进制计数插入正确的 RECNO 等等。

提前致谢

更新 1:

我们使用的程序使用 Access 数据库作为存储。当我使用该程序添加 noeud 时,我必须使用地图所需的菜单和构建信息插入更多信息。问题是很多信息是多余的,程序无法自动处理。我正在尝试使用查询来工作并插入可能的信息。

每次我在 noeuds 表中插入一个 noeud 时,都需要在 INFRA 表中插入一行,仅使用 RECNO(从最后一个开始依次计数)、NOEUD 和其他一些信息(以完成 autocad 表标记)。由于我有数百台 Cxxx、Bxxx、Pxxx、Gxxx 设备,我为每个项目节省了几个小时的无聊工作。

我需要帮助计算为 NOEUDS 表中找到的每个 NOEUD 添加 RECNO 的顺序方式,这些 NOEUD 将插入 INFRA 表中。

更新 2:

我正在手动插入每个 noeud。是否有可能以一种方式加入,它从我想要插入的 noeuds 中获取列表,而不是 1 对 1 进行它获取列表并按顺序执行?

2个查询是:

我想在 INFRA 表中添加的装备:

SELECT NOEUDS.NOEUD FROM NOEUDS WHERE (((NOEUDS.NOEUD) Like "C*" And (NOEUDS.NOEUD) Not In (SELECT NOEUD FROM INFRA)));

手动插入:

插入 INFRA (recno, NOEUD, SECURISE) SELECT (SELECT Right(String(8, "0") & Hex(Max(Val("&H" & RECNO)) + 1), 8) AS N FROM INFRA), NOEUDS .NOEUD, "F" AS Expr2 来自 NOEUDS WHERE (NOEUDS.NOEUD=[INSERT CHAMBRE?]);

4

2 回答 2

1

虽然我不太了解你的问题,但我希望这个答案能提供你可以使用的东西。

我的INFRA表有一个名为RECNO. 该表包含一行。

RECNO
00000019

这个查询给我“1A”作为N

SELECT Hex(Max(Val("&H" & RECNO)) + 1) AS N
FROM INFRA;

要将零填充N到 8 的宽度,我可以使用这个查询,它给我 "0000001A" as N

SELECT Right(String(8, "0") & Hex(Max(Val("&H" & RECNO)) + 1), 8) AS N
FROM INFRA;

关于您的其余问题,我的直觉是打开一个包含不匹配NOEUDS.NOEUD值的记录集,然后浏览记录集行并将每个NOEUD值、您的自定义RECNO序列号和“其他信息”插入INFRA表中。

于 2012-06-26T13:30:30.997 回答
1

我认为 VBA 解决方案应该比尝试只使用 SQL 做你想做的更好。如果您没有太多的 VBA 经验,它仍然可以实现,因为所需的 VBA 应该是相当基本的。看看这个代码大纲是否足以让你开始。

Public Sub AddToInfra()
    Const cstrQuery As String = "qryUnmatchedNoeuds" ' Note 1 '
    Dim db As DAO.Database ' Note 2 '
    Dim fld As DAO.Field
    Dim rsFrom As DAO.Recordset
    Dim rsTo As DAO.Recordset

    Set db = CurrentDb
    Set rsFrom = db.OpenRecordset(cstrQuery, dbOpenSnapshot)
    Set rsTo = db.OpenRecordset("infra", dbOpenTable, dbAppendOnly)

    Do While Not rsFrom.EOF
        rsTo.AddNew
        For Each fld In rsFrom.Fields ' Note 3 '
            If Not fld.Name = "RECNO" Then
                rsTo.Fields(fld.Name).Value = fld.Value
            End If
        Next fld
        rsTo!RECNO = Next_InfraRecno ' Note 4 '
        rsTo!SECURISE = "F" ' Note 5 '
        rsTo.Update
        rsFrom.MoveNext
    Loop

    rsTo.Close
    rsFrom.Close
    Set fld = Nothing
    Set rsFrom = Nothing
    Set rsTo = Nothing
    Set db = Nothing
End Sub

笔记:

  1. 我根据我对您想要的最佳猜测使用了保存的查询。请参阅下面的 SQL。
  2. DAO.Database需要对 Microsoft DAO 对象库的引用。如果您的 Access 版本是 2000 或 Access XP,您可能需要设置该引用(从 VBE 主菜单,工具 -> 引用)。
  3. 我决定目标表将包含与源记录集中字段的名称和数据类型匹配的字段。如果这对您不起作用,请为每个常见字段替换类似的内容:(如果您愿意,请rsTo!YourFieldNameHere.Value = rsTo!YourFieldNameHere.Value放弃。).Value
  4. 创建一个Next_InfraRecno()函数以返回下一个RECNO值。将我们之前使用的方法转换为函数。如果您遇到麻烦,请发布一个新问题...向我们展示您的代码、错误消息和触发错误的行(如果有),以及我们需要知道的任何其他信息。:-)
  5. SECURISE = "F"对于插入的每一行,我都得到了您想要的印象。

在您提到的评论中“使用字段 ANCIEN 存储计数”。我不知道这涉及到什么,希望无论它是什么,你都可以将它集成到这个代码大纲中。如果没有,对不起。:-(

这是我的qryUnmatchedNoeuds查询的 SQL:

SELECT n.DELETED, n.NOEUD
FROM
    noeuds AS n
    LEFT JOIN infra AS i
    ON n.NOEUD = i.NOEUD
WHERE
        (((n.NOEUD) Like "c*")
    AND ((i.NOEUD) Is Null));
于 2012-06-30T00:26:06.637 回答