gpt4 book ai didi

sql - INSERT INTO 增量控制字段

转载 作者:行者123 更新时间:2023-12-02 02:14:32 25 4
gpt4 key购买 nike

我正在使用 MS-ACCESS 数据库。从项目中我使用并提出了一些其他问题表 NOEUDS 和 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

表格节点:

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

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

我使用查询来选择:

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 时,我必须使用 map 所需的菜单和构建信息插入更多信息。问题是很多信息是多余的,程序不能自动处理。我正在尝试工作并使用查询插入可能的信息。

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

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

更新 2:

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

这两个查询是:

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

选择 NOEUDS.NOEUD来自诺伊兹WHERE (((NOEUDS.NOEUD) Like "C*"And (NOEUDS.NOEUD) Not In (SELECT NOEUD FROM 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来自诺伊兹WHERE (NOEUDS.NOEUD=[INSERT CHAMBRE?]);

最佳答案

我认为 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. 我决定目标表将包含与源记录集中字段的名称和数据类型相匹配的字段。如果这对您不起作用,请为每个公共(public)字段替换类似这样的内容:rsTo!YourFieldNameHere.Value = rsTo!YourFieldNameHere.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));

关于sql - INSERT INTO 增量控制字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11206372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com