Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.06.15;
Скачать: [xml.tar.bz2];

Вниз

Как создать таблицу временно?   Найти похожие ветки 

 
deras   (2008-05-23 00:05) [0]

БД FB2.0
Необходимо создать таблицу в процессе работы программы, а потом (скажем, после закрытия программы), удалить эту таблицу?


 
MsGuns ©   (2008-05-23 00:18) [1]

Зачем ?


 
deras   (2008-05-23 00:38) [2]

это типа подготовочная таблица для отчета В нее (таблицу) пользователь вносить данные (в т.ч. из справочников) перед формированием отчета (отчет форм. в Excel - желание пользователя). После создания отчета, эта таблица не нужна.


 
Loginov Dmitry ©   (2008-05-23 00:40) [3]

> Необходимо создать таблицу в процессе работы программы,
> а потом (скажем, после закрытия программы), удалить эту
> таблицу?


И в чем проблема? Используй TIBSQL и конструкцию CREATE TABLE для создания и DROP TABLE для удаления.
Еще есть "временные" таблицы.


 
deras   (2008-05-23 00:42) [4]


> Еще есть "временные" таблицы.

если можно. об этом подробней :-) "Временные" - это какие?


 
MsGuns ©   (2008-05-23 00:42) [5]

Если эти данные нужны только на время одного сеанса, то таблиц никаких не надо - достаточно все держать в памяти, а отображать, к примеру, через стрингрид.
Если эти "временные" данные нужно сохранять (например, из-за большого объема и невозможности подготовить их "в один присест"), то вполне подойдет TClientDataSet или даже простой текстовый файл.
Есть вариант сохранения их в самом Экселе (например, на "непечатном" листе, который удаляется после выгрузки результатов в эксель во избежании случайного вывода на печать вместе с основными данными)


 
MsGuns ©   (2008-05-23 00:43) [6]

>Loginov Dmitry ©   (23.05.08 00:40) [3]

ИМХО, совершенно лишнее - см. [5]


 
MsGuns ©   (2008-05-23 00:44) [7]

>Loginov Dmitry ©   (23.05.08 00:40) [3]
>И в чем проблема? Используй TIBSQL и конструкцию CREATE TABLE для создания и DROP TABLE для удаления.

Проблемы, действительно, нет. Есть проблемище ;)))


 
deras   (2008-05-23 00:49) [8]


> Если эти данные нужны только на время одного сеанса, то
> таблиц никаких не надо - достаточно все держать в памяти,
>  а отображать, к примеру, через стрингрид.

Точно! Так совершенно подойдет. Только вопрос: некоторые поля этой "временных данных"  должны содержать дропдаун с данными из таблицы-справочника. Такое можно реализовать? Достаточно будет ответа "да" или "нет". Спасибо


 
MsGuns ©   (2008-05-23 00:54) [9]

Да.


 
deras   (2008-05-23 00:54) [10]


> MsGuns ©   (23.05.08 00:54) [9]


Благодарю!


 
MsGuns ©   (2008-05-23 00:59) [11]

С помощью фантом-комбобокса, который делается визибельным при получения фокуса соотв. ячейкой, и предварительно вписанным точно в ректангель ячейки. По выходу из комобокса (или по селекту), выбранное из него значение (если селект) записывается в эту ячейку, а сам комбобокс прячется.
В комбобокс, ессно, предвапительно помещается "справочник"
Перед показом комбобокса можно выставить в нем то значение, которое имеется в текущей ячейке, с помощью IndexOf


 
deras   (2008-05-23 01:03) [12]


> MsGuns ©   (23.05.08 00:59) [11]


Ого! Я и не думал, что так непросто. Сам бы не догадался :-)
Т.е., комбобокс один, заполненый данными из справочника, просто он вписывается в ячейку, которая в фокусе? Я правильно понял?


 
MsGuns ©   (2008-05-23 01:06) [13]

