Wymuszanie zapisu pól - przez formularze base

Użytkowanie programu bazodanowego

Wymuszanie zapisu pól - przez formularze base

Postprzez czp » Wt mar 16, 2010 1:19 pm

Witam.

Dzięki poradom mq2 mam już w base substytut zakładek oparty na przyciskach radiowych i makrach – przyznam się, że działa to świetnie.
Ponieważ moja baza oparta jest na mysql i staje się coraz bardziej rozbudowana, a base jest frontegiem bazy to powstał mi w pewnym momencie problem wymuszania zapisu niektórych pól bazy.
Otóż dopóki wymuszanie dotyczyło pól formularza i ich pod formularzy , które w większości stanowiły pola (głównej tabeli mysql oraz pól tabel, które w głównej tabeli miały swoje klucze obce ) to wymuszanie było realizowane na poziomie tabel mysql a w przypadku jeżeli ktoś ominął pole które musiało być z założenia wypełnione to sbase powiadamiało komunikatem, że należy wypełnić pole i podawało jego nazwę.
Sytuacja uległa jednak zmianie gdy tak rozbudowałem bazę, że dołączyłem nowe tabele mysql, które jako klucz obcy mają pola odnoszące się do klucza tabeli głównej i w tym wypadku formularz base nie komunikuje o nie wypełnieniu tych pól bo najpierw należy w takim pod formularzu wybrać (dodać) nowy rekord i usiłować go zapisać. Pominięcie takiego pod formularza w całości nie generuje natomiast w base komunikatu o nie wypełnieniu jego pól.
Stąd moja prośba i pytanie, a mianowicie czy można wymusić zapisanie niektórych pól formularza poprzez odpowiednie makro i komunikat base o zapisanie pól bazy. Jeżeli tak to widzę, to tak że formularz przy zapisywaniu sprawdzałby makrem czy wskazane w nim po `nazwie` pola są zapisane a jeżeli nie to generował by komunikat i pozwalał na zapisanie formularza dopiero po wypełnieniu tych pól.

W tym miejscu ukłon do mq2 i innych osób , które mogłyby mi takie makro nakreślić lub podać jakiś inny sposób na to wymuszenie.


pozdrawiam
Windows 7 i openoffice 3.2
Avatar użytkownika
czp
 
Posty: 47
Dołączył(a): Cz mar 04, 2010 5:38 pm

Re: Wymuszanie zapisu pól - przez formularze base

Postprzez mg2 » Wt mar 16, 2010 7:05 pm

Nie do końca rozumiem problem.
Czy pod-formularz przesyła dane bezpośrednio do tabeli czy do innego formularza?

Może zrób prosty plik z wyizolowanym problemem i wrzuć go na forum?
OOo3.1.1 na Ubuntu 9.04
mg2
 
Posty: 170
Dołączył(a): Cz sty 28, 2010 9:20 pm

Re: Wymuszanie zapisu pól - przez formularze base

Postprzez czp » Wt mar 16, 2010 7:45 pm

Pod formularz przesyła dane do tabeli ale innej z kluczem obcym z tabeli głównej i dlatego formularz nie monitoruje o zapis jeżeli ktoś pominie w dodawaniu danych ten pod formularz.


Ok zrobię coś prostego w base i wrzucę na forum.
Windows 7 i openoffice 3.2
Avatar użytkownika
czp
 
Posty: 47
Dołączył(a): Cz mar 04, 2010 5:38 pm

Re: Wymuszanie zapisu pól - przez formularze base

Postprzez czp » Śr mar 17, 2010 11:59 am

Witam.

Dorzucam prosty plik w base - rozchodzi się o to aby formularz monitował o wpisanie "cel_obiegu" czyli wypełnienie pod formularza
jeżeli ktoś wypisując nowy rekord w tym wypadku nową usługę chciałby przez roztargnienie pominąć wypełnienie tego podformularza.



pozdrawiam
Załączniki
wymuszenie.odb
(15.15 KiB) Pobrane 268 razy
Windows 7 i openoffice 3.2
Avatar użytkownika
czp
 
Posty: 47
Dołączył(a): Cz mar 04, 2010 5:38 pm

Re: Wymuszanie zapisu pól - przez formularze base

Postprzez mg2 » Śr mar 17, 2010 10:58 pm

... rozchodzi się o to aby formularz monitował o wpisanie "cel_obiegu" czyli wypełnienie pod formularza ...


