Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
8-73768
Arhangel
2002-05-27 18:06
2002.09.23
Иконка?


1-73707
koks
2002-09-11 11:37
2002.09.23
HourGlass :((


3-73533
sniknik
2002-09-01 00:45
2002.09.23
Поддерживает Jet тип Grafic?


1-73684
Донской
2002-09-09 18:03
2002.09.23
RXLib для D6


1-73688
kay
2002-09-11 04:35
2002.09.23
Angle





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский