Текущий архив: 2004.03.28;
Скачать: CL | DM;
Вниз
Создание таблиц Найти похожие ветки
← →
Лора (2004-02-19 08:59) [0]Здравствуйте! Подскажите, есть ли возможность в Делфи создать программно рабочую область. То есть как, например в фокспро можно написать:
nnn=1
select naim2 from nsi
where naim1=a into cursor t&nnn,
где t&nnn- это название рабочей области, а nnn-это счетчик
← →
Zacho © (2004-02-19 09:31) [1]Объясни, что такое "рабочая область" Ни в Дельфи, ни в IB такого понятия нет.
А создать таблицы - конечно можно, выполнить запрос CREATE TABLE .. , подробнее читай Data Definition Guide,
← →
Лора (2004-02-19 09:39) [2]Нет, не создание таблицы конкретно в базе данных, а как бы область наподобие таблицы, которую потом можно закрыть и она не остается в базе. То есть она создается на то время пока программа работает.
← →
Johnmen © (2004-02-19 09:42) [3]Зачем это ? Что будешь делать с этим ?
← →
Соловьев © (2004-02-19 09:46) [4]2 Лора
создай таблицу а потом и удали ее. Как? Drop table
← →
Danilka © (2004-02-19 09:49) [5]а чем простой запрос не катит? результат его выполнения отдается клиенту и не хранится на сервере, скока его не проси об этом.
← →
Desdechado © (2004-02-19 10:46) [6]если речь идет о выборке из БД, которая как-то на клиенте проименована, то это и есть объект TQuery, который содержит результаты выборки
← →
Лора (2004-02-19 11:37) [7]Извините, я уходила по делам.
Мне нужно найти маршрут. Есть станция отпарвления и станция назначения, необходима найти те станции, через которые пройдет поезд. Есть участки в справочнике: входная станция и выходная. Но те станции, которые находятся мехду пунктом отправления и назначения, могут иметь ответвления в другую сторону. То есть таким образом выглядит:
станция отправления Джамбул станция назначения Семипалатинск
маршрут выглядит: Джамбул-Луговая-Чу-Моинты-Актогай-Семипалатинск.
Но если я выбираю из справочника станцию отправления Джамбул, то их будет несколько, станций назначения от Джамбул тоже будет несколько, поэтому мне я и делаю select несколько раз пок ане найду Семипалатинск, но я же не знаю сколкьо раз мне его придется делать в цикле, поэтому и не могу создавать столько таблиц через create. Просто знаю, что в фокспро есть такая возможность создать как бы виртуальную таблицу, а потом при закрытии программы она изчезает, то есть ее не надо удалять, просто закрыть и она изчезтнет.
Есть ли такое в делфи?
← →
Zacho © (2004-02-19 11:41) [8]Не вчитывался в условие задачи, но могу сказать, что в IB есть хранимые процедуры, а в языке ХП и триггеров есть такая конструкция - FOR SELECT .. INTO .. DO ..
Хотя вполне возможно, что это можно сделать и одним запросом, без ХП.
Приведи структуру таблиц, пример данных и желаемый результат.
← →
Лора (2004-02-19 11:53) [9]Ну не получилось у меня хранимой процедурой. А вот через создание рабочих областей в фокспро практически получилось. Просто большая часть программы уже реализована на делфи и эту часть тоже нужно бы на делфи сделать. Тока пока не пойму как.
Таблица, которая используется для этого одна-это справочник участков станций, наименовае входа, наименование выхода и расстояние:
naim1 naim2 Rast
Джамбул Луговая 500
Луговая Чу 300
Луговая Рыбачье 310
Чу А-А 1 250
Чу Кияхты 100
А-А 1 А-А 2 100
А-А 1 актогай 600
Актогай Семипалатинск 500
Мне необходимо От Джамбула нарисовать маршрут до Семипалатинска: Джамбул-Луговая-Чу-А-А1-Актогай-Семипалатинск.
и т.д.
← →
Zacho © (2004-02-19 12:04) [10]Ну и кто мешает например, просто выбрать всю таблицу а потом бегать по датасету как заблагорассудится ? В дельфи для работы с данными из БД существует такая вещь как набор данных (DataSet). Почитай что-нибудь про это.
← →
Johnmen © (2004-02-19 12:20) [11]Однозначно нужна рекурсивная ХП.
Подробности, как всегда на ibase.ru
← →
Лора (2004-02-19 12:21) [12]Бегать туда-сюда никто не мешает, просто бегать-то нужно с умом, я должна же помнить какой-то пункт на который мне вернуться в случае, если эта ветка тупиковая. А разве DataSet не связывается с Query или Table, если я их потом почищу для второго раза DataSet не очистится тоже?
← →
aga123 (2004-02-19 12:47) [13]Если боишься что очистится поставь RequestLive e Query только чтение, хотя оно и само по умолчанию будет таковым.
← →
aga123 (2004-02-19 12:49) [14]Прошу прощения, поправлюсь: RequestLive = false хотел сказать
← →
Danilka © (2004-02-19 12:51) [15][12] Лора (19.02.04 12:21)
см: [11] Johnmen © (19.02.04 12:20)
без рекурсии, хоть на клиенте в дельфях, хоть на сервере в ХП (предпочтительнее) тяжело обойтись.
← →
Лора (2004-02-19 13:37) [16]Что за рекурсия?
← →
Danilka © (2004-02-19 13:41) [17][16] Лора (19.02.04 13:37)
функция (процедура) которая вызывает саму себя.
← →
Лора (2004-02-19 13:47) [18]Мда.. Тока проблему-то не решит.. Все арвно надо где-то запоминать маршрут которым шла, опять-таки где?
← →
Никто (2004-02-19 13:52) [19]В SQL есть возможность создавать представление:
CREATE VIEW [ВиртуальнаяТаблица] AS
SELECT...
Основное отличие от простого запроса - запрос внутри представления уже предкомпиллирован, поэтому выполняется быстрее.
При этом работа с результирующими данными ведется как с обычной таблицей, т.е. представление может использоваться как обычная таблица:SELECT * FROM [ВиртуальнаяТаблица] WHERE...
Удаление представления:DROP VIEW [ВиртуальнаяТаблица]
← →
Лора (2004-02-19 13:55) [20]А для view есть возможность не задавть конкретное имя? Проставлять например Tab+n, где n-это счетчик.
← →
Danilka © (2004-02-19 14:04) [21][19] Никто (19.02.04 13:52)
причем здесь вьюхи?
[18] Лора (19.02.04 13:47)
> Тока проблему-то не решит.. Все арвно надо где-то запоминать
> маршрут которым шла, опять-таки где?
Решит.
Просто подумай внимательно.
Примерно так: функции передается 2 параметра:
1. текущая стания отправления
2. конечная станция.
функция делает запрос по станциям, которые напрямую доступны от текущей стании отправления. далее в цикле их сравнивает с конечной станции, если равно, то прерывает цикл и возвращает текущую станцию отправления. Если не равно, то запускает саму себя передавая в качестве первого параметра текощей станцуии из выборки, если получает в ответ null, то берет следующую станцию из выборки, если ответ отличается от null, значит что-то нашлось, выходит из цикла и возвращает этот полученый результат, добавляя к нему 1 переданый ей параметр.
если-же она пройдясь по циклу ничего не обнаружила, то возвращает null.
вот и все. вобщем-то обычный алгоритм.
← →
Zacho © (2004-02-19 14:06) [22]
> Лора (19.02.04 13:47) [18]
Да в динамическом массиве например. Или еще где, простор для фантазии тут есть. Или вообще не "запоминать". Зачем ?
В случа с ХП - просто каждую очередную запись маршрута просто возвращать suspend"ом.
А view в данном случае мало поможет.
← →
Лора (2004-02-19 14:29) [23]Ну, в принципе может и обычный алгоритм, но я с таким еще не сталкивалась. Попробую сейчас
← →
Лора (2004-02-19 14:39) [24][21] Danilka
А если выбрал станцию, передал ее параметром для вызова функции, выбрал данные и по всем направлениям тупик, то есть null, тогда куда возврат и что в качестве параметра?
← →
Danilka © (2004-02-19 14:50) [25]цитирую сам себя: :))
I>
> если-же она пройдясь по циклу ничего не обнаружила, то возвращает
> null.
если тебе вернулся Null то значит тупик.
на самом деле, задача сложнее.
например, есть несколько вариантов пути, один проходит через 10 городов, а другой - через 1, вперед может найтись самый неудачный.
Еще одна проблема - с ростом количества станций, среднее время поиска будет расти в геом. прогрессии. Вообще, есть так называемая "задача комивояджра" - найти самый короткий путь, через наименьшее кол-во городов, если не ошибаюсь, что если кто-то найдет ее решение при котором время поиска будет расти не в геом. прогрессии от кол-ва станций, того ждет мильен долларов. :))
← →
Лора (2004-02-19 15:07) [26][25]Danilka
да нет, понятно, что тупик :)
все-все, поняла, начала описывать ситуацию и поняла :))
← →
SPIRIT © (2004-02-19 15:23) [27]Зачем вы ломаете голову . Жил на свете замечательный дяденька , который написал алгоритм названный в его четь - алгоритм ДЕЙКСТРЫ я писал курсовую на 4 курсе, тока вместо станций были перекрестки в городе и там надо было найти оптимальный путь по заданным критериям. Как я вижу критерий у тебя один - расстояние.
так вот. пиши в каком - нибудь там яндексе "алгоритм Дейкстры"
данные из базы забиваешь в матрицу вида :
......пункт 1 | punkt2 | pinkt 3 **********
pinkt1------- | 200 | 10000
----------------------------------------
punkt2 200 |--------| 10000
---------------------------------------
punkt3 450 | 10000 |---------
10000 - это несуществующее расстояние которое в алгоритме не будет восприниматься в серьез т.к. очень велико.
если ты не блондинка думаю сможешь разобраться
← →
VLAD-MAL (2004-02-19 15:28) [28]TClientDataSet, раз уж все запоминать хочешь...
Создаешь таблицу произвольной структуры (в памяти, естественно), потом делаешь в ней, что придется.
А вообще - то тут задачка из серии лиейного прогриммирования, если "в лоб" решать - ресурсов сожрет - только держись...
← →
Danilka © (2004-01-23 13:35) [29][27] SPIRIT © (19.02.04 15:23)
да, вероятно так будет быстрее: либо сделать udf которая забирает таблицу к себе и ее шерстит по этому алгоритму, либо на клиенте, загрузить полностью таблицу и обработать ее на клиенте по этому алгоритму.
Но все равно, правило: среднее время поиска наименьшего пути пропорционально квадрату количества станций останется.
← →
Лора (2004-01-23 13:46) [30]Здравствуйте!
По вчерашней проблеме написала процедурку, но она затыкается на разветвлении:
здесь выбираю все станции по станции Джамбул, то есть выбираются такие варианты: Джамбул-Каратау, Джамбул-Луговая, Джамбул-Чимкент. Если по первой ветке не нашлось ничего, то переходит на следующую запись (Джамбул-Луговая) и ищет по ней и т.д.
Но после луговой идет разветвление на 2 станции и он их не просматривает, берет только первую и если она тупиковая, то он переходит на запись Джамбул-Чимкент, хотя нужно пройтись по обоим вариантам.
procedure TForm1.Button5Click(Sender: TObject);
begin
stan1:=edit1.text;
stan2:=edit2.text;
form1.qq1.close;
form1.qq1.SQL.clear;
form1.qq1.SQL.add("select * from stanzii");
form1.qq1.SQL.add("where naim1=:vh");
form1.qq1.params[0].value:=stan1;
form1.qq1.open;
while not (form1.qq1.eof) do begin
if form1.qq1["naim2"]<>stan2 then begin
aa:=stan2;
stan1:=form1.qq1["naim2"];
poisk (stan1, stan2);
form1.qq1.next;
strok:="";
end;
end;
end;
procedure poisk (stan1, stan2:string);
begin
strok:=strok+stan1;
form1.qq2.close;
form1.qq2.SQL.clear;
form1.qq2.SQL.add("select * from stanzii");
form1.qq2.SQL.add("where naim1=:vh");
form1.qq2.params[0].value:=stan1;
form1.qq2.open;
while not (form1.qq2.eof) do begin
if form1.qq2["naim2"]<>stan2 then begin
aa:=stan2;
poisk (form1.qq2["naim2"],aa);
form1.qq2.next;
end;
end;
end;
Подскажите, что неправильно? Первый раз пишу рекурсию, может и напутала что-то
← →
Danilka © (2004-02-21 09:04) [31]Глобальные переменные, на мой взгляд, не самый лучший вариант, как правило - источник ошибок. И в твоем случае именно так. qq2 - общий объект для всех, а теперь смотри: у тебя первый poisk запускается, очишает запрос в qq2 и запускает его. Затем, запускает сам себя - процедуру poisk, которая тот-же объект qq2 очищает, заполняет и запускает заново..
Тебе надо qq2 объявить внутри процедуры poisk, создавать внутри нее.
А еще лучше, поищи в поисковиках инфу про алгоритм написаный тут: [27] SPIRIT © (19.02.04 15:23)
Думаю, его реализация будет правильнее/быстрее, чем эта процедура.
← →
kaif © (2004-02-22 14:18) [32]Рабочая область в FoxPro это то же самое, что двунаправленный курсор компонента DataSet. То есть просто резултьтат выборки, по которому можно ходить туда-сюда. Поставь на форму несколько компонентов DataSet (нпример TIBQuery) и выбери в них одну и ту же таблицу. Это и будет аналог нескольких "рабочих областей" в FoxPro. Однако с привычками FoxPro нужно расстаться, если работаешь с IB. Лучше написать хранимую процедуру (CREATE STORED PROCEDURE), которая будет делать это все на сервере, а не гонять таблицу на клиент и потом ее там обходить всякими
with table do while not eof begin next end
Так как твоя таблица с поездами, как я сильно подозреваю, может оказаться очень даже не маленькой... Особенно через пару лет работы такой базы.
Страницы: 1 вся ветка
Текущий архив: 2004.03.28;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.022 c