[SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą
[SOLVED] 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 8 razy
Ostatnio zmieniony czw paź 30, 2025 4:01 pm przez Jan_J, łącznie zmieniany 2 razy.
Powód: korekta tytułu
Powód: korekta tytułu
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: [SOLVED] 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:
Błąd składni.
Czy mogę prosić o poprawienie, wskazanie błędu.
Pozdrawiam.
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 subCzy 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]
Powód: dodane znaczniki [code]
open Suse leap 15.6, Libre Office 25.8
Re: [SOLVED] 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
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: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.
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?
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"")"
)
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)
LO (25.2) ∙ Python (3.13|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: [SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą
Witam
Chciałbym jeszcze zaproponować wykorzystanie makra odwołującego się do klikniętego (wybranego elementu):
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.
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:
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.
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 SubPrzypominam, ż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
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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: [SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą
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:
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 (48.37 KiB) Przejrzano 43 razy
-
- Menedzer makr.jpg (52.22 KiB) Przejrzano 43 razy
-
- Blad.jpg (79.68 KiB) Przejrzano 43 razy
open Suse leap 15.6, Libre Office 25.8
Re: [SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą
Mój błąd, w linijce 4 powinno być:
i zakładam, że procedurę "execute_sql" też masz gdzieś zapisaną...
Kod: Zaznacz cały
execute_sql(sPolecenieSQL )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: [SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą
Procedura "execute_sql" wpisana do:
Dalej ten sam błąd.
Dalej ten sam błąd.
- Załączniki
-
- Ogolne Dodatkowe informacjev2 .jpg (40.56 KiB) Przejrzano 23 razy
-
- Blad2.jpg (66.06 KiB) Przejrzano 23 razy
open Suse leap 15.6, Libre Office 25.8
Re: [SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą
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.
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)
LO (25.2) ∙ Python (3.13|3.10) ∙ Unicode 16 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: [SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą
Powtórzę po sobie i po @Janie_J
Bez tego nie zadziała, zwróć też uwagę na zakreślony tekst: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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Re: [SOLVED] Korelacja zaimportowanej listy z istniejącą tabelą
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
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