powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Связи между таблицами
20 сообщений из 20, страница 1 из 1
Связи между таблицами
    #36965233
Vixler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Проблема такая. В Cache созданы три класса:


Класс Contract:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Class Contract Extends %Persistent
{

/// № договора
Property Number As %String [ Required ];

/// Дата заключения договора
Property DateBegin As %Date [ Required ];

/// Дата окончания договора
Property DateEnd As %Date;

}


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
/// Клиент
Class Client Extends Reference [ ClassType = persistent, ProcedureBlock ]
{

Property Code As %String [ Required ];

Index CodeIndex On Code [ Unique ];

/// Имя клиента
Property Name As %String [ Required ];

Index NameIndex On Name [ Unique ];

/// Список ссылок на объекты договоров с клиентом
Property Contracts As list Of ContractClient;

Класс ContractClient
Код: plaintext
1.
2.
3.
4.
5.
6.
Class ContractClient Extends Contract [ ClassType = persistent, ProcedureBlock ]
{
//Список приложений к договору
Property Applications As list Of ContractClientApp;

}


Класс Client содержит список ссылок на объекты класса ContractClient. Класс ContractClient наследуется от класса Contract. В базе есть записи о клиентах. В записях о клиентах есть списки ссылок на договора (класса ContractClient).

Далее в коде на С#, я пытаюсь получить список клиентов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public static BindingList<Client> GetListOfClient()
		{

			BindingList<Client> listOfClients = new BindingList<Client>();
           			CacheConnection _connect=   ClassConnection.GetConnection();
			CacheDataReader reader = ClassConnection.ExecuteSQLCommand(
				"SELECT * FROM Client");
			Client currClient;
			while (reader.Read())
			{
				currClient = Client.OpenId(_connect, ((Int32)reader["ID"]).ToString());
				 listOfClients.Add(currClient);

 BindingList<ContractClient> listOfContractClient = new BindingList<ContractClient>();
CacheListOfObject contracts = currClient.Contracts;
                foreach (ContractClient contractClient in contracts)
			    {
				    listOfContractClient.Add(contractClient);
			    }
			}
			reader.Close();
			return listOfClients;

Список listOfContractClient заполняется, но почему-то пустыми объектами, без полей и значений. Если же класс Contract сделать %SerialObject, а не %Persistent, то список заполняется как надо. Проблема в том, что класс Contract должен быть именно %Persistent. Собственно, вопрос. Почему список заполняется пустыми значениями и можно ли как-то получать нормальные значения?
...
Рейтинг: 0 / 0
Связи между таблицами
    #36965262
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vixler , не нужно так слепо верить в "наследование"... Тем паче классов %Persistent.

Просто сделай еще один класс с пресловутыми приложениями к договору (тоже %Persistent) и будет тебе счастие...
...
Рейтинг: 0 / 0
Связи между таблицами
    #36965266
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
/// Список ссылок на объекты договоров с клиентом
Property Contracts As list Of ContractClient;
И это не связи...
...
Рейтинг: 0 / 0
Связи между таблицами
    #36965275
Vixler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну а всё-таки, почему оно не работает? )
...
Рейтинг: 0 / 0
Связи между таблицами
    #36965290
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не специалист С#,
но в вашем примере классы примере настораживает эта строчка
Class Client Extends Reference [ ClassType = persistent, ProcedureBlock ]

непонятно, что это за класс, и является ли он хранимым.
Указание ClassType недостаточно, попробуйте
Class Client Extends (Reference,%Persistent) [ ClassType = persistent, ProcedureBlock ]
либо
Class Client Extends (%Persistent,Reference) [ ClassType = persistent, ProcedureBlock ]
Результат, кстати, будет разный.
Кроме того, приведены не все классы, да и само проектирование какое-то странное, такое ощущение, что вы привели классы или разных реализаций.
Например, у вас есть класс ContractClient, который судя по названию, содержит связи от контракта к клиенты, но тут же, в классе клиент они лежат в виде массива. Не лучше ли в классе клиент держать массив стразу контрактов, либо держать отдельно класс контракт-клиент, а в классе клиент сделать Relationship?
...
Рейтинг: 0 / 0
Связи между таблицами
    #36965420
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блок А.Н.держать отдельно класс контракт-клиент, а в классе клиент сделать Relationship?
Придерживаюсь такого же мнения...
...
Рейтинг: 0 / 0
Связи между таблицами
    #36965431
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VixlerНу а всё-таки, почему оно не работает? )
- Доктор, когда я делаю вот так (сгибается в немыслимую позу), у меня почему-то сильно болит вот здесь...
- Не делайте так.
(с)

