Pobieranie danych z pola liczbowego w formularzu i wykorzystanie do makra

Użytkowanie programu bazodanowego
zbroly7
Posty: 2
Rejestracja: pt cze 02, 2023 12:05 pm

Pobieranie danych z pola liczbowego w formularzu i wykorzystanie do makra

Post autor: zbroly7 »

Witam,
jestem w trakcie tworzenia makra, które powinno pobrać liczbę z pola liczbowego w formularzu i stworzyć z nim polecenie sql. Makro jest przypisane do przycisku "Dodaj" i uruchamia się przy naciśnięciu go. Niestety po naciśnięciu przycisku w linii "oStatement.setFloat(1, fmtStan.Value)" wyskakuje błąd "Błąd uruchomieniowy języka BASIC. Nie ustawiono zmiennej obiektu." ChatGPT też nie jest w stanie mi pomóc, może ktoś z Was da radę. Makro wygląda następująco:

Kod: Zaznacz cały

Sub Dodaj()
    Dim oForms As Object
    Dim oForm As Object
    Dim oStatement As Object
    Dim oField As Object
    
    ' Pobierz dostęp do wszystkich formularzy
    oForms = ThisComponent.DrawPage.Forms
    
    ' Pobierz dostęp do formularza o indeksie 0
    oForm = oForms.getByIndex(0)
    
    ' Pobierz połączenie do bazy danych
    oConnection = ThisDatabaseDocument.CurrentController.ActiveConnection
    
    ' Utwórz instrukcję SQL do dodawania wpisu, używając pobranej wartości pola tekstowego
    sSQL = "INSERT INTO ""Historia magazynu"" (""Nr. wewnętrzny"", ""Operacja"",""Ilość"", ""Data operacji"", ""Stan przed"", ""Stan po"") VALUES ('1222101001', 'Dodanie', ?, curdate(), '13', '13')"
    
    ' Utwórz obiekt instrukcji SQL
    oStatement = oConnection.prepareStatement(sSQL)
    
    ' Pobierz wartość z pola liczbowego
    oStatement.setFloat(1, fmtStan.Value) 
    
    ' Wykonaj instrukcję SQL
    oStatement.executeUpdate()
    
    ' Zaktualizuj formularz
    oForm.reload()
End Sub
LibreOffice 7.5.2.2 na Windows 10
Awatar użytkownika
Jermor
Posty: 2233
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Pobieranie danych z pola liczbowego w formularzu i wykorzystanie do makra

Post autor: Jermor »

Wydaje mi się, że nigdzie nie pobierasz wartości z pola formularza.
Jeśli fmtStan jest nazwą pola w formularzu, to program nie wie skąd się wzięła ta nazwa.
Nie jestem nadzwyczajnie biegły w bazodanowych formularzach, ale prawdopodobnie musisz dokładnie podać dojście do wartości,
Bo na razie przydzieliłeś obiektowi oForm tylko pierwszy formularz. Musisz teraz z tego formularza pobrać właściwe pole, czyli coś w rodzaju
oForm.fmtStan.Value
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Rafkus
Posty: 511
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Pobieranie danych z pola liczbowego w formularzu i wykorzystanie do makra

Post autor: Rafkus »

Dodatkowo aby pobrać wartość z jakiegoś pola należy użyć polecenia CurrentValue zamiast Value. Spróbuj tak:

Kod: Zaznacz cały

oStatement.setFloat(1, oForm.fmtStan.CurrentValue)
PS. Dziękuję za pokazanie polecenia >> prepareStatement << nie znałem go, a jest to całkiem wygodne rozwiązanie ...
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Jermor
Posty: 2233
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Pobieranie danych z pola liczbowego w formularzu i wykorzystanie do makra

Post autor: Jermor »

CurrentValue jest typu Variant, więc przy pobieraniu wartości przyjmie jej typ
Value jest typu Double
Snippet wygenerowany przez MRI dla pola liczbowego będącego jedynym polem jedynego formularza ma taką postać:

Kod: Zaznacz cały

Sub Snippet
  Dim oDrawPages As Variant
  Dim oObj1 As Variant
  Dim oForms As Variant
  Dim oObj2 As Variant
  Dim oObj3 As Variant
  Dim nCurrentValue As Double
  Dim nValue As Double
  
  oDrawPages = ThisComponent.getDrawPages()
  oObj1 = oDrawPages.getByIndex(0)
  oForms = oObj1.getForms()
  
  oObj2 = oForms.getByIndex(0)
  oObj3 = oObj2.getByIndex(0)
  nCurrentValue = oObj3.getCurrentValue()
   nValue = oObj3.Value
