我正在寻找在Access前端使用SQL Server功能的正确方法。单向使用它相当简单 - 只需要调用函数,使用括号和瞧 - 就绪。但是我坚持另一个案子。如果有两个独立的功能,则为whtt:一个到#34;代码"第二个到"解码"数据?问题的背景可以在这里找到:Datatype for storing ip address in SQL Server。我想在我的访问应用程序中使用此示例,但如何在MS Access表单中执行两个单独的单向操作?当然,如果需要创建额外的视图或任何额外的层来实现这一点,除了创建一个表单,我不是很顽固,只是有点懒惰 - 我很乐意这样做。
答案 0 :(得分:2)
您所描述的内容确实可以通过绑定到ODBC链接表的Access表单来完成。您需要做的是在表单上创建两个控件
例如,假设您有一个名为[dbo_temperatures]的ODBC链接表,该表指向以Celsius存储温度值的SQL Server表:
-- (code to create the table in SQL Server Management Studio)
CREATE TABLE dbo.temperatures (
id INT IDENTITY PRIMARY KEY,
observed DATETIME,
tempC INT)
SQL Server中还有两个标量函数可以将值从摄氏度转换为华氏度,反之亦然
CREATE FUNCTION dbo.fnCtoF(@tempC AS INT) RETURNS INT
AS
BEGIN
DECLARE @t AS FLOAT;
SET @t = CONVERT(FLOAT, @tempC);
RETURN CONVERT(INT, (@t * 9 / 5) + 32);
END
和
CREATE FUNCTION dbo.fnFtoC(@tempF AS INT) RETURNS INT
AS
BEGIN
DECLARE @t AS FLOAT;
SET @t = CONVERT(FLOAT, @tempF);
RETURN CONVERT(INT, (@t - 32) * 5 / 9);
END
在您的表单上(绑定到链接表[dbo_temperatures]),您创建
表单有两个私有VBA函数来调用SQL Server函数
Private Function getFahrenheit(t As Variant) As Variant
If IsNull(t) Then
getFahrenheit = Null
Else
Dim cdb As DAO.Database, qdf As DAO.QueryDef, rst As DAO.Recordset
Set cdb = CurrentDb
Set qdf = cdb.CreateQueryDef("")
qdf.Connect = cdb.TableDefs("dbo_temperatures").Connect
qdf.SQL = "SELECT dbo.fnCtoF(" & t & ") AS x"
qdf.ReturnsRecords = True
Set rst = qdf.OpenRecordset(dbOpenSnapshot)
getFahrenheit = rst!x
rst.Close
Set rst = Nothing
Set qdf = Nothing
Set cdb = Nothing
End If
End Function
和
Private Function getCelsius(t As Variant) As Variant
If IsNull(t) Then
getCelsius = Null
Else
Dim cdb As DAO.Database, qdf As DAO.QueryDef, rst As DAO.Recordset
Set cdb = CurrentDb
Set qdf = cdb.CreateQueryDef("")
qdf.Connect = cdb.TableDefs("dbo_temperatures").Connect
qdf.SQL = "SELECT dbo.fnFtoC(" & t & ") AS x"
qdf.ReturnsRecords = True
Set rst = qdf.OpenRecordset(dbOpenSnapshot)
getCelsius = rst!x
rst.Close
Set rst = Nothing
Set qdf = Nothing
Set cdb = Nothing
End If
End Function
然后,您可以使用表单的On Current事件来填充华氏度文本框
Private Sub Form_Current()
Me.txtTempF.Value = getFahrenheit(Me.txtTempC.Value)
End Sub
和华氏度文本框的After Update事件更新Celsius文本框。
Private Sub txtTempF_AfterUpdate()
Me.txtTempC.Value = getCelsius(Me.txtTempF.Value)
End Sub
由于Celsius文本框绑定到[tempC]字段,因此在保存记录时,更改将写回到表中。
答案 1 :(得分:0)
我假设您想要使用您的函数解码查询中的某些数据,在表单中显示解码数据,在那里编辑它,然后在保存数据的同时使用其他函数对其进行编码。
这在Access中的数据绑定表单中是不可能的。 Access始终尝试将在表单字段中输入的数据直接写入相应的表或查询字段。不可能在两者之间进行任何数据处理(对编码功能的调用)。
实现此目的的一种方法是使用未绑定的表单。 您创建一个未绑定到任何记录源的表单,然后将查询中的数据读入记录集,并将记录集数据写入表单中的控件。要保存数据读取控件的内容,请创建一个调用编码函数的sql update语句,并将数据保存到表中。