rafal_r1123
17.10.2007, 09:33:07
Witam,
mam taki problem. Jak zaktualizować pole w tabeli np StanSurowca według pola w formularzu IloscPobrana.
Pozdrawiam i z góry dzięki za pomoc.
Cezar708
17.10.2007, 10:03:08
Ostro...
proponuję więcej szczegółów podać wtedy będzie wiadomo o czym mowa.
rafal_r1123
17.10.2007, 12:19:37
Chce zrobić bazę która pomoże mi kontrolować rozchód materiału z magazynu tzn. ilość pobraną, ilość wykorzystaną oraz ilość jaka została nie wykorzystana i musi być zwrócona na magazyn.
Mam tabele:
Materiał{ Id_mat;Nazwa; aktualny stan}
Rozliczenie { nazwa; data_pobrania; iloścpobrana; ilośćwykorzystana;}
na podstawie której chce utworzyć formularz w którym konrolował bym rozchód materiału. Niewiem czy taka koncepcja jest dobra ale tak to wymyśliłem. I teraz chodzi mi o to żeby pole aktualny stan w tabeli Materiał automatycznie aktualizowało stan po wpisaniu w formularzu iloscpobrana i iloscwykorzystana. Czyli pole aktualnystan w tabeli Materiał musiało by się aktualizować według wyniku odejmowania : iloscpobrana - iloscwykorzystana . Czy jest to do zrobienia?
Cezar708
17.10.2007, 14:05:17
Oczywiście, że to jest do zrobienia. Z tego co rozumiem to po prostu chodzi Ci o zaktualizowanie danych w tabeli `Material`, dopiero wtedy, gdy rozliczenie przyjdzie do skutku.
Oczywiście możesz to zrobić za pomocą polecenia SQL UPDATE:
Proponuję jeszcze całość wrzucić to tranzakcji (BEGIN, COMMIT, ROLLBACK) , po to aby w ustrzec się przed błędami bazy danych i przed tym aby w ostatecznym rozrachunku nie okazało się, że w bazie danych widnieje jakiś towar a w magazynie jest pustka.
Czyli pseudokod wyglądałby tak:
<?php
query("BEGIN WORK");
// wrzucamy wartości do rozliczenia
$ok = query("
INSERT INTO Rozliczenie(
nazwa,
data_pobrania,
iloścpobrana,
ilośćwykorzystana
) VALUES (
'$nazwa',
'$data_pobrania',
'$iloścpobrana',
'$ilośćwykorzystana'
)");
if ( !$ok ){
// jeśli nie powiodło się zapytanie cofamy tranzakcję
query("ROLLBACK");
}
$odjacOdAktualnegoStanu = $iloścpobrana - $ilośćwykorzystana;
$ok = query("
UPDATE Materiał
SET
aktualny_stan = aktualny_stan - $odjacOdAktualnegoStanu;
WHERE
id_mat = '$id_mat'
");
if ( !$ok ){
// jeśli nie powiodło się zapytanie cofamy tranzakcję
query("ROLLBACK");
} else {
// w przeciwnym razie wykonujemy tranzakcje
query("COMMIT");
}
?>
mam nadzieje że to pomoże, albo przynajmniej naświetli problem
Pozdrawiam
rafal_r1123
17.10.2007, 14:54:04
Dobrze zrozumiałeś problem i dzięki za twoją propozycję.
Tylko jeden mały szczegół chciałbym to wykonać pod Accessem + VBA ponieważ dostałem takie zlecenie w pracy zrobienia tego pod accessem. Czy wykonalne jest to pod accessem teraz po twojej odpowiedzi myślę że można to zrobic pisząć odpowiednią kwerendę w accessie lub kod w VBA. Tylko do jakiego zdarzenia to przypisać?
Sorry, że odrazu nie napisałem, że w grę wchodzi Access z wykorzystaniem VBA.
Pozdrawiam
spook
17.10.2007, 15:02:08
Witam
Błąd w zaprojektowanym fragmencie bazy. Przy określaniu potrzebnych pól należy pamiętać o tym, by nie wprowadzać danych pośrednich lub obliczonych (danych, które są wynikiem wyrażenia). Pole "Aktualny stan" jest niewątpliwie polem, którego wartość jest wynikiem wyrażenia. Tabele "Rozliczenia" należy rozbić na dwa oddzielne tematy. Przy Twoim rozwiązaniu w dniu pobrania pewnej ilości materiału należy również coś wykorzystać! Proponuje takie rozwiązanie:
1) Materiały={ID Materiału, Nazwa,...}
2) Przychód={ID Przychodu, ID Materiału, Data, Ilość,...}
3) Rozchód={ID Rozchodu, ID Materiału, Data,...}
Nie zapomnij o połączeniach!
Nie ma konieczności, a wręcz nie należy przechowywać danych "Stan aktualny" w tabeli. Przy takim rozwiązaniu informację o aktualnej ilości materiału w każdej chwili możesz otrzymać poprzez proste pole obliczeniowe [Stan aktualny]=Suma([Przychód].[Ilość])-Suma([Rozchód].[Ilość]) umieszczone na formularzu, czy na raporcie lub kwerendzie
rafal_r1123
17.10.2007, 16:19:30
Cytat(spook @ 17.10.2007, 16:02:08 )

