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

Вниз

Создание таблиц   Найти похожие ветки 

 
Лора   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.035 c
3-1077368498
voe
2004-02-21 16:01
2004.03.28
фильтрация


14-1077987414
Ultr
2004-02-28 19:56
2004.03.28
Как логиниться?


1-1078927091
slair
2004-03-10 16:58
2004.03.28
Не ставится delpi6/builder6 под WindowsXP Pro Corp


6-1074255192
Behemoth
2004-01-16 15:13
2004.03.28
TIdTCPServer - как узнать кол-во подключенных клиентов?


3-1076332096
Pilot
2004-02-09 16:08
2004.03.28
Работа с EasyTable





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