如何将多行更新或插入语句绑定到表单?

时间:2011-06-17 16:31:48

标签: sql forms ms-access

我有表格价格

  • ID - 主键,自动编号长整数
  • PriceDate - 日期
  • 价格 - 货币
  • 数量 - 数量,DECIMAL子类型
  • UnitPrice - Number,DECIMAL子类型(运行更新语句以使其与价格和数量保持同步,但它只是方便索引......可能它会被我的查询中的表达式替换)
  • ItemNote - 文字
  • NewStores_ID - 长整数键,查找另一个商店表
  • NewItems_ID - 长整数键,查找另一个项目表

要在给定日期输入给定商店的价格,我希望能够在表单上选择商店和日期ONCE,然后在数据表中单独输入商品。由于原因不明,这证明是困难的。

我可以创建一个子表单,将除了商店和价格之外的所有内容绑定到临时表TempPrices,其结构与原始结构相同。然后我运行SQL语句

INSERT INTO Prices 
    (PriceDate,Price,Quantity,UnitPrice,Brand,ItemNote,NewStores_ID,NewItems_ID)
    SELECT 
        PriceDate,Price,Quantity,Price/Quantity AS 
            UnitPrice,Brand,ItemNote,NewStores_ID,NewItems_ID) 
    FROM Temp_Prices;

这会将所有新行提供给主表。但是,当我只想设置商店和日期一次时,我遇到了问题。我已尝试在insert语句中使用命名参数作为日期存储...这可能会导致弹出提示,但我无法将其绑定到表单控件。我已经尝试将临时表中的那些字段的更新语句绑定到表单...但它甚至没有显示绑定多行更新的选项。

如何以最少的笨拙hackery使用它?似乎应该有一个简单的解决方案,如果我使用像PHP或JDBC这样的东西,我只会运行一个额外的查询。

编辑:将Quantity和UnitPrice的存储类型更改为Number,Decimal子类型代替double float。这样人们就不会因为在货币附近使用浮动而哭泣。这对我的使用没有任何问题,但是有足够的人对此做出了下意识的反应。

编辑2:表单/子表单 我正在尝试将其构建为主表单,其中包含用于输入商店名称和日期的字段,或用于输入商店名称和日期的子表单,然后是用于输入定价数据的子表单映射到临时表。有一个操作按钮来运行插入/更新查询以将临时表转储到我的主价格表中并清除临时表。但是,问题在于我无法弄清楚如何将master(或子表单)中的日期/存储字段绑定到一次应用于所有新行的插入/更新值。

编辑3:SQL语句(为清晰起见)

INSERT INTO 
    PRICES(NewStores_ID,PriceDate,NewItems_ID,Brand,Price,Quantity,
            UnitPrice,ItemNote)
    SELECT 
    @MyStore_ID,@MyPriceDate,NewItems_ID,Brand,Price,Quantity,
            Price/Quantity,ItemNote 
    FROM TempPrices;

UPDATE TempPrices SET PriceDate=@MyPriceDate,NewStores_ID=@MyStoreID;

对于这些查询,我无法将@MyStore_ID或@MyPriceDate的参数绑定到任何形式的字段。尝试将查询链接到表单时,查询不会显示为选项。我可以运行它们并获得弹出框来输入参数,但这不是我想要的。

2 个答案:

答案 0 :(得分:2)

这是我的目标:

我希望能够在表单上选择商店和日期ONCE,然后在数据表中单独输入项目。

但是,如果你有理由需要使用临时表和DML语句,那么这个建议就没用了。

我创建了一个只包含4个字段的价格表,然后在该表上查询我用作表单的记录源“fsubPrices”:

SELECT p.ID, p.NewStores_ID, p.PriceDate, p.Price
FROM Prices AS p
ORDER BY p.NewStores_ID, p.PriceDate;

表单的文本框(txtNewStores_ID,txtPriceDate和txtPrice)绑定到类似命名的查询字段。我为txtPrice设置Enabled = Yes,为其他两个设置Enabled = No.。

然后我创建了一个未绑定的表单“frmPrices”,并在表单标题中添加了一个组合框“cboStores”和一个文本框“txtPriceDate”。该组合的Bound Column = 1,其查询为其Row Source:

SELECT l.Store_ID, l.Store_name FROM tblkupStores AS l ORDER BY l.Store_name; 

然后我将fsubPrices作为子窗体控件添加到frmPrices的详细信息部分。棘手的部分是设置Link Master / Child Fields。有一个“向导对话框”,但它只允许您从可用字段中进行选择,我需要将主窗体上的控件与子窗体上的字段链接起来。为此,我必须直接在子窗体控件的属性表中键入我想要的内容:

Link Child Fields......NewStores_ID;PriceDate
Link Master Fields.....cboStores;txtPriceDate

结果是...在主窗体中选择商店和日期组合...子窗体中显示任何匹配的记录。您可以导航到子窗体中的“新记录”以添加该存储/日期组合的记录。但是,在保存新记录之前,txtNewStores_ID和txtPriceDate控件不会显示更新的值。

我希望这接近你想要的。它实际上非常快速和容易地创建;不容易描述。

答案 1 :(得分:0)

你真的不能这样做。你总是会一次处理一行。

您可以做的是通过将表单的默认视图从“单个表单”更改为“连续表单”或“数据表”来模拟它,并且制作是主表单的子(子)形式。

然后,您可以将商店和日期放在主表单上,并使用NewStores_ID和PriceDate字段链接到子表单。