Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.56 MB
Время: 0.029 c
7-1073319421
iusupp
2004-01-05 19:17
2004.03.28
Проблема установки ZIP Omega с SCSI контролером...


1-1079024994
Riki
2004-03-11 20:09
2004.03.28
Image.Canvas


1-1078394428
BlackTiger
2004-03-04 13:00
2004.03.28
Подозрительная конструкция какая-то. (record + TStrings)


14-1077798423
Andersen
2004-02-26 15:27
2004.03.28
Теперь страна может спать спокойно


14-1078000591
Undert
2004-02-28 23:36
2004.03.28
Тупеем господа ?