Vixler , не используй вообще всякие там свойства-массивы или свойства-коллекции... Потом меньше гемора будет в работе.
Используй стандартные классы. Как вариант можно еще использовать связи (Relationship), они пока себя ни чем не дискредитировали...
...
Рейтинг: 0 / 0
Связи между таблицами
    #36965467
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vixler , как вариант...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
/// Контракт
Class tmp.Contract Extends %Persistent
{

/// Номер договора
Property dgNum As %String;

/// Начало договора
Property dgBeg As %Date;

/// Окончание договора
Property dgEnd As %Date;

Relationship ClientToContract As tmp.ClientToContract [ Cardinality = many, Inverse = Contract ];

}
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
/// Клиент
Class tmp.Client Extends %Persistent
{

/// Имя клиента
Property Name As %String;

Relationship ClientToContract As tmp.ClientToContract [ Cardinality = many, Inverse = Client ];

}
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
/// Связь клиентов с контрактами
Class tmp.ClientToContract Extends %Persistent
{

Relationship Client As tmp.Client [ Cardinality = one, Inverse = ClientToContract ];

Index ClientIndex On Client;

Relationship Contract As tmp.Contract [ Cardinality = one, Inverse = ClientToContract ];

Index ContractIndex On Contract;

}
...
Рейтинг: 0 / 0
Связи между таблицами
    #36967372
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь мы видим два фундаментальных недостатка Cache:
1) метаданные приходится хранить в приложении; это прошлый век, мягко говоря:)
2) отсутствие связей; это позапрошлый век:)

Если бы связи поддерживались, то этот пример выглядел бы, примерно, так (первый недостаток сохраняется):

Class tmp.Contract Extends %Persistent
{
Property dgNum As %String;
Property dgBeg As %Date;
Property dgEnd As %Date;
}

Class tmp.Client Extends %Persistent
{
Property Name As %String;
}
Relationship Client -> Contract
...
Рейтинг: 0 / 0
Связи между таблицами
    #36967512
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я кричал:
- Вы что там, обалдели? Уронили шахматный престиж.
А мне сказали в нашем спортотделе:
- Вот прекрасно, ты и защитишь.


(с) из песни В.Высоцкого
...
Рейтинг: 0 / 0
Связи между таблицами
    #36967802
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaЯ кричал:
- Вы что там, обалдели? Уронили шахматный престиж.
А мне сказали в нашем спортотделе:
- Вот прекрасно, ты и защитишь.


(с) из песни В.Высоцкого

Это не фундаментальные ошибки, а так, мелкая неточность. Таких строк нет ни в одном варианте:)
При таких словах в первых трех строках последняя звучит так:
"Вот прекрасно - ты и полетишь!"
Но с песнями, все-таки, получше, чем со связями получается:)
...
Рейтинг: 0 / 0
Связи между таблицами
    #36967946
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бредятина , цитату песни я взял с сайта...
...
Рейтинг: 0 / 0
Связи между таблицами
    #36967957
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa Бредятина , цитату песни я взял с сайта...
Я и говорю - мелочь... На этом сайте все намного хуже:)
...
Рейтинг: 0 / 0
Связи между таблицами
    #36968022
