"Merging" Access Web App 中使用数据宏的表

"Merging" tables in Access Web App using Data Macro

我构建了一个 Access Web App (2013) 来跟踪客户的设备清单。他们希望能够使用从订单生成的 Excel 电子表格来批量更新数据库。我已经知道在 AWA 中无法将 import/update 数据转换为现有的 table,因此我正在尝试构建一个数据宏,将导入的 table 与现有的 table,并添加新记录,或编辑现有记录。

现在,我只是想让第一部分工作 - 添加新记录。但是,无论我尝试什么,我的数据宏都会给我错误 "Access can't convert the value of 'N/A' to the specified data type."

我在宏上有 运行 跟踪,它表明它完美地完成了每个步骤,直到最后 - 它将创建新记录,设置我正在测试的 2 个字段.. . 然后尝试再次创建记录。它卡住了,因为它没有返回到导入的 table 的下一个 "For Each Record" 循环。我已经尝试在创建记录之后执行 "Stop Macro" 以查看是否可以让它只执行第一条记录,但它仍然尝试再次 运行 并失败。

我在一页上发现有人说 "Data Macros forbid the use of “CreateRecord cannot be used inside of a ForEachRecord””,但我在任何地方都找不到任何支持它的东西。

不幸的是,我没有足够的 post 图片甚至 link 声誉点数,所以我将尝试准确地表示我的宏和下面的跟踪(请原谅我的亲戚网站的新颖性:( ).

我的宏看起来是这样的:

For Each Record In ImportTest
      Where Condition
   SetLocalVar
              Name IsMatch
              Expression = 0
   Look Up A Record In Inventory List
            Where Condition = [InventoryList].[SerialNumber]=[ImportTest].[Serial Number]
      SetLocalVar
                  Name IsMatch
                  Expression = 1
  If [IsMatch]=0 Then
     Create a Record In Inventory List
        Set Field
            Name InventoryList.BuildingName
            Value = 1
        Set Field
            Name InventoryList.SerialNumber
            Value = [ImportTest].[Serial Number]
  End If

所以要解释我的目标是什么,以防我做错了:"For Each Record In ImportTest" 正在查看导入的 table(没有 where 条件,因为我想要所有这些)。第一个 "SetLocalVar IsMatch" 是让宏知道导入 table 中的序列号是否与现有 InventoryList table 中的另一条记录匹配(这是我随后更新该记录的地方,一旦我全部工作)。接下来是我的 "If [IsMatch]=0",它检查是否找到了匹配的记录(如果之前找到了匹配项,则会设置为 1)。由于未找到匹配项,它会使用 For Each Record 循环指向的当前记录在 InventoryList 中创建一条记录。我实际上还有许多其他字段将被设置,但这两个只是为了我的概念证明(我的 InventoryList 需要这两个字段)。此时,它应该完成添加记录,然后结束循环,并重新开始。但是,我的跟踪显示 "CreateRecord" 抛出 SQL 异常:

MacroName-ActionName-Operand-Output-TargetRow-RuntimeErrorMessage
ImportMacro-ForEachRecord-ImportTest;---
ImportMacro-ForEachRecord---[ID] = 1 ; [Serial Number] = TESTTEST1 ; [Building Name] = Glendaal Elementary School-
ImportMacro-SetLocalVar-IsMatch-0.000000--
ImportMacro-LookupRecord-InventoryList;WHERE [InventoryList].[SerialNumber]=[ImportTest].[Serial Number]---
ImportMacro-If-[IsMatch]=0---
ImportMacro-CreateRecord----
ImportMacro-If-[ImportTest].[Building Name]="Glendaal Elementary School"---
ImportMacro-SetField-InventoryList.BuildingName-1--
ImportMacro-SetField-InventoryList.SerialNumber-TESTTEST1--
ImportMacro-CreateRecord----SQL exception

我不明白为什么最后 "CreateRecord" 会抛出异常。有没有人看到我可能遗漏了什么,或者对如何进行有建议?

提前感谢所有提供帮助的人。 ~SetsunaMH

ImportTest 数据宏的当前版本:

<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<DataMacros xmlns="http://schemas.microsoft.com/office/accessservices/2010/12/application"><DataMacro><Statements><ForEachRecord><Data><Reference>ImportTest</Reference></Data><Statements><Action Name="SetLocalVar"><Argument Name="Name">IsMatch</Argument><ExpressionArgument Name="Value"><Expression><Original>0</Original><IntegerLiteral Value="0"/></Expression></ExpressionArgument></Action><LookUpRecord><Data><Reference>InventoryList</Reference><WhereCondition><Expression><Original>[InventoryList].[SerialNumber]=[ImportTest].[Serial Number]</Original><FunctionCall Name="="><Identifier Name="InventoryList.SerialNumber" Index="0"/><Identifier Name="ImportTest.Serial Number" Index="1"/></FunctionCall></Expression></WhereCondition></Data><Statements><Action Name="SetLocalVar"><Argument Name="Name">IsMatch</Argument><ExpressionArgument Name="Value"><Expression><Original>1</Original><IntegerLiteral Value="1"/></Expression></ExpressionArgument></Action></Statements></LookUpRecord><ConditionalBlock><If><Condition><Expression><Original>[IsMatch]=0</Original><FunctionCall Name="="><Identifier Name="IsMatch" Index="0"/><IntegerLiteral Value="0" Index="1"/></FunctionCall></Expression></Condition><Statements><CreateRecord><Data><Reference>InventoryList</Reference></Data><Statements><Action Name="SetField"><Argument Name="Field">InventoryList.BuildingName</Argument><ExpressionArgument Name="Value"><Expression><Original>1</Original><IntegerLiteral Value="1"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.SerialNumber</Argument><ExpressionArgument Name="Value"><Expression><Original>[ImportTest].[Serial Number]</Original><Identifier Name="ImportTest.Serial Number"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.Model</Argument><ExpressionArgument Name="Value"><Expression><Original>8</Original><IntegerLiteral Value="8"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.RoomDescription</Argument><ExpressionArgument Name="Value"><Expression><Original>1</Original><IntegerLiteral Value="1"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.Manufacturer</Argument><ExpressionArgument Name="Value"><Expression><Original>1</Original><IntegerLiteral Value="1"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.DeviceName</Argument><ExpressionArgument Name="Value"><Expression><Original>[ImportTest].[Device Name]</Original><Identifier Name="ImportTest.Device Name"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.ImagePackage</Argument><ExpressionArgument Name="Value"><Expression><Original>[ImportTest].[Image Package]</Original><Identifier Name="ImportTest.Image Package"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.NeedsVerification</Argument><ExpressionArgument Name="Value"><Expression><Original>[ImportTest].[Needs Verification]</Original><Identifier Name="ImportTest.Needs Verification"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.NewLocation</Argument><ExpressionArgument Name="Value"><Expression><Original>[ImportTest].[New Location]</Original><Identifier Name="ImportTest.New Location"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.OneOffs</Argument><ExpressionArgument Name="Value"><Expression><Original>[ImportTest].[One Offs]</Original><Identifier Name="ImportTest.One Offs"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.PurchasedDate</Argument><ExpressionArgument Name="Value"><Expression><Original>[ImportTest].[Purchased Date]</Original><Identifier Name="ImportTest.Purchased Date"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.Retired</Argument><ExpressionArgument Name="Value"><Expression><Original>[ImportTest].[Retired]</Original><Identifier Name="ImportTest.Retired"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.Software1</Argument><ExpressionArgument Name="Value"><Expression><Original>67</Original><IntegerLiteral Value="67"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.Software2</Argument><ExpressionArgument Name="Value"><Expression><Original>67</Original><IntegerLiteral Value="67"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.Software3</Argument><ExpressionArgument Name="Value"><Expression><Original>67</Original><IntegerLiteral Value="67"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.Software4</Argument><ExpressionArgument Name="Value"><Expression><Original>67</Original><IntegerLiteral Value="67"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.Software5</Argument><ExpressionArgument Name="Value"><Expression><Original>67</Original><IntegerLiteral Value="67"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.Staff-Student</Argument><ExpressionArgument Name="Value"><Expression><Original>[ImportTest].[Staff-Student]</Original><Identifier Name="ImportTest.Staff-Student"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.Swap</Argument><ExpressionArgument Name="Value"><Expression><Original>[ImportTest].[Swap]</Original><Identifier Name="ImportTest.Swap"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.TagNumber</Argument><ExpressionArgument Name="Value"><Expression><Original>[ImportTest].[Tag Number]</Original><Identifier Name="ImportTest.Tag Number"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.TopUser</Argument><ExpressionArgument Name="Value"><Expression><Original>[ImportTest].[Top User]</Original><Identifier Name="ImportTest.Top User"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.Warranty</Argument><ExpressionArgument Name="Value"><Expression><Original>[ImportTest].[Warranty]</Original><Identifier Name="ImportTest.Warranty"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.Comments</Argument><ExpressionArgument Name="Value"><Expression><Original>"Test"</Original><StringLiteral Value="Test"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.CreatedBy</Argument><ExpressionArgument Name="Value"><Expression><Original>"Test"</Original><StringLiteral Value="Test"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">InventoryList.UpdatedBy</Argument><ExpressionArgument Name="Value"><Expression><Original>""</Original><StringLiteral Value=""/></Expression></ExpressionArgument></Action></Statements></CreateRecord></Statements></If></ConditionalBlock></Statements></ForEachRecord></Statements></DataMacro></DataMacros>

InventoryList Table 的 Current On Update 宏(当前已停止,以便不会引起问题,也不会在开发中使我的 AuditTrail table 过载。此宏已经过多人测试立即使用数据库,效果非常好)。

<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<DataMacros xmlns="http://schemas.microsoft.com/office/accessservices/2010/12/application"><DataMacro Event="AfterUpdate"><Statements><Comment>Macro is stopped to not overload AuditTrail during changes made to initial data.</Comment><Action Name="StopMacro"/><Comment>Save the Old values</Comment><CreateRecord><Data><Reference>AuditTrail</Reference></Data><Statements><Action Name="SetField"><Argument Name="Field">AuditTrail.OldNew</Argument><ExpressionArgument Name="Value"><Expression><Original>"Old"</Original><StringLiteral Value="Old"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.RecordID</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[ID]</Original><Identifier Name="InventoryList.ID"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.Timestamp</Argument><ExpressionArgument Name="Value"><Expression><Original>Now()</Original><FunctionCall Name="Now"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.ChangedBy</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[UpdatedBy]</Original><Identifier Name="InventoryList.UpdatedBy"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.BuildingName</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[BuildingName]</Original><Identifier Name="Old.BuildingName"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.RoomDescription</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[RoomDescription]</Original><Identifier Name="Old.RoomDescription"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.Manufacturer</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[Manufacturer]</Original><Identifier Name="Old.Manufacturer"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.Model</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[Model]</Original><Identifier Name="Old.Model"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.DeviceName</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[DeviceName]</Original><Identifier Name="Old.DeviceName"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.TopUser</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[TopUser]</Original><Identifier Name="Old.TopUser"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.Staff-Student</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[Staff-Student]</Original><Identifier Name="Old.Staff-Student"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.SerialNumber</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[SerialNumber]</Original><Identifier Name="Old.SerialNumber"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.TagNumber</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[TagNumber]</Original><Identifier Name="Old.TagNumber"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.PurchasedDate</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[PurchasedDate]</Original><Identifier Name="Old.PurchasedDate"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.Warranty</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[Warranty]</Original><Identifier Name="Old.Warranty"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.ImagePackage</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[ImagePackage]</Original><Identifier Name="Old.ImagePackage"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.Swap</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[Swap]</Original><Identifier Name="Old.Swap"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.NewLocation</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[NewLocation]</Original><Identifier Name="Old.NewLocation"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.Retired</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[Retired]</Original><Identifier Name="Old.Retired"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.OneOffs</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[OneOffs]</Original><Identifier Name="Old.OneOffs"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.Comments</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[Comments]</Original><Identifier Name="Old.Comments"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.NeedsVerification</Argument><ExpressionArgument Name="Value"><Expression><Original>[Old].[NeedsVerification]</Original><Identifier Name="Old.NeedsVerification"/></Expression></ExpressionArgument></Action></Statements></CreateRecord><Comment>Save the New values</Comment><CreateRecord><Data><Reference>AuditTrail</Reference></Data><Statements><Action Name="SetField"><Argument Name="Field">AuditTrail.OldNew</Argument><ExpressionArgument Name="Value"><Expression><Original>"New"</Original><StringLiteral Value="New"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.RecordID</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[ID]</Original><Identifier Name="InventoryList.ID"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.Timestamp</Argument><ExpressionArgument Name="Value"><Expression><Original>Now()</Original><FunctionCall Name="Now"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.ChangedBy</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[UpdatedBy]</Original><Identifier Name="InventoryList.UpdatedBy"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.BuildingName</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[BuildingName]</Original><Identifier Name="InventoryList.BuildingName"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.RoomDescription</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[RoomDescription]</Original><Identifier Name="InventoryList.RoomDescription"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.Manufacturer</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[Manufacturer]</Original><Identifier Name="InventoryList.Manufacturer"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.Model</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[Model]</Original><Identifier Name="InventoryList.Model"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.DeviceName</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[DeviceName]</Original><Identifier Name="InventoryList.DeviceName"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.TopUser</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[TopUser]</Original><Identifier Name="InventoryList.TopUser"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.Staff-Student</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[Staff-Student]</Original><Identifier Name="InventoryList.Staff-Student"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.SerialNumber</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[SerialNumber]</Original><Identifier Name="InventoryList.SerialNumber"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.TagNumber</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[TagNumber]</Original><Identifier Name="InventoryList.TagNumber"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.PurchasedDate</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[PurchasedDate]</Original><Identifier Name="InventoryList.PurchasedDate"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.Warranty</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[Warranty]</Original><Identifier Name="InventoryList.Warranty"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.ImagePackage</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[ImagePackage]</Original><Identifier Name="InventoryList.ImagePackage"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.Swap</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[Swap]</Original><Identifier Name="InventoryList.Swap"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.NewLocation</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[NewLocation]</Original><Identifier Name="InventoryList.NewLocation"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.Retired</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[Retired]</Original><Identifier Name="InventoryList.Retired"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.OneOffs</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[OneOffs]</Original><Identifier Name="InventoryList.OneOffs"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.Comments</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[Comments]</Original><Identifier Name="InventoryList.Comments"/></Expression></ExpressionArgument></Action><Action Name="SetField"><Argument Name="Field">AuditTrail.NeedsVerification</Argument><ExpressionArgument Name="Value"><Expression><Original>[InventoryList].[NeedsVerification]</Original><Identifier Name="InventoryList.NeedsVerification"/></Expression></ExpressionArgument></Action></Statements></CreateRecord></Statements></DataMacro></DataMacros>

检查 Access Web 应用程序包后,我确定了问题所在。您当前已将默认值 属性 分配给 InventoryList table 中的每个软件查找字段 (1-5)。我删除了每个字段的默认值。然后我将一些示例虚拟数据放入相关的 table 中。您在列表视图上的按钮当前设置为 运行 ImportMacro2 数据宏。当我现在 运行 时,宏无误地完成并且数据被插入到 InventoryList 中。您不能使用 N/A 作为默认值,因为这些是仅接受 ID(数字)的查找字段。