Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ограничение длины результирующих полей [D6, ADO + MSJet + *.mdb]


Locker ©   (2004-04-10 16:15:00) 

При запросе (компонент TADOQuery):

SELECT
 P.Фамилия AS [Фамилия],
 P.Имя AS [Имя],
 P.Отчество AS [Отчество],
 P.Фамилия + ' ' + P.Имя + ' ' + P.Отчество AS [Пациент],
 ...
FROM
 [Пациенты] P


длина возвращаемого поля [Пациент] составляет 255 символов, хотя поля Фамилия, Имя, Отчетсво имеют длину по 20 символов, что в результате должно давать 60 символов.

Использование функции LEFT:
 LEFT(P.Фамилия + ' ' + P.Имя + ' ' + P.Отчество, 60) AS [Пациент]
не помогает.

И что делать-то? Памяти ведь жрет немеряно!


Locker   (2004-04-12 19:38:00) [1]

А как насчет возможности создания временных индексов?

Может, все же есть возможность задать размер поля в SQL запросе?


Johnmen   (2004-04-12 16:13:00) [2]

Сделать вычисляемое поле в клиентской программе. Тогда память отъедаться будет не более <видимое кол-во записей>*<max длина>.


Locker   (2004-04-12 16:06:00) [3]

Борьба за оптимизацию используемой памяти.

При запросе данных:

SELECT
P.Фамилия AS [Фамилия],
P.Имя AS [Имя],
P.Отчество AS [Отчество],
P.Фамилия + ' ' + P.Имя + ' ' + P.Отчество AS [Пациент],
...
FROM
[Пациенты] P


возвращаемое поле [Пациент] имеет длину 255 символов. Так как тип данных в полях P.Фамилия, P.Имя, P.Отчество - WideString, то и тип конкатенированного поля - WideString. Итого, 255 символов * 2 байта = 510 байт. При этом поля P.Фамилия, P.Имя, P.Отчество имеют (каждое само по себе) длину в 20 символов, то-есть, суммарная длина - 60 символов (по 2 байта) - итого - 120 байт. Имеем 390 байт пустыми. И это в каждой записи. При результатах запроса в 50 тыс. строк имеем (390 * 50000) = 19,5 "пустых" МБайт!

"На пальцах": "Иванов--------------" + "Иван----------------" + "Иванович------------" ="ИвановИванИванович----------------------------------------------------------------------------------------------------- -----------------------------------------"
Тут "-" - пустой символ. Вместо "ИвановИванИванович" и 42 "-" в результирующем поле имеем "ИвановИванИванович" и 237 "-".

Вопрос: как получить в результирующем поле только 60 (реальных) символов без дополняющих (до 255) символов? То-есть, мне надо, чтобы тип данных для результирующего поля [Пациент] был char(60), а не (по "понятиям" MS Jet) - char(255).


Johnmen   (2004-04-12 15:48:00) [4]

За оптимизацию чего конкретно борьба ?


Locker   (2004-04-12 15:17:00) [5]

К сожалению, ругается на:
CAST(P.Фамилия + ' ' + P.Имя + ' ' + P.Отчество AS VarChar(60)) AS [Пациент]
Пишет: "Неопознанная ошибка." и ни слова больше...

Самое печальное, что даже LEFT(P.Имя, 1)выдает результирующую строку в 255 символов! Первый символ - из имени, а все остальное - #0
Вот и что делать с этим? Как это оптимизировать?


ЮЮ   (2004-04-12 02:30:00) [6]

CAST(P.Фамилия + ' ' + P.Имя + ' ' + P.Отчество AS VarChar(60)) AS [Пациент]


RayRom   (2004-04-11 16:29:00) [7]

Ну тут вряд ля я смогу помочь, хех


Locker   (2004-04-11 11:30:00) [8]

Спасибо, RayRom... но, к сожалению, в Jet SQL 4.0 функция CONCAT не поддерживается, а конкатенация строк при помощи + и & приводит к вышеописанному результату.

Что ж делать-то?


RayRom   (2004-04-10 18:53:00) [9]

Извини я имползую MySQL  и по другому это делаю:
concat(FAM," ",left( name, 1  ) ,  ".", left( otch, 1 ) ,  "."  )  as  "F.I.O"'


Наверх

Титульная страница Поиск, карта сайта Написать письмо