ser_shu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бредятинаkrvsa Бредятина , цитату песни я взял с сайта...
Я и говорю - мелочь... На этом сайте все намного хуже:)
http://www.youtube.com/watch?v=WvI0NmLmP-4
...
Рейтинг: 0 / 0
Связи между таблицами
    #36968046
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ser_shu,
А вот у Вас ошибок уже больше:)
Вместо "Уронили шахматный престиж" - "Что же вы, уронили шахматный престиж".
Вместо "Вот прекрасно..." - "Вот, говорят, прекрасно...".
Да, в этом варианте именно "защитишь".
Все очень и очень однозначно:)
Может лучше, все-таки, проблемы Cache понять? Тем более, что они тоже весьма однозначные:)
...
Рейтинг: 0 / 0
Связи между таблицами
    #36968070
ser_shu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Бредятинаser_shu,
А вот у Вас ошибок уже больше:)
Вместо "Уронили шахматный престиж" - "Что же вы, уронили шахматный престиж".
Вместо "Вот прекрасно..." - "Вот, говорят, прекрасно...".
Да, в этом варианте именно "защитишь".
Все очень и очень однозначно:)
Может лучше, все-таки, проблемы Cache понять? Тем более, что они тоже весьма однозначные:)
Думаю, автор бы обалдел и посмеялся над такой однозначной защитой...
И спел бы еще варианты под настроение...
В Cache тоже варианты, можно развивать... неоднозначно
...
Рейтинг: 0 / 0
Связи между таблицами
    #36968073
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ser_shuБредятинаser_shu,
А вот у Вас ошибок уже больше:)
Вместо "Уронили шахматный престиж" - "Что же вы, уронили шахматный престиж".
Вместо "Вот прекрасно..." - "Вот, говорят, прекрасно...".
Да, в этом варианте именно "защитишь".
Все очень и очень однозначно:)
Может лучше, все-таки, проблемы Cache понять? Тем более, что они тоже весьма однозначные:)
Думаю, автор бы обалдел и посмеялся над такой однозначной защитой...
И спел бы еще варианты под настроение...
В Cache тоже варианты, можно развивать... неоднозначно
Может и спел бы... Но не спел:(
Точность важна при обсуждении технических проблем - вот что я хотел продемонстрировать своей "придиркой":)
Какие еще варианты, если связи принципиально не поддерживаются.
...
Рейтинг: 0 / 0
Связи между таблицами
    #36968260
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БредятинаНо не спел:(
Тоже ошибочка... Он не споёт. А пел он таки по-разному. Прямой однозначности искать не стоит...
...
Рейтинг: 0 / 0
Связи между таблицами
    #36968272
Бредятина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaБредятинаНо не спел:(
Тоже ошибочка... Он не споёт. А пел он таки по-разному. Прямой однозначности искать не стоит...
Нет ошибочки. Не спел. А пел именно по-разному. Но то, что Вы написали фактами не подтверждено:) Именно об этом я Вам конкретно и написал:) Если Вам это действительно интересно (то, что базы данных здесь никому не интересныь - это понятно), то можете, например, посмотреть
http://vysotskiy.lit-info.ru/vysotskiy/stihi-varianty/229.htm
...
Рейтинг: 0 / 0
Связи между таблицами
    #36968367
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vixler,

В следующем коде listOfContractClient у меня заполняется корректно:
Код: 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.
using (var cn = new CacheConnection("SERVER=localhost;PORT=1972;NAMESPACE=USER;UID=_SYSTEM;PWD=SYS;"))
{
  cn.Open();
  var listOfClients = new BindingList<Client>();
  using (var cmd = Client.Extent(cn))
  {
    using (var reader = cmd.ExecuteReader())
    {
      Client currClient;
      while (reader.Read())
      {
        var id = reader["ID"].ToString();
        currClient = Client.OpenId(cn, id);
        listOfClients.Add(currClient);

        var listOfContractClient = new BindingList<ContractClient>();
        foreach (ContractClient c in currClient.Contracts)
        {
          listOfContractClient.Add(c);
        }

        // проверяем правильность заполнения listOfContractClient
        foreach (var contractClient in listOfContractClient)
        {
          Console.Out.WriteLine(contractClient.Number + " " + contractClient.DateBegin);
        }

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


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