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

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

[SOLVET]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 4 razy
Ostatnio zmieniony śr paź 29, 2025 5:15 pm przez wryszard, łącznie zmieniany 1 raz.
open Suse leap 15.6, Libre Office 25.8
Awatar użytkownika
Rafkus
Posty: 535
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: 5
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: 535
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: 5
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: 535
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: 5
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: 4634
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: 5
Rejestracja: sob paź 25, 2025 10:02 pm

Re: [SOLVET]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:
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.
open Suse leap 15.6, Libre Office 25.8
Jan_J
Posty: 4634
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: [SOLVET]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"
    ) <== 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"")"
) 
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)
ODPOWIEDZ