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

Próbując rozwiązać problem, o którym piszę tu:

https://www.altkomakademia.pl/baza-wiedzy/qna/discussion/9219/jak-stworzyc-raport-ktory-pobiera-dane-z-recordset

Stworzyłem funkcję, która tworzy formularz z polami, które są wynikiem kwerendy.

Function UtwórzFormularzR8(mSQL As String) As String
Dim rs As ADODB.Recordset
Dim x As Integer
Dim tmp_R8 As Form
Dim tmp_control As Control

Set rs = New ADODB.Recordset

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

x = rs.Fields.Count
If x <= 1 Then GoTo UstawWartośćFunkcji

Set tmp_R8 = CreateForm

With tmp_R8
    .CloseButton = True
    .AllowEdits = False
    .AllowDeletions = False
    .NavigationButtons = False
    .DefaultView = 2
End With

For i = 1 To x
Set tmp_control = CreateControl(tmp_R8.Name, acTextBox, acDetail, rs.Fields(i - 1).Name, rs.Fields(i - 1).Name)
tmp_control.Name = rs.Fields(i - 1).Name
Next i

UstawWartośćFunkcji:
If rs.EOF Then
    UtwórzFormularzR8 = "Brak"
Else
    UtwórzFormularzR8 = tmp_R8.Name
End If

rs.Close
Set rs = Nothing

End Function

Później, po zapisaniu formularza pobieram do niego dane i wszystko hula. W pliku ACCDB po konwersji do ACCDE niestety różowo już nie jest. Czy jest jakieś obejście tego problemu? Czy da się w pliku ACCDE stworzyć formularz?

 

 

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

Odpowiedzi (3)

  • 0

Nie da się. Plik ACCDE jest plikiem niezmiennym. Trzeba tę sztuczkę wykonać w pliku ACCDB, a potem zrobić z niego ACCDE.

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

No tak, tyle, że po każdej aktualizacji bazy wynik może być różny (więcej kolumn) więc się nie da.

No cóż, ten raport będę generował ja, a użytkownicy pozostałe. :)

Tomasz_Kasprzycki
  • Odpowiedział
  • @ Tomasz_Kasprzycki | 10.11.2017
    • 2
    • 4
    • 8
  • 0

Poradziłem sobie z tym tematem w następujący sposób: raport zapisuje się od razu do Excela i nawet użytkownik korzystający z ACCDE może go wygenerować.

Function R8_do_Excela(mSQL As String, Jednostka As String, Błąd As String) As String
On Error GoTo PrzyBłędzie
Dim rs As ADODB.Recordset
Dim xlAP As Excel.Application
Dim xlWB As New Workbook
Dim xlSH As Worksheet
Dim KomDoc As Range

Set rs = New ADODB.Recordset

With rs
    .ActiveConnection = CurrentProject.Connection
    .CursorType = adOpenDynamic
    .CursorLocation = adUseClient
    .Open mSQL
End With

Dim PLIK_WNP As String
Dim SCIEZKA As Office.FileDialog

' WSKAZANIE PLIKU I LOKALIZACJI RAPORTU

Set SCIEZKA = Application.FileDialog(msoFileDialogSaveAs)
With SCIEZKA
    .Title = "Zapisywanie raportu nr 8. " & WERSJA
    .InitialFileName = Jednostka & " (" & Błąd & ") " & Date
    If .Show = True Then
        PLIK_WNP = .SelectedItems(1)
    Else
        R8_do_Excela = "Błąd"
        GoTo KoniecPracy
    End If
End With

Set xlAP = CreateObject("Excel.Application")
Set xlWB = xlAP.Workbooks.Add
xlWB.SaveAs PLIK_WNP
Set xlSH = xlWB.Sheets(1)

x = rs.Fields.Count
y = rs.RecordCount

For i = 0 To x - 1
    rs.MoveFirst
    xlSH.Range("a1").Offset(1, i).Value = rs.Fields(i).Name
    xlSH.Range("a1").Offset(1, i).Interior.Color = RGB(190, 190, 190)
    xlSH.Range("a1").Offset(1, i).Font.Bold = True
        For j = 0 To y - 1
            Set KomDoc = xlSH.Range("a1").End(xlDown).Offset(1 + j, i)
            KomDoc.Value = rs.Fields(i).Value
            rs.MoveNext
        Next j
Next i

xlSH.Cells(1, 1).Value = Jednostka
xlSH.Cells(1, 2).Value = Błąd

xlSH.Range("a1").CurrentRegion.Columns.AutoFit

R8_do_Excela = xlWB.FullName

KoniecPracy:
On Error Resume Next
    rs.Close
    xlWB.Save
    xlWB.Close
    Set xlSH = Nothing
    Set xlWB = Nothing
    Set xlAP = Nothing
    Set KomDoc = Nothing
    Exit Function

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

End Function

Omijam wtedy problem z niemożnością utworzenia nowego formularza, czy też tabeli w pliku ACCDE i raport, który korzysta z kwerendy krzyżowej mogącej jako wynik pokazać różną liczbę kolumn jest dostępny dla użytkownika. :)

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