End Sub
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
zbroly7
Posty: 2
Rejestracja: pt cze 02, 2023 12:05 pm

Re: Pobieranie danych z pola liczbowego w formularzu i wykorzystanie do makra

Post autor: zbroly7 »

Dziękuję wszystkim za podpowiedzi !!!
Mimo licznych prób wykorzystujących Wasze propozycje niestety nie udało mi się tego uruchomić tak jak miałem to w założeniach.
Szkoda, że ten LO Base działa tak topornie, tym bardziej, że sposób przeze mnie przedstawiony był wzięty z dokumentacji Base Guide 7.3, okolice strony 400.
Oprócz tej funkcjonalności miałem dodać jeszcze kilka innych, znacznie bardziej skomplikowanych i skutecznie zostałem do tego zniechęcony.
Postanowiłem, że eksportuje bazę danych do sql i napiszę GUI przy pomocy pythona i biblioteki Tkinter.
Rafkus pisze: pt cze 02, 2023 11:53 pm PS. Dziękuję za pokazanie polecenia >> prepareStatement << nie znałem go, a jest to całkiem wygodne rozwiązanie ...
Tak, jest na prawdę całkiem fajne i "u mnie działa" do momentu kiedy chcę podać do sql zmienną z zewnątrz.
LibreOffice 7.5.2.2 na Windows 10
Awatar użytkownika
Rafkus
Posty: 511
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Pobieranie danych z pola liczbowego w formularzu i wykorzystanie do makra

Post autor: Rafkus »

Widocznie twoja struktura formularza jest nieco inna niż wywróżyliśmy.
Uruchom swój formularz w trybie edycji.
Z paska narzędziowego Projekt formularza uruchom Nawigator formularza i przyjrzyj się elementom. Przykładowo możesz zobaczyć taką coś takiego:
Zrzut ekranu 2023-06-05 161818.png
Zrzut ekranu 2023-06-05 161818.png (76.98 KiB) Przejrzano 335 razy
Chcąc pobrać makrem wartość z jakiegoś pola musisz podać dokładną lokalizację tego elementu. Ja to sobie tłumaczę tak:

Kod: Zaznacz cały

 ' W bieżącym komponencie są obiekty formularza
    oForms = ThisComponent.DrawPage.Forms	'To jest folder "Formularze"      
    oForm = oForms.getByIndex(0)		' w danym folderze "Formularze" jest kontener danych o indeksie 0
    oObj1 = oForm.fmtStan			' w danym kontenerze danych jest jakiś obiekt o nazwie "fmtStan"
    nValue = oObj1.CurrentValue 		'z danego pola pobierz wartość    
Ale UWAGA: na obrazie widać, że w "folderze Formularz" są dwa elementy: MainForm oraz MainForm2, teraz rodzi się pytanie: który z nich ma indeks 0?
Nie chcąc zgadywać - wolę odwoływać się do poszczególnych elementów poprzez ich nazwę:

Kod: Zaznacz cały

 ' W bieżącym komponencie są obiekty formularza
    oForms = ThisComponent.DrawPage.Forms	'To jest folder "Formularze"      
    oForm = oForms.getByName("MainForm")	' w danym folderze "Formularze" jest kontener danych o nazwie "MainForm"
    oObj1 = oForm.getByName("fmtStan")		' w danym kontenerze danych MainForm jest jakiś obiekt o nazwie "fmtStan"
    nValue = oObj1.CurrentValue 		'z danego pola pobierz wartość    
    ' i gdzieś nieco później:
    oStatement.setFloat(1, nValue )
Powyższy kod robi to samo co wcześniejszy. Może być również tak, że w danym kontenerze danych że będziesz miał kolejne kontenery danych (formularze z podformularzami, na zdjęciu jest nim subForm2). w takim przypadku musisz dodać kolejne getByName("xxx"), gdzie xxx to ich nazwy. Np. masz jakeś pola również w podformularzu, dostęp do nich uzyskasz poprzez kolejne polecenia:

Kod: Zaznacz cały

oForm2 = oForms.getByName("MainForm2")		' w danym folderze "Formularz" jest kontener danych o nazwie "MainForm2"
 oForm3 = oForm2.getByName("subForm2")		' w danym kontenerze danych MainForm2 jest jakiś obiekt o nazwie "subForm2"
 nValue2 = oForm3.getByName("jakieś_inne_pole_tekstowe").text	'w "subForm2" jest pole o nazwie... z którego nalezy pobrać tekst
Jest to analogiczne do podawania ścieżki dostępu do jakiegoś konkretnego pliku zapisanego w komputerze.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
ODPOWIEDZ