Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Использование взаимоотношений объектов в ZEN / 9 сообщений из 9, страница 1 из 1
07.04.2009, 12:39
    #35916707
burhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование взаимоотношений объектов в ZEN
Добрый день всем гуру!
Столкнулся вот с такой проблемой, помогите пожалуйста.
Есть 2 класса: класс1 и класс2. Между собой они взаимосвязаны типом взаимоотношений - один ко многим.
Как с помощью ZEN отображать в табличку данные класса1 и данные класса2 относящиеся к классу1.
И как можно реализовать с помощью ZEN одновременное добавление, редактирование, удаление объектов этих классов, учитывая что все операции по добавлению, редактированию, удалению выполняются с классом 1.
Желательно пример или ссылку на пример.
Работу с данными одного класса + ZEN + свойство-класс осилил по документации . Но вот со взаимоотношениями пока ещё нет. Может кто-то уже сталкивался с такой проблемой.
Заранее благодарю откликнувшихся.
...
Рейтинг: 0 / 0
07.04.2009, 13:02
    #35916799
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование взаимоотношений объектов в ZEN
burhanМожет кто-то уже сталкивался с такой проблемой.
Таки проблемы никакой не вижу...
Пора переходить на конкретику. Т.е. от вас пример - от нас совет или пример кода...
...
Рейтинг: 0 / 0
07.04.2009, 13:35
    #35916934
burhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование взаимоотношений объектов в ZEN
krvsa,

Простите, это не совсем проблема. Но подскажите в какую сторону искать?

класс1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Class tutorial.Personal Extends (%Persistent, %ZEN.DataModel.Adaptor)
{
Property Surname As %String(MAXLEN =  200 ) [ Required ];
Property Name As %String(MAXLEN =  200 );
Property DOB As %Date(FORMAT =  3 );
Property Sex As %String;
Property Education As %String;
Relationship Pets As tutorial.Pet [ Cardinality = many, Inverse = NamePet ];
Property AdditionalInfo As %String(MAXLEN =  500 );
}

класс2:
Код: plaintext
1.
2.
3.
4.
5.
Class tutorial.Pet Extends (%Persistent, %ZEN.DataModel.Adaptor)
{
Property NamePet As %String;
Relationship Personals As tutorial.Personal [ Cardinality = one, Inverse = Pets ];
Index PersonalIndex On Personals;
}
ну и собственно класс Zen для всего этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
/// Created using the page template: Default
Class tutorial.DisplayPersonal Extends %ZEN.Component.page
{

/// Class name of application this page belongs to.
Parameter APPLICATION;

/// Displayed name of this page.
Parameter PAGENAME = "Human";

/// Domain used for localization.
Parameter DOMAIN;

/// This Style block contains page-specific CSS style definitions.
XData Style
{
<style type="text/css">
    /* style for title bar */
    #title {
      background: #C5D6D6;
      color: black;
      font-family: Verdana;
      font-size:  1 .5em;
      font-weight: bold;
      padding: 5px;
      border-bottom: 1px solid black;
      text-align: center;
      }
    </style>
}

/// This XML block defines the contents of this page.
XData Contents [ XMLNamespace = "http://www.intersystems.com/zen" ]
{
<page xmlns="http://www.intersystems.com/zen" title="">
<tablePane id="table" tableName="tutorial.Personal" 
valueColumn="ID"
onselectrow="zenPage.RowSel(zenThis);"
	ondblclick="zenPage.Boo(zenThis);">
<column header="id" colName="ID" width="2%" hidden="true"/>
<column header="Фамилия" colName="Surname" filterType="text"/>
<column header="Имя" colName="Name"/>
<column header="Дата рождения" colName="DOB"  filterType="date" filterOp="BETWEEN"/>
<column header="Пол" colName="Sex" width="9%" filterType="enum" filterEnum="мужчина, женщина" filterOp="="/>
<column header="Животина" colName="Pets"/>
<column header="Образование" colName="Education" width="15%" filterType="enum" filterEnum="нет, среднее, среднее-специальное, высшее неоконченное, высшее" filterOp="="/>
</tablePane>

<titlePane title="Создать, редактировать, удалить" />

<dataController id="controller" modelClass="tutorial.Personal"/>
	<form id="MyForm" align="right" labelPosition="top" controllerId="controller">
	<hgroup>
	<text label="Фамилия:" id="Surname" name="Surname" size="35" required="true" dataBinding="Surname"/>
	<spacer width="20"/>
	<text label="Имя:" id="Name" name="Name" size="20" dataBinding="Name"/>
	<spacer width="20"/>
	<dateText label="Дата рождения:" id="DOB" name="DOB" dataBinding="DOB"/>
	</hgroup>
	<spacer height="10"/>
	<hgroup labelPosition="left">
	<radioSet label="Пол:" id="Sex" name="Sex" displayList="мужчина, женщина" valueList="мужчина, женщина" dataBinding="Sex"/>
	</hgroup>
	<spacer height="10"/>
	<hgroup>
	<combobox label="Образование:" id="Education" name="Education" displayList="нет, среднее, среднее-специальное, высшее неоконченное, высшее" valueList="нет, среднее, среднее-специальное, высшее неоконченное, высшее" dataBinding="Education"/>
	<spacer height="10"/>
	<!--dataCombo label="Животина:" id="Pets" name="Pets" displayColumns="2" dataBinding="Pets"/-->
	<spacer height="10"/>
	</hgroup>
	<textarea label="Дополнительная информация:" id="AdditionalInfo" name="AdditionalInfo" cols="50" rows="5" dataBinding="AdditionalInfo"/>
	</form>
	<hgroup id="btnGroup" cellAlign="right">
	<button id="btnNew" caption="Создать" onclick='zenPage.NewItem();'/>
	<spacer width="10"/>
	<button id="btnSave" caption="Сохранить" onclick='zenPage.SaveItem();'/>
	<spacer width="10"/>
	<button id="btnDelete" caption="Удалить" onclick='zenPage.DeleteItem();'/>
	<spacer width="10"/>
	</hgroup>
</page>
}

