Makro - wczytywanie obrazka w formularzu

Użytkowanie programu bazodanowego
aple4
Posty: 2
Rejestracja: śr paź 11, 2023 10:13 pm

Makro - wczytywanie obrazka w formularzu

Post autor: aple4 »

Serdecznie wszystkich witam.
Trafiłem na forum ponieważ już od 4 dni szukam rozwiązania pewnego problemu.
Zacznę od początku:

Mam stworzoną bazę danych, w której jest jedna tabela o nazwie "Motki_sklad", w której są następujące kolumny: ID_produktu (klucz główny), Kolor1, Kolor2, Kolor3.
Mam też stworzony formularz o zdefiniowanej nazwie "Formularz_TEST".
W formularzu jest formant Pole tekstowe o nazwie "WpiszNumer", oraz dwa kolejne pola tekstowe o nazwach "TXT_Kolor1", "TXT_Kolor2". Jest też formant przycisk o nazwie "Przycisk1".
Generalnie stworzyłem Makro, które uruchamia się po naciśnięciu przycisku "Przycisk1" pobiera wpisany wcześniej w polu "WpiszNumer" tekst (który odpowiada jednemu z rekordów w tabeli "Motki_sklad" w kolumnie "ID_produktu") i w polach "TXT_Kolor1" oraz "TXT_Kolor2" wyświetla odpowiednie wartości komórek z tabeli "Motki_sklad" kolumn "Kolor1" oraz "Kolor2".
Powyższa część działa.
Jednak chcę do tego wyświetlać w formularzu obrazek produktu. Obrazek na taką samą nazwę pliku jak wartość wpisywana w polu "WpiszNumer", z rozszerzeniem .jpg. Obrazy są umieszczone w katalogu "obrazy" w folderze z plikiem bazy danych. Na formularzu używam formantu obrazkowego o nazwie "Obrazek".
Niestety czegokolwiek nie robię, nie mogę zmusić programu do wyświetlenia wskazanego obrazka. Kod uruchamia się i kończy powodzeniem (żadnego błędu) ale obrazka nie widać.
Czy możecie mi pomóc to rozgryźć ?
P.S. Poniżej zamieszczam obecny kod i podlinkowuję plik bazy. Kod w celach testowych podzieliłem na dwa makra - pierwszy uruchamiany jest przy kliknięciu przycisku. Drugi "Macro1" (od obrazka) uruchamiany po kliknięciu w formant obrazu:

Kod: Zaznacz cały

Sub WyswietlKolory
    Dim Numer As String
    Dim Kolor1 As String
    Dim Kolor2 As String
    Dim oForm As Object
    
    oForm = ThisComponent.DrawPage.Forms.getByName("Formularz_TEST")
    Numer = oForm.getByName("WpiszNumer").Text
    
    ' Sprawdź, czy wprowadzono numer
    If Numer = "" Then
        MsgBox "Wprowadź numer w polu WpiszNumer."
        Exit Sub
    End If
    
   ' zapytanie SQL, aby pobrać kolory dla danego Numeru
    Dim SQL As String
    SQL = "SELECT ""Kolor1"", ""Kolor2"" FROM ""Motki_sklad"" WHERE ""ID_produktu"" = '" & Numer & "'"
    
    ' Wykonaj zapytanie SQL
    Dim oStatement As Object
    Dim oResultSet As Object
'    Dim SciezkaObrazka As String
'    Dim oImageControl As Object  
      
    oStatement = oForm.ActiveConnection.createStatement()
    oResultSet = oStatement.executeQuery(SQL)
    
    ' Sprawdź, czy znaleziono rekord i ustaw kolory
    If oResultSet.next() Then
        Kolor1 = oResultSet.getString(1)
        Kolor2 = oResultSet.getString(2)
        
        ' Ustaw kolory w polach na formularzu
        oForm.getByName("TXT_Kolor1").Text = Kolor1
        oForm.getByName("TXT_Kolor2").Text = Kolor2
        
    Else
        MsgBox "Nie znaleziono rekordu dla podanego Numeru."
    End If
    
    ' Zamknij zapytanie i statement
    oResultSet.close()
    oStatement.close()
End Sub



Sub Macro1
	Dim Numer As String
	Dim oForm As Object
	Dim SciezkaObrazka As String
	Dim oImageControl As Object 
    
    oForm = ThisComponent.DrawPage.Forms.getByName("Formularz_TEST")
    Numer = oForm.getByName("WpiszNumer").Text
    
    ' Sprawdź, czy wprowadzono numer
    If Numer = "" Then
        MsgBox "Wprowadź numer w polu WpiszNumer."
        Exit Sub
    End If

        ' Zbuduj ścieżkę do pliku obrazka
    		SciezkaObrazka = ConvertToURL(ThisComponent.URL & "/obrazy/" & Numer & ".jpg")

  	    'Ładowanie obrazka do formantu
    		oImageControl = oForm.getByName("Obrazek")
    		oImageControl.ImageURL = SciezkaObrazka

    	 'Jeśli nie udało się załadować obrazka,komunikat
    	If oImageControl.ImageURL = "" Then
       		 MsgBox "Nie można znaleźć obrazka dla podanego Numeru."
    	End If
    
