Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z ustawieniem właściwych wartości dla pól w tabeli
Forum PHP.pl > Forum > Bazy danych > MySQL
migacz
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
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
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
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
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.