Форум: "Базы";
Текущий архив: 2002.09.23;
Скачать: [xml.tar.bz2];
Вниз
BDE + BCD поля Найти похожие ветки
← →
Starter2 (2002-09-03 14:56) [0]Кто работал с таким типом полей, дайте консультацию, пожалйста
Я их использовал впервые из-за фиксированной значности дроби (перевожу складской учет из Paradox 3.5 в Delphi). Все бы хорошо, но столкнулся с такой проблемой. В SQL запросах при подсчетах сумм по колонке такого типа BDE возвращает тип поля "N" и при попытке использования этого поля для модификации/вставки в BCD поле таблицы БД с помощью SQL запроса возникает "mismatch", т.е. несоответсвие типов данных.
Я уже подумывал все заменить с BCD на Float (NUMERIC по SQL-шнему), но потом подумал-подумал и решил спросить людей опытных.
Поделитесь опытом использования BCD (преимущества и недостатки). Буду благодарен любой информации
← →
Val (2002-09-03 15:03) [1]если все глобально переводишь, лучше хранить суммы в копейках(избавит от проблемы округлений), недавно был вопрос на форуме по этой теме, можешь поискать, может что полезное есть.
← →
Starter2 (2002-09-03 16:43) [2]>Val
Задал поиск по "BCD", нашла только в "Круглом столе "Королевства", но никакой конкретики. Ни одной статьи, к сожалению. Мне бы не хотелось отказываться от такого неплохого типа данных только из-за того, что BDE при SQL-суммировании колонки присваивает результирующему полю тип Float. Может подскажите как "заставить" SQL вывести нужный мне тип поля
Что-то вроде
SELECT SUM(Summa1) AS SummAll With Type=BCD
Получилось безграмотно с т.зр. SQL, но зато максимально ясно отражает суть проблемы
← →
Val (2002-09-03 17:12) [3]:( я имел ввиду использование типов для сумм, а не BCD.
в рамках своего опыта(хотя не особо большого) работы с автоматизацией бухгалтерии хочу сказать, что хранение в базе сумм в копейках очень удобное решение.
а что говорит в пользу BCD, чем он такой удобный?
по вопросу:
а почему именно SQL заставлять? есть функции преобразования в Delphi:CurrToBCD/BCDToCurr...
← →
MsGuns (2002-09-03 17:25) [4]
//** Расчет всего начислено за каждый месяц
FillStatusBar("Расчет БД",1);
FillStatusBar("Сумма начислено..",1);
with MainForm.quCheck.SQL do
begin
Clear;
Add("SELECT DISTINCT A.LsNYear, A. LsNMonth, A.LsNFamily,
SUM(A.LsNSumma) AS SumNByMon");
Add(" FROM "LsN" A");
Add(" GROUP BY A.LsNYear, A. LsNMonth, A.LsNFamily");
end;
MainForm.quCheck.Prepare;
MainForm.quCheck.ExecSQL;
//** Сохранить рез.НД в таблице Temp1
MainForm.tbCheck.TableName := "Temp1";
MainForm.tbCheck.Exclusive := true;
MainForm.btmvCopy.Destination := MainForm.tbCheck;
MainForm.btmvCopy.Source := MainForm.quCheck;
MainForm.btmvCopy.Mode := batCopy;
MainForm.btmvCopy.Execute;
with MainForm.quCheck.SQL do
begin
Clear;
Add(" A.LsNYear, A. LsNMonth, A.LsNFamily,
SUM(A.LsNSumma) AS SumNByMon");
Add(" FROM "LsN" A");
Add(" GROUP BY A.LsNYear, A. LsNMonth, A.LsNFamily");
end;
MainForm.quCheck.Prepare;
MainForm.quCheck.ExecSQL;
with MainForm.quCheck.SQL do
begin
Clear;
Add("INSERT INTO "Ls"");
Add(" (LsYear, LsMonth, LsFamily, LsSummaN)");
Add(" SELECT LsNYear, LsNMonth, LsNFamily, SumNByMon
Add(" FROM "Temp1"");
end;
MainForm.quCheck.Prepare;
MainForm.quCheck.ExecSQL;
Как видите, убирать запросы, открывать 2 таблицы и в цикле делать добавку - это не совсем (мягко сказано) хороший стиль, но при вставке еще ладно (рез.таблица пустая), а вот при коррекции (дальше по тексту,- я не приводил здесь за ненадобностью)- это вообще уродство какое-то получается.
Так что альтернативы запросам нет и быть не может.
Надо как-то побороть SQL. Проблема - как ?
← →
MsGuns (2002-09-03 17:27) [5]Sorry за двуликость, просто иногда тут форумит один мой коллега (когда я отхожу), я не всегда забываю поменять Name
Еще раз сори
← →
Val (2002-09-03 17:39) [6]:) запутали вы меня совсем.
я тут глянул в хелп по типам, вот такая картина:
SQL Syntax BDE Logical Paradox dBASE
SMALLINT fldINT16 Short Numeric(6,0)
INTEGER fldINT32 Long Long
DECIMAL fldBCD BCD(32,0) Numeric(20,0)
DECIMAL(7) fldBCD BCD(32,0) Numeric(7,0)
DECIMAL(7,2) fldBCD BCD(32,2) Numeric(7,2)
то есть, переводить или нет, решать вам.
Delphi does not have a native type for BCD. - вот это мне совсем не понравилось :(
а не решает разве cast вашу проблему?
← →
MsGuns (2002-09-03 18:14) [7]На
SELECT LsNYear, LsNMonth, LsNFamily, SumNByMon AS NUMERIC
орет то же самое ! Замена "Numeric" на "Float" - то же самое
Пытаюсь вписать вместо "Numeric" BCD - волает, что нет такого оператока или ключевого слова
← →
MsGuns (2002-09-03 22:00) [8]Кое где справился с помощью CAST, но в целом проблему не поборол. Придется реструктурировать BCD во FLOAT :<(((
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.09.23;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c