Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php/mysql] Generacja unikalnego numeru
Forum PHP.pl > Forum > PHP
Blajo
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?
skowron-line
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??
Blajo
Identyfikatory będę sobie sam ustalał i NIE dopuszczę do takiej sytuacji smile.gif
skowron-line
Cytat(Blajo @ 26.02.2007, 16:14:22 ) *
Identyfikatory będę sobie sam ustalał i NIE dopuszczę do takiej sytuacji 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
Blajo
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?
misiek172
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
Blajo
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ć?
Lonas
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
Blajo
No dobra mniej więcej podobnie mam skonstruowaną bazę.
Jednak problemem jest w jaki sposób mam wyciągnąć tej najwyższy identyfikator.
Lonas
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
bne
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ć ?
misiek172
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. ?>
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.