Usprawnienie zmiany danych w formularzu

Użytkowanie programu bazodanowego
Wieslaw
Posty: 11
Rejestracja: śr lut 13, 2013 11:54 pm

Usprawnienie zmiany danych w formularzu

Post autor: Wieslaw »

Poszukuję sposobu, by w formularzu usprawnić zmianę danych w kolumnie "Zajęcia". Może jakieś makro dołączone do przycisku, które zmieniałoby wszystkim uczestnikom danej grupy zajęcia na 1 lub 2 lub 3. W załączniku przesyłam skompresowany przykładowy formularz bazy.
Załączniki
Zajecia.zip
(87.92 KiB) Pobrany 243 razy
OpenOffice 3.4.1 na Windows 7
mg2
Posty: 170
Rejestracja: czw sty 28, 2010 9:20 pm

Re: Usprawnienie zmiany danych w formularzu

Post autor: mg2 »

W formularzu dodałem trzy pola "Zmień zaj.", "Na zajęcia", "W grupie". Do tego przycisk "Zmień". Do przycisku podpięte jest makro z poleceniem "UPDATE". (Grupa wpisana w pole działa niezależnie od grupy wybranej w tabeli z prawej strony.)

Kod: Zaznacz cały


Sub ZmienZajecia

Dim iZajZ  as Integer
Dim iZajNa as Integer
Dim sGr    as String
'''
Dim oDoc  as Object
Dim oPage as Object
Dim oFrm  as Object
'''
Dim oTxtZajZ  as Object
Dim oTxtZajNa as Object
Dim oTxtGr    as Object
'''
Dim sQuery  as String
Dim oStmt   as Object
'''

   oDoc    = ThisComponent
   oPage   = oDoc.DrawPage
   oFrm    = oPage.Forms.GetByIndex(0)
   
   oTxtZajZ  = oFrm.getByName("txtZajZ")
   oTxtZajNa = oFrm.getByName("txtZajNa")
   oTxtGr    = oFrm.getByName("txtGr")
   
   iZajZ     = oTxtZajZ.text
   iZajNa    = oTxtZajNa.text
   sGr       = oTxtGr.text

   sQuery = "update ""Dane"""                   &_
            " set ""Zajecia"" = " & iZajNa      &_
            " where 1=1"                        &_
            " and ""Grupa""   = " & sGr         &_
            " and ""Zajecia"" = " & iZajZ  
   msgbox(sQuery)
   oStmt = ThisDataBaseDocument.CurrentController.ActiveConnection.CreateStatement
   oStmt.ExecuteUpdate(sQuery)
   oFrm.reload
   
End Sub

Załączniki
zajecia_zmiana.zip
(80.83 KiB) Pobrany 243 razy
OOo3.1.1 na Ubuntu 9.04
Wieslaw
Posty: 11
Rejestracja: śr lut 13, 2013 11:54 pm

Re: Usprawnienie zmiany danych w formularzu

Post autor: Wieslaw »

Formularz znakomicie działa, gdy grupy mają nazwy cyfrowe.
Czy jest możliwość, by formularz zamiany cyfr działał, gdy grupy będą mieć literowe nazwy?
Załączniki
zajecia_zmiana.zip
(89.8 KiB) Pobrany 221 razy
OpenOffice 3.4.1 na Windows 7
Jan_J
Posty: 4579
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Usprawnienie zmiany danych w formularzu

Post autor: Jan_J »