Witam
Błąd w zaprojektowanym fragmencie bazy. Przy określaniu potrzebnych pól należy pamiętać o tym, by nie wprowadzać danych pośrednich lub obliczonych (danych, które są wynikiem wyrażenia). Pole "Aktualny stan" jest niewątpliwie polem, którego wartość jest wynikiem wyrażenia. Tabele "Rozliczenia" należy rozbić na dwa oddzielne tematy. Przy Twoim rozwiązaniu w dniu pobrania pewnej ilości materiału należy również coś wykorzystać! Proponuje takie rozwiązanie:
1) Materiały={ID Materiału, Nazwa,...}
2) Przychód={ID Przychodu, ID Materiału, Data, Ilość,...}
3) Rozchód={ID Rozchodu, ID Materiału, Data,...}
Nie zapomnij o połączeniach!
Nie ma konieczności, a wręcz nie należy przechowywać danych "Stan aktualny" w tabeli. Przy takim rozwiązaniu informację o aktualnej ilości materiału w każdej chwili możesz otrzymać poprzez proste pole obliczeniowe [Stan aktualny]=Suma([Przychód].[Ilość])-Suma([Rozchód].[Ilość]) umieszczone na formularzu, czy na raporcie lub kwerendzie
Dzięki za podpowiedz zmienię strukturę bazy i zobaczę jak mi to będzie działało. A co jeśli chce również miec informacje o tym do jakiej grupy materiałowej został zaliczony wydany materiał. tzn na którą maszynę został wydany i jaki produkt powstał. Czy mogę dodać te dwa pola do tabeli ROZCHÓD czy lepiej utworzyć osobne tabele np : GrMatriałowe{id_mat; nazwa} chyba z tego co widzę to lepiej mi je bedzię dodać do tabeli ROZCHÓD . Jakie jest twoje zdanie ?
spook
17.10.2007, 18:13:16
Ciężko mi jest jednoznacznie odpowiedzieć na Twoje pytanie, gdyż nie znam tematu bazy. Zanim cokolwiek zaczniesz implementować w jakimkolwiek systemie bazodanowym, musisz dogłębnie poznać temat i zaprojektować schemat bazy najlepiej na kartce papieru, a zauważysz w późniejszej pracy, że wszystko działa tak jak sobie tego życzysz.
Pozdrawiam
rafal_r1123
18.10.2007, 10:19:05
Witam,
zmieniłem formę bazy na następującą:
Tabele:
1)Materiały {Id_Materiału;Nazwa}
2)Przychód {Id_Przychodu; Id_Materiału;Data_przyjęcia; Ilość}
3)Rozchód {Id_Rozchodu; Id_Materiału;Data_wydania; Ilość_wydana;; Grupa_Materiałowa}
Relacje:
Materiały - Przychód = jeden do wielu
Materiały - Rozchód = jeden do wielu
Formularz:
Rozchody ( do którego dodałem pole tekstowe [Aktualny stan] w którym chce mieć aktualny stan materału, który mi pozostał.) po wpisaniu w tym polu wyrażenia Suma([Przychód].[Ilość]) - Suma([Rozchód].[Ilość_wydana]) w polu powstaje mi Błąd!!!! Jak powinno wyglądać to wyrażenie ponieważ próbowałem kilku rozwiązań i albo pojawia mi się #BŁAD albo Nazwa?. Co byście zmienili?
spook
18.10.2007, 11:20:21
Witam
Przykładowe rozwiązanie:
Użyj formularza z dwoma podformularzami. Formularz główny "Materiały", podformularz I - "Przychód" II - "Rozchód".
Podformularze najlepiej w widoku Arkusz Danych. W podformularzach zsumuj ilości, a dopiero w formularzu głównym wykonaj różnicę.
rafal_r1123
18.10.2007, 11:24:07
Ok! dzięki spróbuje tak jak napisałeś. Chociaż chyba dodam dodatkowe pola do podformularz Rozchód: { oprócz ilość_wydana jeszcze wyrobiono i pozostało ) ponieważ, ten materiał musi być z powrotem zwrócony na magazyn. i wtedy na podformularzu Rozchody napiszę :
w polu pozostało= Suma(ilość_wydana- wyrobiono) i otrzymam wartość do zwrotu. A w formularzu głównym Materiał w polu obliczniowym wpiszę Suma(ilość - ilość_pobrana+pozostało) może coś otrzymam.
Niestety nie działa z tymi dwoma podformularzami nie wiem dlaczego ponieważ używa konstuktora wyrażeń i za każdym razem wyrzuca mi bład #Nazwa?. Czy możliwe, że coś z nazwami mam nie tak ?
Pozdrawiam
Ps. Czy mógłbyś mi polecić jakąś książę do accessa bądż stronę internetową gdzie znajdę dobrze opisane tworzenie baz w accessie oczywiście z użyciem także VBA. Ponieważ dopiero zacząłem się tym zajmować.
spook
18.10.2007, 13:54:16
Odwołując się do podformularzy spróbuj użyc właściwości "Me!"..., albo podaj mi swój adres e-mail, podrzucę Ci jakiś przykład, być może odzwieciadlający to co byś chciał uzyskać.
rafal_r1123
19.10.2007, 10:34:46
To jest mój email rafal_rafalski@op.pl
Z góry dziękuje za pomoc
Chciałem podziękować z rozwiązanie mojego problemu. Wielkie dzięki dla spook za pomoc. Ale niestety mam teraz kolejny problem ponieważ gdy wpisuje rozchód towaru to faktycznie widnieje aktualny stan po odjęciu ilości wydanej i po dodaniu ilości materiału którego nie wykorzystano. Problem w tym, że gdy przechodzę do kolejnego rekordu aby wpisać ilośc wydaną to w Polu aktualny stan pojawia sie całkowita ilość materiału bez uwzglednienia o tą wartość którą wydałem w pierwszym rekordzie. Gdzie popełniłem błąd ?
Ok. problem z poprzedniego pytania już rozwiązałem wię wszystko działa tak jak chchiałem. Pozdrawiam wszystkich.
dzięki za pomoc spook
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.