[SOLVET]Korelacja zaimportowanej listy z istniejącą tabelą
[SOLVET]Korelacja zaimportowanej listy z istniejącą tabelą
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
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
Re: Korelacja zaimportowanej listy z istniejącą tabelą
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:
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:
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:
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"
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 WarunekW 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);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"); LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Korelacja zaimportowanej listy z istniejącą tabelą
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.
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
Re: Korelacja zaimportowanej listy z istniejącą tabelą
Można też to zrobić wykorzystując polecenie IN:
Operator IN sprawdza, czy dany element znajduje się na określonej liście. Tutaj tą listę wartości tworzy podzapytanie.
Kod: Zaznacz cały
UPDATE "Zawodnicy"
SET "udzial_w_zaw" = true
WHERE "Nr_lic" IN (SELECT "nr_licencji" FROM "Lista_import" ); LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Korelacja zaimportowanej listy z istniejącą tabelą
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.
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
Re: Korelacja zaimportowanej listy z istniejącą tabelą
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.
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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: Korelacja zaimportowanej listy z istniejącą tabelą
Jeszcze raz bardzo dziękuję Rafkus za wyczerpujące odpowiedzi.
Temat do zamknięcia.
P.S.
Nie wiem jak dopisać [SOLVET] do tematu?
Temat do zamknięcia.
P.S.
Nie wiem jak dopisać [SOLVET] do tematu?
open Suse leap 15.6, Libre Office 25.8
Re: Korelacja zaimportowanej listy z istniejącą tabelą
@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.
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)
LO (25.2) ∙ Python (3.13|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: [SOLVET]Korelacja zaimportowanej listy z istniejącą tabelą
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.
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
Re: [SOLVET]Korelacja zaimportowanej listy z istniejącą tabelą
Najpierw banały. Połamię kod na wiersze, by łatwej zobaczyć problem(y)
1. Na poziomie funkcji z Basica
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.
Poprawne będzie coś w rodzaju
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.
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?
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)
Kod: Zaznacz cały
execute_sql(
"UPDATE ""Zawodnicy"" SET ""udzial_w_zaw"" = TRUE WHERE ""Nr_lic"" IN (SELECT ""nr licencji"" FROM ""Lista_import"")"
)
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)
LO (25.2) ∙ Python (3.13|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)