Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php/mysql] Generacja unikalnego numeru
Blajo
post
Post #1





Grupa: Zarejestrowani
Postów: 98
Pomógł: 1
Dołączył: 7.08.2005
Skąd: Górny Śląsk

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


Witam

Zastanawiam się nad generacją unikalnego numeru umowy, ale ciężko mi na cokolwiek sensownego wpaść.

Otóż - mam w bazie tabelę osoby z danymi osób o następującej strukturze: id, nazwisko, skrot

Przykładowe dane w tabeli:
1 | Imię Nazwisko | IM
2 | Jan Kowalski | JK
itd.

Dodaję z pewnego formularza do tabeli umowy. Wybieram osobę z tabeli osoby i chcę dodawanej umowie nadać unikalny numer w następującej formie XXXXYYZZ, gdzie:
XXXX - numer umowy począwszy od 0001 (ważne, żeby te 0 też się wpisywały)
YY - skrót osoby wybranej z bazy osoby
ZZ - dwie ostatnie cyferki roku - czyli np. 07

Problem mój polega na tym, że nie za bardzo wiem jak się za takie coś zabrać.
Zwrócić uwagę należy na to, że jeśli dla pierwszej wpisywanej umowy wybiorę skrót IM, to numer umowy powinien być następujący: 0001IM07, jeśli będę wprowadzała drugą umową, w której wybiorę znowu tę samą osobę - to numer powinien być 0002IM07. Wpisuję trzecią umowę, ale teraz wybieram inną osobę - to numer powinien być 0001JK07, przy czwartej umowie i pierwszej osobie: 0003IM07.

Krótko mówiąc - każda osoba ma swoją unikalną numerację, która od każdego nowego roku leci od 0001.
Jak to wykonać ze strony technicznej?
Jakie pola dodać do bazy danych, aby była łatwość wyciągania danych (np. wszystkie umowy dla IM, gdzie rok jest 2007), oraz aby dobrze szło wyszukiwać umowy wpisując np. 1234IM07?

Jakieś pomysły?
Go to the top of the page
+Quote Post
skowron-line
post
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


a chcialem zauwazyc ze Kowalskich i Nowakow jest w tym kraju miliony i nawet zdarza sie ze maja tak samo na imie.

wiec jak bedziesz mial
Jan Kowalski ze Śląska
Jan Kowalski z Katowic

to bedziesz mial takie same dwa identyfikatory umow

i co wtedy??
Go to the top of the page
+Quote Post
Blajo
post
Post #3





Grupa: Zarejestrowani
Postów: 98
Pomógł: 1
Dołączył: 7.08.2005
Skąd: Górny Śląsk

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