Да, важно.
Сразу после показа фантома не забыть передать ему фокус !

И еще одни "грабли".
Когда комбобокс виден, а Вы скруллингуете грид, то получите очень некрасивый, все портящий эффект. Чтобы его избежать, есть 2 способа, простой и не очень.

Простой заключается в том, что Вы запрещаете скролы вообще. Но это скорее всего не получится.

Не очень заключается в том, что Вам необходимо отловить само событие начала скроллинга и спрятать комбобокс.


 
MsGuns ©   (2008-05-23 01:13) [14]

>deras   (23.05.08 01:03) [12]
>Т.е., комбобокс один, заполненый данными из справочника, просто он ?>вписывается в ячейку, которая в фокусе? Я правильно понял?

Правильно. Причем этот комбобокс Вы создаете в дизайне со свойством Visible := false. Чтобы правильно его "вписывать", Вам нужно привязаться либо к самому гриду (т.е. св-во TComoBox.Parent := TStringGrid) и тогда для его ректангеля просто использовать ректангель сетки,
либо к форме, но тогда над пересчитывать координаты.

Если справочников несколько, то у Вас опять-таки два пути
1) Для каждого справочника свой бокс, но тогда особое внимание разборкам "визибельности", чтобы у вас не сетке не получилась имитация игры "Морской бой". Зато один раз записали в них все справочники и забыли
2) Бокс один, но перед показом его нужно заполнить содержимым соотв. справочника. При этом чтобы не лазить кажый раз на сервер и не получать тормоза, заведите несколько TStrings для каждого справочника и в Items бокса зааписывайте содержимое соотв. списка


 
deras   (2008-05-23 01:18) [15]


> Не очень заключается в том, что Вам необходимо отловить
> само событие начала скроллинга и спрятать комбобокс.


а в этом есть проблема? Я спрашиваю, потому, что не понимаю еще как реализовывать.
Вы знаете, благодаря Вашим ответам, нашел вот это:
http://codesources.net/delphi-combobox-v-yacheyke-stringgrid/
Но, по-моему там не учтена проблема скроллинга


> 1) Для каждого справочника свой бокс,

Я так и думал. Но пока  есть только один справочник, что упрощает проблему


 
MsGuns ©   (2008-05-23 01:33) [16]

И последнее (раз уже начал лекцию, то надо и закончить ;))
Касательно собственно справочников, а точнее 2-х аспектов

1. Характристика объекта, хранящегося в справочнике.
Если это справочник-словарь (т.е. запись справочника состоит по сути из двух полей - код (идентификатор) записи и текст (наименование)), то описанный выше "комбобоксовый" способ вполне подойдет
Если же справочник содержит объекты с множеством характеристик, например, справочник сотрудников, в котором помимо таб.номера (или что там вместо него) есть еще поля "Фамилия", "Имя", "Отчество", "Год рождения" и т.д., но из который в сетку надо выбрать только один реквизит, то бокс явно не подходит, т.к. пользователь будет видеть только номера, фактически работая "вслепую". Для этого случая я бы вместо комбобокса использовал "нормальную" форму с DB-гридом, которую бы модально показывал под/над и слева/справа от целевой ячейки. На формочку повесил бы еще стандартный сервис поиска, сортировки, фильтрации и т.д. Пользователю, несомненно, это понравилось бы куда больше "зашированного" списка в комбобоксе

2. Специфика работы со справочником
Надо ли дать возможность пользователю "на лету" вносить изменения в сам справочник (например, добавить нового человека, если его там нет). Если надо, то без формочки никак. Если словарь, то можно в принципе обойтись комбобоксом, но во-первых, нельзя ни удалить, ни отредактировать, а при добавлении нового (юзер просто набрал в боксе текст) надо посылать запрос на вставку. Все бы ничего, если бы не эффект "неявной правки справочника", т.е. весьма вероятной ошибочной (а, следовательно, лишней) записи в справочник и, как следствие, появление в нем массы мусора.

