Пореден номер на документ

DirectX

Registered
Добър вечер пак и пак :P

Такааааааа ... в цялата система която разработвам се наложи да се печатат и един документи (касов ордер); на него също като на фактурата има номер който нараства със всеки следващ нов документ. Питанията ми са:

1) Как да направя, така че при печат на касовия ордер на всеки човек да с различен номер (последователен разбира се :P )

2) Как ще стане, така че за всяка стопанска година (2010-2011; 2011-2012 etc. ) да започва след това от 1 пак ?
 
По първия въпрос : на полето ID трябва да зададеш auto_increment, след което да използваш функцията mysql_insert_id() която ти дава ID на последния вмъкнат запис.

По втория въпрос - ако няма да ти трябва таблицата за изминалата година, просто я архивираш и я нулираш (TRUNCATE ). Ако ще ти трябва (вероятно) ще трябва да се измисли нещо друго.

Ей сега ми хрумна нещо :

if ($id > $Last_Record_From_Prev_year) {$id -= $Last_Record_From_Prev_year}

Обаче за всяка следваща година ще трябва да правиш по още една проверка.
 
madmax3_ каза:
По първия въпрос : на полето ID трябва да зададеш auto_increment, след което да използваш функцията mysql_insert_id() която ти дава ID на последния вмъкнат запис.

По втория въпрос - ако няма да ти трябва таблицата за изминалата година, просто я архивираш и я нулираш (TRUNCATE ). Ако ще ти трябва (вероятно) ще трябва да се измисли нещо друго.

Ей сега ми хрумна нещо :

if ($id > $Last_Record_From_Prev_year) {$id -= $Last_Record_From_Prev_year}

Обаче за всяка следваща година ще трябва да правиш по още една проверка.
а добре как да го използвам по-точно тази функция ?
някаква нова таблица ли да направя или какво, че малко ми убягва
 
----------------MySQL-------------------
CREATE TABLE `test` (
`id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`txt` VARCHAR( 255 ) NOT NULL
) ENGINE = MYISAM ;
----------------MySQL-------------------


----------------PHP-------------------
$sql = "INSERT INTO `test` (`id` ,`txt` )VALUES (NULL , 'Proba 1');";

mysql_query($sql);

$id = mysql_insert_id(); //$id = 1;


$sql = "INSERT INTO `test` (`id` ,`txt` )VALUES (NULL , 'Proba 2');";

mysql_query($sql);

$id = mysql_insert_id(); //$id = 2;

----------------PHP-------------------
 
Най-накрая нещо по моята специалност :)

Сега да ти кажа това е по-голям проблем от колкото си мислиш. Ти че ще си имаш ID на документа, което да е от auto_increment поле - ще си имаш, това е задължително, но номера на документ е нещо което потребителите много обичат да променят и не става с auto increment.

Следващ номер за годината можеш да си вземеш така:

select MAX(DocNum)+1 WHERE year(DocDate)=$WantedYear and DocType=$WantedDocType
което е ОК ако системата ти не е натоварена и веднага след заявката insert-неш новия документ. Ако системата ти е натоварена обаче (повече от 100 едновременно работещи с един вид документ и от една фирма) и в зависимост от вида на базата данни и настройката на изолация на транзакциите може в един момент още някой да направи същата заявка и да получи същия следващ номер.
В моята система няколко пъти вече ми се случи. Аз се преборих така:
1. създадох си уникален индекс по искания от мен ключ (в твоя случай година и номер)
2. затворих заявката за вземане на номер в една транзакция със записа на документа
START TRANSACTION
select MAX(DocNum)+1 WHERE year(DocDate)=$WantedYear and DocType=$WantedDocType update .....
insert ....
COMMIT TRANSACTION
и завъртях в цикъл транзакцията докато не успее.

Тази схема обаче не позволява да покажеш предварително номера на документа, както най-вероятно ще ти искат, но това е положението - аз не им го показвам - нито на фактури, нито на касови ордери, нито на стокови разписки.

Естествено трябва да видиш в базата която използваш дали се поддържат транзакции - специално аз не съм на mySql, но мисля че InnoDB в mySql поддържа транзакции - не съм сигурен дали myISAM вече поддържа, едно време нямаше.

Съветвам те още от сега да се откажеш от auto_increment-а защото особеностите при номер на документ са толкова много, че няма да ти свърши работа. Ако базата ти не е mysql погледни дали се поддържат sequences, което би могло да ти влезне от полза.
 

Back
Горе