I want to replace name to id only between from clause and where clause in all the queries of MS Access. I've written a code in VBA, but it doesn't support Union/Union All queries and subqueries. Can anyone suggest better way to do this ?
Example 1: input: Select a,b,name,id from x inner join y on x.name=y.name where x IN (select p,r,r from i inner join j on i.name=j.name)
expected output: Select a,b,name,id from x inner join y on x.id=y.id where x IN (select p,r,r from i inner join j on i.id=j.id)
Example 2:
Input: (select p,r,r from i inner join j on i.name=j.name) UNION (select a,b,c from x inner join y on x.name=y.name)
Output: (select p,r,r from i inner join j on i.id=j.id) UNION (select a,b,c from x inner join y on x.id=y.id)
VBA Code:
Public Sub ReusabilityChanges()
Dim qd As DAO.QueryDef
Dim ErrorQuery, ErrorQueryName As String
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim oFile, oFile1, oFileError As Object
Set oFile = fso.CreateTextFile("E:\Query changes\txtQueries.txt")
Set oFile1 = fso.CreateTextFile("E:\Query changes\txtQueriesUpdated.txt")
Set oFileError = fso.CreateTextFile("E:\Query changes\txtQueriesWithErrors.txt")
For Each qd In CurrentDb.QueryDefs
oFile.WriteLine qd.Name & ":"
oFile.WriteLine qd.SQL
ErrorQuery = Reusability(qd.SQL)
ErrorQueryName = qd.Name
qd.SQL = Reusability(qd.SQL)
oFile1.WriteLine qd.Name & ":"
oFile1.WriteLine qd.SQL
On Error GoTo errHandler
Next
oFile.Close
Set fso = Nothing
Set oFile = Nothing
Set qd = Nothing
errHandler:
oFileError.WriteLine ErrorQueryName & ":"
oFileError.WriteLine ErrorQuery
Resume Next
End Sub
Function Reusability(qd As String)
Dim query As String
query = qd
Dim tillFrom, btwFromAndWhere, afterWhere, inp, oup As String
Dim fromPosition, wherePosition, endPosition As Integer
inp = query
query = UCase(query)
'Debug.Print query
fromPosition = InStr(1, query, "FROM")
endPosition = InStr(1, query, ";")
If query Like "*WHERE*" Then
wherePosition = InStr(1, query, "WHERE")
btwFromAndWhere = Mid(query, fromPosition + 4, wherePosition - 4 - fromPosition)
tillFrom = Left(query, fromPosition + 4)
afterWhere = Mid(query, wherePosition, endPosition)
btwFromAndWhere = Replace(btwFromAndWhere, "PRODOFFNAME", "PRODOFFID")
oup = tillFrom + btwFromAndWhere + afterWhere
Else
If query Like "*GROUP BY*" Then
wherePosition = InStr(1, query, "GROUP BY")
btwFromAndWhere = Mid(query, fromPosition + 4, wherePosition - 4 - fromPosition)
tillFrom = Left(query, fromPosition + 4)
afterWhere = Mid(query, wherePosition, endPosition)
btwFromAndWhere = Replace(btwFromAndWhere, "PRODOFFNAME", "PRODOFFID")
oup = tillFrom + btwFromAndWhere + afterWhere
ElseIf query Like "*HAVING*" Then
wherePosition = InStr(1, query, "HAVING")
btwFromAndWhere = Mid(query, fromPosition + 4, wherePosition - 4 - fromPosition)
tillFrom = Left(query, fromPosition + 4)
afterWhere = Mid(query, wherePosition, endPosition)
btwFromAndWhere = Replace(btwFromAndWhere, "PRODOFFNAME", "PRODOFFID")
oup = tillFrom + btwFromAndWhere + afterWhere
ElseIf query Like "*ORDER BY*" Then
wherePosition = InStr(1, query, "ORDER BY")
btwFromAndWhere = Mid(query, fromPosition + 4, wherePosition - 4 - fromPosition)
tillFrom = Left(query, fromPosition + 4)
afterWhere = Mid(query, wherePosition, endPosition)
btwFromAndWhere = Replace(btwFromAndWhere, "PRODOFFNAME", "PRODOFFID")
oup = tillFrom + btwFromAndWhere + afterWhere
Else
wherePosition = InStr(1, query, ";")
Debug.Print Mid(query, fromPosition + 4, wherePosition - 4 - fromPosition)
btwFromAndWhere = Mid(query, fromPosition + 4, wherePosition - 4 - fromPosition)
'Debug.Print btwFromAndWhere
tillFrom = Left(query, fromPosition + 4)
btwFromAndWhere = Replace(btwFromAndWhere, "PRODOFFNAME", "PRODOFFID")
oup = tillFrom + btwFromAndWhere + ";"
End If
End If
Reusability = oup
End Function