Strona 1 z 1

Wymuszanie zapisu pól - przez formularze base

PostNapisane: Wt mar 16, 2010 1:19 pm
przez czp
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

Re: Wymuszanie zapisu pól - przez formularze base

PostNapisane: Wt mar 16, 2010 7:05 pm
przez mg2
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?

Re: Wymuszanie zapisu pól - przez formularze base

PostNapisane: Wt mar 16, 2010 7:45 pm
przez czp
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.

Re: Wymuszanie zapisu pól - przez formularze base

PostNapisane: Śr mar 17, 2010 11:59 am
przez czp
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

Re: Wymuszanie zapisu pól - przez formularze base

PostNapisane: Śr mar 17, 2010 10:58 pm
przez mg2
... 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".

Re: Wymuszanie zapisu pól - przez formularze base

PostNapisane: Cz mar 18, 2010 8:52 am
przez czp
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ń.

Re: Wymuszanie zapisu pól - przez formularze base

PostNapisane: Cz mar 18, 2010 3:51 pm
przez mg2
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"));

Re: Wymuszanie zapisu pól - przez formularze base

PostNapisane: Cz mar 18, 2010 9:13 pm
przez czp
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ą.

Re: Wymuszanie zapisu pól - przez formularze base

PostNapisane: Pt mar 19, 2010 12:45 am
przez mg2
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

Re: Wymuszanie zapisu pól - przez formularze base

PostNapisane: Pt mar 19, 2010 11:21 am
przez czp
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.

???

Re: Wymuszanie zapisu pól - przez formularze base

PostNapisane: Pt mar 19, 2010 3:42 pm
przez mg2
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 :)