Pull Attributes Up

This script allows you to selectively update attribute values in the current module from in-linked objects in another module. The script allows you to select which source module(s) to copy from and which attributes to update. The script respect the display set in the current module.

//   Pull Attributes Up

/*

Tony Goodman	Initial Version

*/

// Current module

Module masterModule = null

// dialog box elements

DB   dbMain   = null

DBE dbeDialogLabel = null

DBE dbeFrame = null

DBE dbeMasterModuleFrame = null

DBE dbeMasterModule = null

DBE dbeBranchedRequirementsFrame = null

DBE dbeRelationships = null

DBE dbeSpacer = null

DBE dbeBranchedModules = null

DBE dbeAttributes = null

DBE dbeUpdate = null

DBE dbeSelectAll = null

DBE dbeClearAll = null

string dummy[] = {}

Skip skipMasterAttributes = createString

Skip skipBranchedAttributes = createString

Skip skipRelationships = createString

Skip skipBranchedModules = createString

Skip skipSelectedBranchedModules = createString

Skip skipSelectedAttributes = createString

bool relationshipsFound = false

string selectedRelationship = ""

Buffer errBuf = create

int errors = 0

int objectsUpdated = 0

/******************************************************************************

getAttributes

******************************************************************************/

string getAttributes()

{

string mName = ""

Module branchedModule = null

AttrDef ad = null

string attr = ""

int i = 0

empty(dbeAttributes)

if (!relationshipsFound)

{

inactive(dbeAttributes)

return("")

}

delete(skipBranchedAttributes)

skipBranchedAttributes = createString

for mName in skipSelectedBranchedModules do

{

branchedModule = read(mName, false)

if (null branchedModule)

{

return("Error opening module:\n" mName)

}

(current ModuleRef__) = branchedModule

filtering off

outlining off

for ad in branchedModule do

{

if (!ad.object) continue

if (ad.name == "Absolute Number") continue

if (ad.system) continue

put(skipBranchedAttributes, ad.name, ad.name)

}

}

delete(skipMasterAttributes)

skipMasterAttributes = createString

(current ModuleRef__) = masterModule

for ad in masterModule do

{

if (!ad.object) continue

if (ad.dxl) continue

if (ad.name == "Absolute Number") continue

if (ad.system) continue

if (!find(skipBranchedAttributes, ad.name)) continue

put(skipMasterAttributes, ad.name, ad.name)

}

put(skipMasterAttributes, "Object Heading", "Object Heading")

put(skipMasterAttributes, "Object Text", "Object Text")

// Refresh dialog

i = 0

for attr in skipMasterAttributes do

{

insert(dbeAttributes, i, attr, iconNone)

setCheck(dbeAttributes, i, true)

i++

}

return("")

}

/******************************************************************************

getBrachedModules

******************************************************************************/

void getBrachedModules()

{

ModName_ mn = null

Object o = null

LinkRef lr = null

string mName = ""

int i = 0

empty(dbeBranchedModules)

if (!relationshipsFound)

{

return()

}

delete(skipBranchedModules)

skipBranchedModules = createString

delete(skipSelectedBranchedModules)

skipSelectedBranchedModules = createString

for o in masterModule do

{

for lr in o <- "*" do

{

if (name(module(lr)) != selectedRelationship) continue

mn = source(lr)

put(skipBranchedModules, fullName(mn), fullName(mn))

}

}

i = 0

for mName in skipBranchedModules do

{

insert(dbeBranchedModules, i, mName, iconNone)

set(dbeBranchedModules, i, true)

i++

put(skipSelectedBranchedModules, mName, mName)

}

}

/******************************************************************************

getRelationships

******************************************************************************/

void getRelationships()

{

Object o = null

LinkRef lr = null

int i = 0

string relationship = ""

delete(skipRelationships)

skipRelationships = createString

for o in masterModule do

{

for lr in o <- "*" do

{

put(skipRelationships, name(module(lr)), name(module(lr)))

relationshipsFound = true

}

}

if (relationshipsFound)

{

i = 0

for relationship in skipRelationships do

{

insert(dbeRelationships, i++, relationship)

}

}

else

{

insert(dbeRelationships, 0, "<no relationships found>")

inactive(dbeUpdate)

}

set(dbeRelationships, 0)

selectedRelationship = get(dbeRelationships)

}

