2015-11-10 1 views
1

Во-первых, вот ПИК на моем докладе в режиме конструктора:Report от ControlSource не стреляя

enter image description here

Основной запрос для отчета возвращает значения следующим образом:

Allen Nelli 3:A,5:B,7:A,8:A, etc. 
Breton Micheline 1:A,3:A,5:B,7:A, etc 
Caporale Jody 1:A,3:A,5:B,7:A, etc 

Мне пришлось использовать подзапрос, чтобы получить третье поле, которое объединяет номер : письмо комбинаций. Эти значения фактически представляют день месяца и обозначение для конкретного изменения графика. Таким образом, в основном, за определенный месяц каждый человек работает назначенный сдвиг, обозначенный значением дня.

Целью является вызов пользовательской публичной функции с именем PopulateTextboxes (Value as String), которая будет вызываться из первого текстового поля в отчете из свойства ControlSource текстового поля. Третье поле в запросе на самом деле называется Expr1, и оно передается в качестве параметра функции. Эта функция предназначена для заполнения всех текстовых полей с соответствующим обозначением буквы: A или B или C или D и т. Д. Сама функция не запускается, когда я запускаю отчет.

Функция выглядит следующим образом:

Public Function PopulateTextboxes(Expr As String) As String 
'Each element of Expr should be a number followed by a colon followed by a letter: 10:A,12:B,15:C, etc. 
Dim shiftData() As String 
Dim Data As Variant 
Dim i As Integer 
Dim j As Integer 
Dim temp() As String 
Dim txt As TextBox 
Dim rpt As Report 
Dim strCtrl As String 

If Expr = "" Then Exit Function 

If IsNull(Expr) Then Exit Function 

shiftData = Split(Expr, ",") 

If UBound(shiftData) > 0 Then 
    'Make a 2D array 
    ReDim Data(UBound(shiftData), 2) 
    'Load up 2D array 
    For i = 0 To UBound(shiftData) - 1 
    If shiftData(i) <> "" Then 
     temp = SplitElement(shiftData(i), ":") 
     Data(i, 0) = temp(0) 
     Data(i, 1) = temp(1) 
    End If 
    Next i 

    Set rpt = Reports.item("Multi_Locations_Part_1") 

    If UBound(days) = 0 Then 
    MsgBox "days array not populated" 
    Exit Function 
    End If 

    'Populate each Textbox in the Multi_Locations_Part_1 Report 
    For i = 1 To UBound(days) 
    strCtrl = "txtDesig_" & CStr(i) 
    Set txt = rpt.Controls.item(strCtrl) 
    For j = 0 To UBound(Data) - 1 
     If Data(j, 0) = days(i) Then 
     txt.Value = Data(j, 1) 'A,B,C,etc. 
     Exit For 
     End If 
    Next j 
    Next i 
End If 
PopulateTextboxes = Expr 
End Function 

Private Function SplitElement(Value As String, Delim As String) As String() 
Dim result() As String 

result = Split(Value, Delim) 

SplitElement = result 
End Function 

Пожалуйста посоветуйте.

+0

Привет, то, что у вас там, установит значение этого поля для возврата функции PopulationTextboxes, если это ничего не возвращает, тогда ничего не будет. Вам нужно вызвать его, когда откроется отчет, но я не уверен, что он будет работать так, я думаю, вам нужно будет иметь отдельные поля для каждого текстового поля, а затем просто привязать их к этому, так что имя, op1, op2, op3, op4 и т. д. –

+0

FYI, функция ничего не возвращает, но даже при этом, когда я изменил функцию так, чтобы она что-то возвращала, функция все еще не срабатывала. Интересно, что даже когда я не вызываю функцию и просто устанавливаю ControlSource первого текстового поля только на Expr1, запустите отчет, чтобы текстовое поле не заполнялось данными. Я в тупике. – Alan

+0

Можете ли вы показать код функции? –

ответ

0

Лучшим способом является вызов вашей функции из события Format в разделе «Детали», поэтому он будет вызываться для каждой записи.

Private Sub Detail_Format(Cancel As Integer, FormatCount As Integer) 
    Call PopulateTextboxes(Me.Expr1) 
End Sub 

Если PopulateTextboxes находится в отдельном модуле, я предлагаю передать Me в качестве дополнительного параметра для отчета, так что вам не нужно жёстко имя отчета.

Также обратите внимание, что при назначении переменных объекта необходимо использовать ключевое слово Set.

Set txt = rpt.Controls.item("txtDesig_" & CStr(i)) 
+0

Я отредактировал функцию по рекомендации. Однако я назвал функцию из Detail_Format, как это было предложено, но даже не уволен. Я поставил точку останова на вызов функции, но он не ломается. – Alan

+0

Вы должны открыть отчет в ** Page Preview **, а не в представлении «Отчет», для запуска события «Формат». Не уверен, есть ли подходящее событие для представления отчета. – Andre

+0

Вызов функции из Detail_Format неприемлем. Отчет должен отображаться в представлении отчета. Я обнаружил еще одну проблему, почему функция не вызывалась в первую очередь. Теперь, когда это исправлено, и я могу пройти через код, я опубликую отдельный вопрос на этом форуме о новой проблеме. – Alan

Смежные вопросы