Identyfikatory będę sobie sam ustalał i NIE dopuszczę do takiej sytuacji (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
skowron-line
post
Post #4





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Cytat(Blajo @ 26.02.2007, 16:14:22 ) *
Identyfikatory będę sobie sam ustalał i NIE dopuszczę do takiej sytuacji (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)


troche bez sensu nie lepiej zrobic to jakos z glowa zeby pozniej sobie jej nie zawracac bo jak ci ta baza urosnie to potem mozesz tego nie ogarnac i bedziesz sobie w brode plul
Go to the top of the page
+Quote Post
Blajo
post
Post #5





Grupa: Zarejestrowani
Postów: 98
Pomógł: 1
Dołączył: 7.08.2005
Skąd: Górny Śląsk

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


To nie jest moim problem - tym bardziej, że tych osób z identyfikatorami w bazie będzie dokładnie 6.

Więc jakiś pomysł na rozwiązanie mojego powyższego problemu?
Go to the top of the page
+Quote Post
misiek172
post
Post #6





Grupa: Zarejestrowani
Postów: 656
Pomógł: 3
Dołączył: 26.10.2005
Skąd: Częstochowa

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


o jejq... wystarczy substr aby rozdzielić cyfry do powiększenia, dodać +1 i spowrotem złożyć w całość


  1. <?php
  2. $str = "0001IM07";
  3. $pos = strpos($str, 'IM');
  4. $s[0] = substr($str, 0, $pos);
  5. $s[1] substr($str, $pos+1);
  6. $pow = $s[0] + 1;
  7.  
  8. $dlugos = strlen($s[0]);
  9. $dlugosc2 = strlen($pow);
  10. if($dlugosc2 < $dlugosc){
  11.  $roznica = $dlugosc - $dlugosc2;
  12.  for(i=0;i<=$roznica;$i++){
  13.  $zera .= '0'; 
  14.  }
  15. $pow = $zera.$pow;
  16. }
  17. // powiększony string
  18. $strnowy = $pow.$s[1];
  19. ?>


nie testowałem, pisałem z głowy, ale myśle, że powinno chulać ;P

Ten post edytował misiek172 26.02.2007, 16:59:54
Go to the top of the page
+Quote Post
Blajo
post
Post #7





Grupa: Zarejestrowani
Postów: 98
Pomógł: 1
Dołączył: 7.08.2005
Skąd: Górny Śląsk

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


Bardzo mi pomógł Twój post, dzięki.

Teraz mam problem z bazą danych, otóż jak wprowadzam pierwszy raz do bazy, ze skrótem powiedzmy JK, to wszystko jest fajnie: wychodzi 0001JK07, drugi raz z tym samym - super 0002JK07. Jednakże, gdy trzeci raz wprowadzę z innym skrótem, np. MN => 0001MN07, bardzo dobrze.

Problem zaczyna się, gdy chcę wprowadzić teraz 4 raz - ponownie ze skrótem JK, to zamiast 0003JK07 - wprowadza mi znowu 0001JK07.

Przypuszczam, że problem jest w zapytaniu do bazy, może dodać jakieś nowe pole trzeba?

Oto zapytanie:

  1. $querynumer = mysql_query("SELECT * FROM um WHERE id = (select max(id) from um) AND id_a='$id_a' AND rok='$rok'");


Kod generujący:
  1. <?
  2.  
  3. $rok = date("Y");
  4. $do = substr("$rok", -2);
  5.  
  6. $qa = mysql_query("SELECT * FROM ak WHERE id_a='$id_a'");
  7. $ra = mysql_fetch_array($qa);
  8. $a = $ra["skrot"];
  9.  
  10. if(mysql_num_rows($querynumer) == 0) {
  11. $numer = "0001$a$do";
  12. $nr = 1;
  13. } else {
  14. $rown = mysql_fetch_array($querynumer);
  15. $str = $rown["numer"];
  16. $j = substr($str, 0, 4);
  17. $d = substr($str, 4, 2);
  18. $t = substr($str, 6, 2);
  19. $pow = $j + 1;
  20.  
  21. if ($pow<10)
  22. $numer = "000$pow$d$t";
  23. elseif ($pow>9 AND $pow<100)
  24. $numer = "00$pow$d$t";
  25. $nr = $pow;
  26. }
  27. ?>


Jak temu z kolei zaradzić?
Go to the top of the page
+Quote Post
Lonas
post
Post #8





Grupa: Zarejestrowani
Postów: 576
Pomógł: 14
Dołączył: 9.11.2005

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


Przygotowałbym sobie baze danych nastepująco :

Tabela umowa :

| ID_umowa | ID_kontrahent | Identyfikator | Numer_umowy | Rok |

Pole identyfikator nie jest w sumie niezbędne bo identyfikator możesz trzymać w tabeli Kontrahent - później przy wyswietlaniu umowy pobierać identyfikator.


Teraz łatwo możesz dodawać kolejne wpisy - wyciagasz z bazy najwyzszy numer umowy przypisany do danego kontrehenta inklementujesz go o 1 i tworzysz nowy wpis do bazy.

Pozdrawiam
Go to the top of the page
+Quote Post
Blajo
post
Post #9





Grupa: Zarejestrowani
Postów: 98
Pomógł: 1
Dołączył: 7.08.2005
Skąd: Górny Śląsk

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


No dobra mniej więcej podobnie mam skonstruowaną bazę.
Jednak problemem jest w jaki sposób mam wyciągnąć tej najwyższy identyfikator.
Go to the top of the page
+Quote Post
Lonas
post
Post #10





Grupa: Zarejestrowani
Postów: 576
Pomógł: 14
Dołączył: 9.11.2005

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


Już pisze :

Tworzysz sobie funkcje ktora wybiera kontrahentow z bazy i wyswietla w polu select :


  1. <?php
  2. //wybiera wszystkich kontrahentow z bazy
  3. function pokaz_kontrahent()
  4. {
  5. $result = mysql_query("select id_kontrahent,nazwa from kontrahent order by nazwa asc");
  6. while($dane = mysql_fetch_array($result))
  7.  echo '<option value="'.$dane[0].'">'.$dane[1].' </option>';
  8. }
  9. ?>

wywolujesz nastepujaco :
  1. <?php
  2. echo' <select name="kontrahent"> ';
  3.  pokaz_kontrahent();
  4. echo'  </select> ';
  5. ?>



Odbierasz sobie ID kontrahenta - wybierasz najwyzszy nr z bazy
  1. <?php
  2. $id_kontrahent = $_POST['kontrahent'];
  3. $rok = date("Y");
  4.  
  5. $wynik  = mysql_query("SELECT MAX(Numer_umowy) AS max_nr WHERE id_kontrahent = '$id_kontrahent' AND rok = '$rok' ");
  6.  
  7. $dane = mysql_fetch_array($wynik);
  8. $max_nr = $dane['max_nr'];
  9.  
  10. $max_nr_next = $max_nr + 1;
  11. ?>


I tyle robisz teraz nowy wpis do bazy
Go to the top of the page
+Quote Post
bne
post
Post #11





Grupa: Zarejestrowani
Postów: 83
Pomógł: 1
Dołączył: 18.10.2006

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


Według mnie to trochę głupie, skoro masz pewność, że tych osób będzie tylko 6 to nie lepiej samemu dodać te indentyfikatory zamiast sie tyle pocić ?
Go to the top of the page
+Quote Post
misiek172
post
Post #12





Grupa: Zarejestrowani
Postów: 656
Pomógł: 3
Dołączył: 26.10.2005
Skąd: Częstochowa

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


Może w czymś pomoże...
Tą funkcją w moim skrypcie podaje sobie nastepny numer w kolejności.
mój format danych np: '326/2007'
  1. <?php
  2. function next_nr($nr){
  3. for($i=0;$i<count($nr);$i++){
  4. $c = explode('/', $nr[$i]);
  5. $q[$i] = Array();
  6. $q[$i][0] = $c[0];
  7. $q[$i][1] = $c[1];
  8. $w[$i] = $c[1];
  9. }
  10. $max = end($w);
  11. $v = 0;
  12. for($i=0;$i<count($q);$i++){
  13. if($q[$i][1] == $max){
  14. $tab[$v] = $q[$i][0];
  15. $v++;
  16. }
  17. }
  18. sort($tab);
  19. $war = end($tab);
  20. return ++$war.'/'.$max;
  21.  
  22. }
  23. ?>
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: 22.08.2025 - 23:46