Как отобразить имя модуля в другом модуле, который не связан с ним напрямую (DXL DOORS)

Я новичок в DXL и пытаюсь создать главный модуль (модуль A) в DOORS, в котором есть столбец, отображающий текст из модуля B, за которым следует заголовок модуля C. Модуль B связан с модулем A, а модуль C связан с модулем B. Я хотел бы, чтобы модуль A имел столбец, который 1) отображает содержимое, связанное с B, и 2) в той же строке, что и каждый объект модуля B, отображает имя модуля C, которое связано с модулем B. Я бы хотел, чтобы имя модуля C было заключено в квадратные скобки. Это должно выглядеть так:

В модуле A Первый столбец: "текст, введенный вручную в A" Второй столбец: "текст, введенный вручную в B [название C]"

В настоящее время я могу перенести B в новый столбец внутри A. Вот этот код:

pragma runLim, 0
void showIn(Object o, int depth) {
    Link l
    LinkRef lr
    ModName_ otherMod = null
    Module linkMod = null
    ModuleVersion otherVersion = null
    Object othero
    string disp = null
    string s = null
    string plain, plainDisp
    int plainTextLen
    int count
    bool doneOne = false
    string linkModName = "*"
    for lr in all(o<-linkModName) do {
        otherMod = module (sourceVersion lr)
        if (!null otherMod) {
            if ((!isDeleted otherMod) && (null data(sourceVersion lr))) {
                load((sourceVersion lr),false)
            }
        }
    }
    for l in all(o<-linkModName) do {
        otherVersion = sourceVersion l
        otherMod = module(otherVersion)
        if (null otherMod || isDeleted otherMod) continue
        othero = source l
        if (null othero) {
            load(otherVersion,false)
        }
        othero = source l
        if (null othero) continue
        if (isDeleted othero) continue
        doneOne = true
        if (depth == 1) {
            s = probeRichAttr_(othero,"Object Text", false)
            if (s == "") 
            displayRich("\\pard " " ")
            else
            displayRich("\\pard " s)
        }
    }
}
showIn(obj,1)

Вот что я нашел до сих пор из другого запроса: Показать столбцы DXL из других модулей

Это было полезное начало для отображения имени C в квадратных скобках в новом столбце в B. Вот мой код для этого:

    pragma runLim, 0
    int lines[4] = {0, 0, 0, 0}
    void adjustLines(int depth, showAtDepth) {
    int count
    for (count = 0; count < 4; count++) {
    while (lines[depth-1] < lines[count]) {
        if (depth == showAtDepth) displayRich("\\pard " " ")
        lines[depth-1]++
    }
  }
}
void showIn(Object o, int depth) {
Link l
LinkRef lr
ModName_ otherMod = null
Module linkMod = null
ModuleVersion otherVersion = null
Object othero
string disp = null
string s = null
string plain, plainDisp
int plainTextLen
int count
bool doneOne = false

    string linkModName = "*"
    for lr in all(o<-linkModName) do {
        otherMod = module (sourceVersion lr)
        if (!null otherMod) {
            if ((!isDeleted otherMod) && (null data(sourceVersion lr))) {
                load((sourceVersion lr),false)
            }
        }
    }
    for l in all(o<-linkModName) do {
        otherVersion = sourceVersion l
        otherMod = module(otherVersion)
        if (null otherMod || isDeleted otherMod) continue
        othero = source l
        if (null othero) {
            load(otherVersion,false)
        }
        othero = source l
        if (null othero) continue
        if (isDeleted othero) continue
        int oldLines = lines[depth-1]
        adjustLines(depth, 1)
        bool kick = (doneOne) && (lines[depth-1] == oldLines)
        if (kick) {
            lines[depth-1]++
            if (depth == 1) displayRich("\\pard " " ")
        }
        if (depth < 4) {
            showIn(othero, depth+1)
        }
        doneOne = true
        if (depth == 1) {
            s = name(otherMod)
            if (isBaseline(otherVersion)) {
                s = s " [" versionString(otherVersion) "]"
            }

        s = "{[" s "]}"

        displayRich s

        }
        lines[depth-1] += 3
    }
}
showIn(obj,1)

Однако есть 2 проблемы с этим. 1) У меня есть несколько ссылок от объектов в C, входящих в B, и для каждой ссылки отображается имя C столько раз. Я бы хотел, чтобы имя C отображалось только один раз для каждого объекта в B, чтобы не было избыточности. 2) Имя C отображается как новый столбец в B, но я бы хотел, чтобы оно было конкатенировано в конце текста в уже существующем столбце.

Кроме того, набор ссылок между A и B находится в другой папке, чем набор ссылок между B и C, поэтому приведенный выше ответ на переполнение запасов, похоже, не работает 1.

Я полагаю, что есть 2 разных подхода к этому. Пусть имя C отображается в конце текста объекта в B, а затем A вызывает этот столбец B, таким образом захватывая оба связанных объекта. В этом случае мне нужен только код DXL для B. Или сделайте A достаточно умным, чтобы вызвать столбец B и добавить к нему имя C. В этом случае мне понадобится только код DXL для A.

Я не уверен, что этот форум является подходящим местом для этого вопроса (я пытался позвонить в службу поддержки IBM, и они направили меня сюда). Заранее спасибо.


person Stephanie Reed    schedule 10.10.2014    source источник


Ответы (1)


Я знаю, что этот ответ немного запоздал, и я уверен, что вы уже ушли, НО... Я думаю, вы ищете что-то вроде этого...

pragma runLim, 0
void showIn(Object o, int depth) {
  Link l, l2
  LinkRef lr
  ModName_ modC = null
  ModName_ otherMod = null
  Module linkMod = null
  ModuleVersion otherVersion = null
  Object othero
  string disp = null
  string s = null
  string plain, plainDisp
  int plainTextLen
  int count
  bool doneOne = false
  string linkModName = "*"
  for lr in all(o<-linkModName) do {
    otherMod = module (sourceVersion lr)
    if (!null otherMod) {
        if ((!isDeleted otherMod) && (null data(sourceVersion lr))) {
            load((sourceVersion lr),false)
        }
    }
  }
  for l in all(o<-linkModName) do {
    otherVersion = sourceVersion l
    otherMod = module(otherVersion)
    if (null otherMod || isDeleted otherMod) continue
    othero = source l
    if (null othero) {
        load(otherVersion,false)
    }
    othero = source l
    if (null othero) continue
    if (isDeleted othero) continue
    doneOne = true
    if (depth == 1) {
        s = probeRichAttr_(othero,"Object Text", false)
         for l2 in all (othero <- "*") do {
          modC = source(l2)
          s = s " [" name(modC) "]"
          break
        }

        if (s != "") 
        displayRich("\\pard " s)
    }
  }
}
showIn(obj,1)

Возможно, вам придется немного изменить его для вашей конкретной ситуации.

Удачи!

person Steve Valliere    schedule 15.04.2015