Sql server VBA代码逻辑与SQL代码
这里是我需要的访问函数翻译成SQL下面是我都没有得到相同的结果我错过了什么?当我把它与表相对时,会有一些小的差异。Access代码是正确的,我只需要确保我的SQL代码与Access做的事情相同 谢谢 --访问VBA代码:Sql server VBA代码逻辑与SQL代码,sql-server,vba,Sql Server,Vba,这里是我需要的访问函数翻译成SQL下面是我都没有得到相同的结果我错过了什么?当我把它与表相对时,会有一些小的差异。Access代码是正确的,我只需要确保我的SQL代码与Access做的事情相同 谢谢 --访问VBA代码: Public Function DelDuplicates() 'save the deleted double counts DoCmd.OpenQuery "QrySavetrash" Dim Mysqlfin, MysqlTrd As String
Public Function DelDuplicates()
'save the deleted double counts
DoCmd.OpenQuery "QrySavetrash"
Dim Mysqlfin, MysqlTrd As String
Dim Myrecordfin As ADODB.Recordset
Dim MyrecordTrd As ADODB.Recordset
Mysqlfin = "select * from TBL_TEMP1"
MysqlTrd = "select * from TBL_TEMP2"
Set Myrecordfin = New ADODB.Recordset
Myrecordfin.ActiveConnection = CurrentProject.Connection
Myrecordfin.CursorType = adOpenDynamic
Myrecordfin.LockType = adLockOptimistic
Myrecordfin.Open Mysqlfin
Set MyrecordTrd = New ADODB.Recordset
MyrecordTrd.ActiveConnection = CurrentProject.Connection
MyrecordTrd.CursorType = adOpenDynamic
MyrecordTrd.LockType = adLockOptimistic
MyrecordTrd.Open MysqlTrd
If Not MyrecordTrd.EOF Then
MyrecordTrd.MoveFirst
End If
If Not Myrecordfin.EOF Then
Myrecordfin.MoveFirst
End If
If MyrecordTrd.EOF Then
MsgBox " Table TBL_TEMP2 is empty, please check"
End If
If Myrecordfin.EOF Then
MsgBox "Table TBL_TEMP1 is empty, please check to make the preprocessing meaningful"
End If
RowNo = 0
Do While Not MyrecordTrd.EOF
Do While Not Myrecordfin.EOF
If MyrecordTrd!Invoice = Myrecordfin!INV_NO Then
If IsNull(MyrecordTrd!Ck_No) Then MyrecordTrd!Ck_No = " "
If IsNull(Myrecordfin!Ck_No) Then Myrecordfin!Ck_No = " "
If (MyrecordTrd!Ck_No = Myrecordfin!Ck_No) Or (Nz(MyrecordTrd!Ck_No) = Nz(Myrecordfin!Ck_No)) Then
MyrecordTrd.Delete
RowNo = RowNo + 1
Exit Do
End If
End If
If Not Myrecordfin.EOF Then
Myrecordfin.MoveNext
End If
Loop
Myrecordfin.MoveFirst
If Not MyrecordTrd.EOF Then
MyrecordTrd.MoveNext
End If
Loop
MyrecordTrd.Close
Myrecordfin.Close
'dbinfo.Close
Set MyrecordTrd = Nothing
Set Myrecordfin = Nothing
MsgBox " preprocessing is done " & RowNo & " duplicate records have been deleted"
'Set dbinfo = Nothing
End FunctionPublic Function DelDuplicates()
'save the deleted double counts
DoCmd.OpenQuery "QrySavetrash"
---SQL 2012代码
UPDATE [dbo].[TBL_TEMP1] SET [CK_NO] = LTRIM(RTRIM([CK_NO]))
UPDATE [dbo].[TBL_TEMP2] SET [CK_NO] = LTRIM(RTRIM([CK_NO]))
UPDATE [dbo].[TBL_TEMP1] SET [INV_NO] = LTRIM(RTRIM([INV_NO]))
UPDATE [dbo].[TBL_TEMP2] SET [Invoice] = LTRIM(RTRIM([Invoice])
UPDATE [dbo].[TBL_TEMP1] SET [CK_NO] = ' ' WHERE ISNULL([CK_NO], '0') = '0'
UPDATE [dbo].[TBL_TEMP2] SET [CK_NO] = ' ' WHERE ISNULL([CK_NO], '0') = '0'
UPDATE [dbo].[TBL_TEMP1] SET [INV_NO] = ' ' WHERE ISNULL([INV_NO], '0') = '0'
UPDATE [dbo].[TBL_TEMP2] SET [Invoice] = ' ' WHERE ISNULL( [Invoice], '0') = '0'
DELETE FROM [dbo].[TBL_TEMP2] FROM [dbo].[TBL_TEMP2]
LEFT JOIN [dbo].[TBL_TEMP1] ON [dbo].[TBL_TEMP2].[Invoice] = [TBL_TEMP1].[INV_NO]
WHERE [dbo].[TBL_TEMP2].[Ck_No] = [TBL_TEMP1].[CK_NO]
DELETE FROM [dbo].[TBL_TEMP2] FROM [dbo].[TBL_TEMP1]
LEFT JOIN [dbo].[TBL_TEMP2] ON [TBL_TEMP1].[INV_NO] = [dbo].[TBL_TEMP2].[Invoice]
WHERE [TBL_TEMP1].[CK_NO] = [dbo].[TBL_TEMP2].[Ck_No]
您的SQL应该看起来像这样,以执行VBA正在执行的相同操作。似乎您正试图从tbl_temp1中删除tbl_temp2的记录以及匹配的发票和支票(或空支票)
delete a
from tbl_temp2 a
inner join tbl_temp1 b
on a.invoice = b.inv_no
and case when a.ck_no is null then -1 else a.ck_no end
= case when b.ck_no is null then -1 else b.ck_no end ;
例如:
我获取了您的VBA代码,并在MS Access 2013中创建了相同的数据,并对其运行了VBA代码。结果与SQL的结果相同
该语句根据发票号和支票号匹配两个表中的记录。如果找到匹配项,该记录将从tbl_temp2
中删除。对于空校验号,动态使用-1
VBA还与发票号和支票号匹配。此外,如果check number为null,它将转换为空字符串(就像我使用的-1)并进行匹配。与其让VBA函数解释您要做什么,不如自己写几个字?目前,只有了解VBA和SQL Server的人才能回答您的问题。似乎您从未在记录集上调用
Update
?请稍候。我知道VBA和SQL Server,但我仍然不知道您在尝试做什么,因为我没有时间查看所有代码并找出答案。一个简短的解释,用你自己的话来说,会有很大的不同。