Некорректная связь ячеек двух таблиц

Автор Тема: Некорректная связь ячеек двух таблиц  (Прочитано 6834 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн valtur1983Автор темы

  • ADN OPEN
  • Сообщений: 46
  • Карма: 2
Приветствую форумчане!

Есть две таблицы. Необходимо связать определенные ячейки этих таблиц.

Прилагаю код:

Код - C# [Выбрать]
  1. using (Transaction tr = db.TransactionManager.StartTransaction())
  2.             {
  3.  
  4.                 Table tbl = new Table();
  5.                 tbl.TableStyle = db.Tablestyle;
  6.                 /*
  7.                 //формируем и заполняем таблицу
  8.                 */
  9.  
  10.                 tbl.Position = new Point3d(intShagSetkiX * (intPosColumnInModel - 1) + 20.0, -intShagSetkiY * (intPosRowInModel - 1) + 262.0, 0.0);
  11.  
  12.                 tbl.GenerateLayout();
  13.                 BlockTableRecord sp = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  14.                 sp.AppendEntity(tbl);
  15.                 tr.AddNewlyCreatedDBObject(tbl, true);
  16.                 for (int n = 0; n < intKolRowsTable; n++)
  17.                     tbl.Cells[n, 15].Contents[0].Formula = "=Sum(J" + Convert.ToString(n + 1) + ":N" + Convert.ToString(n + 1) + ")";
  18.  
  19.                 //создаем вторую таблицу
  20.                 Table tbl1 = new Table();
  21.                 tbl1.TableStyle = db.Tablestyle;
  22.                 /*
  23.                 формируем ячейки второй таблицы
  24.                 */
  25.  
  26.                 tbl1.Position = new Point3d(intShagSetkiX * (intPosColumnInModel - 1) + 20.0, -intShagSetkiY * (intPosRowInModel - 1) + 26.0, 0.0);
  27.  
  28.                 tbl1.GenerateLayout();
  29.                 sp = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  30.                 sp.AppendEntity(tbl1);
  31.                 tr.AddNewlyCreatedDBObject(tbl1, true);
  32.  
  33.                 Field field = new Field("%<\\AcExpr (Table(%<\\_ObjId " + tbl.ObjectId.OldIdPtr.ToString() + ">%).P3)>%");
  34.                 ObjectId id = tbl1.SetField(field);
  35.                 tr.AddNewlyCreatedDBObject(field, true);
  36.                 tbl1.Cells[0, 1].FieldId = id;
  37.  
  38.                 field = new Field("%<\\AcExpr (Table(%<\\_ObjId " + tbl.ObjectId.OldIdPtr.ToString() + ">%).P2)>%");
  39.                 id = tbl1.SetField(field);
  40.                 tr.AddNewlyCreatedDBObject(field, true);
  41.                 tbl1.Cells[1, 1].FieldId = id;
  42.  
  43.                 field = new Field("%<\\AcExpr (Table(%<\\_ObjId" + tbl.ObjectId.OldIdPtr.ToString() + ">%).Evaluate(Sum(P3:P11)))>%");
  44.                 id = tbl1.SetField(field);
  45.                 tr.AddNewlyCreatedDBObject(field, true);
  46.                 tbl1.Cells[2, 2].FieldId = id;
  47.                
  48.  
  49.                 tr.Commit();
  50.             }
  51.  
  52.  

Проблема в строках 33-46.

При обработке одного поля (любого, например, строки 33-36) программа работает корректно, но как только я хочу использовать связь трех полей, то во второй таблице (tbl1) первые два поля вообще пустые а третье поле вываливает "###". В третьем поле увидел что ObjectId не соответствует ObjecId исходной таблицы, думаю что связано это с методом AddNewlyCreatedDBObject

Подскажите в чем проблема

Я

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробуй вместо field использовать отдельные field1, field2, field3
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн valtur1983Автор темы

  • ADN OPEN
  • Сообщений: 46
  • Карма: 2
Код - C# [Выбрать]
  1. Field field1 = new Field("%<\\AcExpr (Table(%<\\_ObjId " + tbl.ObjectId.OldIdPtr.ToString() + ">%).P3)>%");
  2.                 ObjectId id1 = tbl1.SetField(field1);
  3.                 tr.AddNewlyCreatedDBObject(field1, true);
  4.                 tbl1.Cells[0, 1].FieldId = id1;
  5.  
  6.  
  7.                 Field field2 = new Field("%<\\AcExpr (Table(%<\\_ObjId " + tbl.ObjectId.OldIdPtr.ToString() + ">%).P2)>%");
  8.                 ObjectId id2 = tbl1.SetField(field2);
  9.                 tr.AddNewlyCreatedDBObject(field2, true);
  10.                 tbl1.Cells[1, 1].FieldId = id2;
  11.  
  12.  
  13.                 Field field3 = new Field("%<\\AcExpr (Table(%<\\_ObjId" + tbl.ObjectId.OldIdPtr.ToString() + ">%).Evaluate(Sum(P3:P" + Convert.ToString(intKolRowsTable + 6)+"))>% ");
  14.                 ObjectId id3 = tbl1.SetField(field3);
  15.                 tr.AddNewlyCreatedDBObject(field3, true);
  16.                 tbl1.Cells[2, 2].FieldId = id3;
  17.  
  18.  

ничего не меняется, любой одиночный блок отрабатывается, а в комплексе нет

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробуй разделить транзакции. Первую таблицу формируй в первой транзакции, вторую во второй. Если не поможет - создавай тестовый проект-пример. Посмотрю в чем может быть проблема.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Кстати, попробуй вместо своего последнего кода вот этот:
Код - C# [Выбрать]
  1. //Field field1 = new Field("%<\\AcExpr (Table(%<\\_ObjId " + tbl.ObjectId.OldIdPtr.ToString() + ">%).P3)>%");
  2. //ObjectId id1 = tbl1.SetField(field1);
  3. //tr.AddNewlyCreatedDBObject(field1, true);
  4. //tbl1.Cells[0, 1].FieldId = id1;
  5. tbl1.Cells[0, 1].TextString = "%<\\AcExpr (Table(%<\\_ObjId " + tbl.ObjectId.OldIdPtr.ToString() + ">%).P3)>%";
  6.  
  7. //Field field2 = new Field("%<\\AcExpr (Table(%<\\_ObjId " + tbl.ObjectId.OldIdPtr.ToString() + ">%).P2)>%");
  8. //ObjectId id2 = tbl1.SetField(field2);
  9. //tr.AddNewlyCreatedDBObject(field2, true);
  10. //tbl1.Cells[1, 1].FieldId = id2;
  11. tbl1.Cells[1, 1].TextString = "%<\\AcExpr (Table(%<\\_ObjId " + tbl.ObjectId.OldIdPtr.ToString() + ">%).P2)>%";
  12.  
  13.  
  14. //Field field3 = new Field("%<\\AcExpr (Table(%<\\_ObjId" + tbl.ObjectId.OldIdPtr.ToString() + ">%).Evaluate(Sum(P3:P" + Convert.ToString(intKolRowsTable + 6)+"))>% ");
  15. //ObjectId id3 = tbl1.SetField(field3);
  16. //tr.AddNewlyCreatedDBObject(field3, true);
  17. //tbl1.Cells[2, 2].FieldId = id3;
  18. tbl1.Cells[2, 2].TextString = "%<\\AcExpr (Table(%<\\_ObjId" + tbl.ObjectId.OldIdPtr.ToString() + ">%).Evaluate(Sum(P3:P" + Convert.ToString(intKolRowsTable + 6)+"))>%";
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн valtur1983Автор темы

  • ADN OPEN
  • Сообщений: 46
  • Карма: 2
Ссылки просто на ячейку отработали на ура, а вот с вычислениями (Evaluate) не получилось, скорее всего все таки надо через Field делать

При использовании блока:
Код - C# [Выбрать]
  1. Field field3 = new Field("%<\\AcExpr (Table(%<\\_ObjId" + tbl.ObjectId.OldIdPtr.ToString() + ">%).Evaluate(Sum(P3:P" + Convert.ToString(intKolRowsTable + 6)+"))>% ");
  2.                 ObjectId id3 = tbl1.SetField(field3);
  3.                 tr.AddNewlyCreatedDBObject(field3, true);
  4.                 tbl1.Cells[2, 2].FieldId = id3;
  5.  

Заметил одну деталь, tbl.ObjectId.OldIdPtr.ToString() передает неверный ObjectId исходной таблицы в строке

Код - C# [Выбрать]
  1. tbl1.Cells[2, 2].TextString = "%<\\AcExpr (Table(%<\\_ObjId" + tbl.ObjectId.OldIdPtr.ToString() + ">%).Evaluate(Sum(P3:P" + Convert.ToString(intKolRowsTable + 6)+"))>%";
  2.  

Мало того, даже уже когда макрос отработал и таблица сформировалась, при двойном щелчке на ячейку с это формулой, ObjectId в строке выражении постоянно меняется.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А так:
   
Код - C# [Выбрать]
  1. tbl1.Cells[2, 2].TextString = "%<\\AcExpr (Table(%<\\_ObjId " + tbl.ObjectId.OldIdPtr.ToString() + ">%).Evaluate(Sum(P3:P" + Convert.ToString(intKolRowsTable + 6)+"))>%";
  2.      
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
В твоей строке после _ObjId не было пробела.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн valtur1983Автор темы

  • ADN OPEN
  • Сообщений: 46
  • Карма: 2
Не получается
После формирования таблицы кодом, при щелчке на ячейку, вижу такую строку в формуле для поля:

%<\AcExpr (Table(1656063335680).Evaluate(Sum(P3:P11))>%

При ручном формировании формулы (через диалоговое окно), формируется такая строка:

%<\AcExpr (Table(%<\_ObjId 1656063335680>%).Evaluate(Sum(P3:P11)))>%

добавлял в код строку:

Код - C# [Выбрать]
  1. field3.Evaluate();
  2.  

результат не меняется

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
valtur1983,
Повторюсь про пробел.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
И еще не хватает одной закрывающей скобки в конце строки (должно быть три закрывающие скобки подряд). Я твой код проверяю не на компьютере. Так что извини, что сразу не заметил.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн valtur1983Автор темы

  • ADN OPEN
  • Сообщений: 46
  • Карма: 2
В скобке дело было (((
Постоянно с ними проблема, да и ошибки

А вот вставка двух и более полей с вычислениями не отрабатываются

Код - C# [Выбрать]
  1. Field field = new Field();
  2. string fieldcode = "%<\\AcExpr (Table(%<\\_ObjId " + tbl.ObjectId.OldIdPtr.ToString() + ">%).Evaluate(Sum(P3:P" + Convert.ToString(ListKD.Count + 6) + ")))>%";
  3. field.SetFieldCode(fieldcode);
  4. field.Evaluate();
  5. ObjectId id = tbl1.SetField(field);
  6. tr.AddNewlyCreatedDBObject(field, true);
  7. tbl1.Cells[2, 2].FieldId = id;
  8.                
  9.  
  10. Field field1 = new Field();
  11. string fieldcode1 = "%<\\AcExpr (Table(%<\\_ObjId " + tbl.ObjectId.OldIdPtr.ToString() + ">%).Evaluate(Count(P3:P" + Convert.ToString(ListKD.Count + 6) + ")))>%";
  12. field1.SetFieldCode(fieldcode1);
  13. field1.Evaluate();
  14. ObjectId id1 = tbl1.SetField(field1);
  15. tr.AddNewlyCreatedDBObject(field1, true);
  16. tbl1.Cells[1, 2].FieldId = id1;
  17.  

По одиночке работают

При вставке двух полей и более, обрабатывается только последняя вставка поля. Вставка первых полей игнорируется (ячейки пустые)

И еще одна бяка, сначала в ячейку вставляется "####", но при РЕГЕН или при щелчке на ячейку значение становится нормальным

Отмечено как Решение valtur1983 18-12-2021, 06:19:41

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А без полей через TextString?  Добавлять поля (Field) нужно не к таблице, а к базе данных при помощи метода Database.AddDbObject
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вот это неправильно:
Код - C# [Выбрать]
  1. ObjectId id1 = tbl1.SetField(field1);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн valtur1983Автор темы

  • ADN OPEN
  • Сообщений: 46
  • Карма: 2
Спасибо!
Все заработало

Через
Код - C# [Выбрать]
  1. tbl1.Cells[2, 2].TextString = "%<\\AcExpr (Table(%<\\_ObjId " + tbl.ObjectId.OldIdPtr.ToString() + ">%).Evaluate(Sum(P3:P" + Convert.ToString(ListKD.Count + 6) + ")))>%";
  2.  

Сразу же показывает нужное значение

Через Field
Код - C# [Выбрать]
  1. Field field = new Field();
  2.                 string fieldcode = "%<\\AcExpr (Table(%<\\_ObjId " + tbl.ObjectId.OldIdPtr.ToString() + ">%).Evaluate(Sum(P3:P" + Convert.ToString(ListKD.Count + 6) + ")))>%";
  3.                 field.SetFieldCode(fieldcode);
  4.                 field.Evaluate();
  5.                 ObjectId id = db.AddDBObject(field);
  6.                 tr.AddNewlyCreatedDBObject(field, true);
  7.                 tbl1.Cells[2, 2].FieldId = id;
  8.  

Тоже вставляет все поля, но нужно сделать какие нибудь манипуляции в чертеже чтобы поля обновились и вместо "####" появились нужные результаты

А не подскажите для чего тогда метод SetField класса DBObject применяется?



Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Тоже вставляет все поля, но нужно сделать какие нибудь манипуляции в чертеже чтобы поля обновились и вместо "####" появились нужные результаты
Database.EvaluateFields() позволяет обновить поля.
Но в твоём случае tbl1.Cells[2, 2].FieldId = id; недостаточно. Всё равно нужно присвоить tbl1.Cells[2, 2].TextString

А не подскажите для чего тогда метод SetField класса DBObject применяется?
Это если у объекта одно поле. Повторный вызов SetField переопределяет поле объекта.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение