2015-11-12 3 views
0

Если вы можете использовать метод формирования цепочки, чтобы получить до результатов, таких как линия нижеVBA Property Chaining?

cReportcard.student("doe").Metric("math").score 

Как вы принять имущество обратно вниз по цепочке?

У меня есть коллекция пользовательских классов для предметов (например, математика, языковые искусства, pe ...). У пользовательского класса есть ученик, оценка, учитель, класс, период.

Как

cReportcard.student("doe").Metric("math").score=0.96 

и иметь цепочку назад к коллекции класса происходящего?

Я предполагаю, что это что-то похожее на «родительское» свойство класса Worksheet. Я просто не могу понять, как это сделать.

До сих пор я разработал схему таблицы с 4-мя столами (Student, метрические, уклонов периоды)

Student(ID [pk], NAME, DOB) 
Metric (ID [pk], NAME) 
Period (ID [pk], METRIC_ID [fk], GRADE_LEVEL, START_TIME, LENGTH, CLASS_RM, TEACHER_ID [fk]) 
Grade (ID [pk], PERIOD_END_DATE, PERIOD_ID [fk], STUDENT_ID [fk], METRIC_SCORE 

)

+0

Что вы подразумеваете под «цепью назад к оригинальной коллекции»? –

+0

Вышеупомянутый метод цепной привязки вытаскивает один из классов метрик из коллекции и передает его вперед как «Я», тогда вы можете собрать счет из этого нового класса. Как изменить показатель и вернуть его к оригинальной коллекции? –

+0

Каковы отношения между классами? Это выглядит так: в отчете есть коллекция студентов, и у каждого ученика есть набор показателей, и каждая метрика имеет несколько свойств, из которых оценка - одна. Это верно? – Blackhawk

ответ

2

Я думаю, что вы можете положить немного больше времени в определении ваши конкретные варианты использования, чтобы убедиться, что эти таблицы быстро позволят вам выполнять любые операции, которые вам понадобятся. Но если предположить, что это окончательная структура, я бы дизайн классов, как это:

clsGrade:

'It would be better to have them all private and provide get/set properties 
Private ID As Long 
Public Student As clsStudent 
Public Period As clsPeriod 
Public Period_End_Date As Date 
Public Metric_Score As Long 

'This assumes that, per your example, the only fields necessary to find a "grade" are student name and metric 
Public Sub Load(studentName As String, Metric As String) 
    Dim rs As Recordset 
    'SQL query to get the grade for a particular student/metric 

    Set Student = New clsStudent 
    Student.Load rs!STUDENT_ID 

    Set Period = New clsPeriod 
    Period.Load rs!PERIOD_ID 

End Sub 

Public Sub Save() 
    'SQL query to save the grade 

    'You would have to decide whether or not this cascades and saves the Student/Period/Metric info as well. 
    Student.Save 
    Period.Save 
End Sub 

clsMetric:

'It would be better to have them all private and provide get/set properties 
Private ID As Long 
Public Name As String 

Public Sub Load(ID As Long) 
    'SQL to load a metric by ID 
End Sub 

Public Sub Save() 
    'SQL to save the metric 
End Sub 

clsPeriod:

'It would be better to have them all private and provide get/set properties 
Private ID As Long 
Public Metric As clsMetric 
Public Grade_Level As Long 
Public Start_Time As Date 
Public Length As Date 
Public Class_Rm As String 
Public Teacher_ID As Long 

Public Sub Load(ID As Long) 
    Dim rs As Recordset 
    'SQL to load a period by ID 

    'Also load the child metric 
    Set Metric = New clsMetric 
    Metric.Load rs!METRIC_ID 

End Sub 

Public Sub Save() 
    'SQL to save the period 

    'Also save the child metric 
    Metric.Save 
End Sub 

clsStudent:

'It would be better to have them all private and provide get/set properties 
Private ID As Long 
Public Name As String 
Public DOB As Date 

Public Sub Load(ID As Long) 
    'SQL to load a student by ID 
End Sub 

Public Sub Save() 
    'SQL to save the student 
End Sub 

И тогда вы могли бы использовать их так:

Public Sub Main() 
    Dim grade As clsGrade 
    Set grade = New clsGrade 
    grade.Load "doe", "math" 
    grade.Metric_Score = 0.96 
    grade.Save 
End Sub 

Если вы хотите, чтобы оптимизировать его и получить фантазии, вы можете сделать Get/Пусть Свойства и добавить «грязный» бит для каждого класса, чтобы сохранить отслеживать, изменилось ли что-либо с момента его загрузки или нет. Таким образом, вы не сохраняете информацию, которая не изменилась.

+0

ваш пример поддается обсуждению на вопрос, похоже, что ваш пример будет много открывать и закрывать записи. Это лучше, чем загружать коллекцию классов один раз и использовать коллекцию классов? Первое, что я делаю, - это взять таблицы в базилионе и импортировать их в Access. Я собирался сделать это через этот пользовательский класс для массажа и проверки данных. Следующее будет состоять в том, чтобы использовать пользовательские коллекции классов в качестве построителя отчетов вместе с небольшим массивом данных для некоторых объектов BI и GIS. –

+0

@FredWilson Вы использовали Access раньше? Инструменты предназначены для импорта данных просто из самых разных источников данных, включая электронные таблицы Excel. Массаж и подтверждение ваших данных с помощью запросов - вы можете запускать запросы из кода, если хотите. Я бы настоятельно предложил использовать встроенную функцию отчетности, прежде чем создавать свои собственные с нуля. VBA не предоставляет никаких возможностей ORM быстрого доступа, поэтому я считаю, что, если ситуация не требует много логики или вычисления, запросы - это путь. При необходимости вы можете использовать функции VBA в запросах. – Blackhawk

+0

Я использую MS Access все время. Я просто никогда не спрыгивал в коллекции пользовательских классов. Я понимаю встроенные функции импорта, но данные, которые я импортирую, не структурированы таким образом, что это позволяет импортировать этот путь. Аналогично, требуемая отчетность находится в MS Excel. Наконец, данные ГИС должны быть обработаны, поэтому я решил, что небольшой файл данных был в порядке. Все это через Access делает его простым и дешевым с тем, что сейчас находится на рабочем столе. –