powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Использование взаимоотношений объектов в ZEN
9 сообщений из 9, страница 1 из 1
Использование взаимоотношений объектов в ZEN
    #35916707
burhan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем гуру!
Столкнулся вот с такой проблемой, помогите пожалуйста.
Есть 2 класса: класс1 и класс2. Между собой они взаимосвязаны типом взаимоотношений - один ко многим.
Как с помощью ZEN отображать в табличку данные класса1 и данные класса2 относящиеся к классу1.
И как можно реализовать с помощью ZEN одновременное добавление, редактирование, удаление объектов этих классов, учитывая что все операции по добавлению, редактированию, удалению выполняются с классом 1.
Желательно пример или ссылку на пример.
Работу с данными одного класса + ZEN + свойство-класс осилил по документации . Но вот со взаимоотношениями пока ещё нет. Может кто-то уже сталкивался с такой проблемой.
Заранее благодарю откликнувшихся.
...
Рейтинг: 0 / 0
Использование взаимоотношений объектов в ZEN
    #35916799
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
burhanМожет кто-то уже сталкивался с такой проблемой.
Таки проблемы никакой не вижу...
Пора переходить на конкретику. Т.е. от вас пример - от нас совет или пример кода...
...
Рейтинг: 0 / 0
Использование взаимоотношений объектов в ZEN
    #35916934
burhan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Использование взаимоотношений объектов в ZEN
    #35916979
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну как минимум в TablePane можно указать в качестве источника данных либо Query ли свой запрос sql
а там вы уже можете любой сложности sql запрос сформировать
в запрос можно передавать значения для условия where
через компонент <parameter>
...
Рейтинг: 0 / 0
Использование взаимоотношений объектов в ZEN
    #35917008
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тем более что вы используете DataModelAdaptor
он используется например для связи формы с данными

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

и отдельный класс DataModelAdaptor
в нем вы описываете все поля из обоих классов
и описываете поведение при открытии объекта и создании а также сохранение
все это можно найти в учебном пособии по ZEN, найти его можно на форуме Intersystems http://writeimagejournal.com/forum/index.php?topic=189.0
...
Рейтинг: 0 / 0
Использование взаимоотношений объектов в ZEN
    #35917012
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жаль конечно что вы нигде не пишите коментариев и не указываете дискрипшен в классах... Но вот куда стоит "искать".
- Поскольку у вас даные организованы так, что одной записи в классе сопоставлены несколько записей из другого класса. Можно все организовать на двух страницах. Первая показывает и работает с "основным" классом, а вторая появляется при выборе записи и показывает записи из "связаного" класса которые соответствуют выбраной записи из основного класса.
- Т.о. в первой страничке можно управлять основным классом, а во второй связаным...
- Пока вы использовали только методы типа [ Language = javascript ]... Но в них можно делать вызовы и других методов Каше... Вот в них-то и можно выполнять удаление связаных записей из связаного класса при удалении записи из основного...
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Использование взаимоотношений объектов в ZEN
    #35917042
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Использование взаимоотношений объектов в ZEN
    #35917080
burhan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем. Дали пищу для ума. Буду курить дальше маны и пробовать. :)
...
Рейтинг: 0 / 0
Использование взаимоотношений объектов в ZEN
    #35917738
VadimF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,

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

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

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

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

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


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