Kategorie szkoleń | Egzaminy | Kontakt
  • 2
  • 1
  • 1

Potrzebuję stworzyć raport, który będzie pobierał dane z recordset, a nie z kwerendy.

Napisałem taki oto kod:

W raporcie, na otwarciu:

Private Sub Report_Load()
On Error GoTo PrzyBłędzie
Dim mSQL As String

mSQL = "TRANSFORM Count(tbl_Uwagi.TreśćUwagi) AS PoliczOfTreśćUwagi " _
& "SELECT tbl_Działanie.[Numer i nazwa działania] " _
& "FROM tbl_ListaBłędów INNER JOIN ((tbl_Działanie INNER JOIN kw_Działania ON tbl_Działanie.Identyfikator = kw_Działania.wyr) INNER JOIN (tbl_WNP INNER JOIN tbl_Uwagi ON tbl_WNP.Identyfikator = tbl_Uwagi.[WNP/KOR_ID]) ON kw_Działania.[WNP/KOR] = tbl_WNP.[WNP/KOR]) ON tbl_ListaBłędów.ID_Błędu = tbl_Uwagi.BłędyID " _
& "WHERE tbl_Działanie.[Instytucja Pośrednicząca]='" & Forms!frm_Raporty.Pole_Jednostka.Value _
& "' AND tbl_Działanie.Identyfikator=dopiszdziałania([tbl_wnp].[wnp/kor]) AND tbl_ListaBłędów." & Forms!frm_Raporty.Pole_Błąd_R8.Value & "=True " _
& "GROUP BY tbl_Działanie.[Numer i nazwa działania] " _
& "PIVOT zmiana_w_czasie_kwartały([datauwagi])"

PobierzDane_Raport8 mSQL, Me

KoniecPracy:
    Exit Sub

PrzyBłędzie:
    MsgBox "Błąd! " & Err.Source & ". " & Err.Description & " Nr błędu: " & Err.Number & ".", vbCritical, WERSJA
    Resume KoniecPracy
End Sub

I funkcję pobierającą dane:

Function PobierzDane_Raport8(mSQL As String, rep As Access.Report) As Boolean
Dim rs As ADODB.Recordset

Set rs = New ADODB.Recordset

With rs
    .ActiveConnection = CurrentProject.Connection
    .CursorLocation = adUseClient
    .CursorType = adOpenKeyset
    .LockType = adLockPessimistic
    .Open mSQL
End With

Set rep.Recordset = rs

If rs.EOF Then
    PobierzDane_Raport8 = False
Else
    PobierzDane_Raport8 = True
End If

rs.Close
Set rs = Nothing

End Function

Po uruchomieniu pojawia mi się błąd:

Ta funkcja jest dostępna tylko w pliku ADP. Nr błędu: 32585.

Co to jest plik ADP?

Jak widać problem z kwerendą wynika z tego, że pole z tabeli jest zmienne, tzn., że w zależności od tego, co w formularzu wybierze użytkownik, tak będzie skonstruowany raport, chodzi o ten fragment:

tbl_ListaBłędów." & Forms!frm_Raporty.Pole_Błąd_R8.Value & "=True

Kwerenda powinna zliczyć ile razy jest w danej kolumnie wartość True.

Tomasz_Kasprzycki
  • Zapytał
  • @ Tomasz_Kasprzycki | 30.10.2017
    • 2
    • 4
    • 8

Odpowiedzi (2)

  • 1

To niestety oznacza dokładnie to co jest napisane. W Access od roku 2000 do roku 2003 była wspierana współpraca z SQL Server, wręcz pojawiły się autoryzowane kursy o tworzeniu korporacyjnych aplikacji klient - serwer w technologii Access - SQL Server. Były do tego utworzone specjalne pliki Access, tzw projekty Access - z rozszerzeniem .adp. Niestety od roku 2007 ta technologia przestała być wspierana, a rola Access jako środowiska programistycznego jest systematycznie degradowana na rzecz .NET.

Dla mnie też jest to irytujące, ale MS celowo blokuje możliwości Access (to, że raport Access w jednym pliku pozwala na manipulowanie obiektem recordset, a w innym już nie jest zabiegiem czysto politycznym).

Oczywiście są obejścia np. wrzucenie danych z recordset do tabeli Access, która może być źródłem rekordów raportu, ale jest to lekko nieoptymalne (i irytujące).

Pozdrawiam.
Dariusz Kolasa.

  • Odpowiedział
  • @ | 05.11.2017
  • TRENER ALTKOM AKADEMII
  • 0

Dziękuję za odpowiedź.

Czyli problem jest nie do rozwiązania, bo w pliku ACCDE nie stworzę ani nowego formularza, ani tabeli, bo raport ma się opierać o kwerendę krzyżową, gdzie liczba kolumn jest wynikiem funkcji (może być jedna, a może być ich wiele - funkcja podaje kwartał roku i rok, w którym miało miejsce dane zdarzenie).

Tomasz_Kasprzycki
  • Odpowiedział
  • @ Tomasz_Kasprzycki | 08.11.2017
    • 2
    • 4
    • 8