Strona 1 z 1

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

: sob paź 25, 2025 10:35 pm
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

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

: pn paź 27, 2025 12:02 am
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"

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

: pn paź 27, 2025 4:22 pm
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.

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

: wt paź 28, 2025 1:47 am
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.

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

: wt paź 28, 2025 5:09 pm
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.

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

: śr paź 29, 2025 1:02 am
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.

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

: śr paź 29, 2025 3:12 pm
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?

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

: śr paź 29, 2025 5:04 pm
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.

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

: śr paź 29, 2025 7:51 pm
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.

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

: śr paź 29, 2025 11:55 pm
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.

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

: sob lis 01, 2025 4:50 pm
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 6735 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.

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

: sob lis 01, 2025 11:25 pm
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:

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

: ndz lis 02, 2025 1:06 am
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ą...

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

: ndz lis 02, 2025 11:48 pm
autor: wryszard
Procedura "execute_sql" wpisana do:
Dalej ten sam błąd.

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

: pn lis 03, 2025 8:48 am
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.

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

: pn lis 03, 2025 2:54 pm
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 6695 razy

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

: pn lis 03, 2025 10:06 pm
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

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

: wt lis 04, 2025 6:49 pm
autor: Jan_J
Tak opiekuńczego forum jeszcze nie spotkałem.
Bo mało pytających?
AI wyraźnie podebrała nam rozmówców.

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

: wt lis 04, 2025 10:51 pm
autor: wryszard
Witam.
Czy w tej sytuacji wypada zamknąć temat?
P.S.
Jestem pewny że wspierając się Waszą pomocą baza do obsługi zawodów łuczniczych byłaby o wiele lepsza.
Jest co prawda https://www.ianseo.net lecz jego obsługa nie jest prosta dla zwykłych użytkowników komputerów.

Pozdrawiam całe forum.