Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Sprawdzanie poprawności przedziałów
nexis
post 13.12.2008, 20:06:45
Post #1





Grupa: Zarejestrowani
Postów: 1 012
Pomógł: 109
Dołączył: 26.09.2003
Skąd: nexis.pl

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


Mam tabelę w bazie danych o następującej strukturze:

Kod
+++++++++++++++++++++++++++
+     od +     do + marza +
+++++++++++++++++++++++++++
+   0.00 +  99.99 + 10.00 +
+ 100.00 + 199.99 + 20.00 +
+ 200.00 + 299.99 + 30.00 +
+ 280.00 + 399.99 + 40.00 +
+++++++++++++++++++++++++++


która zawiera przedziały cenowe wraz z odpowiednimi prowizjami. Przy wprowadzaniu wartości chciałbym sprawdzać, czy poszczególne przedziały cenowe na siebie nie nachodzą i chciałem do tego wykorzystać transakcje. Jak jednak w łatwy sposób ustalić, czy przedziały faktycznie na siebie nie nachodzą? W powyższym przykładzie ostatni wpis jest nieprawidłowy, ponieważ nachodzi na przedostatni.

Drugim problemem było sprawdzenie czy nie ma pustych zakresów, tzn. że jest przerwa między przedziałami (dokładność do jednego grosza, maksymalna wartość 99 999 999.99, czyli DOUBLE(10,2)).

Ten post edytował nexis 13.12.2008, 20:08:20


--------------------
Zend Certified Engineer

Kliknij POMÓGŁ jeśli moja odpowiedź okazała się użyteczna!
Go to the top of the page
+Quote Post
Darti
post 13.12.2008, 21:18:57
Post #2





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

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


na przykładzie, może coś zauważysz co Cie naprowadzi winksmiley.jpg
100 - 99.9 = 0.01
200 - 199.99 = 0.01
280 - 299.99 = -19.99


--------------------
The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1
MySQL Client API version : 5.0.27
Go to the top of the page
+Quote Post
nexis
post 13.12.2008, 21:44:20
Post #3





Grupa: Zarejestrowani
Postów: 1 012
Pomógł: 109
Dołączył: 26.09.2003
Skąd: nexis.pl

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


Cytat(Darti @ 13.12.2008, 21:18:57 ) *
na przykładzie, może coś zauważysz co Cie naprowadzi winksmiley.jpg
100 - 99.9 = 0.01
200 - 199.99 = 0.01
280 - 299.99 = -19.99


  1. <?php
  2. if ($_POST['from'] >= $_POST['to']) {
  3.   exit('End value must be larger than start value!');
  4. }
  5. // Begin transaction
  6. $this->db->beginTransaction();
  7. $query = sprintf
  8.   (
  9.      "INSERT INTO `comission` (`from`, `to`, `comission`) VALUES ('%01.2f', '%01.2f', '%01.2f')",
  10.      $_POST['from'],
  11.      $_POST['to'],
  12.      $_POST['comission']
  13.   );
  14. $this->db->query($query);
  15. // Search for overlapping values or empty spaces
  16. try {
  17.   $query = "SELECT `from`, `to` FROM `comission` ORDER BY `from` ASC";
  18.   $last  = -0.01;
  19.   foreach ($this->db->fetchAll($query) as $row) {
  20.      $diff = round($row['from']-$last, 2);
  21.      if ($diff != 0.01) {
  22.         if ($diff > 0.01)
  23.            throw new Exception('Empty spaces between values!');
  24.         else
  25.            throw new Exception('Overlapping values!');
  26.      }
  27.      $last = $row['to'];
  28.   }
  29.   $this->db->commit();
  30. } catch (Exception $e) {
  31.   $this->db->rollBack();
  32.   exit($e->getMessage());
  33. }
  34. ?>


--------------------
Zend Certified Engineer

Kliknij POMÓGŁ jeśli moja odpowiedź okazała się użyteczna!
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 Wersja Lo-Fi Aktualny czas: 14.08.2025 - 10:22