widzę, to tak że formularz przy zapisywaniu sprawdzałby makrem czy wskazane w nim po `nazwie` pola są zapisane a jeżeli nie to generował by komunikat i pozwalał na zapisanie formularza dopiero po wypełnieniu tych pól.


Pytanie jakie wybrać kryterium "wskazania pola"?

Np. jeżeli rekord "zamówienia" w tabeli "2010" będzie miał "stempel czasowy" to można sprawdzić czy istnieje przynajmniej jeden "obieg" z nowszym "stemplem" w tabeli "2010_obieg". Jeżeli nie to znaczy, że brakuje wpisu "obiegu".
Jeżeli w tym samym czasie z bazą pracuje kilku użytkowników to nowszy "obieg" może pochodzić od innej osoby niż tak, która ma być sprawdzona. Wtedy oprócz "stempla" trzeba sprawdzić też "prowadzącego".
OOo3.1.1 na Ubuntu 9.04
mg2
 
Posty: 170
Dołączył(a): Cz sty 28, 2010 9:20 pm

Re: Wymuszanie zapisu pól - przez formularze base

Postprzez czp » Cz mar 18, 2010 8:52 am

Wystarczy aby makro sprawdzało tylko czy istnieje "pierwszy_wpis" w tym wypadku w polu "cel_obiegu" (dla konkretnej nowej usługi czyli nowego rekordu klucza "RS") i wtedy monitowało o jego wpisanie.

Takich podformularzy jak cel_obiegu mam podpietych w rzeczywistości do formularza głównego jeszcze pare innych, ale sprawdzanie każdego z nich powinno dotyczyć tylko ich nowego rekordu przy dodawaniu nowego rekordu formularza głównego z kluczem "RS" .

P.s.

Wpisywanie danych zamówień do formularza odbywa się tylko na podstawie (oryginalnej fizycznej teczki danego zamówienia), tak , że inni użytkownicy tej bazy na pewno nie mogą w tym samym czasie wpisywać danych tego samego zamówienia , ale mogą pracować nad innymi zamówieniami, których teczki posiadają. Oczywiście kilku użytkowników może w tym samym czasie rejestrować po raz pierwszy nowe usługi na podstawie nowych teczek, ale to baza nada im nowy kolejny nr "RS" na każde kolejne zamówienie, który to nr RS wpisuje się na teczkę, tak , że nie ma możliwości zdublowania zamówień.
Windows 7 i openoffice 3.2
Avatar użytkownika
czp
 
Posty: 47
Dołączył(a): Cz mar 04, 2010 5:38 pm

Re: Wymuszanie zapisu pól - przez formularze base

Postprzez mg2 » Cz mar 18, 2010 3:51 pm

Wystarczy aby makro sprawdzało tylko czy istnieje "pierwszy_wpis" w tym wypadku w polu "cel_obiegu" (dla konkretnej nowej usługi czyli nowego rekordu klucza "RS") i wtedy monitowało o jego wpisanie.


Racja ... tabela "obiegi" zawiera klucz "zamówienia". Nie trzeba kombinować z datą.

Potrzebna jest kwerenda, która porówna klucz tabeli "2010" z jego odpowiednikiem w "2010_obiegi". Jeżeli coś jest w "2010" a nie ma w "2010_obiegi" to brakuje wpisu.

Można jeszcze tak:
- wypełnianie zamówienia zaczyna się od wybrania osoby z listy rozwijanej
- zrobić makro ukrywające przycisk "ZAPISZ" "RS" (i jakiś komunikat "wpisz obieg")
- podpiąć to makro do listy
- wybór nazwiska ukrywa "ZAPISZ" "RS"
- wypełniamy pozostałe pola zamówienia i dopiero wtedy można wypełniać "cel_obiegu"
- przycisk "ZAPISZ" "cel_obiegu" odkrywa przycisk "ZAPISZ" "RS" (drugie makro)

Ukrywanie elementów już przerabialiśmy :)

PS

Z tym, że to takie kombinowanie formularzami z bazą podatną na błędy. Baza sama w sobie powinna pilnować tego o co pytasz.
Jak ktoś teraz weźmie samą bazę bez tego formularza, który pilnuje porządku, to będzie miał problem.

PS 2

Powyższy problem wynika chyba ze słabych założeń projektowych bazy. Para "zamówienie" i obieg są "nierozdzielane". W twojej bazie zostały rozdzielone i teraz próbujemy skleić je taśmą klejącą.

