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

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

Динамическое создание таблиц [IB6.x]


YurikGL ©   (2004-06-26 19:45:00) 

В процессе формирования отчета появилась необходимость динамически создавать таблицу, которую заполняет рекурентная функция. Проблема в том, как подобрать имя таблицы так, что-бы с разных компьтеров создавались таблицы под разными именами. На данный момент в имя таблицы простоа вставляю имя пользователя и имя компьтера.
Может существуют другие более корректные способы?


YurikGL   (2004-06-26 22:32:00) [1]


> Sergey Masloff   (26.06.04 22:27) [14]

В ссылке я такого совета не нашел, либо его не понял. Мне ж нужно по простому, как в [10]. Так и буду делать.


Sergey Masloff   (2004-06-26 22:27:00) [2]

YurikGL ©   (26.06.04 21:57) [13]
Дык, не мой он. Довольно-таки общепринятый. Насколько я помню в ссылке Romkin-а примерно то же советуют.


YurikGL   (2004-06-26 21:57:00) [3]


> Sergey Masloff   (26.06.04 21:48) [12]

Спасибо. Ваш способ меня устраивает на все 99.(9)%.


Sergey Masloff   (2004-06-26 21:48:00) [4]

А какой сервер у тебя? Если FB из последних там же есть переменные соотв. А так по фиг любой идентификатор хоть генератором. То есть запоминаешь любой интежер и передаешь его в процедуру которая формирует отчет. Потом из общей таблицы отчетов читаешь по этому идентификатору.


YurikGL   (2004-06-26 21:34:00) [5]

Отчет просто формируется в этой таблице, а проблем с экспортом у меня нет.

> Пусть функция заполняет общую статическую таблицу вставляя
> туда допустим дополнительный столбец идентифицирующий конкретную
> сессию


А насколько корректно идентефикатор сессии генерировать можно с помощью генератора?


Sergey Masloff   (2004-06-26 21:28:00) [6]

Пусть функция заполняет общую статическую таблицу вставляя туда допустим дополнительный столбец идентифицирующий конкретную сессию. Это будет лучше чем временная таблица. По скорости все будет нормально.
 Ну не знаю что там у тебя за отчеты я уже много лет делаю все отчеты в виде XML. То есть процедура формирующая отчет сразу формирует XML который я построчно читаю. Ну и у меня есть самописная (не мной но ничего военного нет - самому написать можно, по крайней мере правлю я ее регулярно) DLL которая умеет этот XML печатать в Word и Excel, я прямо из XML управляю форматированием, именами полей и так далее. Можно печатать по букмаркам можно в заранее подготовленый шаблон с таблицами. Можно всякие объединения-деления ячеек и все через XML. Ну вернее это некий самодельный XML, но от стандартного он почти не отличается. Очень удобно.

Процедуры выглядят примерно так
CREATE PROCEDURE PRNT(LIST : INTEGER)
RETURNS (RESULT VARCHAR(2000))
as
BEGIN
 RESULT = '<worddoc>';
 suspend;
 for select x1,x2,x3... from... where... into... do...
 RESULT = <row>;
 suspend;
 RESULT = '<cell1>x1</cell1><cell2>x2</cell2...
 suspend;
 /// и так далее
END;  

потом делаю селект из этой процедуры и результат подсовываю в DLL. Все дико довольны ;-)


YurikGL   (2004-06-26 21:03:00) [7]


> Sergey Masloff   (26.06.04 20:54) [8]

А как можно еще решить эту проблему?


Sergey Masloff   (2004-06-26 20:54:00) [8]

Romkin ©   (26.06.04 20:18) [5]
>Вот чего бы я не советовал, так это динамически менять метаданные. Они кешируются, и неприятностей может быть много.
Золотые слова


YurikGL   (2004-06-26 20:22:00) [9]

А генератор это - идея.

Другой идей была работа с локальной базой Access в которой и создается временная таблица, но возникла проблема создания запроса к обоим базам одновременно.


YurikGL   (2004-06-26 20:19:00) [10]


> Anatoly Podgoretsky ©   (26.06.04 20:16) [4]

Я делаю Trnas(ИмяПользователя+ИмяКомпьютера)+Random где Truns транслитерирует русские буквы в английские и удаляет недопустимые символы.
Но ИМХО это все равно не корректный способ.


Romkin   (2004-06-26 20:18:00) [11]

Вот чего бы я не советовал, так это динамически менять метаданные. Они кешируются, и неприятностей может быть много.
Если так уж понадобились временные таблицы, то их можно эмулировать, используя генератор
http://www.ibase.ru/devinfo/generator.htm#extra


Anatoly Podgoretsky   (2004-06-26 20:16:00) [12]

YurikGL ©   (26.06.04 20:02) [2]
Нет в принципе ты делаешь не так, UserName<>ComputerName
Пользователь может работать более чем с одной машины одновременно.
По именам нет разницы, более того у имени пользователя вероятность недопустимых символов больше.
Если нужна юольшая уникальность, то <ComputerName>+<UserName>+Random
В конце концов в последнее время у микрософта принять использовать для таких целей GUID


YurikGL   (2004-06-26 20:05:00) [13]

Кстати, с одного компьютера потенциально под разными сеансами могут работать два пользователя :)


YurikGL   (2004-06-26 20:02:00) [14]


> Anatoly Podgoretsky ©  

В принципер, так и делаю. Проблема в том, что в имени компьютера могут содержаться символы, которые недопустимы в имени таблицы, приходится их исключать.
Хотел узнать, может в самом IB (пользую в качестве сервера FB 1.5) есть подобные функции генерации имени таблицы или существует другое "классическое" решение проблемы.


Anatoly Podgoretsky   (2004-06-26 19:52:00) [15]

<ComputerName>+X


Наверх

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