![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание таблиц [D5, IB5.x]
Лора © (2004-02-19 08:59:00)Здравствуйте! Подскажите, есть ли возможность в Делфи создать программно рабочую область. То есть как, например в фокспро можно написать:
nnn=1
select naim2 from nsi
where naim1=a into cursor t&nnn,
где t&nnn- это название рабочей области, а nnn-это счетчик
kaif (2004-02-22 14:18:00) [1]Рабочая область в FoxPro это то же самое, что двунаправленный курсор компонента DataSet. То есть просто резултьтат выборки, по которому можно ходить туда-сюда. Поставь на форму несколько компонентов DataSet (нпример TIBQuery) и выбери в них одну и ту же таблицу. Это и будет аналог нескольких "рабочих областей" в FoxPro. Однако с привычками FoxPro нужно расстаться, если работаешь с IB. Лучше написать хранимую процедуру (CREATE STORED PROCEDURE), которая будет делать это все на сервере, а не гонять таблицу на клиент и потом ее там обходить всякими
with table do while not eof begin next end
Так как твоя таблица с поездами, как я сильно подозреваю, может оказаться очень даже не маленькой... Особенно через пару лет работы такой базы.
Danilka (2004-02-21 09:04:00) [2]Глобальные переменные, на мой взгляд, не самый лучший вариант, как правило - источник ошибок. И в твоем случае именно так. qq2 - общий объект для всех, а теперь смотри: у тебя первый poisk запускается, очишает запрос в qq2 и запускает его. Затем, запускает сам себя - процедуру poisk, которая тот-же объект qq2 очищает, заполняет и запускает заново..
Тебе надо qq2 объявить внутри процедуры poisk, создавать внутри нее.
А еще лучше, поищи в поисковиках инфу про алгоритм написаный тут: [27] SPIRIT © (19.02.04 15:23)
Думаю, его реализация будет правильнее/быстрее, чем эта процедура.
VLAD-MAL (2004-02-19 15:28:00) [3]TClientDataSet, раз уж все запоминать хочешь...
Создаешь таблицу произвольной структуры (в памяти, естественно), потом делаешь в ней, что придется.
А вообще - то тут задачка из серии лиейного прогриммирования, если "в лоб" решать - ресурсов сожрет - только держись...
SPIRIT (2004-02-19 15:23:00) [4]Зачем вы ломаете голову . Жил на свете замечательный дяденька , который написал алгоритм названный в его четь - алгоритм ДЕЙКСТРЫ я писал курсовую на 4 курсе, тока вместо станций были перекрестки в городе и там надо было найти оптимальный путь по заданным критериям. Как я вижу критерий у тебя один - расстояние.
так вот. пиши в каком - нибудь там яндексе "алгоритм Дейкстры"
данные из базы забиваешь в матрицу вида :
......пункт 1 | punkt2 | pinkt 3 **********
pinkt1------- | 200 | 10000
----------------------------------------
punkt2 200 |--------| 10000
---------------------------------------
punkt3 450 | 10000 |---------
10000 - это несуществующее расстояние которое в алгоритме не будет восприниматься в серьез т.к. очень велико.
если ты не блондинка думаю сможешь разобраться
Лора (2004-02-19 15:07:00) [5][25]Danilka
да нет, понятно, что тупик :)
все-все, поняла, начала описывать ситуацию и поняла :))
Danilka (2004-02-19 14:50:00) [6]цитирую сам себя: :))
I>
> если-же она пройдясь по циклу ничего не обнаружила, то возвращает
> null.
если тебе вернулся Null то значит тупик.
на самом деле, задача сложнее.
например, есть несколько вариантов пути, один проходит через 10 городов, а другой - через 1, вперед может найтись самый неудачный.
Еще одна проблема - с ростом количества станций, среднее время поиска будет расти в геом. прогрессии. Вообще, есть так называемая "задача комивояджра" - найти самый короткий путь, через наименьшее кол-во городов, если не ошибаюсь, что если кто-то найдет ее решение при котором время поиска будет расти не в геом. прогрессии от кол-ва станций, того ждет мильен долларов. :))
Лора (2004-02-19 14:39:00) [7][21] Danilka
А если выбрал станцию, передал ее параметром для вызова функции, выбрал данные и по всем направлениям тупик, то есть null, тогда куда возврат и что в качестве параметра?
Лора (2004-02-19 14:29:00) [8]Ну, в принципе может и обычный алгоритм, но я с таким еще не сталкивалась. Попробую сейчас
Zacho (2004-02-19 14:06:00) [9]
> Лора (19.02.04 13:47) [18]
Да в динамическом массиве например. Или еще где, простор для фантазии тут есть. Или вообще не "запоминать". Зачем ?
В случа с ХП - просто каждую очередную запись маршрута просто возвращать suspend'ом.
А view в данном случае мало поможет.
Danilka (2004-02-19 14:04:00) [10][19] Никто (19.02.04 13:52)
причем здесь вьюхи?
[18] Лора (19.02.04 13:47)
> Тока проблему-то не решит.. Все арвно надо где-то запоминать
> маршрут которым шла, опять-таки где?
Решит.
Просто подумай внимательно.
Примерно так: функции передается 2 параметра:
1. текущая стания отправления
2. конечная станция.
функция делает запрос по станциям, которые напрямую доступны от текущей стании отправления. далее в цикле их сравнивает с конечной станции, если равно, то прерывает цикл и возвращает текущую станцию отправления. Если не равно, то запускает саму себя передавая в качестве первого параметра текощей станцуии из выборки, если получает в ответ null, то берет следующую станцию из выборки, если ответ отличается от null, значит что-то нашлось, выходит из цикла и возвращает этот полученый результат, добавляя к нему 1 переданый ей параметр.
если-же она пройдясь по циклу ничего не обнаружила, то возвращает null.
вот и все. вобщем-то обычный алгоритм.
Лора (2004-02-19 13:55:00) [11]А для view есть возможность не задавть конкретное имя? Проставлять например Tab+n, где n-это счетчик.
Никто (2004-02-19 13:52:00) [12]В SQL есть возможность создавать представление:
CREATE VIEW [ВиртуальнаяТаблица] AS
SELECT...
Основное отличие от простого запроса - запрос внутри представления уже предкомпиллирован, поэтому выполняется быстрее.
При этом работа с результирующими данными ведется как с обычной таблицей, т.е. представление может использоваться как обычная таблица:
SELECT * FROM [ВиртуальнаяТаблица] WHERE...
Удаление представления:
DROP VIEW [ВиртуальнаяТаблица]
Лора (2004-02-19 13:47:00) [13]Мда.. Тока проблему-то не решит.. Все арвно надо где-то запоминать маршрут которым шла, опять-таки где?
Danilka (2004-02-19 13:41:00) [14][16] Лора (19.02.04 13:37)
функция (процедура) которая вызывает саму себя.
Лора (2004-02-19 13:37:00) [15]Что за рекурсия?
Danilka (2004-02-19 12:51:00) [16][12] Лора (19.02.04 12:21)
см: [11] Johnmen © (19.02.04 12:20)
без рекурсии, хоть на клиенте в дельфях, хоть на сервере в ХП (предпочтительнее) тяжело обойтись.
aga123 (2004-02-19 12:49:00) [17]Прошу прощения, поправлюсь: RequestLive = false хотел сказать
aga123 (2004-02-19 12:47:00) [18]Если боишься что очистится поставь RequestLive e Query только чтение, хотя оно и само по умолчанию будет таковым.
Лора (2004-02-19 12:21:00) [19]Бегать туда-сюда никто не мешает, просто бегать-то нужно с умом, я должна же помнить какой-то пункт на который мне вернуться в случае, если эта ветка тупиковая. А разве DataSet не связывается с Query или Table, если я их потом почищу для второго раза DataSet не очистится тоже?
Johnmen (2004-02-19 12:20:00) [20]Однозначно нужна рекурсивная ХП.
Подробности, как всегда на ibase.ru