Інформація про нас Розроблені нами програми Наші інтернет-розробки Фотогалерея наших робіт Документація до програм, наші статті, а також перезентації наших програм

Вийшла нова версія програми "Склад".


 Виправлено велику кількість помилок.


 Можливість вимкнення заборони негативних чистилів у поточних залишках.


Наші координати

Ел. пошта
rs@corp2.net

Телефон: +38 (067) 901-63-22

Зателефонуйте: +380 63 108 17 00

Напишіть у Telegram: @erpk2

 

Виклик форуму

Динамічна інтернет-сторінка

 


 

Інші посилання


Інші сторінки

Програми
Корпорація

Склад
Корпорація
Бухгалтерія
Зарплата


Програми
Іспит
Розрахунок шаф
Реплікатор
Редактор
VDoc
Календар
Калькулятор
Буфер
Розсилка пошти
Голосування по мережі
Інсталятор
Планувальник
Адміністратор порталу
R-броузер

Документація
Відповіді на запитання
Вся документація
Склад
Розрахунок шаф
Іспит
Реплікатор
Інсталятор

Докумнтація складу
Встановлення програми

Вступ
Введення залишків
Замовлення (купівля)
Заявка
Зовнішній рахунок-фактура
Прихід товару складу
Витрата товару зі складу
Податкова накладна
Внутрішнє переміщення
Списання товару
Повернення товару
Замовлення на закупівлю
Реалізація та консигнація
Відстрочка платежу
Резервування товарів
Рахунок-фактура без рез.
Копіювання документів
Журнали документів
Платіжні документи
Забірний лист
Картка продукції
Калькуляція
Відбраковування товарів
Переоцінка товарів
Бронювання послуг
Анулювання послуг
Рахунок
Журнали документів


Довідник фірм
Довідник активів
Технологічні карти
Прайс-листи
Одиниці виміру
Норми витрати
Місце розташування товару
План рахунків
Сервісні центри
Співробітники
Курси валют
Системні довідники
Фрази

Поточні залишки
Звіт з внутрішнього переміщення
Звіт з продажу
Взаєморозрахунки
Рух матеріалів

Пошук інформації
Штрих-коди, шифри, партії

Об'єднання фірм
Об'єднання товарів
Робота в мережі та інтернет
Визначення прав
Створення та налаштування користувача
Скрипт налаштування користувача
Налаштування фірми
Налаштування складів
Налаштування мов
Типи документів
Налаштування меню
Версії програм та історія
Перевірка розрахунків
Створення та зміна звітів
Створення тіні (дзеркала) бази даних
Відновлення бази даних
Резервне копіювання бази даних

Інформація про програму
Робота з вікнами
Робота з таблицями
Експорт даних у таблицях
Імпорт даних у таблицях
Робота з деревами
Експорт із дизайнера звітів
Опис дизайнера звітів FastReport

Статті
Лічильник
Як заощадити на ліцензіях
Відновлення баз даних Interbase

Послуги
Веб-дизайн
Купівля програм

Інше
Фотогалерея


 

 


Вийшла нова версія програми "Корпорація" (ROffice).

 

 

Переглянути всі новини

 

 

 

 

 








Реалізація ключових полів у форматі int64 у базі даних Interbase (Firebird)

 

Автор: Рудюк С.О.
Internet: rudjuk.kiev.ua

Поля у форматі Integer можуть приймати значення від -2147483648 до 2147483647. Для більшості систем цього цілком достатньо.

Проблеми починаються, коли необхідно розділити індексний простір між розподіленими базами даних.

Розглянемо, наприклад, бухгалтерську систему, що працює на великих підприємствах, в яких є кілька сладів та офісів. У центральному офісі збирається інформація з усіх точок та об'єднується у загальну велику базу даних. Для того щоб дані на різних точках не конфліктували один з одним необхідно розділити індексний простір. Наприклад, якщо у нас 20 таких точок, то можна виділити кожному підрозділу діапазони по 100 млн. варіантів. Цього до певного часу, до часу вистачить. За невеликого руху даних цього вистачить на кілька років. Через 5-10 років все ж таки доведеться вирішувати цю проблему. Набагато вигідніше це передбачити при первісному проектуванні програми, щоб потім не було "проблеми 2000".

Інший приклад додатку, де потрібні великі індексні поля – це різні системи тарифікацій (тарифікації інтернет, АТС). У таких системах щосекунди можуть додаватися десятки записів.

Крім того, при веденні логів змін у базі даних у таблиці логування також рекомендується створювати індекси більші, ніж Integer.

Int 64 в Interbase (Firebird)

В Interbase 6 для 64-х розрядного цілого введено тип BigInt. Для того щоб Ви могли створювати поля з типом даних BigInt необхідно вказати у базі даних, що застосовується 3-й діалект бази даних.

Число формату BigInt може приймати 10-18 ступеня варіантів.

Int 64 та dbExpress

На жаль, у dbExpress тип Int 64 сприймається як TFMTBCDField, це приносить низку незручностей у роботі:

1) Не можливо просто виконати арифметичну операцію, а потрібно це робити через процедуру або привести до типу Int64, а потім виконати арифметичну операцію.

2) Хоч начебто за документацією тип BCD може мати 64 розряди, проте, як не дивно не сприймаються коректно числа, більші, ніж 10 у 15-му ступені. Натомість видається помилка про переповнення типу BCD.

3) Щоразу доводиться робити перетворення типів з BCD-типу Int64 і назад.

4) Іноді виникають дивні помилки про переповнення типу BCD. Це відбувається, коли у всіх розрядах типу BCD внесено 0.

5) Чомусь компонент SQLStoredProcedure погано працює з такими числами. Тому його доводиться замінювати звичайним запитом виклику процедури SQLQuery.

Таких проблем у компонентах прямого доступу до Interbase немає!

Функції для перетворення BCD на Int64 і назад

Напишемо функцію для перетворення BCD на Int64.

function BcdToInt64(const Bcd: TBcd; Truncate: Boolean = False): Int64;
var
ABcd: TBcd;
begin
if (Truncate) and (BcdScale(Bcd) > 0 ) then
NormalizeBcd(Bcd,ABcd,Bcd.Precision,0)
else
ABcd := Bcd;

if BcdCompare(ABcd,Int64ToBcd(0))=0
then Result := 0
else Result := StrToInt64(BcdToStr(ABcd));
end;

Напишемо функцію перетворення з Int64 в BCD.

function Int64ToBcd(const AValue: Int64): TBcd;
begin
Result := StrToBcd(IntToStr(AValue));
end;

Так як іноді виникає помилка переповнення, коли всі розряди BCD-типу знаходяться в нулях, необхідно передати значення через функцію, що нормалізує це число:

function NormBcd(const AValue: TBcd): TBcd;
begin
if BcdCompare(AValue,Int64ToBcd(0))=0
then Result := Int64ToBcd(0)

else Result := AValue;
end;

Передача параметрів у dbExpress

Якщо ми встановлюємо параметр у компоненті SimpleDataSet, необхідно число з формату Int64 перетворювати на TFMTBCD.

With iqGetSecurName Do
Begin
Close;
Params.ParamByName('securid').AsFMTBCD
:=NormBcd(Int64ToBcd(VarInt64));
Open;

Для виконання арифметичних операцій необхідно число призвести до Int64.

VarInt64:=BcdToInt64(iqGetTypeDocTYPEDOCID.Value);

Коли параметр встановлюється значенням поля типу TFMTBCD необхідно надходити так:

Params.ParamByName('SKLADID').AsFMTBCD
:=NormBcd(itSkladsSKLADID.Value);