Tuesday, June 28, 2005

Creating Long SQL strings with Arrays

If you've ever created an long SQL string for a Pivot Table or some other reason, you will have come across Excel's limitations in this area. For example, you cannot have too many line continuations ( _ ). Also, if you have used the macro recorder while getting External Data through MS Query, there is some limitation there too. It will not actually record all the SQL, but cuts it off half way through.

The way the recorder works when getting data for a Pivot Table is interesting and I thought I'd use it in my code in a different way. It creates an array of arrays like this:

Sub Macro1()
'
' Macro1 Macro
' Macro recorded 28/06/2005 by A
'

'
    With ActiveWorkbook.PivotCaches.Add(SourceType:=xlExternal)
        .Connection = Array(Array( _
        "ODBC;DSN=Xtreme Sample Database 2003;DBQ=C:\Program Files\Microsoft Visual Studio .NET 2003\Crystal Reports\Samples\Database\xtreme." _
        ), Array("mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;"))
        .CommandType = xlCmdSql
        .CommandText = Array( _
        "SELECT Employee.`Employee ID`, Employee.`Supervisor ID`, Employee.`Last Name`, Employee.`First Name`, Employee.Position, Employee.`Birth Date`, Employee.`Hire Date`, Employee.`Home Phone`, Employee.Ex" _
        , _
        "tension, Employee.Photo, Employee.Notes, Employee.`Reports To`, Employee.Salary, Employee.SSN, Employee.`Emergency Contact First Name`, Employee.`Emergency Contact Last Name`, Employee.`Emergency Cont" _
        , _
        "act Relationship`, Employee.`Emergency Contact Phone`" & Chr(13) & "" & Chr(10) & "FROM Employee Employee" _
        )
        .CreatePivotTable TableDestination:="[Book1]Sheet1!R3C1", TableName:= _
        "PivotTable1", DefaultVersion:=xlPivotTableVersion10
    End With
    
    'do stuff with pivot tables
    
End Sub


It's a bit messy so I thought I'd clean it up. I used the array idea by adding bits of the string into the next element of a growing array, and then joining the array using the Join Function (opposite of Split).

Sub Macro1Redo()

    Dim ssql As String
    Dim sConn As String

    'create the array string
    Call AddToArray(ssql, "SELECT Employee.Employee ID, Employee.Supervisor ID, Employee.Last Name,")
    Call AddToArray(ssql, "Employee.First Name, Employee.Position, Employee.Birth Date, ")
    Call AddToArray(ssql, "Employee.Hire Date,Employee.Home Phone, Employee.Extension,")
    Call AddToArray(ssql, "Employee.Photo, Employee.Notes, Employee.Reports To,")
    Call AddToArray(ssql, "Employee.Salary, Employee.SSN, Employee.Emergency Contact First Name,")
    Call AddToArray(ssql, "Employee.Emergency Contact Last Name, Employee.Emergency Contact Relationship,")
    Call AddToArray(ssql, "Employee.Emergency Contact Phone ")
    Call AddToArray(ssql, "FROM Employee")
    
    'join the strings back together
    ssql = Join(ssql)
    
    Call AddToArray(sConn, "ODBC;DSN=Xtreme Sample Database 2003;")
    Call AddToArray(sConn, "DBQ=C:\Program Files\Microsoft Visual Studio .NET 2003\")
    Call AddToArray(sConn, "Crystal Reports\Samples\Database\xtreme.mdb;")
    Call AddToArray(sConn, "DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;")

    'join the strings back together
    sConn = Join(sConn)

    With ActiveWorkbook.PivotCaches.Add(SourceType:=xlExternal)
        .Connection = sConn
        .CommandType = xlCmdSql
        .CommandText = ssql
        .CreatePivotTable TableDestination:="[Book1]Sheet1!R3C1", TableName:= _
        "PivotTable1", DefaultVersion:=xlPivotTableVersion10
    End With
    
    'do stuff with pivot tables
    
End Sub


Sub AddToArray(myArray As Variant, arrayElement As Variant)

If Not IsArrayInitialized(myArray) Then
    ReDim myArray(0)
    myArray(0) = arrayElement
Else
    ReDim Preserve myArray(UBound(myArray) + 1)
    myArray(UBound(myArray)) = arrayElement
End If

End Sub

Labels: ,

3 Comments:

At 11:18 PM, Anonymous Anonymous said...

Hi! Just wondering if you can help me. When I open an Excel Spreadsheet document sent to me it doesn't display the column of simplified Chinese characters as Chinese characters - merely a line - in each cell.

What do I need to do in order to view the Chinese characters in Excel? I'm on a Mac.

thanks!

 
At 4:46 AM, Anonymous yaniv said...

want to learn more about EXCEL,
or other subjects that interest you,
you can see our free lessons,
we have hundreds of free lessons in www.wisetrainer.com
try us its free,
you can even put our free movies in your site

 
At 12:21 AM, Anonymous Anonymous said...

Hi Robert: I am working in MSAccess and trying to create a Pivot table in Excel using Pivotcache.Add but this has been another gotcha. Do you have any thought about this? Thanks

 

Post a Comment

<< Home