Banał: dodaj pojedyncze cudzysłowy wokół wartości tekstowych w zapytaniu: ... zajecia = '1' zamiast zajecia = 1. Zadziała, sprawdziłem.
Na marginesie:
  • do czego służy warunek 1=1?
  • baza nie prowadzi kontroli spójności danych; jeżeli formularz pozwoli, da się wpisać cokolwiek, nawet bez sensu.
  • konstrukcja napisu z żądaniem SQL na zasadzie mechanicznego łączenia tekstów z kodem i z danymi niesie pewne zagrożenia. W miejsce danych da się podstawić tekst zawierający kod, tak by został on wykonany. Nie twierdzę, że Twoja baza wymaga szczególnej ochrony, ale jeżeli ktoś tak buduje zapytania, powinien zdawać sobie sprawę do czego to może prowadzić. Niejeden duży projekt zaczynał się od garażowej prowizorki, w której poczynione błędy zyskują istotność w miarę, jak narzędzie się rozwija.
JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
mg2
Posty: 170
Rejestracja: czw sty 28, 2010 9:20 pm

Re: Usprawnienie zmiany danych w formularzu

Post autor: mg2 »

Czy jest możliwość, by formularz zamiany cyfr działał, gdy grupy będą mieć literowe nazwy?
Jak wspomniał Jan trzeba dodać apostrofy. W dynamicznym zapytaniu wygląda to tak:

Kod: Zaznacz cały

" and ""Grupa""   = " & "'" & sGr & "'"  &_
W załączniku są pełne nazwy grup np. "Gr. 1". Ponadto nazwy grup umieściłem w polu kombi.
do czego służy warunek 1=1?
"Trzymacz miejsca" tzn. można usunąć wszystkie "and" a zapytanie dalej działa.
baza nie prowadzi kontroli spójności danych; jeżeli formularz pozwoli, da się wpisać cokolwiek, nawet bez sensu
... W miejsce danych da się podstawić tekst zawierający kod, tak by został on wykonany. ...
Wrzuć nazwy grup, klas do oddzielnych tabelek i wypełnij nimi pola kombi.

Skoro używasz makr to zrezygnuj z funkcjonalności formularza. Zrób wszystko ręcznie w SQL. Tabelkę używaj tylko do wyświetlania danych (ukryj pasek nawigacji i ustaw formularz do odczytu). Wszystkie wartości stałe trzymaj w oddzielnych tabelkach wypełniających pola kombi. (Grupy masz już zrobione, przenieś je tylko do oddzielnej tabelki.)

Zrób okna dialogowe np.:
  • Dodaj osobę
  • Dodaj grupę
  • Dodaj klasę
  • Zmiana grupy
Każde okno jest otwierane przez osobny guzik obok tabelki. Np. w oknie [Dodaj osobę] będą pola do wypełnienia ręcznego "Imię", "Nazwisko", "Uwagi". Pozostałe dane umieść w polach kombi. Po wypełnieniu pól wciskami przycisk "Wstaw", który ma podpięte makro z walidacją danych i poleceniem "insert".

Wszystko jest według makra, które już masz, tzn.
  • weź formularz
  • weź pole z formularza
  • weź wartość z pola
  • sprawdź wartość (jak z pola kombi to nie trzeba)
  • zbuduj zapytanie SQL (insert, update, delete)
  • wykonaj SQL
Załączniki
zajecia_zmiana_2.zip
(81.12 KiB) Pobrany 246 razy
OOo3.1.1 na Ubuntu 9.04
mg2
Posty: 170
Rejestracja: czw sty 28, 2010 9:20 pm

Re: Usprawnienie zmiany danych w formularzu

Post autor: mg2 »

Przykład okna dialogowego wstawiające dane do tabeli.

W okienku "Narzędzia->Makra->Zarządzaj oknami" mamy zakładki "Moduły", "Okna dialogowe", "Biblioteki". Tworzymy nowe okno i umieszczamy na nim kontrolki. (Żeby zaznaczyć okno trzeba je całe "obrysować" - klikanie nie zaznacza.)

Na formularzu wstawiamy przycisk otwierający okno poprzez makro. Poniższy kod ładuje okno "osoba" z biblioteki "Standard".

Kod: Zaznacz cały