Method Boo(table) [ Language = javascript ]
{
	var id = table.getValue();
		//zenPage.ShowObject(id);
		alert('RowSelected ' + id);
}

Method NewItem() [ Language = javascript ]
{
	var controller = zenPage.getComponentById('controller');
		controller.createNewObject();
}

Method SaveItem() [ Language = javascript ]
{
	var controller = zenPage.getComponentById('controller');
		controller.save();
	var table = zenPage.getComponentById('table');
		table.executeQuery(true);
}

Method DeleteItem() [ Language = javascript ]
{
	var controller = zenPage.getComponentById('controller');
	var id = controller.getModelId();
	
		if (id == '') {
			alert('Выберите строку для удаления!!!');
		}
		else if (confirm('Уверены что хотите удалить данную запись? Учтите данная операция не обратима!!!' + ' ' + id))
		{controller.deletId(controller.getModelId());
		

		var table = zenPage.getComponentById('table');
			table.executeQuery(true);
			controller.update();
		}
}

Method RowSel(table) [ Language = javascript ]
{
	var id = table.getValue();
		zenPage.ShowObject(id);
		//alert('RowSelected ' + id);
}

Method ShowObject(id) [ Language = javascript ]
{
	var controller = zenPage.getComponentById('controller');
		controller.setModelId(id);
		//alert('ShowObject ' + id);
}

}

Вот и все.
А теперь как отобразить данные о Pets в таблице, и редактирование Pets (добавить либо удалить)?
...
Рейтинг: 0 / 0
07.04.2009, 13:44
    #35916979
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование взаимоотношений объектов в ZEN
ну как минимум в TablePane можно указать в качестве источника данных либо Query ли свой запрос sql
а там вы уже можете любой сложности sql запрос сформировать
в запрос можно передавать значения для условия where
через компонент <parameter>
...
Рейтинг: 0 / 0
07.04.2009, 13:52
    #35917008
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование взаимоотношений объектов в ZEN
тем более что вы используете DataModelAdaptor
он используется например для связи формы с данными

вам нужно 2 простых класса с данными

и отдельный класс DataModelAdaptor
в нем вы описываете все поля из обоих классов
и описываете поведение при открытии объекта и создании а также сохранение
все это можно найти в учебном пособии по ZEN, найти его можно на форуме Intersystems http://writeimagejournal.com/forum/index.php?topic=189.0
...
Рейтинг: 0 / 0
07.04.2009, 13:52
    #35917012
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование взаимоотношений объектов в ZEN
Жаль конечно что вы нигде не пишите коментариев и не указываете дискрипшен в классах... Но вот куда стоит "искать".
- Поскольку у вас даные организованы так, что одной записи в классе сопоставлены несколько записей из другого класса. Можно все организовать на двух страницах. Первая показывает и работает с "основным" классом, а вторая появляется при выборе записи и показывает записи из "связаного" класса которые соответствуют выбраной записи из основного класса.
- Т.о. в первой страничке можно управлять основным классом, а во второй связаным...
- Пока вы использовали только методы типа [ Language = javascript ]... Но в них можно делать вызовы и других методов Каше... Вот в них-то и можно выполнять удаление связаных записей из связаного класса при удалении записи из основного...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
07.04.2009, 14:01
    #35917042
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование взаимоотношений объектов в ZEN
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
Вот пример вызова кащейского метода...

...
/// Удаление всех элементов
Method DelAll() [ Language = javascript ]
{
	var ok=confirm('Вы действительно хотите удалить все элементы из списка?')
	if (ok) {
		zenPage.cDelAll()
		zenPage.getComponentById('tpTbl').executeQuery();
	}
}

/// Удаление всех элементов
Method cDelAll() [ ZenMethod ]
{
	// Удалить все элементы досылки
	s sql="Delete From ver.Adhoc"
	s ors=##class(%ResultSet).%New("%DynamicQuery:SQL")
	s ok=ors.Prepare(sql)
	s:ok ok=ors.Execute()
	d ors.Close()
	// Создать программу настройки
	d:##class(%Routine).Exists("nast.int") ##class(%Routine).Delete("nast.int")
	s or=##class(%Routine).%New("nast.int")
	d or.WriteLine("nast")
	d or.WriteLine("Start()")
	d or.WriteLine(" d MESSAGE")
	d or.WriteLine(" q 1")
	s val=$$WinDos^AHTM("Все итоговые сообщения")
	d or.WriteLine("MESSAGE ; "_val)
	d or.WriteLine(" q")
	s ok=or.Save()
	d or.%Close()
	q ok
}
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
07.04.2009, 14:08
    #35917080
burhan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование взаимоотношений объектов в ZEN
Спасибо всем. Дали пищу для ума. Буду курить дальше маны и пробовать. :)
...
Рейтинг: 0 / 0
07.04.2009, 16:50
    #35917738
VadimF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование взаимоотношений объектов в ZEN
Добрый день,

Дополнительная пища для размышлений:
Есть конференция InterSystems-ZEN , где можно задавать такие вопросы.

На сайте конференции есть раздел с примерами кода , где есть пример MVC Parent/Child relationship interface .

Это конечно не совсем One-to-many, но тоже может помочь.

Еще примеры, наверняка есть у Вашего технического консультанта.

Вадим
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Использование взаимоотношений объектов в ZEN / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]