Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Вывод родствеников

Ответить
Настройки темы
Delphi - Вывод родствеников

Новый участник


Сообщения: 19
Благодарности: 2

Профиль | Отправить PM | Цитировать


Изменения
Автор: student_po
Дата: 23-04-2013
Изображения
Тип файла: jpg 1.jpg
(18.1 Kb, 10 просмотров)
Вложения
Тип файла: zip tdb.zip
(17.9 Kb, 2 просмотров)
Доброго времени суток. Есть база в access с именем члена семьи и данными о родителях.
Из этой базы как нужно вывести всех предков данного человека. Заранее спасибо всем.

Отправлено: 09:01, 23-04-2013

 

Аватара для lxa85

Необычный


Contributor


Сообщения: 4466
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


student_po, это надо сделать средствами Access? Или средствами Delphi? Потому что средствами Access это проблематично. Средствами Delphi -- это задача на графы.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 10:26, 23-04-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата lxa85:
Потому что средствами Access это проблематично. »
Почему? Обычная рекурсия (концепт, без необходимых проверок):
читать дальше »
Код: Выделить весь код
Option Compare Database
Option Explicit

Sub Sample(strFIO As String)
    Dim objRS As Recordset
    Dim lngLevel As Long
    
    
    lngLevel = 0
    
    Set objRS = CurrentDb.OpenRecordset("SELECT * FROM Genealogy WHERE [ФИО] = '" & strFIO & "'")
    
    GetParents objRS.Fields.Item("ID").Value, lngLevel
End Sub

Sub GetParents(lngID As Long, ByVal lngLevel)
    With CurrentDb.OpenRecordset("SELECT [ФИО], [Отец], [Мать] FROM Genealogy WHERE [ID] = " & lngID & "")
        With .Fields
            Debug.Print String(lngLevel, vbTab) & .Item("ФИО").Value
            
            lngLevel = lngLevel + 1
            
            If Not IsNull(.Item("Отец").Value) Then
                GetParents .Item("Отец").Value, lngLevel
            End If
            
            If Not IsNull(.Item("Мать").Value) Then
                GetParents .Item("Мать").Value, lngLevel
            End If
        End With
    End With
End Sub
Примерный результат работы по вызову «Sample("Я")»:
Код: Выделить весь код
Я
    Папа
        Дед (отец отца)
        Бабка (мать отца)
    Мама
        Дед (отец матери)
        Бабка (мать матери)
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:41, 23-04-2013 | #3


Новый участник


Сообщения: 19
Благодарности: 2

Профиль | Отправить PM | Цитировать


Средствами Delphi

Отправлено: 12:18, 23-04-2013 | #4


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


student_po, так переведите с VBA на Delphi. Алгоритм один и тот же.

Отправлено: 13:10, 23-04-2013 | #5


Аватара для lxa85

Необычный


Contributor


Сообщения: 4466
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Iska, я с Access ом не работал. Поэтому я затруднился дать ответ. Была мысль написания единого SQL запроса, и она потонула в сомнениях (AFAIK SQL не поддерживает рекурсию). Поэтому возникла мысль запросить всю таблицу в Delphi, сформировать массива и работать с ним как с матрицей, описывающий граф гинеалогического дерева.

-------
- Я не разрешаю тебе быть плохой! Потому что плохие люди совершают плохие поступки. А это нехорошо!
(Из наставлений 5 летней девочки своей младшей сестре)


Отправлено: 14:41, 23-04-2013 | #6


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


lxa85, а мне сразу PROLOG вспомнился .

Отправлено: 15:11, 23-04-2013 | #7


Аватара для lxa85

Необычный


Contributor


Сообщения: 4466
Благодарности: 994

Профиль | Сайт | Отправить PM | Цитировать


Iska,

Отправлено: 17:21, 23-04-2013 | #8


Новый участник


Сообщения: 19
Благодарности: 2

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
procedure TForm1.genealogy(iddb:integer);
var f,m:integer;
begin
  Datam.ADOQuery3.Locate('id',iddb, []);
  if Datam.ADOQuery3.FieldByName('Отец').AsInteger<>0 then
  begin
    f:=(datam.ADOQuery3.FieldByName('Отец').AsInteger);
    Memo2.Lines.Add(inttostr(f));
    Datam.ADOQuery3.Locate('id',f, []);
    genealogy(Datam.ADOQuery3.FieldByName('id').AsInteger);
  end;
  if Datam.ADOQuery3.FieldByName('Мать').AsInteger<>0 then
  begin
    m:=(datam.ADOQuery3.FieldByName('Мать').AsInteger);
    Memo2.Lines.Add(inttostr(m));
    Datam.ADOQuery3.Locate('id',m, []);
    genealogy(Datam.ADOQuery3.FieldByName('id').AsInteger);
  end;
end;
До деда по отцу доходит и встали. Где я скриворукил.

Отправлено: 18:13, 23-04-2013 | #9


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


student_po, обратите внимание на разницу — я сначала выбираю запись, делаю вывод «ФИО», затем проверяю в записи свойства «Отец»/«Мать» и, если они не пустые — рекурсивно вызываю процедуру. В Вашем коде логика иная: если у деда нет «Отца» — самого деда в «Memo2» Вы не увидите.

Отправлено: 18:46, 23-04-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Вывод родствеников

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Звук - Вывод звука hErrosh Прочее железо 6 04-02-2011 15:57
Win32 API - Вывод картинок Lev Программирование и базы данных 11 12-02-2010 19:38
Драйвер - Вывод изрбражения... помогите... TheSaint Microsoft Windows 7 3 16-01-2010 14:16
Вывод на телевизор dascon Программное обеспечение Windows 15 04-09-2004 06:55
постраничный вывод chem1 Вебмастеру 4 16-01-2004 22:46




 
Переход