dialogLibraries.loadLibrary("Standard")
dlg = createUnoDialog(dialogLibraries.getByName("Standard").getByName("osoba"))
dlg.execute()
Okna dialogowe nie mają dostępu do formularzy. Musimy ręcznie wypełnić listy wartościami z tabel. Poniższy kod wypełnia pole listy "listOddzial" danymi z tabeli "oddzial".

Kod: Zaznacz cały

stat = thisDataBaseDocument.currentController.activeConnection.createStatement
sel = stat.executeQuery("select ""oddzial"" from ""oddzial""") 
while sel.next()
   dlg.getControl("listOddzial").addItem(sel.getString(1), sel.getRow())
wend
Okno dialogowe zawiera przycisk wstawiający dane do tabeli. Najpierw pobieramy dane z pól i list. (Funkcja "trim" usuwa początowe i końcowe spacje. Zmienna "dlg" dająca dostęp do okna jest zadeklarowana globalnie, na poziomie modułu, tzn. znajduje się "na zewnątrz" wszystkich procedur. Dzięki temu gdy jedna procedura utworzy okno, druga procedura może później skorzystać z tego okna. )

Kod: Zaznacz cały

imie       = trim(dlg.getControl("txtImie").getText)
oddzial  = trim(dlg.getControl("listOddzial").getSelectedItem)
Przeprowadzamy walidację danych. Wartości pobrane z okna nie mogą być puste.

Kod: Zaznacz cały

if imie = null or imie = "" then
   msgbox("Wpisz imię.")
   exit sub
end if
Przyjmujemy, że tabela docelowa nie może zawierać dwa razy tej samej osoby. Sprawdzamy czy wpisana w oknie osoba znajduje się już w tabeli.

Kod: Zaznacz cały

stat = thisDataBaseDocument.currentController.activeConnection.createStatement
	
sel = stat.executeQuery(_
"select count(""imie"") from ""osoba""" &_
"where 1=1" &_
"and ""imie""     = " & "'" & imie     & "'" &_
"and ""nazwisko"" = " & "'" & nazwisko & "'" )
	
sel.next
if sel.getInt(1) > 0 then
   msgbox( _
   "Tabela już zawiera taką osobę." & chr(10) &_
   "Imię:[" & imie  & "]" & chr(10) &_
    "Nazwisko:[" & nazwisko & "]")
   exit sub
end if
Jeżeli walidacja zakończyła się pomyślnie to wstawiamy dane do tabeli docelowej.

Kod: Zaznacz cały

stat = thisDataBaseDocument.currentController.activeConnection.createStatement

stat.executeUpdate(_
"insert into ""osoba"" ("                &_
" ""imie"", ""nazwisko"", ""oddzial"","  &_
" ""grupa"", ""klasa"")"                 &_
"values ("     &_
"'" & imie     & "'" & "," &_
"'" & nazwisko & "'" & "," &_
"'" & oddzial  & "'" & "," &_
"'" & grupa    & "'" & "," &_
"'" & klasa    & "'" &  ")" )
Uaktualniamy widok formularza i zamykamy okno. (Poniższy kod nie jest "ładny". Nie znalazłem bezpośredniego dostępu do formularza "osoba" więc: chowam okno, przywołuję widok formularza, to co jest aktywne na ekranie to "thisComponent", przeładowuję formularz, zamykam okno).

Kod: Zaznacz cały

dlg.setVisible(false)
thisDatabaseDocument.formDocuments.getByName("osoba").open
thisComponent.drawPage.forms.getByIndex("MainForm").reload
dlg.endExecute()
Działający przykład w załączniku.
Załączniki
zajecia_zmiana_3.zip
(82.75 KiB) Pobrany 295 razy
OOo3.1.1 na Ubuntu 9.04
Wieslaw
Posty: 11
Rejestracja: śr lut 13, 2013 11:54 pm

Re: Usprawnienie zmiany danych w formularzu

Post autor: Wieslaw »

