| Типы программирования, программирование, языки программирования, книги программирование | На сайте представлена информация про программирование в Интернете и работу |
|
Помогите начинающему!, Как поставить закладку в таблице? Поиск по БД Отображение данных в TDBComboBox, Не получается... Регистр букв при работе с dbf ч/з ADO, Как сделать запрос неразличимый к рег-ру Какие есть способы поиска в DBGrid1 ? обновление параметров Как Вы относитесь к курящим девушкам? WinAPI, GetUserName Пароль на таблице, где его вводить? Запрос на проверку при удалении Delphi + Oracle, длиная строка Обзор таблицы через TreeView1, Задача Как поместить картинку в BLOB поле Надпись "Unregistered version" в FR, Как убрать? Транзакции, SQL DBGrid, Скроллинг не работает База данных в dbf формате, Помогите обработать DBF выделению оперативной памяти под бд Работа с TStringList., __ Ограничить размер кэша для SQLQuery, как можно ограничить размер кэша Delphi+ADO+MS SQL2000 Помогите. Вопрос по ЗАПРОСУ, там вопрос про оператор like Различия синтаксиса SQL Как можно получить кол-во строк рез-та запроса? InstallShield. Проблема с клиентом для MySQL Запрос в базе данных работа с apolo v6.0 dbf & cdx, открытие двух dbf афйлов Преобразование, dbf в cds БД Paradox на лежит на хосте., Как получить к ней доступ из программы Поиск, Поиск Как получить список доступных БД?, Как получить список доступных БД? Запрос SQL, как объединить два разнотипных поля? Нумерация выборки????????, Доб-ть счет-к к DBGrid-у не зав. от сорт TADOQuery и параметры, ADO и MSSQL База данных в dbf формате, Помогите обработать DBF минимизировать связку компонентов, MySQL, DbExpress DBGrid и AdoQuery, не изменяется значение в столбце :( TdxDBGrid, сохранение в реестр, Как загрузить данные ???? в чем разница между NT и 2000 Запросы и параметры, или как избавится от многих проблем…. закрытие чужой программы Побайтное чтение и запись, Неизвестная база *.DAT (возможно BTree) Сохранение в Blob поле .... [ABsolute DB] Не открывается картинка из бд, access в дельфи через ado организация поиска в БД DBGrid, как что-то дописать в ячейке Разрыв страницы в Fast Report, на скриптовом языке? Real округляется до Integer, Oracle через BDE BDE,DBF,SQL, запрос с агрегатными функциями Перенос на страницы, FastReport БД и Дерево, Какие функции надо использовать Вопрос о реестре, новые методы Как Вы относитесь к курящим девушкам? Ссылки на литературу по работе с БД в Delphi Из ячейки в Memo Переходим на клиент-сервер (советы), на примере MS SQL Server MS SQL dbf через ADO, каракули Таблица с разными полями, Paradox, BDE ADO + OLEException, Генерация исключений Узнать, пусто ли Blob-поле, Access, Ado Печать с двух сторон, как реализовать??? RichEdit У меня к вам ышо вопросик есть ебаут Creating Проблемма с БД Проблемы с Query и DataSource удаленная БД, организационные вопросы Импорт данных Excel -> dbf, нужен пример импорта данных Перенос БД (ФайлСервер -> КлиентСервер), Paradox -> MySQL Как с помощью ADO открыть таблицу dBase (.dbf) |
Платные хостинги Раскрутка сайта Книги по программированию Обзор таблицы через TreeView1, Задача
- Создал таблицу и псевдоним с именем Lavocka.Таблица такая - таблица описывает предприятие, у каждого рабочего имеется свой универсальны код в таблице,и дополнительный код, который означает - у кого в подчинение данный рабочий, вот таблица:code name dopcode proffession0033 bos 0000 director0084 ivanov 0033 menejer0085 vasichkin 0033 menejer0097 ohlamonov 0084 menejer's p0moshnik 0097 ohlamonov 0085 menejer's p0moshnikМне нужно через дерево TreeView1, используя SQL -запросы отобразить базу данных,следующим образом :-bos _ _ _-ivanov_ _ _ _ _ _ohlamonov_ _ _-vasichkin_ _ _ _ _ _ohlamonovподскажите пожалуйста, как нужно чего делать????????????? - УУУ, чего захотел!компонент TDBTree поищи в каком-нить яндексе. - Вот в этой теме посмотри - Для построения данного дерева нужно использовать рекурсию. Вариантов может быть несколько. Если БД на SQL сервере то могу предложить следующее:Создать на сервере 2 хранимые процедуры, которые используя рекурсию сформируют промежуточную таблицу, на основании которой delphi построит дерево.Процедура 1Код CAREATE PROCEDURE TREEADDASBEGINDECLARE @TREEID AS INT, @TREEUPID AS INT, @DESC AS VARCHAR(255), @POZ AS INTCREATE TABLE #RESULT(TYPE VARCHAR(10), DESCR VARCHAR(255), IDREC INT)DECLARE #PRIMARY_TREE CURSOR LOCAL FAST_FORWARD FOR SELECT TREEID, TREEUPID, DESCRIPTIONFROM STRUCTUREWHERE TREEUPID = 0OPEN #PRIMARY_TREEWHILE @@ERROR=0 BEGIN FETCH NEXT FROM #PRIMARY_TREE INTO @TREEID, @TREEUPID, @DESC IF @@FETCH_STATUS<>0 BREAK INSERT INTO #RESULT VALUES('Nil',@DESC,@TREEID) SET @POZ = (SELECT COUNT(*) FROM #RESULT)-1 EXECUTE RECURSADD @TREEID,@POZ END CLOSE #PRIMARY_TREE DEALLOCATE #PRIMARY_TREESELECT * FROM #RESULTDROP TABLE #RESULTEND highlightSyntax('sqlZTczMT','sql');Процедура 2Код PROCEDURE RECURSADD @TREEID INT, @POZITION INTASDECLARE #REVERS CURSOR LOCAL FAST_FORWARD FOR SELECT TREEID, TREEUPID, DESCRIPTIONFROM STRUCTUREWHERE TREEUPID = @TREEIDOPEN #REVERSDECLARE @TRID AS INT, @TRUPID AS INT, @DESCR AS VARCHAR(255), @POZ AS INTWHILE @@ERROR=0 BEGIN FETCH NEXT FROM #REVERS INTO @TRID, @TRUPID, @DESCR IF @@FETCH_STATUS <>0 BREAK INSERT INTO #RESULT VALUES(CAST(@POZITION AS VARCHAR),@DESCR,@TRID) SET @POZ = (SELECT COUNT(*) FROM #RESULT)-1 EXECUTE RECURSADD @TRID,@POZ END CLOSE #REVERSDEALLOCATE #REVERShighlightSyntax('sqlg5Y2M0','sql');В Delphi пишем процудеру формирования дерева:Код with ADOQuery2 do begin SQL.Clear; SQL.Add('exec TREEADD'); Open; end;ADOQuery2.First;TreeView1.Items.Clear;TreeView1.Items.BeginUpdate;while not ADOQuery2.Eof do begin IF ADOQuery2.FieldByName('TYPE').AsString = 'Nil' then BeginTreeView1.Items.AddChildObject(nil, ADOQuery2.FieldByName('DESCR').AsString, Pointer(ADOQuery2.FieldByName('IDREC').AsInteger)); End Else BeginTreeView1.Items.AddChildObject(TreeView1.Items[ADOQuery2.FieldByName('TYPE').AsInteger],ADOQuery2.FieldByName('DESCR').AsString,Pointer(ADOQuery2.FieldByName('IDREC').AsInteger)); End; ADOQuery2.Next; End;TreeView1.Items.EndUpdate;highlightSyntax('delphiU3NGM1','delphi');При этом всю основную нагрузку по формированию данных выполняет SQL сервер а Delphi лишь остается нарисовать дерево пройдясь по всем строчкам в возвращенном наборе данных.Либо можно организовать рекурсивное построение дерева средствами самого Delphi. каму как больше нравится. Это сообщение отредактировал BSV_Sergey - 10.12.2004, 14:43 - BSV_Sergey, спасибо, но я сделал бд используя BDE, извиняюсь, что неполностью всё не описал, как с помощью компонентов DataSourse и Query добиться решения задачи? Это сообщение отредактировал Ddddddelphi - 10.12.2004, 23:16 - Ну, берешь, Query, которые выбирает сотрудников первого уровня - саамых главных, - из этого списка, создаешь, узлы первого уровня, затем берешь первый узел, смотришь сотрудников, которые ему подчиняются, - это узелы второго уровня для первого узла, затем, берешь первый узел второго уровня, для первого начальника, смотришь какие люди ему подчиняются,... и т.д.Вот и построишь дерево. - Алгоритм формирования дерева можно организовать используя код приведенный ниже. Возможно его удастся улучшить, это первое решение, которое пришло мне в голову;Структура таблицы используемой в примере:REPORTTREEtreeid description treeupid1 tree1 02 tree2 13 tree3 1 и тдТекст модуля:Код unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, StdCtrls, ComCtrls;type TForm1 = class(TForm) ADOQuery1: TADOQuery; TreeView1: TTreeView; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } gNOM:integer;//Глобальный счетчик количества ветвей в дереве end;var Form1: TForm1;procedure treeadd();Function recursADD(id:string;nomer:integer):Boolean;implementation{$R *.dfm}procedure treeadd();var sSQL,treeid:string; n,i:integer;beginForm1.gNOM := -1;sSQL := 'select count(*) as counttree from REPORTTREE where treeupid = 0';with form1.ADOQuery1 do begin Close; SQL.Clear; SQL.Add(sSQL); Open; end;treeid := '';n := Form1.ADOQuery1.FieldByName('counttree').AsInteger;for i:=1 to n do begin if treeid = '' then sSQL := 'Select top 1 * from REPORTTREE where treeupid = 0' else sSQL := 'Select top 1 * from REPORTTREE where treeupid = 0 and treeid not in ('+treeid+')'; with form1.ADOQuery1 do begin Close; SQL.Clear; SQL.Add(sSQL); Open; end; if treeid = '' then treeid :=Form1.ADOQuery1.FieldByName('treeid').Asstring else treeid := treeid + ','+Form1.ADOQuery1.FieldByName('treeid').Asstring; Form1.TreeView1.Items.BeginUpdate; Form1.TreeView1.Items.Add(nil,Form1.ADOQuery1.FieldByName('DESCRIPTION').AsString); Form1.gNOM := Form1.gNOM + 1; recursADD(Form1.ADOQuery1.FieldByName('treeid').AsString,Form1.gNOM); end; Form1.TreeView1.Items.EndUpdate;end;Function recursADD(id:string;nomer:integer):Boolean;var sSQL,treeid:string; i,n:integer;beginsSQL := 'select count(*) as counttree from REPORTTREE where treeupid = '+id;with form1.ADOQuery1 do begin Close; SQL.Clear; SQL.Add(sSQL); Open; end;treeid := '';n := Form1.ADOQuery1.FieldByName('counttree').AsInteger;if n > 0 thenfor i:=1 to n do begin if treeid = '' then sSQL := 'Select top 1 * from REPORTTREE where treeupid = '+id else sSQL := 'Select top 1 * from REPORTTREE where treeupid = '+id+' and treeid not in ('+treeid+')'; with form1.ADOQuery1 do begin Close; SQL.Clear; SQL.Add(sSQL); Open; end; if treeid = '' then treeid :=Form1.ADOQuery1.FieldByName('treeid').Asstring else treeid := treeid + ','+Form1.ADOQuery1.FieldByName('treeid').Asstring; Form1.TreeView1.Items.AddChild(Form1.TreeView1.Items[nomer],Form1.ADOQuery1.FieldByName('DESCRIPTION').AsString); Form1.gNOM := Form1.gNOM + 1; recursADD(Form1.ADOQuery1.FieldByName('treeid').AsString,Form1.gNOM); end;end;procedure TForm1.Button1Click(Sender: TObject);begintreeadd();end;end.highlightSyntax('delphi2FiMDE','delphi');Ddddddelphi Надеюсь, я не слишком опоздал с ответом и мое решение еще актуальною Это сообщение отредактировал BSV_Sergey - 16.12.2004, 15:01 - BSV_Sergey, актуально, я учусь для себя поками-сь.... cпасибо!!!!! поработаю...глупые вопросы, а:Структура таблицы используемой в примере:REPORTTREEэто из стандартных? не нашёл...c этим ладноtreeid description treeupid1 tree1 02 tree2 13 tree3 1 и тдчё воще означает? Это сообщение отредактировал Ddddddelphi - 16.12.2004, 15:55 - Таблица REPORTTREE - содержит 3 столбца:treeid - id ветви дерева description - название ветви дереваtreeupid - какой ветви дерева подчиняется.В случае если treeupid = 0 - ветвь является контевой ветвью дерева и не кому не подчиняется.Я назвал таблицу REPORTTREE, в твоей программе она может называться по другому. В твоем примере, если я правильно понял code - это treeid в моей таблице name - description, dopcode - treeupid.К примеру дерево на основе следующих данных:treeid description treeupid1 Иванов 02 Петров 13 Сидоров 1 4 Смирнов 35 Наумов 2будет выглядеть так- Иванов----Петров-------Наутов----Сидоров-------Смирнов Это сообщение отредактировал BSV_Sergey - 16.12.2004, 17:13 - Я посмотрел твой пример. У тебя есть возможность, что у одного сотрудника могут быть несколько руководителей. В данной ситуации я еще посоветовал бы слегка изменить структуру таблиц, чтобы избежать избыточности данных. Можно создать таблицу с информацией о сотрудниках, к примеру Employee (employeeid(ID сотрудника), lastname, firstname, post и тд) и таблицу Hierarchy (employeeid, chiefid) в которой будет прописана орг структура предприяпия. В поле employeeid будет храниться ID сотрудника из таблицы employee, а в поле chiefid – ID сотрудника из таблица employee, который является руководителем первого.Example:Employee1 ivanov ivan Manager2 petrov ivan Chief of Branch of Department3 sidorov petr DirectorHierarchy3 01 32 31 2Дерево будет выглядеть так--sidorov----ivanov----petrov--------ivanovХотя мож это и лищнее, смотри сам.. - Еще прощеСтавищ EhLib 3.5, если еще не стоитВ оэтой библиотеке много полезного, в том числе есть и такая фича, которая тебе нужна, по трем полям построить дерево. - попытался отсканировать пару страниц из книги "Мир Interbase"получилось кривовато есть таблица[ID_GOODS] [ID_PARENT_GOODS] [GOOD_NAME]1 0 GOODS2 1 Бытовая техника3 1 Компьютеры и комплектующие4 2 Холодиль ники5 2 Стиральные машины6 4 Трехкамерные7 4 Двухкамерные8 4 Однокамерные9 5 Вертикальные10 5 Фронтальные11 10 Узкие12 10 КлассическиеDECLARE VARIABLE CURR_CHILD_NAME VARCHAR(80);BEGIN/*Организуем внешний цикл FOR SELECT no непосредственным потомкам товара с ID_GOOD=ID_GOOD2SHOW */FOR SELECT gt1.id_good, gt1.good_nameFROM GoodsTree gt1WHERE gt1.id_parent_good=:ID_good2showINTO:ID_CHILD_G00D, :full_goods_nameDOBEGIN/*Проверка с помощью функции EXISTS, которая возвращаетTRUE, если запрос в скобках вернет хотя бы одну строку.Если у найденного узла с ID_PARENT_GOOD = ID_CHILD_GOOD нет потомков,то он является "листом" дерева и попадает в результаты */IF (NOT EXISTS(SELECT * FROM GoodsTreeWHERE GoodsTree.id_parent_good=:id_child_good))THEN BEGIN/* Передаем "лист" дерева в результаты */SUSPEND;ENDELSE/* Для узлов, у которых есть потомки*/BEGIN/*сохраняем имя узла-родителя во временной переменной */CURR_CHILD_NAME=full_goods_name;/ * рекурсивно запускаем эту процедуру */FORSELECT ID_CHILD_GOOD, full_goods_nameFROM GETFULLNAME (:ID_CHILD_GOOD)INTO:ID_CHILD_GOOD, :full_goods_nameDO BEGIN/*добавляем имя узла-родителя к найденному имени потомка с помощью операции конкатенации строк || */full_goods_name=CURR_CHILD_NAME||' '||full_goods_name;SUSPEND; /* возвращаем полное имя товара*/ENDENDENDENDЕсли мы выполним данную процедуру с входным параметром ID_GOOD2SHOW=1, то получим следующее:FULL_GOODS_NAME FULL_GOODS_NAMEБытовая техника Холодильники Трехкамерные 6Бытовая техника Холодильники Двухкамерные 7Бытовая техника Холодильники Однокамерные 8и т.д. Это сообщение отредактировал dsergey - 21.12.2004, 12:57 - @dsergey "Мир Interbase"-что за книга? специально для Дельфи или? До изучения Interbase по книге ещё не дошёл, надо будет твой код рассмотреть, когда дойду. - "Мир Interbase (вторая редакция)" это, насколько я знаю единственная книга на русском языке по Interbase, для Delphi там не очень много, еще продается с ней компакт-диск, там прилочно информации, компонентов, а также кроме IB7, есть "огненная утка" |