End Sub
Plik bazy: https://drive.google.com/file/d/1FxX09R ... drive_link

Z góry dziękuję za pomoc
Libre office 7.6.2/ Windows 10
Awatar użytkownika
Rafkus
Posty: 516
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Makro - wczytywanie obrazka w formularzu

Post autor: Rafkus »

Odnośnie twojego Macro1
Źle uzyskujesz ścieżkę do pliku. Makro wywołujesz z poziomu formularza, przy pomocy polecenia: ThisComponent.URL, a aby uzyskać tą lokalizacje musisz wyjść z tego formularza. Uzyskasz to przy pomocy polecania Parent, poprawne polecenie jest następujące:

Kod: Zaznacz cały

ThisComponent.Parent.URL
Ale w ten sposób uzyskasz ścieżkę do danego pliku bazy, wynikiem tego polecenia będzie tekst np.: "C:\Users\User\Downloads\Motki\MOTKI_LIBRE.odb"
więc z tego ciągu musisz się jeszcze pozbyć nazwy pliku, albo zamienić ją na nazwę folderu. Można to osiągnąć np. w ten sposób:

Kod: Zaznacz cały

sURL = split (ThisComponent.Parent.URL, ThisComponent.Parent.Title) 
      SciezkaObrazka = ConvertToURL(sURL(0) & "obrazy/" & Numer1 & ".jpg")
Twoje makro będzie działać zatem w takiej postaci:

Kod: Zaznacz cały

Sub Macro1
	Dim Numer1 As String
    Dim oForm As Object
    
    oForm = ThisComponent.DrawPage.Forms.getByName("Formularz_TEST")
    Numer1 = oForm.getByName("WpiszNumer").Text
    
    ' Sprawdź, czy wprowadzono numer
    If Numer1 = "" Then
        MsgBox "Wprowadź numer w polu WpiszNumer."
        Exit Sub
    End If

    Dim SciezkaObrazka As String
    Dim oImageControl As Object
    Dim sURL As Variant
    
    ' Zbuduj ścieżkę do pliku obrazka
    sURL = split (ThisComponent.Parent.URL, ThisComponent.Parent.Title) 
    SciezkaObrazka = ConvertToURL(sURL(0) & "obrazy/" & Numer1 & ".jpg")      
 	'SciezkaObrazka = ConvertToURL(ThisComponent.URL & "/obrazy/" & Numer1 & ".jpg")
 	
  	    'Spróbuj załadować obrazek
    		oImageControl = oForm.getByName("Obrazek")
    		oImageControl.ImageURL = SciezkaObrazka


    '	 Jeśli nie udało się załadować obrazka, wyświetl komunikat
    	If oImageControl.ImageURL = "" Then
       		 MsgBox "Nie można znaleźć obrazka dla podanego Numeru."
    	End If    
End Sub
Ten sam efekt można także osiągnąć nie stosując makr.
  • Aby to zrobić stworzyłem dodatkową tabelę Filtr, z dwoma polami IDFiltr - pole klucz typu boolean (tabela ta miec tylko jeden rekord), oraz pole ProduktID, które będzie przechowywało wpisaną wartość (tutaj ID_Produktu);
  • Następnie dla tabeli Filtr przy pomocy kreatora tworzę formularz, w którym będzie podformularz;
  • podformularzem będzie twoja tabela Motki_sklad;
  • Podaję które pole formularza głównego a więc tabeli Filtr (tj. ProduktID) będzie miało te same wartości co w podformularzu czyli w tabeli Motki_sklad pole ID_Produktu;
  • Po utworzeniu formularza, trochę je modyfikuję w trybie edycji. Kreator formularzy nie tworzy pul kombi, dlatego zamieniam pole tekstowe na pole kombi, we właściwościach zaznaczam że powinno mieć ono rozwijaną listę, i w zakładce dane określam co będzie źródłem danych dla listy.
  • do podformularza dodaję przycisk, któremu przypisuję akcję odśwież formularz;
  • pole tekstowe Zdięcie zamieniam na formant obrazkowy
Do formularza, do pola ProduktID wpisuję jakiś tekst, aby dane w podformularzu się zaktualizowały należy odświeżyć formularz.
Aby wstawić obraz można kliknąć prawym klawiszem myszki na formancie obrazkowym i wybrać opcję wstaw grafikę...
Załączniki
Zrzut ekranu.jpg
Zrzut ekranu.jpg (96.69 KiB) Przejrzano 260 razy
MOTKI_LIBRE.odb
(38.58 KiB) Pobrany 68 razy
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
aple4
Posty: 2
Rejestracja: śr paź 11, 2023 10:13 pm

Re: Makro - wczytywanie obrazka w formularzu

Post autor: aple4 »

Bardzo dziękuję za pomoc. :-D Do głowy by mi nie przyszło z tą lokalizacją, a nigdzie na ten temat nie idzie znaleźć informacji.

Serdecznie pozdrawiam
Libre office 7.6.2/ Windows 10
ODPOWIEDZ