Pragnę usprawnić działanie bazy, ale nie umiem sobie poradzić z prawidłowym działaniem makra w formularzu "Dane1". W oparciu o datę zajęć chcę wpisać uwagę całej grupie. Przykład w załączniku.
Załączniki
Przyklad.zip
(99.21 KiB) Pobrany 161 razy
OpenOffice 3.4.1 na Windows 7
Wieslaw
Posty: 11
Rejestracja: śr lut 13, 2013 11:54 pm

Re: Usprawnienie zmiany danych w formularzu

Post autor: Wieslaw »

Przerobiłem makro, ale podaje mi "Błąd uruchomieniowy języka BASIC" związany z "oStmt.ExecuteUpdate(sQuery)". Czy mógłby ktoś mi pomóc?

Przykład w załączniku.

Kod: Zaznacz cały

Sub ZmienZajecia
Dim iZajZ  as String
Dim iZajNa as String
Dim sGr    as String
Dim sData  as String
'''
Dim oDoc  as Object
Dim oPage as Object
Dim oFrm  as Object
'''
Dim oTxtZajZ  as Object
Dim oTxtZajNa as Object
Dim oTxtGr    as Object
Dim oTxtData  as Object
'''
Dim sQuery  as String
Dim oStmt   as Object
'''
   oDoc    = ThisComponent
   oPage   = oDoc.DrawPage
   oFrm    = oPage.Forms.GetByIndex(0)
   
   oTxtZajZ  = oFrm.getByName("txtZajZ")
   oTxtZajNa = oFrm.getByName("txtZajNa")
   oTxtGr    = oFrm.getByName("txtGr")
   oTxtData  = oFrm.getByName("txtData")
   
   iZajZ     = oTxtZajZ.text
   iZajNa    = oTxtZajNa.text
   sGr       = oTxtGr.text
   sData     = oTxtData.text 

   sQuery = "update ""Dane"""                   &_
            " set ""Zajecia"" = " & "'" & iZajNa & "'"    &_
            " where 1=1"                        &_
            " and ""Grupa""   = " & "'" & sGr & "'"  &_
            " and ""Data""   = " & "'" & sData & "'"  &_
            " and ""Zajecia"" = " & "'" & iZajZ & "'"   
   msgbox(sQuery)
   oStmt = ThisDataBaseDocument.CurrentController.ActiveConnection.CreateStatement
   oStmt.ExecuteUpdate(sQuery)
   oFrm.reload
End Sub
Załączniki
Przyklad.zip
(94.76 KiB) Pobrany 187 razy
OpenOffice 3.4.1 na Windows 7
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Usprawnienie zmiany danych w formularzu

Post autor: belstar »

Kod: Zaznacz cały

Sub ZmienZajecia
Dim iZajZ  as String
Dim iZajNa as String
Dim sGr    as String
Dim sData  as String
'''
Dim oDoc  as Object
Dim oPage as Object
Dim oFrm  as Object
'''
Dim oTxtZajZ  as Object
Dim oTxtZajNa as Object
Dim oTxtGr    as Object
Dim oTxtData  as Object
'''
Dim sQuery  as String
Dim oStmt   as Object
'''
   oDoc    = ThisComponent
   oPage   = oDoc.DrawPage
   oFrm    = oPage.Forms.GetByIndex(0)
   
   oTxtZajZ  = oFrm.getByName("txtZajZ")
   oTxtZajNa = oFrm.getByName("txtZajNa")
   oTxtGr    = oFrm.getByName("txtGr")
   oTxtData  = oFrm.getByName("txtData")
 '*******************************************************  
   ss = oTxtData.CurrentValue
   y= ss.year
   m= ss.month
   d= ss.day
   sData = y & "-" & m &"-" & d