/******************************************************************************

updateObject

******************************************************************************/

void updateObject(Object o, Object othero)

{

string attr = ""

for attr in skipSelectedAttributes do

{

// ignores attributes that do not exist without error

copyAttribute_(othero, o, attr)

}

objectsUpdated++

}

/******************************************************************************

doSelectBranchedModules

******************************************************************************/

void doSelectBranchedModules(DBE dbe, int x)

{

string res = ""

string mName = ""

delete(skipSelectedBranchedModules)

skipSelectedBranchedModules = createString

for mName in dbeBranchedModules do

{

put(skipSelectedBranchedModules, mName, mName)

}

res = getAttributes()

if (res != "")

{

infoBox("ERROR: " res)

}

}

/******************************************************************************

doSelectRelationship

******************************************************************************/

void doSelectRelationship(DBE dbe)

{

string res = ""

selectedRelationship = get(dbeRelationships)

getBrachedModules()

res = getAttributes()

if (res != "")

{

infoBox("ERROR: " res)

}

}

/******************************************************************************

doUpdate

******************************************************************************/

void doUpdate(DB db)

{

ModName_ mn = null

string res = ""

Object o = null

Object othero = null

Link l = null

string attr = ""

string mName = ""

int i = 0

if (!confirm("You are about to update master requirements in the current module with values\n" //-

"copied from linked (branched) requirements.\n\nAre you sure you want to continue?"))

{

return

}

delete(skipSelectedAttributes)

skipSelectedAttributes = createString

for (i = 0; i < noElems(dbeAttributes); i++)

{

if (getCheck(dbeAttributes, i))

{

attr = getColumnValue(dbeAttributes, i, 0)

put(skipSelectedAttributes, attr, attr)

}

}

for o in masterModule do

{

for l in o <- "*" do

{

if (name(module(l)) != selectedRelationship) continue

mn = source(l)

if (!find(skipSelectedBranchedModules, fullName(mn))) continue

othero = source(l)

if (null othero)

{

errBuf += "Object " identifier(o) " is linked to a null object\n"

errors++

continue

}

if (isDeleted othero)

{

errBuf += "Object " identifier(o) " is linked to a deleted object\n"

errors++

continue

}

updateObject(o, othero)

}

}

if (errors > 0)

{

infoBox("Update complete, but with errors:\n" stringOf(errBuf))

}

else

{

infoBox("Update completed successfully.\n" //-

objectsUpdated " object" (objectsUpdated == 1 ? " has " : "s have " ) //-

"been updated\nPlease remember to save your module.")

}

release(dbMain)

}

/******************************************************************************

doSelectAll

******************************************************************************/

void doSelectAll(DBE dbe)

{

int i = 0

for (i = 0; i < noElems(dbeAttributes); i++)

{

setCheck(dbeAttributes, i, true)

}

}

/******************************************************************************

doClearAll

******************************************************************************/

void doClearAll(DBE dbe)

{

int i = 0

for (i = 0; i < noElems(dbeAttributes); i++)

{

setCheck(dbeAttributes, i, false)

}

}

/******************************************************************************

doClose

******************************************************************************/

void doClose(DB db)

{

release(dbMain)

}

/******************************************************************************

buildDialog

******************************************************************************/

void buildDialog()

