Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Rozłożenie wierszy w tabeli
Forum PHP.pl > Forum > Przedszkole
neo1986kk
Witam w innym temacie pytalem jak zminiac wiersze, ale niestety nie uzyskałem odpowiedzi dlatego wpadłem na inny pomysł tylko potrzebuję jedną informację.

wyswietlanie tabeli polega na:

  1. while ($wiersz = mysql_fetch_row($idzapytania))
  2. {
  3.  
  4. echo wiersz[1] wiersz[2] wiersz[3];
  5. }

no i jest fajnie bo wyświetla sie tabela.
Świetnie tylko że ja potrzebuje z wiersza poniżej zamienić wiersz[1].
czyli

jest
a a a
b b b
a ma być
b a a
a b b
Czy jest jakaś możliwość w php zrobienia czegoś takiego, ale nie poprzez sortowanie?
webdice
Jeśli Cię dobrze rozumiem, to nie bardzo coś takiego uzyskasz bez dodatkowego kodu. Napisz lepiej co chcesz zrobić.

P.S. Dodaj bbcode, w innym wypadku temat zamknę.
neo1986kk
Tworzę pewnego rodzaju plan, i mam tabelę w której jest id,klient,kod,data rozpoczęcia produkcji, data zakończenia produkcji.
Chcę aby kierownik produkcji miał możliwość zmiany kolejności produkcji, co za tym idzie automatycznie powinna zmieniać się data rozpoczęcia produkcji i data zakończenia. moze podam przykład. Sortowanie po dacie zakończenia.

id klient kod data rozpoczecia data zakonczenia
1 a a1 2009-10-20 12:00 2009-10-20 15:00
2 b b1 2009-10-20 15:00 2009-10-20 19:00
3 c c1 2009-10-20 19:00 2009-10-20 20:00

Okazuje się ze klient c potrzebuje towar szybciej i po zmianie powiny się zmienić daty oraz kolejności w ten sposób

3 c c1 2009-10-20 12:00 2009-10-20 13:00
1 a a1 2009-10-20 13:00 2009-10-20 16:00
2 b b1 2009-10-20 16:00 2009-10-20 20:00

Myślę, że jest to bardziej czytelne
webdice
Sortujesz po dacie.
neo1986kk
no to ja wiem ze sortuje po dacie ale ja chce zamienić te daty tak jak na przykładzie powyżej. Samo sortowanie nic nie da, tylko pogorszy sprawę.
webdice
Musisz sprawdzić czas trwania danej produkcji i na tej podstawie dodać/odjąć czas rozpoczęcia oraz zakończenia dla dwóch sąsiednich rekordów.

P.S. Edytujesz post po moim wpisie i wychodzę na kretyna.
neo1986kk
Cytat(webdice @ 22.10.2009, 10:28:17 ) *
Musisz sprawdzić czas trwania danej produkcji i na tej podstawie dodać/odjąć czas rozpoczęcia oraz zakończenia dla dwóch sąsiednich rekordów.

P.S. Edytujesz post po moim wpisie i wychodzę na kretyna.


sorry bo akurat napisales a ja kliknalem zapisz...
ok wiem jak odjąć czas tylko wlasnie jak to zrobić dla 2 rekordów?

chcę zeby to polegało na tym że wyświetla się tabela czyli caly plan i przy każdym rekordzie będzie przycisk, przesuń wyżej lub przesuń niżej i po kliknięciu zmienił sie plan.
thek
Będziesz musiał wyciągnąć czas trwania zadania (ilość godzin od startu do końca), znać godzinę startu tego "specjala" i każdej po nim wstawionego odpowiednio "przesuwać daty oraz godziny". Posługując się Twoim przykładem...
1 a a1 2009-10-20 12:00 2009-10-20 15:00
2 b b1 2009-10-20 15:00 2009-10-20 19:00
3 c c1 2009-10-20 19:00 2009-10-20 20:00
Wiemy, że C dostał specjala i startuje o 12 zamiast A. Wstawiamy go tam z czasem 12.00 do 13 (bo C trwa godzinę, od 19 do 20). Teraz WSZYSTKIE po nim począwszy od tego z jakim go zamieniliśmy, czyli od A mają sprawdzamy czas trwania i dostosowywane są do zmienionego rozkładu. A więc:
A trwa 3 godziny (12-15), więc od 13.00 (czas końca specjala) do 16.00
B trwa 4 godziny(15-19), więc od 16.00 (koniec A) do 20.

Zmianom ulegają TYLKO zadania począwszy od tego, które zostało zastąpione do tego przed specjalnym. Na przykładzie nieco szerszym:

1 a a1 12:00 - 15:00
2 b b1 15:00 - 19:00
3 c c1 19:00 - 20:00
4 c c2 20.00 - 21.00
5 b b2 21.00 - 22.00
Gdy 4 ma zacząć się o 15.00...
4 trwa godzinę, a za sobą ma 5, zaś o 15.00 zaczyna się 2, co sprawia, że do korekty godzin kwalifikują się 2 i 3 (tylko one mają czasy startu od 15.00 do starego startu zadania 4 czyli 20.00).
Jako że różnica to godzina, więc wszystkim złapanym robimy przesunięcie daty startu i końca zadania o godzinę, zaś priorytetowi stat ustawiamy na ową godzinę i dodajemy czas trwania.
Da nam to:
1 a a1 12:00 - 15:00
4 c c2 15.00 - 16.00
2 b b1 16:00 - 20:00
3 c c1 20:00 - 21:00
5 b b2 21.00 - 22.00

