William Benson
vbacreations at gmail.com
Fri May 18 21:19:00 CDT 2012
As usual reading someone else's code on web helped (with creating fields and properties) This code is a long way from a complete schema implementation engine. A long, long way.but thanks for a little bit of praise after a tough week Jim. ;) On May 18, 2012 10:01 PM, "Jim Lawrence" <accessd at shaw.ca> wrote: > Good job there, Benson. > > Jim > > -----Original Message----- > From: accessd-bounces at databaseadvisors.com > [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Benson, William > (GE Global Research, consultant) > Sent: Friday, May 18, 2012 6:55 PM > To: Access Developers discussion and problem solving > Subject: Re: [AccessD] Code to auto-load an ORACLE schema > > Resolved the error. I needed to append the field to the fields collection > and then I also benefited from assigning the property values as I created > them and definitely did need to append the properties. I guess order of > events is important. > > Sub CreateTableAndFields() > Dim XL As Excel.Application > Dim R As Excel.Range > Dim WS As Excel.Worksheet > Dim WB As Excel.Workbook > Dim rBegin As Range > Dim rEnd As Range > Dim Cell As Excel.Range > Dim D As DAO.Database > Dim T As DAO.TableDef > Dim F As DAO.Field > Dim Ar() > Dim P As DAO.Property > Dim sLastTable As String > Dim ub As Long > Set XL = MyXL > Set D = CurrentDb > Set WB = XL.ActiveWorkbook > Set WS = WB.ActiveSheet > Set R = WB.Names("MyFields").RefersToRange > Set rBegin = R.Cells(1, 1).Offset(1, 0) > Set rEnd = WS.Cells(WS.Rows.Count, 1).End(xlUp) > If rEnd.Row > R.Cells(1, 1).Row Then > 'There is data > Set rBegin = R.Cells(1, 1).Offset(1, 0) > Set rEnd = WS.Cells(WS.Rows.Count, 1).End(xlUp) > For Each Cell In XL.Range(rBegin, rEnd).Cells > If sLastTable <> XL.Trim(Cell) Then > '1 =Table Name (don't need this but may as well) > '2 = Field Name > '3 = Type > '4 = Size > '5 = Decimals > '6 = ValidationRule > '7 = Required > > ReDim Ar(1 To 7, 1 To 1) > On Error Resume Next > DoCmd.DeleteObject acTable, XL.Trim(Cell) > On Error GoTo 0 > Set T = D.CreateTableDef(Name:=XL.Trim(Cell)) > ub = 1 > Else > ub = UBound(Ar, 2) + 1 > ReDim Preserve Ar(1 To 7, 1 To ub) > End If > Ar(1, ub) = XL.Trim(Cell) 'Table Name > Ar(2, ub) = XL.Trim(Cell.Offset(0, 1)) 'Field Name > Ar(3, ub) = CLng(Cell.Offset(0, 2)) ' Type > Ar(4, ub) = CLng(Cell.Offset(0, 3)) ' Size > If Len(XL.Trim(Cell.Offset(0, 4))) > 0 Then > Ar(5, ub) = CLng(Cell.Offset(0, 4)) 'Decimals > End If > If Len(XL.Trim(Cell.Offset(0, 5))) > 0 Then > Ar(6, ub) = XL.Trim(Cell.Offset(0, 5)) 'ValidationRule > End If > If XL.Trim(Cell.Offset(0, 6)) = "NOT NULL" Then > Ar(7, ub) = True 'Required > Else > Ar(7, ub) = False > End If > Set F = T.CreateField(Ar(2, ub), Ar(3, ub), Ar(4, ub)) > T.Fields.Append F > F.Required = Ar(7, ub) > If CStr(Ar(6, ub)) <> "" Then > F.ValidationRule = CStr(Ar(6, ub)) > End If > If CStr(Ar(5, ub)) <> "" Then > Set P = F.CreateProperty(Name:="DecimalPlaces", Type:=2, > Value:=Ar(5, ub)) > 'P.Value = Ar(5, ub) > F.Properties.Append P > End If > If CLng(Ar(3, ub)) = 8 And CLng(Ar(4, ub)) = 8 Then > > Set P = F.CreateProperty(Name:="Format", Type:=10, > Value:="General Date") > ' P.Value = "General Date" > F.Properties.Append P > End If > If ub = 1 Then > D.TableDefs.Append T > ' D.TableDefs.Refresh > End If > > sLastTable = Cell > Next > End If > Application.RefreshDatabaseWindow > > End Sub > > -- > AccessD mailing list > AccessD at databaseadvisors.com > http://databaseadvisors.com/mailman/listinfo/accessd > Website: http://www.databaseadvisors.com > > -- > AccessD mailing list > AccessD at databaseadvisors.com > http://databaseadvisors.com/mailman/listinfo/accessd > Website: http://www.databaseadvisors.com >