INSERT INTO增量控制字段

时间:2012-06-26 11:29:02

标签: sql ms-access

我正在使用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?]);

2 个答案:

答案 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

注意:

  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"的印象。
  6. 在您提及的评论" 使用字段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));