Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Autonumeracja faktur na poziomie bazy danych
Forum PHP.pl > Forum > Bazy danych > MySQL
115750
Chciałbym wprowadzić automatyczną numerację faktur na poziomie MySQLa według schematu numer/rok np. 115/2014.
Po wejściu w nowy rok numer byłby zerowany.

Zakładam, że taka numeracja wymaga dwóch kolumn - na numer kolejny i rok.
Czy da się to zrobić na poziomie bazy w jakiś elegancki sposób?
Pyton_000
Tak, 2 kolumny
Funkcja zwracająca MAX() z numeru faktur WHERE rok = 2014
115750
A czy rok też się da automatycznie zmienić pop nadejściu nowego roku?
Pyton_000
YEAR(NOW())
Crozin
Po prostu jako wartość dla kolumny ROK ustaw wartość funkcji YEAR(NOW())
115750
Wyczarowałem coś takiego:

  1. INSERT INTO receipt (`number`, `year`, `date`)
  2. SELECT IFNULL(MAX(number), 0) + 1, YEAR(NOW()), NOW()
  3. FROM receipt
  4. WHERE year=YEAR(NOW())


Iffnulla dodałem ponieważ, gdy zmieniałem ręcznie rok na inny, to wtedy pierwszym numerem faktury jest 0 a nie 1.

Czy taki kod jest Waszym zdaniem ok, czy można go jakoś ulepszyć?
Pyton_000
A spróbuj zamiast MAX(number)+1 dać
  1. IFNULL(MAX(number), 0)+1
115750
Chciałem dziś przerobić swoje zapytanie na procedurę. Utworzyłem taki kod:

  1. CREATE PROCEDURE new_receipt (IN p_id_order int(11))
  2. BEGIN
  3.  
  4. INSERT INTO receipt (number, year, date, id_order)
  5. SELECT IFNULL(MAX(number), 0) + 1, YEAR(NOW()), NOW(), p_id_order
  6. FROM receipt
  7. WHERE year=YEAR(NOW());
  8.  
  9. END


Niestety otrzymuję błąd:
Cytat
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 8


Gdzie tkwi błąd?
Pyton_000
Dodaj przed

DELIMITER //
i po
//
115750
Niestety nic to nie zmieniło. Tylko nieznacznie zmienił się komunikat błędu:

Cytat
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '//' at line 9
Pyton_000
  1. DELIMITER //
  2. CREATE PROCEDURE new_receipt (IN p_id_order int(11))
  3. BEGIN
  4.  
  5. INSERT INTO receipt (number, `year`, `date`, id_order)
  6. SELECT IFNULL(MAX(number), 0) + 1, YEAR(NOW()), NOW(), p_id_order
  7. FROM receipt WHERE
  8. `year` = YEAR(NOW());
  9. END
  10. //
115750
Niestety wciąż jest błąd.

Spróbowałem utworzyć tą procedurę za pomocą PHPMyAdmin i się udało. Oto jaki wygenerował kod:
  1. CREATE PROCEDURE `new_receipt` (IN `p_id_order` INT)
  2. COMMENT 'Nowy rachunek - autonumeracja'
  3. NOT DETERMINISTIC MODIFIES SQL DATA SQL SECURITY DEFINER
  4. INSERT INTO receipt( number, year, date, id_order)
  5. SELECT IFNULL( MAX( number ) , 0 ) +1, YEAR( NOW( ) ) , NOW( ) , p_id_order
  6. FROM receipt
  7. WHERE year = YEAR(NOW( ));
Pyton_000
Kod który Ci podałem też tworzył tą procedurę
115750
Może problem był w tym, że ten kod wykonywałem z poziomu PHPMyAdmin a nie bezpośrednio w konsoli mysql.
sazian
w phpmyadmin nie podajesz dyrektywy DELIMITER tylko wpisujesz go w polu pod zapytaniem
115750
Wpisałem ten kod od Pyton_000 bezpośrednio w konsoli i również zadziałało.
Dziękuję za pomoc.
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.