Teraz widzisz na przykładzie co się dzieje? Robisz zapytanie do bazy, które zwraca Ci w wyniku rekordy z datami i czasami pomiędzy startem priorytetu a startem tego zadania gdyby było robione normalnie i w nich dodajesz do startu i końca czas trwania zadania priorytetowego. To jest wszystko co musisz zrobić smile.gif

EDIT: @ Webdice. Jak widzisz w przykładzie, to nie tyle 2 sąsiednie rekordy... Jeśli użyje linków w stylu "Wyżej", "Niżej" to mu wystarczy tylko zmiana czasu w rekordzie priorytetu i tym przed nim. Gdy posłużyłby się "drag&drop", to rozwiązanie jakie przedstawiłem obejmie więcej niż 2 rekordy zapewne. Czyli obejmuje to nie tyle sąsiednie 2 rekordy, tylko rekordy zawsze przed tym priorytetowym. Nigdy po nim następujące.

EDIT2: Pamiętaj, że wybrana przez Ciebie godzina może być nieosiągalna (może trwać inne zadanie). Albo przerywasz je i kończysz później (w bazie zrobisz mały bajzel lub będziesz musiał zmienić jej strukturę by na to pozwalała), albo zaczniesz priorytet gdy skończy się trwające wtedy zadanie (rozsądniejsze). Twój pomysł z niżej, wyżej sugeruje podejście drugie.
webdice
Przy założeniu że zmiany polegają na przesuń w górę/dół to id 2 rekordów odczytasz bez problemu (w końcu masz tablice), zastanów się chwilę. Sytuacja troszkę się komplikuje gdy dany rekord możesz przesuwać o niewiadomą ilość pozycji, w tym wypadku zobacz jak wygląda zasada działania nested tree.
neo1986kk
WOW, no dziękuje Ci bardzo za tego posta, ale po pierwszym przeczytaniu nie za bardzo to kumam, muszę to dokładnie przeanalizować,
rozumiem ze daty muszą się zmieniać automatycznie i dopasowywac, tak jak napisałeś ale właśnie nie wiem jak to zrobić.
Chodzi o to że odejmę czas rozpoczęcia od wykonania i wyjdzie mi 1h. ok
no i najgorsze to jest gdzie to zapisać że bedzie to godzina, może jak sie pobawie to dla jednego rekordu to zrobię, ale nie mam pojęcia jak to zrobić dla wszystkich rekordów... Najlepiej jak by ktoś miał choć kawałek skryptu gotowego, ale nie bede o to prosił, bo po pierwsze zostane wysmiany, a po drugie nie wypada... w każdym razie pokombinuje z tym, dzięki.

tylko jeszcze może być później kłopot bo jeśli zamienię
1.

a
b
c
d

na:

b
a
c
d

to jest ok

ale teraz jeśli bede chcial zamienić jeszcze aby kolejność była
b
d
a
c
no to juz jest lipa - nie moge czytać po ID
thek
Musisz policzyć róznicę czasu pomiędzy startem i końcem. Bazy mają funkcje operujące na czasie. Przejrzyj sobie odpowiedni dział manuala. Mając już ją wybierasz rekordy jakie podpadają do zmiany. Gdy masz tylko zmianę o pozycję w górę lub dół to nie problem. Nawet się nieco upraszcza, bo następuje wymiana pewnych danych winksmiley.jpg
Przykład wymiany 2 z 3, zwróć uwagę na kolory:
1 12:00 - 15:00
2 15:00 - 19:00
3 19:00 - 20:00

1 12:00 - 15:00
3 15:00 - 16:00
2 16:00 - 20:00

Jak widzisz pomarańcz się nie zmienił, a niebieski to czas startu plus trwanie priorytetu. Ostatecznie więc priorytet ma godziny:
Nowy_start_priorytetu = start_zadania_wcześniejszego, Nowy_koniec_priorytetu = start_zadania_wcześniejszego + czas trwania_priorytetu
Nowy_start_przesuniętego = Nowy_start_przesuniętego + czas_trwania_priorytetu, Nowy_koniec_przesuniętego = Koniec_starego_priorytetu

Zauważ, że godziny 16 mogą być liczone w różny sposób winksmiley.jpg A to nie jedyne sposoby. Jest jeszcze co najmniej jedna w mojej głowie liczona jako różnica czasów pomiędzy końcami starymi. Może więc ta godzina być wyliczona na kilka sposobów, a potem tylko użyć UPDATE na obu wierszach smile.gif

@UP: To zadziała, ale update rekordów musisz robić zaraz po zmianie pozycji wierszy, a nie najpierw porobić zmiany, a potem dopiero UPDATE. Baza musi się aktualizować "w locie", nie czekając na Submit. Linki UP i DOWN muszą wysyłać te informacje do bazy o przesunięciach, dzięki czemu one się przesuną. Zauważ, że Twój "nie działający przypadek" nic nie zmienia. Nie czytamy bowiem po Id, ale po tablicy sortowanej według godziny (i ewentualnie daty) startu zadań. Nie przejmujemy się żadnym id. Po zmianie zadań sortowanie odbywa się według nowych godzin już, więc id mogą być przemieszane, ale godziny są już aktualne. Znajomość id jest więc zbędna tak naprawdę. Co najwyżej się przyda przy UPDATE. Ale czy rekordy te mają id różne o 1 czy 10 to już bez znaczenia. To godzina się liczy, a nie id przy sortowaniu rekordów.
neo1986kk
Ok. Więc jeśli wyrażasz chęć to proszę o pomoc w napisaniu zapytania.
Czy on ma wyglądać tak?

  1. 1.Select * from plan where `dataprodukcji`='$_GET['dataprod']' ;
  2. $a=$_GET['dataprod']+$_GET['czasprod'];
  3. 2.Select * from plan where `dataprodukcji`='$a'

questionmark.gif?
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.