Короче, это достаточно обширная тема и выходит за рамки сабжа, просто я хотел бы предостеречь Вас от возможных граблей при "простой" реализации "очевидных" вещей ;))


 
MsGuns ©   (2008-05-23 01:39) [17]

>deras   (23.05.08 01:18) [15]
>а в этом есть проблема? Я спрашиваю, потому, что не понимаю еще как реализовывать.

"Нет ничего сложного, если знаешь" ;)))

Подсказывать не хочу, а вот наводку дам. Посмотрите события предков класса TStringGrid и, если найдете что-то похожее, внимательно изучите.
Событие есть, но оно "укрыто" от наследников. Чтобы доступиться к нему из стрингрида, создайте "дружественный" класс (это Зотовская характеристика, не моя ;)), посредством которого можно перекрыть это событие, дописав в нем свое FantomeBox.Hide ;)


 
MsGuns ©   (2008-05-23 01:49) [18]

>http://codesources.net/delphi-combobox-v-yacheyke-stringgrid/

Если отбросить в сторону чудовищный стиль кода, то реализовано в целом верно за исключением того, что даже если я ничего не выбрал в боксе (т.е. просто открыл его, просмотрел, протащив ползунок, а потом щелкнул рядом с ним на сетке, убрав с него т.о. фокус), то содержимое целевой ячейки все равно изменится


 
deras   (2008-05-23 02:01) [19]


> MsGuns ©   (23.05.08 01:33) [16]
</I

> MsGuns ©   (23.05.08 01:39) [17]

>

Спасибо большое за уроки. Много интересного узнал. Вы четко дали направление, куда "рыть".
Очень приятно с Вами общаться.


 
deras   (2008-05-23 02:04) [20]


>  Для этого случая я бы вместо комбобокса использовал "нормальную"
> форму с DB-гридом, которую бы модально показывал под/над
> и слева/справа от целевой ячейки. На формочку повесил бы
> еще стандартный сервис поиска, сортировки, фильтрации и
> т.д.


А вот это - супер! Хотя у меня пока один справочник-словарь (думаю, будут еще), но я все равно так реализую ибо и красиво и удобно. Спасибо!


 
MsGuns ©   (2008-05-23 02:13) [21]

>но я все равно так реализую ибо и красиво и удобно. Спасибо!

В качестве бонуса за [19] ;)

Может быть, Вам придется иметь дело не с одним "нормальным" справочником, а несколькими. Тогда для того, чтобы не писать в каждой формочке одно и то же, создайте одну, базовую форму, не привязанную конкретно ни к какому датасету, и в ней разместите все элементы управления (сам грид, менюшки, кнопки, статусбары и т.д.) и реализуйте все сервисы. Затем для каждого конкретного спр-ка создайте форму-наследника от базового класса, настройте в дизайне запрос, "оформите" красивую решетку и все ! За полчаса Вы таким образом спроектируете десяток вполне роботоспособных форм просмотра справочников ! И удивитесь как мало в них кода.


 
deras   (2008-05-23 02:18) [22]


> и реализуйте все сервисы


что имеется ввиду?


 
MsGuns ©   (2008-05-23 02:20) [23]

>стандартный сервис поиска, сортировки, фильтрации и т.д.


 
deras   (2008-05-23 02:23) [24]

понял.
Еще раз спасибо! Буду пробовать реплизовать


 
Sergey13 ©   (2008-05-23 08:52) [25]

> [2] deras   (23.05.08 00:38)
> это типа подготовочная таблица для отчета В нее (таблицу)
> пользователь вносить данные (в т.ч. из справочников) перед
> формированием отчета. После создания отчета, эта таблица не нужна.