{

string res = ""

dbMain = create(masterModule, "Pull Attributes Up", styleCentered)

dbeDialogLabel = label(dbMain, "This utility allows you to update attribute values in your master requirements module.\n" //-

"Values are copied from branched requirements that they are linked to via the selected relationship.\n" //-

"Only values for the selected attributes are compared and updated.")

dbeFrame = frame(dbMain, "", 450, 460)

dbeFrame->"top"->"flush"->dbeDialogLabel

dbeFrame->"left"->"form"

dbeFrame->"right"->"form"

dbeFrame->"bottom"->"form"

dbeMasterModuleFrame = frame(dbMain, "Master requirements module", 400, 20)

dbeMasterModuleFrame->"top"->"inside"->dbeFrame

dbeMasterModuleFrame->"left"->"inside"->dbeFrame

dbeMasterModuleFrame->"right"->"inside"->dbeFrame

dbeMasterModuleFrame->"bottom"->"unattached"

dbeMasterModule = field(dbMain, "", fullName(masterModule), 50, true)

dbeMasterModule->"top"->"inside"->dbeMasterModuleFrame

dbeMasterModule->"left"->"inside"->dbeMasterModuleFrame

dbeMasterModule->"right"->"inside"->dbeMasterModuleFrame

dbeMasterModule->"bottom"->"inside"->dbeMasterModuleFrame

dbeBranchedRequirementsFrame = frame(dbMain, "Branched requirements", 400, 360)

dbeBranchedRequirementsFrame->"top"->"flush"->dbeMasterModuleFrame

dbeBranchedRequirementsFrame->"left"->"inside"->dbeFrame

dbeBranchedRequirementsFrame->"right"->"inside"->dbeFrame

dbeBranchedRequirementsFrame->"bottom"->"inside"->dbeFrame

dbeRelationships = choice(dbMain, "Relationship:", dummy, 0, 30, false)

dbeRelationships->"top"->"inside"->dbeBranchedRequirementsFrame

dbeRelationships->"left"->"inside"->dbeBranchedRequirementsFrame

dbeRelationships->"right"->"inside"->dbeBranchedRequirementsFrame

dbeRelationships->"bottom"->"unattached"

dbeBranchedModules = listView(dbMain, listViewOptionMultiselect, 400, 5, dummy)

dbeBranchedModules->"top"->"flush"->dbeRelationships

dbeBranchedModules->"left"->"inside"->dbeBranchedRequirementsFrame

dbeBranchedModules->"right"->"inside"->dbeBranchedRequirementsFrame

dbeBranchedModules->"bottom"->"unattached"

dbeAttributes = listView(dbMain, listViewOptionCheckboxes | listViewOptionMultiselect, 400, 10, dummy)

dbeAttributes->"top"->"flush"->dbeBranchedModules

dbeAttributes->"left"->"inside"->dbeBranchedRequirementsFrame

dbeAttributes->"right"->"inside"->dbeBranchedRequirementsFrame

dbeAttributes->"bottom"->"unattached"

dbeSelectAll = button(dbMain, "Select All", doSelectAll)

dbeSelectAll->"top"->"flush"->dbeAttributes

dbeSelectAll->"left"->"inside"->dbeBranchedRequirementsFrame

dbeSelectAll->"right"->"unattached"

dbeSelectAll->"bottom"->"inside"->dbeBranchedRequirementsFrame

dbeClearAll = button(dbMain, "ClearAll", doClearAll)

dbeClearAll->"top"->"flush"->dbeAttributes

dbeClearAll->"left"->"flush"->dbeSelectAll

dbeClearAll->"right"->"unattached"

dbeClearAll->"bottom"->"inside"->dbeBranchedRequirementsFrame

dbeUpdate = apply(dbMain, "Update", doUpdate)

realize(dbMain)

insertColumn(dbeAttributes, 0, "Attributes to compare/update", 430, iconNone)

insertColumn(dbeBranchedModules, 0, "Branched requirements modules", 430, iconNone)

set(dbeRelationships, doSelectRelationship)

set(dbeBranchedModules, doSelectBranchedModules, doSelectBranchedModules, doSelectBranchedModules)

getRelationships()

getBrachedModules()

getAttributes()

block(dbMain)

destroy(dbMain)

dbMain = null

}

/***************************

requirementsFlowUp

***************************/

void requirementsFlowUp()

{

masterModule = current Module

if (null masterModule || !isEdit masterModule)

{

infoBox("This utility can only be run from a formal module open for exclusive edit.")

halt

}

(current ModuleRef__) = masterModule

buildDialog()

}

/***************************

MAIN

***************************/

requirementsFlowUp()