[SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą

Użytkowanie programu bazodanowego
wryszard
Posty: 8
Rejestracja: sob paź 25, 2025 10:02 pm

[SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą

Post autor: wryszard »

Witam wszystkich forumowiczów.
W przykładowej bazie nie potrafię wykonać zmiany statusu [false] na [true] w istniejącej tabeli na podstawie zaimportowanej listy w zadowalający sposób.
Będę wdzięczny za podpowiedzi jak to wykonać w zadowalający sposób.
Pozdrawiam.

Środowisko:
OpenSuse Leap 15.6
Libre Office 25.8
Java Oracle Corporation 11.0.28
Załączniki
Import listy.odb
Zmiana statusu [fail] na [true] na podstawie listy.
(69.99 KiB) Pobrany 8 razy
Ostatnio zmieniony czw paź 30, 2025 4:01 pm przez Jan_J, łącznie zmieniany 2 razy.
Powód: korekta tytułu
open Suse leap 15.6, Libre Office 25.8
Awatar użytkownika
Rafkus
Posty: 538
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Korelacja zaimportowanej listy z istniejącą tabelą

Post autor: Rafkus »

Witaj
Widzę, że używasz BAZY z osadzonym "Firebridem" - nie czuję się w nim ekspertem, więc musiałem trochę poszperać w necie aby znaleść rozwiązanie. Ogólnie mówiąc do modyfikowania istniejących rekordów w tabeli stosuje się polecenie UPDATE w następujący sposób:

Kod: Zaznacz cały

UPDATE Nazwa_tabeli
SET Kolumna1= Wartość1, Kolumna2= Wartość2, ...
WHERE Warunek
Tłumacząc na polski mówimy programowi, że chcemy zaktualizować w danej tabeli określone pola, a raczej przypisać określonym polom pewną wartość. Warunkiem określamy które pola mają zostać zmieniane. To polecenie sprawdzi się, gdy np. chcesz zmienić wszystkie wartości w jakimś polu - nie wpisując warunku, lub gdy wiesz które pola chcesz zmienić podając dokładny warunek czyli np. Nazwisko = 'Kowalski" lub ID<15, itp.
W prezentowanym przypadku chcesz zmienić wartości na podstawie wyników z innej tabeli. Musisz zatem skorzystać z nieco bardziej rozbudowanej formuły, wykorzystującej polecenie EXISTS:

Kod: Zaznacz cały

UPDATE Nazwa_tabeli_1
SET Kolumna1= Wartość1
  WHERE EXISTS(
         SELECT *
           FROM Nazwa_tabeli_2
           WHERE Nazwa_tabeli_1.Pole_A = Nazwa_tabeli_2.Pole_B);
Operator EXISTS służy do sprawdzenia, czy w podzapytaniu istnieje jakiś rekord, jeśli tak to zwraca wartość TRUE.

W twoim przypadku musisz użyć formuły:

Kod: Zaznacz cały

UPDATE "Zawodnicy"  
SET "udzial_w_zaw" = true
WHERE EXISTS (SELECT * FROM "Lista_import" WHERE "Zawodnicy"."Nr_lic" = "Lista_import"."nr_licencji"); 
Wyrażenie to musisz w pisać w okno dialogowe wywołane z menu Narzędzia >> SQL.... Wywołane okno będzie nosiło nazwę: "Wykonaj polecenie SQL"
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
wryszard
Posty: 8
Rejestracja: sob paź 25, 2025 10:02 pm

Re: Korelacja zaimportowanej listy z istniejącą tabelą

Post autor: wryszard »

Super.
Działa, UPDATE znałem ale to działało tylko dla jednej zmiany wartości a była potrzeba zmiany oznaczonej ilości na podstawie innej listy.
Nie znałem operatora EXISTS.
Zmiana na [false] jest prostsza.
UPDATE "Zawodnicy" SET "udzial_w_zaw"='false' WHERE "udzial_w_zaw"='true'
Jeszcze raz bardzo dziękuję.
Jeżeli kogoś byłby zainteresowany bazą danych do obsługi zawodów łuczniczych opartą o LO Base proszę o kontakt.
Nadmieniam że jest to opracowane nie przez programistę.
Pozdrawiam forumowiczów.
open Suse leap 15.6, Libre Office 25.8
Awatar użytkownika
Rafkus
Posty: 538
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Korelacja zaimportowanej listy z istniejącą tabelą

Post autor: Rafkus »

Można też to zrobić wykorzystując polecenie IN:

Kod: Zaznacz cały

UPDATE "Zawodnicy"
SET "udzial_w_zaw" = true 
WHERE "Nr_lic" IN (SELECT "nr_licencji" FROM "Lista_import" ); 
Operator IN sprawdza, czy dany element znajduje się na określonej liście. Tutaj tą listę wartości tworzy podzapytanie.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
wryszard
Posty: 8
Rejestracja: sob paź 25, 2025 10:02 pm

Re: Korelacja zaimportowanej listy z istniejącą tabelą

Post autor: wryszard »

Dziękuję Rafkus.
Nie jestem programistą i składam tą bazę z klocków które daje LO.
Jest możliwe z zadaję banalne pytanie, ale czy tego typu polecenia mogą być zawarte w makrach?
I czy można je popisać pod jakiś przycisk tak jak tu https://forum.openoffice.org//pl/forum/ ... php?t=6077
Pozdrawiam.
open Suse leap 15.6, Libre Office 25.8
Awatar użytkownika
Rafkus
Posty: 538
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Korelacja zaimportowanej listy z istniejącą tabelą

Post autor: Rafkus »

Nie bawiłem się bazami danych opartych na Firebridzie, ale myślę, że tutaj też pójdzie.
Tutaj jest prosta wersja takiego kodu viewtopic.php?p=13719#p13719 , a tu bardziej skomplikowana viewtopic.php?t=6053 . Makra te działały w bazach opartych na HSQL.

EDYTOWANE:
PS. Sprawdziłem te pierwsze rozwiązanie - działa.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
wryszard
Posty: 8
Rejestracja: sob paź 25, 2025 10:02 pm

Re: Korelacja zaimportowanej listy z istniejącą tabelą

Post autor: wryszard »

Jeszcze raz bardzo dziękuję Rafkus za wyczerpujące odpowiedzi.
Temat do zamknięcia.
P.S.
Nie wiem jak dopisać [SOLVET] do tematu?
open Suse leap 15.6, Libre Office 25.8
Jan_J
Posty: 4635
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Korelacja zaimportowanej listy z istniejącą tabelą

Post autor: Jan_J »

@wryszard
otworzyć pierwszy post w wątku i zmodyfikować temat

@rafkus
użycie IN daje ładniejsze rozwiązanie niż EXISTS, bo pozwala utworzyć podzapytanie nieskorelowane z wierszami tabeli głównego zapytania, więc robi się je tylko raz.
JJ
LO (25.2) ∙ Python (3.13|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
wryszard
Posty: 8
Rejestracja: sob paź 25, 2025 10:02 pm

Re: [SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą

Post autor: wryszard »

Przepraszam ze przedłużam dyskusję już na inny temat niż w tytule.
Tak napisane makro nie działa:

Kod: Zaznacz cały

sub makrotestowe
	execute_sql("UPDATE ""Zawodnicy"" SET ""udzial_w_zaw"" = TRUE (WHERE ""Nr_lic"" IN SELECT ""nr licencji"" FROM ""Lista_import") )
end sub
Błąd składni.
Czy mogę prosić o poprawienie, wskazanie błędu.
Pozdrawiam.
Ostatnio zmieniony sob lis 01, 2025 4:53 pm przez Rafkus, łącznie zmieniany 1 raz.
Powód: dodane znaczniki [code]
open Suse leap 15.6, Libre Office 25.8
Jan_J
Posty: 4635
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: [SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą

Post autor: Jan_J »

Najpierw banały. Połamię kod na wiersze, by łatwej zobaczyć problem(y)
1. Na poziomie funkcji z Basica

Kod: Zaznacz cały

execute_sql(
    "UPDATE ""Zawodnicy"" SET ""udzial_w_zaw"" = TRUE 
    (
    WHERE ""Nr_lic"" IN SELECT ""nr licencji"" FROM ""Lista_import" <=== ostatni " kończy opis stringa
    ) <== ten nawias kończy listę argumentów funcji Basic
) <=== co robi ten nawias?
2. Na poziomie stałej tekstowej z treścią żądania

W Basicu cudzysłowy "..." są ogranicznikami stałej tekstowej. Jeśli w takim tekście ma się pojawić symbol cudzysłowu, to pisze się go podwójnie "". Cudzysłowy "" nie są zrównoważone wewnątrz. Nie jest to błąd składniowy Basica, ale zostanie rozpoznane jako błąd składni SQL przy próbie realizacji żądania, do której jeszcze nie doszło.

Kod: Zaznacz cały

"UPDATE 
   ""Zawodnicy"" 
   SET 
   ""udzial_w_zaw""
    = TRUE 
    ( <=== ten nawias nie jest zamknięty w obrębie zapytania
    WHERE <=== a nawet gdyby był, to podzapytanie nie może się zacząć od WHERE
    ""Nr_lic"" IN 
    <== tu SELECT zaczyna podzapytanie; potrzebne otwarcie nawiasu
    SELECT ""nr licencji"" FROM ""Lista_import
    " <== brak zamknięcia cudzysłowu ograniczającego nazwę tabeli; brak zamknięca nawiasu (i tego źle otwartego, i tego wymaganego)
Poprawne będzie coś w rodzaju

Kod: Zaznacz cały

execute_sql( 
    "UPDATE ""Zawodnicy"" SET ""udzial_w_zaw"" = TRUE WHERE ""Nr_lic"" IN (SELECT ""nr licencji"" FROM ""Lista_import"")"
) 
Ale otaczanie nazw obiektów bazodanowych cudzysłowami jest w zapytaniu nieobowiązkowe (są wyjątki, jeśli pominięcie cudzysłowów spodowodałoby problemy z interpretacją), więc to samo da się napisać prościej:

Kod: Zaznacz cały

execute_sql( 
    "UPDATE Zawodnicy SET udzial_w_zaw = TRUE WHERE Nr_lic IN (SELECT ""nr licencji"" FROM Lista_import)"
) 
Nazwa "nr licencji" zawiera spację, więc ograniczające cudzysłowy są w jej przypadku konieczne.

Potem kontekst:
umieszczenie żądania SQL jako argumentu funkcji o nazwie execute_sql wymaga, by funkcja ta otwierała połączenie z bazą i przekazywała jej żądanie. Nie wiem jak ona działa, mam nadzieję, że jest już przetestowana.
JJ
LO (25.2) ∙ Python (3.13|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Rafkus
Posty: 538
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: [SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą

Post autor: Rafkus »

Witam
Chciałbym jeszcze zaproponować wykorzystanie makra odwołującego się do klikniętego (wybranego elementu):

Kod: Zaznacz cały

Sub WykonajSQL(oEv)
 dim sPolecenieSQL as string
	sPolecenieSQL = oEv.Source.Model.Tag
	execute_sql(sPolecenieSQL )
End Sub
W tym sposobie polecenie SQL należy wpisać we właściwościach formantu (tutaj jest nim przycisk), a konkretnie do właściwości o nazwie "Dodatkowe informacje". W ten sposób nie będziesz musiał pisać dodatkowych makr do realizacji innych poleceń. To makro obsłuży dowolną liczbę przycisków.
Właściwosc.png
Właściwosc.png (21.34 KiB) Przejrzano 53 razy
Dodatkowym atutem jest fakt, że nie trzeba bawić się w podwójne wpisywanie znaków "

Przypominam, że powyższy kod (WykonajSQL oraz wspomniane wcześniej makrotestowe) wykorzystuje inną proceduę, a mianowicie:

Kod: Zaznacz cały

sub execute_sql(strSQL as string)
'makro to powinno być zapisane w danym pliku bazy
   Dim oStatement As Object
   Dim oDoc As Object
		
   oDoc = ThisDatabaseDocument.CurrentController
   if IsNull(oDoc.ActiveConnection) then
      oDoc.connect
   endif
   
   oStatement = oDoc.ActiveConnection.createStatement()
   oStatement.execute(strSQL)
end sub
PS. I na koniec sugerowałbym NIE UŻYWAĆ znaku SPACJI w nazwach pól oraz w nazwach tabel. Zdarza się, że baza ma problemy z ich przetworzeniem.
Ostatnio zmieniony ndz lis 02, 2025 1:07 am przez Rafkus, łącznie zmieniany 1 raz.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
wryszard
Posty: 8
Rejestracja: sob paź 25, 2025 10:02 pm

Re: [SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą

Post autor: wryszard »

Witam.
Dziękuję za zainteresowanie. Uzyskałem informacje o które pytałem w temacie.
Obecnie próbuję uruchomić przycisk na LO 25.8, Debianie 13, JRE 25.0.1. Niestety poległem.
Właściwości przycisku:
Załączniki
Wlasciwosci przycisku Wydarzenia.jpg
Wlasciwosci przycisku Wydarzenia.jpg (48.37 KiB) Przejrzano 43 razy
Menedzer makr.jpg
Menedzer makr.jpg (52.22 KiB) Przejrzano 43 razy
Blad.jpg
Blad.jpg (79.68 KiB) Przejrzano 43 razy
open Suse leap 15.6, Libre Office 25.8
Awatar użytkownika
Rafkus
Posty: 538
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: [SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą

Post autor: Rafkus »

Mój błąd, w linijce 4 powinno być:

Kod: Zaznacz cały

execute_sql(sPolecenieSQL )
i zakładam, że procedurę "execute_sql" też masz gdzieś zapisaną...
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
wryszard
Posty: 8
Rejestracja: sob paź 25, 2025 10:02 pm

Re: [SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą

Post autor: wryszard »

Procedura "execute_sql" wpisana do:
Dalej ten sam błąd.
Załączniki
Ogolne Dodatkowe informacjev2 .jpg
Ogolne Dodatkowe informacjev2 .jpg (40.56 KiB) Przejrzano 23 razy
Blad2.jpg
Blad2.jpg (66.06 KiB) Przejrzano 23 razy
open Suse leap 15.6, Libre Office 25.8
Jan_J
Posty: 4635
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: [SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą

Post autor: Jan_J »

No tak, ale czy masz definicję procedury execute_sql?
Powinna ona nawiązać połączenie z bazą i przekazać jej żądanie, a potem zamknąć połączenie.
Chyba że połączenie utrzymujesz stale otwarte (lepiej nie).
Samo się to wszystko nie zrobi.
JJ
LO (25.2) ∙ Python (3.13|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Rafkus
Posty: 538
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: [SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą

Post autor: Rafkus »

Powtórzę po sobie i po @Janie_J
i zakładam, że procedurę "execute_sql" też masz gdzieś zapisaną...
Bez tego nie zadziała, zwróć też uwagę na zakreślony tekst:
Macro.png
Macro.png (41.26 KiB) Przejrzano 13 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
wryszard
Posty: 8
Rejestracja: sob paź 25, 2025 10:02 pm

Re: [SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą

Post autor: wryszard »

Tak działa.
Chylę czoła za cierpliwość.
Tak opiekuńczego forum jeszcze nie spotkałem.
Dopiero teraz dowiaduję się jak mało wiem.
Myślę ze znacie trzy stany wiedzy:
1. Nie wiem że nie wiem.
2. Wiem że nie wiem.
3. Nie wiem że wiem.
Podziękowania dla Rafkus i Jan_J
open Suse leap 15.6, Libre Office 25.8
ODPOWIEDZ