Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Autonumeracja faktur na poziomie bazy danych
115750
post
Post #1





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 7.06.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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?

Ten post edytował 115750 25.06.2014, 15:07:41
Go to the top of the page
+Quote Post
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Tak, 2 kolumny
Funkcja zwracająca MAX() z numeru faktur WHERE rok = 2014
Go to the top of the page
+Quote Post
115750
post
Post #3





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 7.06.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


A czy rok też się da automatycznie zmienić pop nadejściu nowego roku?
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


YEAR(NOW())
Go to the top of the page
+Quote Post
Crozin
post
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Po prostu jako wartość dla kolumny ROK ustaw wartość funkcji YEAR(NOW())
Go to the top of the page
+Quote Post
115750
post
Post #6





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 7.06.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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ć?

Ten post edytował 115750 25.06.2014, 16:19:10
Go to the top of the page
+Quote Post
Pyton_000
post
Post #7





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


A spróbuj zamiast MAX(number)+1 dać
  1. IFNULL(MAX(number), 0)+1
Go to the top of the page
+Quote Post
115750
post
Post #8





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 7.06.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Pyton_000
post
Post #9





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Dodaj przed

DELIMITER //
i po
//
Go to the top of the page
+Quote Post
115750
post
Post #10





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 7.06.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Pyton_000
post
Post #11





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


  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. //


Ten post edytował Pyton_000 26.06.2014, 15:02:19
Go to the top of the page
+Quote Post
115750
post
Post #12





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 7.06.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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( ));


Ten post edytował 115750 26.06.2014, 15:06:47
Go to the top of the page
+Quote Post
Pyton_000
post
Post #13





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Kod który Ci podałem też tworzył tą procedurę
Go to the top of the page
+Quote Post
115750
post
Post #14





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 7.06.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Może problem był w tym, że ten kod wykonywałem z poziomu PHPMyAdmin a nie bezpośrednio w konsoli mysql.
Go to the top of the page
+Quote Post
sazian
post
Post #15





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


w phpmyadmin nie podajesz dyrektywy DELIMITER tylko wpisujesz go w polu pod zapytaniem
Go to the top of the page
+Quote Post
115750
post
Post #16





Grupa: Zarejestrowani
Postów: 117
Pomógł: 0
Dołączył: 7.06.2004
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Wpisałem ten kod od Pyton_000 bezpośrednio w konsoli i również zadziałało.
Dziękuję za pomoc.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 15.09.2025 - 22:07