migacz
21.10.2003, 13:24:33
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
PMadej
21.10.2003, 13:34:56
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.
GeoS
21.10.2003, 13:56:50
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]
migacz
22.10.2003, 08:52:57
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"
uboottd
23.10.2003, 14:19:47
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.
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.