Strona 1 z 1
Usprawnienie zmiany danych w formularzu
: czw lut 14, 2013 10:40 pm
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.
Re: Usprawnienie zmiany danych w formularzu
: sob mar 30, 2013 6:20 pm
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
Re: Usprawnienie zmiany danych w formularzu
: śr kwie 03, 2013 4:41 pm
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?
Re: Usprawnienie zmiany danych w formularzu
: śr kwie 03, 2013 9:04 pm
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.
Re: Usprawnienie zmiany danych w formularzu
: sob kwie 06, 2013 1:07 am
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:
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
Re: Usprawnienie zmiany danych w formularzu
: sob kwie 06, 2013 6:18 pm
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.
Re: Usprawnienie zmiany danych w formularzu
: sob sty 23, 2016 9:43 pm
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.
Re: Usprawnienie zmiany danych w formularzu
: sob sty 30, 2016 11:56 am
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
Re: Usprawnienie zmiany danych w formularzu
: sob sty 30, 2016 8:25 pm
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.
Re: Usprawnienie zmiany danych w formularzu
: sob sty 30, 2016 9:31 pm
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".
Re: Usprawnienie zmiany danych w formularzu
: sob sty 30, 2016 10:24 pm
autor: belstar
Testowałem na LO, i tam działa. Sprawdzę i dam znać, a poza tym możesz sobie zainstalować LO
Re: Usprawnienie zmiany danych w formularzu
: sob sty 30, 2016 10:39 pm
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
Re: Usprawnienie zmiany danych w formularzu
: sob sty 30, 2016 10:48 pm
autor: Wieslaw
Dziękuję.