Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server VBA代码逻辑与SQL代码_Sql Server_Vba - Fatal编程技术网

Sql server VBA代码逻辑与SQL代码

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

这里是我需要的访问函数翻译成SQL下面是我都没有得到相同的结果我错过了什么?当我把它与表相对时,会有一些小的差异。Access代码是正确的,我只需要确保我的SQL代码与Access做的事情相同

谢谢

--访问VBA代码:

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,但我仍然不知道您在尝试做什么,因为我没有时间查看所有代码并找出答案。一个简短的解释,用你自己的话来说,会有很大的不同。