Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z ustawieniem właściwych wartości dla pól w tabeli
migacz
post
Post #1





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 15.04.2003
Skąd: Tczew

Ostrzeżenie: (10%)
X----


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
Go to the top of the page
+Quote Post
PMadej
post
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.


--------------------
Go to the top of the page
+Quote Post
GeoS
post
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
Go to the top of the page
+Quote Post
migacz
post
Post #4





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 15.04.2003
Skąd: Tczew

Ostrzeżenie: (10%)
X----


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"
Go to the top of the page
+Quote Post
uboottd
post
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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 08:21