![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 77 Pomógł: 0 Dołączył: 29.05.2006 Skąd: /dev/null Ostrzeżenie: (0%) ![]() ![]() |
Witam. Otóż właśnie byłem na ukończeniu swojego flagowego systemu CRM, ale odkryłem jeden mały denerwujący problem z zakładką cechy klientów. Otóż struktura tabel odpowiadających za cechy ma taką postać jak poniżej. Nie powiem, iż trochę zgapiłem od CRM Lefthand, tyle że ich baza stoi na firebird więc musiałem trochę strukturę przerobić i dostosować do swoich potrzeb oraz własnego interfejsu.
Za wykonywanie zapytań, pobieranie cech oraz ich wyświetlanie w formie drzewa odpowiada skrypt poniżej. (Pewne rzeczy musiałem usunąć bo post był za duży).
I nie mówię, wszystko byłoby ładnie, bo i pobiera i zapisuje do odpowiednich tabel relacyjnie, lecz przecież to chyba normalne, żeby mozna było również odznaczać już wcześniej zapisane cechy. No i tu pojawia się problem, gdyż ta cała nieszczęsna struktura tabel, jest może i fajna i elastyczna, ale jak teraz u licha stworzyć jakąś tablice z danymi zazanczonymi w interfejsie, porównać z zawartością w tabeli mp_attributes, oraz podjąć odpowiednią akcję, czyli zastosować INSERT tam gdzie pole w interfejsie jest zaznaczone a w tabeli puste (narazie jest tylko dostępna ta opcja!), no i DELETE tam gdzie chceckbox jest pusty a w tabeli jest jakaś wartość. Kiedy oba warunki są puste lub zaznaczone nie wyknuje żadnej operacji. ma ktoś może jakiś pomysł? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 611 Pomógł: 19 Dołączył: 28.02.2005 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
po 1 nie wyjaśniłeś co jest w tabeli i twoj problem jakiej tabeli dotyczy ale tak na macajewa moze uda mi sie trafić w rozwiązanie twojego problemu:
otoż np. -możesz to zrobić poprzez zrobienie flag mówiących o czy dany atrybut jest zaznaczony na 1 lub 0 ( i wtedy w razie potrzeby bawić się na przemiat insertem i updejtem) - możesz też zastosować status bitowy tzn dany atrybut jest kodowany na odpowiednim bicie i poprzez odpowiedni updejt wiedzieć jakie atrybuty należą do danego klienta ( tu by trzeba jeszcze sobie jakiś słownik stworzyć coby sie samemu nie pogubić w statusach) i tak na marginesie jak masz jakieś relacje to nie rób delete bo czasem przy jakimś błędzie ludzkim możesz stracić cenne dane (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 77 Pomógł: 0 Dołączył: 29.05.2006 Skąd: /dev/null Ostrzeżenie: (0%) ![]() ![]() |
Kod po 1 nie wyjaśniłeś co jest w tabeli i twoj problem jakiej tabeli dotyczy ale tak na macajewa moze uda mi sie trafić w rozwiązanie twojego problemu: Tu są przykładowe dane z poszczególnych tabel które podałem. Poza tym jeśli chodzi o relacje nie mają one szczególnego zastosowania w działaniach użytkownika, który operuje w sumie tylko i wyłącznie na polach z mp_attributes. Gdyby było inaczej zmieniłbym silnik na InnoDB, wyłączył AUTOCOMMIT i odpalił transakcje. Kod >select * from mp_attribute_kind; +----+------------------+-------------+------------------+ | ID | NAME | DESCRIPTION | IFACE_OUTLINE_NR | +----+------------------+-------------+------------------+ | 1 | Opiekunowie | NULL | 0 | | 2 | Introligatorka | NULL | 7 | | 3 | Klient - formaty | NULL | 16 | | 4 | Rodzaj | NULL | 21 | +----+------------------+-------------+------------------+ 4 rows in set (0.00 sec) >select * from mp_attribute where ID_MP_ATTRIBUTE_KIND=3 ORDER BY ID; +----+------+-------------+----------------------+------------+ | ID | NAME | DESCRIPTION | ID_MP_ATTRIBUTE_KIND | FIELD_TYPE | +----+------+-------------+----------------------+------------+ | 15 | A2 | NULL | 3 | checkbox | | 16 | B1 | NULL | 3 | checkbox | | 17 | B2 | NULL | 3 | checkbox | | 18 | B3 | NULL | 3 | checkbox | +----+------+-------------+----------------------+------------+ 4 rows in set (0.00 sec) >select mp_attribute_kind.name, mp_attribute.name,mp_attribute.id from mp_attributes, mp_attribute_kind, mp_attribute where mp_attributes.id_klienci=2 and mp_attribute.id=mp_attributes.id_mp_attribute and mp_attribute_kind.id = mp_attribute.id_mp_attribute_kind; +------------------+-----------------+----+ | name | name | id | +------------------+-----------------+----+ | Opiekunowie | Jan Kowalski | 3 | | Klient - formaty | B1 | 16 | | Introligatorka | Morgana | 9 | +------------------+-----------------+----+ 3 rows in set (0.00 sec) I teraz zgodnie ze skryptem z poprzedniego posta
kiedy coś zaznaczymy w polu np. checkbox czy radio i wyślemy POST-em to odpali zapytanie: mysql_query('INSERT INTO mp_attributes (id_klienci,id_mp_attribute) VALUES ('.$_SESSION['id'].','.$_POST['sub_cat'][$i].')'); Ale jesli odznaczymy coś w interfejsie to nie wyśle oczywiście tego pola bo to normalne, niezaznaczone pole nie jest wysyłane, więc to co chcemy usunąć nie pojawi się w tablicy $_POST rzecz jasna. I teraz zastanawiam się po prostu nad tym jak poprawić interfejs aby rozróżniał odznaczenie pola i odpalał inną kwerendę SQL. Mam nadzieję że w miarę jasno to opisałem. (IMG:http://forum.php.pl/style_emoticons/default/worriedsmiley.gif) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 02:20 |