![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
BDE + BCD поля [D6, Paradox]
Starter2 © (2002-09-03 14:56:00)Кто работал с таким типом полей, дайте консультацию, пожалйста
Я их использовал впервые из-за фиксированной значности дроби (перевожу складской учет из Paradox 3.5 в Delphi). Все бы хорошо, но столкнулся с такой проблемой. В SQL запросах при подсчетах сумм по колонке такого типа BDE возвращает тип поля "N" и при попытке использования этого поля для модификации/вставки в BCD поле таблицы БД с помощью SQL запроса возникает "mismatch", т.е. несоответсвие типов данных.
Я уже подумывал все заменить с BCD на Float (NUMERIC по SQL-шнему), но потом подумал-подумал и решил спросить людей опытных.
Поделитесь опытом использования BCD (преимущества и недостатки). Буду благодарен любой информации
MsGuns (2002-09-03 22:00:00) [1]Кое где справился с помощью CAST, но в целом проблему не поборол. Придется реструктурировать BCD во FLOAT :<(((
MsGuns (2002-09-03 18:14:00) [2]На
SELECT LsNYear, LsNMonth, LsNFamily, SumNByMon AS NUMERIC
орет то же самое ! Замена "Numeric" на "Float" - то же самое
Пытаюсь вписать вместо "Numeric" BCD - волает, что нет такого оператока или ключевого слова
Val (2002-09-03 17:39:00) [3]:) запутали вы меня совсем.
я тут глянул в хелп по типам, вот такая картина:
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 17:27:00) [4]Sorry за двуликость, просто иногда тут форумит один мой коллега (когда я отхожу), я не всегда забываю поменять Name
Еще раз сори
MsGuns (2002-09-03 17:25:00) [5]
//** Расчет всего начислено за каждый месяц
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. Проблема - как ?
Val (2002-09-03 17:12:00) [6]:( я имел ввиду использование типов для сумм, а не BCD.
в рамках своего опыта(хотя не особо большого) работы с автоматизацией бухгалтерии хочу сказать, что хранение в базе сумм в копейках очень удобное решение.
а что говорит в пользу BCD, чем он такой удобный?
по вопросу:
а почему именно SQL заставлять? есть функции преобразования в Delphi:CurrToBCD/BCDToCurr...
Starter2 (2002-09-03 16:43:00) [7]>Val
Задал поиск по "BCD", нашла только в "Круглом столе "Королевства", но никакой конкретики. Ни одной статьи, к сожалению. Мне бы не хотелось отказываться от такого неплохого типа данных только из-за того, что BDE при SQL-суммировании колонки присваивает результирующему полю тип Float. Может подскажите как "заставить" SQL вывести нужный мне тип поля
Что-то вроде
SELECT SUM(Summa1) AS SummAll With Type=BCD
Получилось безграмотно с т.зр. SQL, но зато максимально ясно отражает суть проблемы
Val (2002-09-03 15:03:00) [8]если все глобально переводишь, лучше хранить суммы в копейках(избавит от проблемы округлений), недавно был вопрос на форуме по этой теме, можешь поискать, может что полезное есть.