Wydaje mi się, że powinno się zrobić jedną tablę zawierającą "id_zamówienie" i "id_obieg". Oba pola powinny zostać kluczem głównym tabeli. Czyli powinno się utworzyć tzw.
"klucz łączony " (composite key).

create table "t" ("id_a" integer, "id_b" integer, primary key("id_a", "id_b"));
OOo3.1.1 na Ubuntu 9.04
mg2
 
Posty: 170
Dołączył(a): Cz sty 28, 2010 9:20 pm

Re: Wymuszanie zapisu pól - przez formularze base

Postprzez czp » Cz mar 18, 2010 9:13 pm

No ta para `zamówienia` i `obiegi` kiedyś była razem w jednej tabeli, ale z przyczyn praktycznych została
rozdzielona dlatego, że jedno zamówienie ma wiele swoich obiegów pod różnymi datami i było niewłaściwie
aby pisać wiele obiegów i ich różnych powodów w tym samym polu tekstowym, bo nawet niechcący można było coś skasować.
Dlatego teraz są w oddzielnych tabelach połączonych relacją.
Windows 7 i openoffice 3.2
Avatar użytkownika
czp
 
Posty: 47
Dołączył(a): Cz mar 04, 2010 5:38 pm

Re: Wymuszanie zapisu pól - przez formularze base

Postprzez mg2 » Pt mar 19, 2010 12:45 am

Dlatego teraz są w oddzielnych tabelach połączonych relacją.


Właśnie dlatego wspomniałem o "kluczu łączonym", który robi dokładnie to czego potrzebujesz. Robisz tabelę:

id_zamówienie (klucz główny)
id_obieg (klucz główny)
nazwa obiegu
itd.

Nie można zrobić klucza łączonego z poziomu okienek. Trzeba wpisać polecenie, które podałem wyżej, w okienku SQL (wymaga to ponownego otwarcia bazy aby tabela pojawiła się w okienkach). W okienkowej edycji takiej tabeli widać juz prawidłowo klucz w postaci dwóch kolumn.

W takim przypadku każda para "zamówienie" - "obieg" jest unikatowa i nierozłączna.

Z O <- [klucz główny jest parą kolumn]
1 1 <- zamówienie 1 obieg 1
1 2
1 3
2 1 <- zamówienie 2 obieg 1
2 2
OOo3.1.1 na Ubuntu 9.04
mg2
 
Posty: 170
Dołączył(a): Cz sty 28, 2010 9:20 pm

Re: Wymuszanie zapisu pól - przez formularze base

Postprzez czp » Pt mar 19, 2010 11:21 am

No jak to laik jakoś się zagubiłem.

Ale odnosząc się do nazw tabel i pól z mojego przykładu to proponujesz aby w tabeli `2010_obieg` klucz główny tej tabeli czyli `ID` był kluczem głównym tej tabeli w parze z kluczem `id_rs` jako klucz łączony. No ale w tym wypadku klucz `id_rs` jest jednocześnie kluczem obcym odnoszącym się do kolumny `RS` będącej kluczem głównym w tabeli `2010`.

Nawet gdy tak robię to nie mogę jednocześnie wymusić aby w tym kluczu łączonym klucz `ID` był polem autoincrement - a w przeciwnym wypadku to nie ma
sensu bo musiałbym w to pole ręcznie wpisywać kolejne nr.

???
Windows 7 i openoffice 3.2
Avatar użytkownika
czp
 
Posty: 47
Dołączył(a): Cz mar 04, 2010 5:38 pm

Re: Wymuszanie zapisu pól - przez formularze base

Postprzez mg2 » Pt mar 19, 2010 3:42 pm

Nawet gdy tak robię to nie mogę jednocześnie wymusić aby w tym kluczu łączonym klucz `ID` był polem autoincrement - a w przeciwnym wypadku to nie ma
sensu bo musiałbym w to pole ręcznie wpisywać kolejne nr.


Zgadza się, "wartość automatyczna" czyli właściwość "identity" może być tylko jedna w tabeli i nie może być użyta w kluczu złożonym.

Rozumiem, że stosujesz "identity" z jakiegoś względu ale tracisz przez to spójność danych.

Twój wybór :)
OOo3.1.1 na Ubuntu 9.04
mg2
 
Posty: 170
Dołączył(a): Cz sty 28, 2010 9:20 pm


Powrót do Base

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość