我正在使用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时,我必须使用地图所需的菜单和内置信息插入更多信息。问题是很多信息是多余的,程序无法自动处理。我正在尝试使用lees并使用查询插入可能的信息。
每次在noeuds表中插入noeud时,都需要在INFRA表中插入一行只有RECNO(从最后一个顺序计数),NOEUD和其他一些信息(以完成autocad表标记)。由于我有数百台Cxxx,Bxxx,Pxxx,Gxxx设备,我每个项目都会花费一些小时的无聊工作。
我需要帮助计算为将在INFRA表中插入的NOEUDS表中的每个NOEUD添加RECNO的顺序方式。
更新2:
我手动插入每个noeud。是否有可能以一种方式加入,它从我要插入的noeuds中获取列表,并且以1为单位执行,它采用列表并按顺序执行?
这两个查询是:
我想在表INFRA添加的设备:
SELECT NOEUDS.NOEUD 从NOEUDS 在哪里(((NOEUDS.NOEUD)喜欢“C *”和(NOEUDS.NOEUD)不在(从INFRA中选择NOEUD));
手工插入:
插入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 在哪里(NOEUDS.NOEUD = [INSERT CHAMBRE?]);
答案 0 :(得分:1)
虽然我不太了解你的问题,但我希望这个答案能提供你可以使用的东西。
我的INFRA
表有一个名为RECNO
的文本列。该表包含一行。
RECNO
00000019
此查询将“1A”作为N
。
SELECT Hex(Max(Val("&H" & RECNO)) + 1) AS N
FROM INFRA;
要将N
用零填充到宽度为8,我可以使用此查询,它将“0000001A”作为N
。
SELECT Right(String(8, "0") & Hex(Max(Val("&H" & RECNO)) + 1), 8) AS N
FROM INFRA;
关于问题的其余部分,我的直觉是打开包含无法匹配的NOEUDS.NOEUD
值的记录集,然后浏览记录集行并插入每个NOEUD
值,即自定义{{1}序列号,以及RECNO
表中的“其他信息”。
答案 1 :(得分: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
注意:
DAO.Database
需要对Microsoft DAO对象库的引用。如果您的Access版本是2000或Access XP,您可能需要设置该引用(从VBE主菜单,工具 - >参考)。rsTo!YourFieldNameHere.Value = rsTo!YourFieldNameHere.Value
(如果您愿意,请删除.Value
。)Next_InfraRecno()
函数以返回下一个RECNO
值。将我们之前使用的方法转换为函数。如果您遇到麻烦,请发布一个新问题...向我们展示您的代码,错误消息和触发错误的行(如果有的话),以及我们需要知道的任何其他内容。 : - )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));