Public Function DischargePivot(strFacility As String) As Variant
Dim rstDischarge As ADODB.Recordset, sqlDischarge As String
Dim sqlBuildString As String
Dim strField1 As String, strField2 As String, strField3 As String, strField4 As String
Dim strField5 As String, strField6 As String, bytVal As Byte
Dim counter As Variant, strTbxValue As String
Dim rstDischarges As ADODB.Recordset, sqlDischarges As String
'SQL for pulling the many child records WHERE the children match the Parent
sqlDischarge = "SELECT tblDischarge.FacID, tblDischarge.DisDate, tlkpProgram.[Program Code], tblDischarge.Eligibility, " & _
"tblDischarge.Cap, tlkpPhase.[WO Type], tblDischarge.SRFA FROM tlkpPhase " & _
"INNER JOIN (tlkpProgram INNER JOIN tblDischarge ON tlkpProgram.ProgramTypeID = tblDischarge.Program) " & _
"ON tlkpPhase.PhaseID = tblDischarge.Phase Where FacID ='" & strFacility & "';"
'create/open recordset
Set rstDischarge = New ADODB.Recordset
rstDischarge.Open sqlDischarge, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
'Determine max number of fields to pivot from 1-many to 1-1 and enumerate them in string variables.
'All should end in same number
strField1 = "DischargeDate1"
strField2 = "Program1"
strField3 = "Eligibility1"
strField4 = "Cap1"
strField5 = "Phase1"
strField6 = "SRFA1"
'Set beginning counter to match Field Names
counter = 1
'Begin sql string that will ultimately create the new table to compile the records
sqlBuildString = "create table Discharges (FacID varchar, " & strField1 & " date, " & strField2 & " varchar, " & strField3 & " YesNo, " & strField4 & " currency, " & strField5 & " varchar, " & strField6 & " YesNo"
'Move to beginning of recordset
rstDischarge.MoveFirst
'Set Do Loop Until EOF
Do Until rstDischarge.EOF
'As your counter goes up to 10 it will change the secondary function to pass to for
'creating new field names for each of the child records
'part of the secondary function is changing the number at the end of the field name
'and you have to change the Right() statement once it goes to 10 or greater
If counter < 10 Then
strField1 = CounterLess(strField1)
strField2 = CounterLess(strField2)
strField3 = CounterLess(strField3)
strField4 = CounterLess(strField4)
strField5 = CounterLess(strField5)
strField6 = CounterLess(strField6)
Else
strField1 = CounterMore(strField1)
strField2 = CounterMore(strField2)
strField3 = CounterMore(strField3)
strField4 = CounterMore(strField4)
strField5 = CounterMore(strField5)
strField6 = CounterMore(strField6)
End If
'add next section of sql string that will be run
sqlBuildString = sqlBuildString & ", " & strField1 & " date, " & strField2 & " varchar, " & strField3 & " YesNo, " & strField4 & " currency, " & strField5 & " varchar, " & strField6 & " YesNo"
'advance counter
counter = counter + 1
'Move to next record in recordset for child records
rstDischarge.MoveNext
Loop
'set closing portion of sql statement
sqlBuildString = sqlBuildString & ");"
'Run SQL
DoCmd.RunSQL sqlBuildString
'Reset to beginning of recordset to loop through and insert records
rstDischarge.MoveFirst
'Create sql string for recordset of table that was just created
sqlDischarges = "Select * From Discharges;"
'create/open recordset
Set rstDischarges = New ADODB.Recordset
rstDischarges.Open sqlDischarges, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
'Start AddNew to be updated after all child records have been inserted into new table
rstDischarges.AddNew
'Create Key value
rstDischarges!FacID = rstDischarge!FacID
'Reset Field Enumeration
strField1 = "DischargeDate1"
strField2 = "Program1"
strField3 = "Eligibility1"
strField4 = "Cap1"
strField5 = "Phase1"
strField6 = "SRFA1"
'Reset Counter
counter = 1
'Set Do Until EOF for record insertion
Do Until rstDischarge.EOF
'Insert first set of records in first group of fields
rstDischarges.Fields.Item(strField1) = rstDischarge.Fields.Item(1)
rstDischarges.Fields.Item(strField2) = rstDischarge.Fields.Item(2)
rstDischarges.Fields.Item(strField3) = rstDischarge.Fields.Item(3)
rstDischarges.Fields.Item(strField4) = rstDischarge.Fields.Item(4)
rstDischarges.Fields.Item(strField5) = rstDischarge.Fields.Item(5)
rstDischarges.Fields.Item(strField6) = rstDischarge.Fields.Item(6)
'Run through changing names as with creating the table
If counter < 10 Then
strField1 = CounterLess(strField1)
strField2 = CounterLess(strField2)
strField3 = CounterLess(strField3)
strField4 = CounterLess(strField4)
strField5 = CounterLess(strField5)
strField6 = CounterLess(strField6)
Else
strField1 = CounterMore(strField1)
strField2 = CounterMore(strField2)
strField3 = CounterMore(strField3)
strField4 = CounterMore(strField4)
strField5 = CounterMore(strField5)
strField6 = CounterMore(strField6)
End If
'Move to next record
rstDischarge.MoveNext
'advance counter
counter = counter + 1
'Repeat
Loop
'Update recordset and close all open recordsets
rstDischarges.Update
rstDischarges.Close
rstDischarge.Close
End Function