'********************************************************
   iZajZ     = oTxtZajZ.text
   iZajNa    = oTxtZajNa.text
   sGr       = oTxtGr.text
   'sData     = oTxtData.text 

   sQuery = "update ""Dane"""                   &_
            " set ""Zajecia"" = " & "'" & iZajNa & "'"    &_
            " where 1=1"                        &_
            " and ""Grupa""   = " & "'" & sGr & "'"  &_ 
            " and ""Data""   = " & "'" & sData & "'"  &_
            " and ""Zajecia"" = " & "'" & iZajZ & "'" 
              
   msgbox(sQuery)
   oStmt = ThisDataBaseDocument.CurrentController.ActiveConnection.CreateStatement
   oStmt.ExecuteUpdate(sQuery)
   oFrm.reload
End Sub
Data musi być podana w formacie ISO, a u ciebie jest jak widzisz w formularzu.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Wieslaw
Posty: 11
Rejestracja: śr lut 13, 2013 11:54 pm

Re: Usprawnienie zmiany danych w formularzu

Post autor: Wieslaw »

Dzięki za podpowiedź, ale nadal, mam problem. Przy próbie zmiany danych mam komunikat: "Błąd uruchomieniowy języka BASIC. Nie ustawiono zmiennej obiektu" i zaznacza linię: "y= ss.year".
OpenOffice 3.4.1 na Windows 7
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Usprawnienie zmiany danych w formularzu

Post autor: belstar »

Testowałem na LO, i tam działa. Sprawdzę i dam znać, a poza tym możesz sobie zainstalować LO
LibreOffice 5.1.2.2 Ubuntu 16 LTS
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Usprawnienie zmiany danych w formularzu

Post autor: belstar »

Wersja dla OO

Kod: Zaznacz cały

Sub ZmienZajecia
	Dim iZajZ  as String
	Dim iZajNa as String
	Dim sGr    as String
	Dim sData  as String
	'''
	Dim oDoc  as Object
	Dim oPage as Object
	Dim oFrm  as Object
	'''
	Dim oTxtZajZ  as Object
	Dim oTxtZajNa as Object
	Dim oTxtGr    as Object
	Dim oTxtData  as Object
	'''
	Dim sQuery  as String
	Dim oStmt   as Object
	'''
	oDoc    = ThisComponent
	oPage   = oDoc.DrawPage
	oFrm    = oPage.Forms.GetByIndex(0)
	
	oTxtZajZ  = oFrm.getByName("txtZajZ")
	oTxtZajNa = oFrm.getByName("txtZajNa")
	oTxtGr    = oFrm.getByName("txtGr")
	oTxtData  = oFrm.getByName("txtData")
	'*********************************************
	'wersja dla OO   
	ss = oTxtData.CurrentValue
	
	y= Left(ss, 4)
	m= Mid(ss,5,2)
	d= Right(ss, 2)
	sData = y & "-" & m &"-" & d
	'*********************************************   
	iZajZ     = oTxtZajZ.text
	iZajNa    = oTxtZajNa.text
	sGr       = oTxtGr.text
	'sData     = oTxtData.text 
	
	sQuery = "update ""Dane"""                   &_
	         " set ""Zajecia"" = " & "'" & iZajNa & "'"    &_
	         " where 1=1"                        &_
	         " and ""Grupa""   = " & "'" & sGr & "'"  &_ 
	         " and ""Data""   = " & "'" & sData & "'"  &_
	         " and ""Zajecia"" = " & "'" & iZajZ & "'" 
	           
	msgbox(sQuery)
	oStmt = ThisDataBaseDocument.CurrentController.ActiveConnection.CreateStatement
	oStmt.ExecuteUpdate(sQuery)
	oFrm.reload
End Sub
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Wieslaw
Posty: 11
Rejestracja: śr lut 13, 2013 11:54 pm

Re: Usprawnienie zmiany danych w formularzu

Post autor: Wieslaw »

Dziękuję.
OpenOffice 3.4.1 na Windows 7
ODPOWIEDZ