STP, используй блокировки. Я в Интербейзе не силен, как конкретно сделать не подскажу, но теория говорит на этот счет вполне определенно. Рассмотрим пример, иллюстрирующий данную ошибку: пусть есть 2 пользователя, А и Б. Работают одновременно, и почти в одно и то же время захотели выставить счет. Что реально происходит (распишем по моментам времени):
1) Пользователь А прочитал последний номер счета из базы
2) Пользователь А формирует у себя на клиенте данные для сохранения в базу (например генерит новый номер счета). В это время пользователь Б читает из базы данных последний номер счета. О пользователе А он ничего не знает.
3) Пользователь А сформировал наконец счет и сохраняет его в базе данных. В этот момент пользователь Б формирует свой вариант нового счета. Понятно, что при условии идентичтоности алгоритмов генерации номеров счетов у всех пользователей пользователи А и Б сгенерят одинаковые идентификаторы счетов.
4) Пользователь Б сохраняет (а точнее пытается сохранить, СУБД не должна ему позволить это сделать) свой счет
Как с этим бороться: пользователь А после считывания последнего номера счета (в примере - шаг 1) ) должен поставить блокировку на таблицу. Если кто-то в это время обращается к таблице, то он ждет до освобождения блокировки (так происходит не всегда - читай документацию по Интребейзу). После вставки данных пользователь А разблокирует таблицу и пользователь Б может продолжить работу.\
Как поставить блокировку не знаю, в оракле есть такая вещь как SELECT .... FOR UPDATE. Попробуй копнуть
Кстати, как правильно сказал Oldy, можно не париться и применить генераторы, вот только я не уверен, что бизнес-логика позволяет сделать номер счета автоинкрементным. Если позволяет, то забудь про блокировки и введи в таблицу автоинкрементное поле (в SQL Server определяется как IDENTITY)