![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 55 Pomógł: 0 Dołączył: 15.04.2003 Skąd: Tczew Ostrzeżenie: (10%) ![]() ![]() |
Witam
Robię dziennik korespondencji i natrafiłem na takowy problem: Dokument jest rejestrowany i jest mu nadawany numer. Numer ma taką postać kolejny_numer/rok Problem polega na tym że jeżeli zrobię dwa oddzielne pola "nr" i "rok" to php muszę wykonać dwa zapytania Pierwsze [sql:1:f31dd17b09] SELECT MAX(nr) FROM tabele WHERE rok=aktualny_rok[/sql:1:f31dd17b09] i pobranie "nr" jako zmiennej a następnie drugie zapytanie które bedzie dodawało rekord. Obawiam się, że jeżeli bedzie pracowało kilkadziesiąt osób to może dojść do błędów i będa się powtarzać numery. Z kolei jeżeli zrobię jedno pole, w którym bedzie taki wpis "kolejny_numer/rok" to jak ustawić MySQLa aby utomatycznie zmieniał "kolejny_numer" a rok wstawiał aktualny. Może są inne sposoby jak to zrobić, ale ja nie mam pojęcia jak. Z góry dzięki za wszelkie podpowiedzi, przykłady i rozwiązania |
|
|
![]()
Post
#2
|
|
![]() Vice-Administrator serwera Grupa: Przyjaciele php.pl Postów: 395 Pomógł: 0 Dołączył: 7.08.2003 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
ja do tego stworzylem dosc spory kod w php, przeanalizuj sobie i przerob na wlasne potrzeby:
[php:1:1a603cb16e]<?php //pobranie numerów faktur z bazy danych $zapytanie3 = "SELECT nr_fv FROM sprzedaz;"; $wynik3 = mysql_query($zapytanie3,$dblink); if(!$wynik3) { print("Blad ! <br><br >n"); print("error number :".mysql_errno()."<br />"); print(mysql_error()."<br />"); } $a=0; while($dbRow3=mysql_fetch_row($wynik3)) { $numer[$a] = split ('[/.-]', $dbRow3[0]); $a++; } //funkcja filrtuj±ca tablicę względem aktualnego roku function filtr($test) { return ($test == date("Y")); } $a=0; while($a<count($numer)) { $numer_[$a]=$numer[$a][1]; $numer_[$a]=date("Y",mktime(0,0,0,1,1,$numer_[$a])); $a++; } $numer2=array_filter($numer_,"filtr"); //stworzenie tablicy numerów po filtrowaniu $a=0; while ($a<count($numer_)) { if ($numer2[$a]!="") { $numer3[$a][0]=$numer[$a][0]; $numer3[$a][1]=$numer2[$a]; } $a++; } sort($numer3); $a=0; while ($a<count($numer3)) { $numer1[]=$numer3[$a][0]; $a++; } //wybór najwyższego numeru faktury w danym roku $max[0]=$numer3[array_search(max($numer1),$numer1)][0]; $max[1]=$numer3[array_search(max($numer1),$numer1)][1]; $max[0]=$max[0]+1; $naglowek[0]=implode("/",$max); ?>[/php:1:1a603cb16e] zmienna $naglowek[0] ma juz format : nr/rok np. 123/2003 teraz musisz miec zapytanie ktore wstawi ci jej wartosc do bazy ale nie do dwoch roznych komorek ale do jednej. -------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 602 Pomógł: 0 Dołączył: -- Skąd: W - WA -> GRO Ostrzeżenie: (0%) ![]() ![]() |
Co tez opowiadasz. Napisz dokladnie, co masz (struktura tabeli), co chcesz wyciagnac/wrzucic do bazy.
Na razie rozumiem to tak (jesli nr nie jest typu autoincrement): [sql:1:4292e61079]INSERT INTO tabele (nr, rok) VALUES (MAX(nr)+1, NOW());[/sql:1:4292e61079] -------------------- Zanim zadasz pytanie, zawsze wczesniej zajrzyj do manuala ( pl.php.net/manual/pl/ ).
Szukasz skryptow - www.hotscripts.com |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 55 Pomógł: 0 Dołączył: 15.04.2003 Skąd: Tczew Ostrzeżenie: (10%) ![]() ![]() |
cała struktura tabeli nie jest aż tak istotna. Najważniejsze to to aby poprawnie były nadawane numery.
[sql:1:11ac50c4e2]INSERT INTO tabele (nr, rok) VALUES (MAX(nr)+1, NOW()); [/sql:1:11ac50c4e2] To co podałeś nie działa u mnie. Zwraca coś takiego "Invalid use of group function" |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 384 Pomógł: 0 Dołączył: 3.04.2003 Skąd: Chorzow Ostrzeżenie: (0%) ![]() ![]() |
Witamy wszystkich w temacie transakcje lub blokowanie tabel.
Blokownie tabel jets banalne: LOCK TABLE faktury, mieszamy na fakturach, UNLOCK TABLE i mozemy spac spokojnie. Transakcje sa troche trudniejsze. Po pierwsze baza/tabela musi wspierac transackje (czytaj: jesli MySQL to tabela musi byc InnoDB lub inna transakcyjna). Potem leci tak: ustwiasz transakcej na poziom serializable, robisz select najwyzszego wiersza dodajac na koncu zapytania FOR UPDATE (co lokuje wiersz), mieszasz na pobranych danych, i wstawiasz je insertem, po czym konczysz transakcje. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 08:21 |