![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическое создание таблиц [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