ИМХО странная логика. Пользователь что-то внес распечатал и все удалилось. Через полчаса потребовалось снова распечатать - опять что-то вноси.
Я бы организовал простую НЕ временную таблицу с идентификатором пользователя и очищал бы ее по запросу перед формированием отчета.


 
MsGuns ©   (2008-05-23 11:35) [26]

>Sergey13 ©   (23.05.08 08:52) [25]
>ИМХО странная логика.

Отнюдь. Как пример, надо распечатать лицевые для нескольких человек (список из бухгалтерии прилагается). Можно, конечно, по одному, каждый раз дергая сервер и заполняя форму-запрос. А можно указать список во временной табличке, из которой затем и сделать все ЗА ОДИН раз.

По похожей системе, кстати, работают многие "билетные" системы. Оператор за раз вводит паспортные данные НЕСКОЛЬКИХ человек, после чего ЗА ОДНУ ТРАНЗАКЦИЮ резервирует несколько билетов.

По завершению транзакции информация временной таблички уже никому не нужна.


 
Sergey13 ©   (2008-05-23 11:51) [27]

> [26] MsGuns ©   (23.05.08 11:35)
> По завершению транзакции информация временной таблички уже
> никому не нужна.

> и сделать все ЗА ОДИН раз.

Потом пойти в другой кабинет, где стоит принтер и убедиться, что принтер не работает и надо печатать на другой. Вернуться, ввести все фамилии заново и повторить процедуру.


 
MsGuns ©   (2008-05-23 12:01) [28]

>Sergey13 ©   (23.05.08 11:51) [27]

Просто скучно и захотелось пофлудить ?

Ну а если у про принтер.. Настоящие пачаны НИКОГДА не выводят непосредственно на принтер. Кто в хатмель, кто в эксел, кто в текстовик.


 
Игорь Шевченко ©   (2008-05-23 12:02) [29]

Sergey13 ©   (23.05.08 11:51) [27]

Принтер всегда работает.

MsGuns ©   (23.05.08 11:35) [26]


> По похожей системе, кстати, работают многие "билетные" системы.
>  Оператор за раз вводит паспортные данные НЕСКОЛЬКИХ человек,
>  после чего ЗА ОДНУ ТРАНЗАКЦИЮ резервирует несколько билетов.
>
>
> По завершению транзакции информация временной таблички уже
> никому не нужна.


Это в случае билетов на трамвай


 
MsGuns ©   (2008-05-23 12:16) [30]

>Игорь Шевченко ©   (23.05.08 12:02) [29]
>Это в случае билетов на трамвай

"Но тут малец с поправкой влез.." (с)
Как обычно, брякнул и в кусты. Или снизойдем и просветим невежественных ?


 
Sergey13 ©   (2008-05-23 12:19) [31]

> [29] Игорь Шевченко ©   (23.05.08 12:02)
> Принтер всегда работает.

2. Если принтер не работает, смотри пункт 1.


 
Игорь Шевченко ©   (2008-05-23 12:30) [32]

MsGuns ©   (23.05.08 12:16) [30]

Я тебя про запросы-то просветить не могу, а про системы резервирования малость подольше будет.


 
MsGuns ©   (2008-05-23 12:46) [33]

>Игорь Шевченко ©   (23.05.08 12:30) [32]
>Я тебя про запросы-то просветить не могу, а про системы резервирования малость подольше будет.

Ничего, послушать умных людей терпения хватит



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.06.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.007 c
2-1211396061
serega12
2008-05-21 22:54
2008.06.15
Треугольник


2-1211275074
RR Bom
2008-05-20 13:17
2008.06.15
Свойства DBGrid1


11-1189762779
Yury Sidorov
2007-09-14 13:39
2008.06.15
Предложение отказаться от ASM версии


2-1211321993
deras
2008-05-21 02:19
2008.06.15
Как в Edit сделать так, чтоб текст при вводе помещался справа?


2-1211292635
Stif
2008-05-20 18:10
2008.06.15
Реестр





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский