SalesBUILDER for Windows Release Notes 4.1 Trilogy © Copyright by Trilogy Development Group. All rights reserved. This material is unpublished and Confidential Information of Trilogy Development Group and is available under license only. This material is not to be copied or disclosed without the prior written approval of Trilogy Development Group. September 19, 1996 ======================================================== 4.1.13 -------------------------------------------------------- Release Note System Diagram supports new instance shapes The following is a brief summary of the extensions that have been made to the system diagram (and how to enable them with CML). Note that all of these new attributes are of type "String" and should be declared: "String {preserve TRUE;}". 1. The system diagram is now able to draw not only rectangles, but also ellipses, rounded rectangles and icons. To do this, declare a string attribute named "sb_Shape" and set it one of the following: ELLIPSE, ROUND_RECT, RECTANGLE, or ICON. If you specify anything other than ICON, then the system diagram will draw the shape specified using the height and width parameters to determine the size of the shape drawn. To draw a circle, just specify an ellipse with the same height and width. If you specify ICON, you must also declare and set a string attribute named "sb_Icon". This attribute must point to the full path name of an icon (.ICO) file which the system diagram will read in and draw. The height and width parameters are used to specify the size of the box that encloses the icon. This box must be at least as large as the icon, but can be bigger. Note: Due to limitations in the 16-bit Windows API, only 16 by 16 icons are currently allowed on Win16. 2. You can now specify "settable" labels, label locations and label orientation. To create a modifiable label declare and set the "sb_Label" to be the text you wish to decorate the instance shape in the diagram. Note that the value of sb_Label will override the value of the intrinsic attribute "label" if "sb_Label" is set. Note that "modifiable" labels not yet supported in SBW, but other system diagram based applications may make use of them via the system diagram API. To determine the label's orientation, declare and set the attribute "sb_Label_Orientation". Set this to HORIZONTAL to have labels drawn horizontally and VERTICAL to have labels drawn vertically. If this variable is not set or not declared, the system diagram will choose the orientation that best fits the component it's drawing on. Declare and set the attribute "sb_Label_Location" to position the label within the instance at a location different from the default (the system diagram used to draw horizontal labels in the upper left hand corner of the component and draw vertical labels in the upper right hand corner of the component). There are now nine possible settings for location: TOP_LEFT, MIDDLE_LEFT, BOTTOM_LEFT, TOP_CENTER, CENTER, BOTTOM_CENTER, TOP_RIGHT, MIDDLE_RIGHT, BOTTOM_RIGHT. Note: These settings are absolute and do not depend on label orientation. -------------------------------------------------------- Bug Fix Entering small floats (< 0.1) into edit fields, can yield incorrect results History and Origins: Typing "0.08" into an edit field, then tabbing away, will leave "8.00000001" in the field. Resolution: Small values were being represented in scientific notation (0.08 = "8.000000010000E-02"), with the exponent portion of the value truncated because of the field length. These values now remain displayed in normal decimal notation. ======================================================== 4.1.9 -------------------------------------------------------- Bug Fix Selection Set with attribute initialization results in crash History and Origins: Form set included a set of Radio Buttons and a Dynamic Table. The radio buttons initialized attributes that where used by constraints on the dynamic table. These constraints controlled the availability of items on the dynamic table. On the first selection of the radio button, the attribute would be set and the constraint on the dynamic table would function. Any subsequent use of the the radio buttons would cause SBW to crash. The problem is repeatable regardless of which radio button is first selected or which radio button was subsequently selected Resolution: This problem was due to impropoer handling of SelectionSet initialization list by the API call sb_SetSelectionStatus when the initialization list ID provided to the API call was NULL (a valid value, indicating that a null initialization list should replace the existing initialization list for the SelectionSet). This problem has been fixed. -------------------------------------------------------- Bug Fix -0 in table bound from 0 to some positive number causes SBW to crash History and Origins: If the legal values in a table are restriced between and a positive value, entering "-0" causes an error. Resolution: Typing -# in a SBW table no longer causes an error in SBW. ======================================================== 4.1.8 -------------------------------------------------------- New Feature Allow dynamic tables to initialize attribute values Context and Motive for Implementation: Allow dynamic tables to specify an attribute which is initialized by the values entered in the table. Resolution: Dynamic tables can now specify an attribute that will get initialized by the values entered in the table. If an attribute is specified it changes the behavior of the requests made by the table. Dynamic tables can be viewed as a set of component-quantity request pairs. A table with N items has pairs C1 Q1 thru CNQN. For each pair that has Qi greater than 0, the table would normally request Qi copies of the component Ci with sb_SelectionCount initialized to Qi . When a dynamic table specifies an attribute to be initialized, the behavior of the requests changes to: for each pair that has Qi greater than 0, the table requests 1 component Ci with sb_SelectionCount initialized to Qi and the attribute specified initialized to Qi. Other attribute initialization via the initialization list is unaffected. A dynamic table that specifies an attribute to initialize uses the attributes sb_Max and sb_Min for range checking similar to the standard dynamic table. To change the quantity of items selected in the interface set the attribute specified to the desired value in the model. This differs from standard dynamic tables where you set sb_SelectionCount to change the interface. To specify one of these dynamic tables in the forms language, create a dynamic table description (the same as a regular dynamic table) and add the following to the definition: INITATTR . Form set: // Definition of dynamic table that initializes an attribute. frmBaseSystem: dlt1 { FROM Item DISPLAY description CUMULATIVE INITATTR itemAttr1 } Product base: Float sb_Min; Float sb_Max; Float sb_SelectionCount; Float itemAttr1; productLine plAll "All product lines"; class Item : Component { attributes: sb_Min = 0; sb_Max = 1; sb_SelectionCount; itemAttr1; } component item1 : Item { productLines: plAll; description: "Item 1"; } component item2 : Item { productLines: plAll; description: "Item 2"; attributes: sb_Max = 2; } // Active constraints can be written against the class // Item to dynamically change the values of sb_Min, // sb_Max and itemAttr1 based on the values of itemAttr1 // and sb_SelectionCount passed in the interface. Example use: Item 1 Quantity: 0 Range: [0-1] Item 2 Quantity: 2 Range: [0-2] This would produce the following: request 1 item2 where sb_Selection=2 and itemAttr1=2 -------------------------------------------------------- Bug Fix SBW Dynamic List Box within Iteration does not auto--re-populate the list as well as after "reset all" History and Origins: SBW Dynamic List Box within Iteration does not auto--re-populate the list as well as after "reset all" Resolution: The Dynamic List Box control in SBW now auto-repopulates correctly. ======================================================== 4.1.6 -------------------------------------------------------- New Feature SBW Implementation of Selection Sets Does Not Give Modelers a Way to Distinguish Selected from Selectable Candidates Context and Motive for Implementation: The current SBW selection set implementation marks all the candidates in a selection set as selected when no candidates in the set have been selected. This design was chosen presumably to avoid filtering out candidates which might require a selection in a set for which the user has not yet made a selection. However, this approach makes it impossible for a model's active constraints to distinguish when a candidate has actually been selected versus when it is selectable. The problem is particularly bad when the selection set contains a single candidate or when the selection set allows multiple choices. Resolution: There is a new flag that can be used in the FRS file. If you want all items in a selection set to be initially unselected, add the following line to your FRS file. SSAllInitiallySelected = 0 The default value for this is 1, which is the current behavior, and causes all items in a selection set to be initially selected. -------------------------------------------------------- New Feature Option to not save configured system in quotesheet Context and Motive for Implementation: Configured systems take up the largest portion of space for a saved quotesheet. Customer would like an option to not save the configured system, and to regenerate it from the requirements when the quotesheet is reopened. Customer is aware that this has potential data migration pitfalls (if the productbase or formset changes, the resulting configuration may be quite different), but is still interested in having the option. Resolution: SBW now has an option to disable saving systems in quotesheets. To set the option add the following line in the sbw.ini file in the [Options] section. SaveSystemInQuoteSheet=0 The default value for this option is 1. This affects saving quotesheets to the database and to flat files. Note: By not saving out a system, you are relying on the saved requirements set to regenerate the system. If the form set or the product base has changed, the system that is generated may be different than the system that was initially generated for the quotesheet. -------------------------------------------------------- New Feature SBW Exploitation of Quantity Based Selection sets Context and Motive for Implementation: SBW needs to exploit the quantity based selection set support provided by the engine in the June '96 release. Resolution: Support for quantity based selection sets has been added to SBW. SBW now has a new control type dynamic table. See "Support for tables and list buttons to be dynamic using selection sets" for an explanation of how to add dynamic tables to a form set. The following is an example form set and product base which shows how to use dynamic tables. In the example there is a list box which contains cabinets (resource providers) and a table which contains various types of items (resource consumers). Initially when no cabinet is selected, no items are enabled. If you select a cabinet, then the model figures out how many of each item can now be selected. For instance if you select the cabinet which provides 100 units, then you can select between 0 and 5 of an item that consumes 20 units, and 0 to 3 of an item that consumes 30 units. The table enforces this range by providing a spin button for each entry. The quantity requested can be incremented or decremented using the up and down arrows, or you can type directly in it. After changing a quantity and leaving the cell, the table recalculates the minimum and maximum values and will update the ranges and enabled status for each entry. All tables will use the attributes sb_Max, sb_Min and sb_SelectionCount to denote the maximum and minimum quantities of an item that can be selected, and the amount selected. All of the attributes are floats though only integer values are valid. sb_Max must be defined or else the range will default to 0-0 and no selections will be possible. sb_SelectionCount is set by SBW to the quantity that is selected in the interface and can be set to another value by the model which will be reflected in the interface. ****************************** *** form set (infile.frs) *** ****************************** // Note: There are a few important flags which need to // be set in the FRS file in order to enable quantity // based selection sets. The two flags are // SSCapacityFiltering and SSProviderFiltering and both // need to be set to 1. FORMSETID @1 NEXTID @200 MODULE @2 mod0011a.mod SSExtraIterations = 10 SSMakeActiveSelected = 0 SSMakeInactiveUnselected = 1 SSSelectedInAllInstances = 0 SSCapacityFiltering = 1 SSProviderFiltering = 1 SSAllInitiallySelected = 0 ******************************* *** form set (module01.mod) *** ******************************* Form @8 frmBaseSystem "Base System" 0, 20, 645, 538 { ClassDynamicListBox @10 dlb1 "Cabinet" 0, 0, 235, 200 ClassDynamicTable @20 dlt1 "Items" 0, 0, 235, 200 } Initial All_in_one frmBaseSystem frmBaseSystem: dlb1 { FROM Cabinet DISPLAY description } frmBaseSystem: dlt1 { FROM Item DISPLAY description CUMULATIVE } ********************************* *** product base (infile.prs) *** ********************************* // // Quantity-based filtering example /////////////////// // Product Lines // /////////////////// productLine All_in_one "Example Productline"; // // Classes: // Cabinet - members provide resource Cabinet_Space // Item - members consume resource Cabinet_Space // // Attributes: // cabinetSpaceRequired - defines how much Cabinet_Space // required by an Item // sb_Max - computed number of a member of Item that can // be added recorded here // providerClass - class from which the resource allocator // gets providers // providers - list of providers, accumulated by the // resource allocator // providersIdentified - flag indicating that the resource // allocator has identified its resource providers // sb_Min - computed value for the minimum number of a // selected resource provider (Cabinet) recorded here // sb_SelectionCount - number of occurrences of a component // (Cabinet or Item) assumed in the configuration (set // by the application) Boolean providersIdentified; Float cabinetSpaceRequired; Float sb_Min; Float sb_Max; Float sb_Min; Float sb_SelectionCount; class Component { attributes: sb_SelectionCount = 0; sb_Min = 0; } class Cabinet : Container { attributes: sb_Max = 1; } class Item : Component { attributes: cabinetSpaceRequired; sb_Max = 0; } class System : Composite { } Component_Class providerClass; Multivalued Component_Instance providers; //------------------------------------------------------ // The abstract resource Space is defined, and allocator // constraints are applied to this abstract resource, in // order to specify allocator behavior for multiple // allocators. // Note: only one allocator is used in this example. //------------------------------------------------------ resource Space { attributes: providersIdentified = FALSE; providerClass; providers; } resource Cabinet_Space : Space { attributes: providerClass = Cabinet; } component cabinet100 : Cabinet { productLines: All_in_one; resource: Cabinet_Space 100; values: sb_Max = 1; description: "Super cabinet 100"; } component cabinet160 : Cabinet { productLines: All_in_one; resource: Cabinet_Space 160; values: sb_Max = 1; description: "Super-duper cabinet 160"; } component item30 : Item { productLines: All_in_one; values: cabinetSpaceRequired = 30; description: "Widget (30)"; } component item60 : Item { productLines: All_in_one; values: cabinetSpaceRequired = 60; description: "Gizmo (60)"; } component item90 : Item { productLines: All_in_one; values: cabinetSpaceRequired = 90; description: "Bracket (90)"; } component item120 : Item { productLines: All_in_one; values: cabinetSpaceRequired = 120; description: "Whizzo attachment (120)"; } component item20 : Item { productLines: All_in_one; values: cabinetSpaceRequired = 20; description: "Fly-wheel (20)"; } component item40 : Item { productLines: All_in_one; values: cabinetSpaceRequired = 40; description: "Whatzit (40)"; } component item80 : Item { productLines: All_in_one; values: cabinetSpaceRequired = 80; description: "Thinga-ma-bob (80)"; } component item100 : Item { productLines: All_in_one; values: cabinetSpaceRequired = 100; description: "Doo-hickey (100)"; } constraint active; constraint count; constraint selection; constraint installItem on Item { requiresContainer(Cabinet, Cabinet_Space( ?this.cabinetSpaceRequired * ?this.sb_SelectionCount, Consumed), ?cab); } constraint alwaysSucceed on Component { // The active constraint evaluation for Items will // always succeed. In this example, we assume that // the application will use the sb_Max // attribute to determine that the associated // candidate cannot be added // to the configuration (i.e., is effectively // inactive). Alternatively, // this active abstract constraint could // fail if sb_Max == 0, achieving // the same effect by making the candidate inactive. TRUE; } constraint countInitialization on Item { SETVALUE(?this.sb_Max, ?this.sb_SelectionCount); count(?this); ?this.sb_Max > 0; } constraint itemActive on Item { // Allocate required resources requiresComponent(Cabinet, Cabinet_Space(?this.cabinetSpaceRequired, Consumed), ?cab); // Update sb_Max, used by the interface to // display maximum number of // instances of this component that can be added // (i.e., upper bound of the range) SETVALUE(?this.sb_Max, ?this.sb_Max + 1); // Recurse count(?this); } constrain class Item with installItem; constrain class Item active with countInitialization; constrain class Item count with (itemActive OR alwaysSucceed); constrain class Item selection with installItem; // // SelectionSet resource pool allocator constraints // constraint findSpaceProviders on Space { NOT ?this.providersIdentified; // Get the next provider requiresComponent(?this.providerClass, ?provider, Existing); NOT MEMBER(?provider, ?this.providers); SETVALUE(?this.providers, ?this.providers + {?provider}); // Compute the maximum resource provided // by a single selection SETVALUE(?this.resourceQuantity, (?this.resourceQuantity < (?provider.(?this.resourceType).resourceQuantity) * ?provider.sb_SelectionCount) ? (?provider.(?this.resourceType).resourceQuantity * ?provider.sb_SelectionCount) : ?this.resourceQuantity); } constraint findSpaceProvidersTermination on Space { NOT ?this.providersIdentified; SETVALUE(?this.providersIdentified, TRUE); } constraint allocateSelectionRequest on Space { ?this.providersIdentified; // Is resource available? ?this.resourceAvailable >= ?this.resourceRequested; // Allocate the resource SETVALUE(?this.resourceConsumed, ?this.resourceConsumed + ?this.resourceRequested); SETVALUE(?this.resourceAllocationComplete, TRUE); } // // Cabinet filtering constraints // constraint filterCabinet on Cabinet_Space { // SelectionSet resource pool/allocator filtering // Cabinet selections. // These conditions are needed if the Cabinet // SelectionSet is non-cumulative, // since a single selection must provide the // requried resource. // Does the selected component provide // sufficient resource? (parent(?this, Cabinet).Cabinet_Space.resourceQuantity * parent(?this, Cabinet).sb_SelectionCount) >= (?this.resourceConsumed + ?this.resourceShared); // Compute the minimum selection count that // will satisfy the resource requirement SETVALUE(parent(?this, Cabinet).sb_MinSelectionCount, ceil((?this.resourceConsumed + ?this.resourceShared) / parent(?this, Cabinet).Cabinet_Space.resourceQuantity)); } ******************************************************** -------------------------------------------------------- Bug Fix SBW does not filter selection sets correctly on initial view of forms History and Origins: On start up and viewing the form set for a new system, the SBW does not filter the selection sets choices properly. All choices are sometimes present and show selected, even though they are not valid choices. If a user changes the selection, the set is filtered properly. The dynamic list box does not allow use to make an invalid choice however the it is confusing to see all choices and then they disappear if the user tries to select an invalid choice. Resolution: SBW did not properly filter selection sets when there were default selections. Now SBW waits until all dynamic controls have been set up and assigned default values before it performs it's first filter. This way the default selections cause filtering to take place. -------------------------------------------------------- New Feature Support for attribute initialization on components requested in a selectionSet Context and Motive for Implementation: Add support for using attribute initialization on components requested in a selection set. This feature should be added to FormBUILDER as well. Resolution: Attributes set by controls can now initialize components that are part of dynamic controls at the point when the control is changed instead of waiting until configuration time. In order to use this functionality the model and form set need the following: - A dynamic control which is initialized by an attribute list. - A control which initializes an attribute on that attribute list. - A model which defines an active constraint which uses the attribute that was initialized. In the following example, a set of radio buttons control the enabled status of the items in a dynamic list box. The radio buttons initialize the attribute fRequestedType on the list alBoxes. This list in turn initializes the dynamic list box frmBoxes: dlbBoxes. In the model, the class Box has an active constraint which checks the attribute fRequestedType against fType, another attribute defined on the class Box. The end effect on the form set is: - If item 1 is selected all items are enabled. - If item 2 is selected only items 2 and 3 are enabled. - If item 3 is selected only item 3 is enabled. ********************************* *** product base (infile.prs) *** ********************************* String sColor; Float fType; Float fRequestedType; Float sb_DefaultRequestPriority; Float sb_DefaultRequestQuantity; class Component { attributes: sb_DefaultRequestPriority = -1; sb_DefaultRequestQuantity; } class Box : Component { attributes: sColor; fType; fRequestedType; } productLine plBox "Boxes"; component box0001 : Box { productLines: plBox; values: fType = 1; description: "Box 0001-" + ?this.sColor; } component box0002 : Box { productLines: plBox; values: fType = 2; description: "Box 0002-" + ?this.sColor; } component box0003 : Box { productLines: plBox; values: fType = 3; description: "Box 0003-" + ?this.sColor; } constraint active; constraint activeBox on Box doLookAhead : TRUE; { ?this.fType >= ?this.fRequestedType; } constrain class Box active with activeBox; ***************************** *** form set (infile.frs) *** ***************************** FORMSETID @1 NEXTID @22 MODULE @2 module01.frm SSExtraIterations = 10 SSMakeActiveSelected = 0 SSMakeInactiveUnselected = 1 SSSelectedInAllInstances = 0 SSCapacityFiltering = 0 SSProviderFiltering = 0 ******************************** *** form file (module01.frm) *** ******************************** Form @3 frmBoxes "Boxes" 0, 20, 544, 327 { ClassDynamicListBox @4 dlbBoxes "Boxes" 300, 30, 193, 224 ListButton @5 lbColor "Color" 35, 45, 230, 100 StaticField @6 StaticField_1 "Color" 35, 20, 230, 25 RadioButton @10 rbType1 "Type 1" 35, 100, 141, 29 0 RadioButton @11 rbType2 "Type 2" 35, 150, 141, 29 0 RadioButton @12 rbType3 "Type 3" 35, 195, 141, 29 0 ATTRIBUTELIST alBoxes } Initial plBox frmBoxes frmBoxes: dlbBoxes { FROM Box DISPLAY description ORDER BY description INITIALIZEDBY alBoxes } frmBoxes: lbColor { @17 "Red" DEFAULT {INITIALIZES alBoxes sColor "Red" } @18 "Blue" {INITIALIZES alBoxes sColor "Blue" } @19 "Green" {INITIALIZES alBoxes sColor "Green" } } frmBoxes: rbType1 @20 { INITIALIZES alBoxes fRequestedType "1" } frmBoxes: rbType2 @21 DEFAULT { INITIALIZES alBoxes fRequestedType "2" } frmBoxes: rbType3 @22 { INITIALIZES alBoxes fRequestedType "3" } ******************************************************** ======================================================== 4.1.5 -------------------------------------------------------- New Feature Ability to run with uncompiled PB/forms files Context and Motive for Implementation: For customers who are using SBW exclusively, it would be helpful to model development efforts to be able to run SBW against uncompiled productBase and form set files (as is possible in PSB). Having to recompile each time they make a change to the model can eat up a big chunk of a developers time. It might be necessary to disable some functionality (such as saving quotesheets), as is the case in PSB when running against source files. Resolution: SBW can now load uncompiled product bases and form sets. To access these features use the following command line options: -frmlf Load an uncompiled form set. SBW will look for the file infile.frs in the model directory. Any modules specified in infile.frs must be qualified with a path or reside in the SBW application directory or SBW will not be able to load them. -pbli Load an uncompiled product base. SBW will look for the file infile.prs in the model directory. -pblf Load an uncompiled product base. SBW will look for the file infile.prb in the model directory. This file should contain the name of 1 or more CML files. The name of these files should either be fully qualified with a path or reside in the same directory as infile.prb. Note: This is intended as a feature to be used only for development. This should NOT be used as a deployment solution for the following reasons: 1) it is not as memory efficient as loading compiled product bases and form sets, 2) it is not fully DBCS compliant, 3) various features are not available when running in this mode (eg. client server). -------------------------------------------------------- Bug Fix SBW commandline (except -lq) is not double-byte enabled History and Origins: The code for command line parsing is not DB-enabled. Resolution: SBW now has the following commandline options: -NLS_LQ - Loads the quotesheet with the description set in the [Options] NLS_LoadQuoteSheetDesc ini file setting. -NLS_U - Uses the user name set in the [Options] NLS_User ini file setting. -NLS_P - Assumes the rest of the commandline is the password. -NLS_D - Sets the model directory to the directory set in the [Options] NLS_ModelDir ini file setting. -NLS_SD -Sets the server model directory to the directory set in the [Options] NLS_HostModelDir ini file setting. The old ones work as before with the following changes: -lq is now -LQ for consistency All options can now be quoted strings to allow for spaces. -------------------------------------------------------- New Feature Simplify SBW Attach Table Installation Context and Motive for Implementation: The existing installation process is too complicated. You need to edit several macros if your host is not sbw and your login is not trilogy/trilogy1. It also requires Microsoft Access which is a pretty significant prerequisite. Resolution: The attach table process works like this: 1. You specify the data source name for your host database in the [Database] DataSourceName ini file setting. 2. Upon running SBW for the first time, if you have set the [Database] ResetAttachTables = 1, SBW will attempt to attach each of its tables to the specified datasource using your login and password. It will prompt you if it is about to delete a local table so you don't accidentally lose your data. 3. If the attach process completes successfully, SBW sets ResetAttachTables = 0 so the process is not repeated. ======================================================== 4.1.4 -------------------------------------------------------- New Feature Permit configured systems to be exported from SBW Context and Motive for Implementation: Permit configured systems to be exported from SBW menu. Add a "Current System" option to the "File|Export" menu. When selected, user is presented with Save Dialog with which current system can be saved to a file. As many customers will not want to expose such functionality, this feature should only be enabled when a preference (AllowSystemExport in [Options]) is set to a non zero value (with the default value set to 0). Resolution: The feature has been implemented as suggested. -------------------------------------------------------- New Feature Command-line option to load QuoteSheet Context and Motive for Implementation: A "load quotesheet" command-line option is needed. Resolution: The loadQuoteSheet command-line option (-lq) works as follows: If -lq is specified on the command line, SBW looks in the sbw.ini file for the QuoteSheet description under the [Options] LoadQuoteSheetDesc setting.This is done so that QuoteSheet descriptions that contain double-byte characters can be parsed and loaded properly. ======================================================== 4.1.3 -------------------------------------------------------- New Feature Support for tables and list buttons to be dynamic using selection sets Context and Motive for Implementation: Add support for tables and list buttons to be dynamic using selection sets. Resolution: SBW now supports dynamic list buttons and dynamic tables. To add a dynamic list button, in the form definition you need to add the following line. ClassDynamicListButton The control definition of ClassDynamicListButton is similar to that of a ClassDynamicListBox. It can handle all of the same elements except for the HIDEDISABLED flag. For dynamic list buttons, this flag is always set meaning that you never see disabled items in the list button. The definition syntax is: : [ ()] [MANDATORY] { FROM [WHERE ""] [DISPLAY ] [WITH DEFAULT] [INITIALIZEDBY ] } See the definition of ClassDynamicListBox for a description of the various fields. To add a dynamic table, in the form definition you need to add the following line: ClassDynamicTable The control definition of the dynamic table is identical to the dynamic list box. In addition, dynamic tables can support range checking by using the model to define minimum and maximum quantities. See the issue on Quantity-based filtering in selection sets and SBW Exploitation of Quantity Based Selection sets for a more thorough description of how to define a model to take advantage of dynamic tables. ======================================================== 4.1.1 -------------------------------------------------------- Release Note New Customer Browser functionality The customer browser in SBW now contains the same functionality as the quotesheet browser. The customer browser is user-customizable in the following ways: (1) Any of the customer fields can be added, deleted and resized. Click the "Change View" button to bring up a dialog to add or delete fields from the browser. The size of columns in the spreadsheet can be changed by dragging the border of the column header (similar to other spreadsheets). (2) The size and location of the browser window can be changed. (3) Searching and sorting can be keyed by any field displayed in the spreadsheet. Fields to search and sort on are selected from a drop-down list. Changes made by the user to the browser are maintained across SBW sessions. The initial customer find functionality remains the same as before. -------------------------------------------------------- Bug Fix Iterations Not Correctly Restored when Importing a Saved Request File History and Origins: If a request file (.req) is saved to record the requirements for a configuration and then reloaded and reconfigured, the new configuration has a quoted price that is significantly higher than the quoted price for the original configuration. Resolution: Default values from tables, list boxes, and list buttons from forms with default product lines, were getting incorrectly added to iterations when loading a request file. Iterations were not being properly restored, and default requests were being added to the iterations, incorrectly resulting in additional components in the configuration, which caused the quoted price increase. ======================================================== 4.0.5 -------------------------------------------------------- Bug Fix Not all of a large selection set is displayed in a dynamic listbox History and Origins: For a selection set with a large number of items (100-200, depending on the length of the descriptions), not all of the items are displayed in the dynamic listbox. Resolution: All items in a selection set now display properly in ClassDynamicListBoxes. -------------------------------------------------------- Bug Fix Assertion Failure with empty Dynamic List Boxes History and Origins: If a dynamic list box control query returns an empty list, this results in an assertion failed error and crashes SBW. Resolution: ClassDynamicListBoxes now properly handle the case of an empty selection set (by displaying nothing in the listbox). ======================================================== 4.0.4 -------------------------------------------------------- Bug Fix Crash if quotesheet is minimized with Configurations tab displayed History and Origins: Customer has several custom reports created in sbreport.dll and available in the Report menu choice. If a report is opened and then closed from the Configurations tab, then the Config window is resized and truncated (cannot see scale listbutton and 3D checkbox at bottom right). If the user minimizes the quotesheet, then SBW generates the error message "Invalid Propery Value" and exits. Resolution: SBW would crash if the quotesheet was minimized while the Configurations tab was displayed. This had nothing to do with reports per se. The problem has been fixed. -------------------------------------------------------- Bug Fix Values for Address3 and Zip are switched when added to QuoteSheet Browser History and Origins: If you add the Address3 and Zip fields to the Quote Browser in SBW, then the Address3 value will appear under the Zip field and the Zip value will appear under the Address3 field. This happens in SBW 2.0.7 and in the GA release. Resolution: Address3 and Zip now display properly in the QuoteSheet Browser. ------------------------------------------------------------ Release Notes 4.0.0 ------------------------------------------------------------ Note Known Limitations in 4.0 Resolution: When running in client/server mode (engine running on a server), a. OS/2 server is sensitive to buffer sizes when transfferring files between client and server. The APIs sb_GetFileBug and sb_PutFileBuf take as an argument a maximum buffer size. For some values of buffer size, these operations succeed, for others, they fail with an invalid bound RPC error. These operations are invoked when a quotesheet is saved/loaded. b. Some SBW operations are slow when running in client/server mode. They are: browsing the productline tree, expanding product categories in the Parts Library, and viewing Additional Components or the Failed Requests lists when on the configurations tab. c. When performing client side tracing (e.g. sbHost=:trace), viewing a system diagram can cause a crash. ------------------------------------------------------------ Note Floating point error in BC30RTL.DLL on Windows 95 Resolution: Some users have reported encountering the error: Floating point error: Square root of negative number in BC30RTL.DLL while running Portable SalesBUILDER or SalesBUILDER for Windows on Windows 95, on particular machines. The most common situation in which this has been reported is loading a ProductBase, but it has also been reported in connection with compiling forms and navigating forms. This problem has been very difficult to reproduce and isolate. As a result, no reliable workaround has been discovered. Trilogy encourages customers to report incidents of this problem (even though it is already known), to help us track down the cause. In one case, the problem was correlated with running "System Agent" in the background; however, this program was not even present in other cases. ------------------------------------------------------------ Note Using SBW/QB with Attached Tables Resolution: To connect to Oracle using attatched table you need to: ODBCDIR = \\roadrunner\app\pcinstal\odbc\oracle 0. Install SBW or SBW/QB 1. Install Sqlnet. 2. Install ODBC driver for Oracle. 3. Create a Datasource named SBW if you don't have Microsoft Access. 4. Modify sbw.ini 1. Installing Sqlnet. a. Goto the Oracle Installation Directory b. run ORAINST.EXE c. Install the following products; 1. SQL*NET TCP/IP 1.1.7.10.4 2. SQL*Plus 3.1.2.2.6 d. Check connectivity by using sqlplus: e.g. plus31 user/password@T:149.74.255.255:machine e. If you get an error message with a number you will need to either login to a machine which has Oracle error messages onlie or get the Error codes manual. f. Useful locations: C:\ORAWIN is the default installation dir. WINDIR\ORACLE.INI is where the oracle ini file is, 2. Installing the ODBC driver for Oracle. a. Got to Oracle ODBC install dir b. Run SETUP.EXE c. Follow instructions to set up the ODBC driver. 3. Creating a datasource named SBW. a. Run the ODBC manager: ODBCADM.EXE b. Add Driver oracle7. 4. Modifying SBW.INI a. In SBW.INI change the DatabaseName ini setting in the Database Section to SBDBAC20.MDB b. The login should exist in the sb_salespersons table in Oracle. How to get error messages: e.g. telnet machine user: oracle password: oracle type: oerr errnum and follow instructions to correct the error E.g. if you get the error 1056 Type: oerr ORA 1056 c. Connect string is t:149.74.255.255:machine (where machine is the correct machine name and the IP address is the IP address of the Oracle server). ------------------------------------------------------------ New Feature Configure Menu Item Context or Motive for Implementation: A menu item is desired that will perform the configure command. This item will provide an easily-accessible, consistent place for configuration to be triggered, rather than finding a Configure button in the form set. Resolution: While the Requirements Tab is active, there is a System menu which contains a Configure menu item. ------------------------------------------------------------ Release Notes 2.1.13 ------------------------------------------------------------ Bug Fix MANDATORY Enabled when Control is Disabled History and Origins: A control on a form has been denoted as Mandatory. If the control is disabled by another control using Control Modifications, the error message appears at run-time stating that the user must select an entry from the Mandatory control. Resolution: All actions on disabled controls are ignored, including MANDATORY and requests. ------------------------------------------------------------ Release Notes 2.1.12 ------------------------------------------------------------ New Feature Version Checking Enabled by Default Context or Motive for Implementation: To help protect users from possible DLL and VBX conflicts, SalesBUILDER for Windows should have version checking turned on by default in the SBW.INI. Resolution: By default, previous releases of SBW did not perfom version checks on dependent modules (DLLs and VBXs) when the SBW.INI setting VersionInfoFile in the [Options] section was unset. (If VersionInfoFile was set to a filename, then the results of the module check were written to that filename.) Starting with this release, SalesBUILDER for Windows will always check for the existence and the required version of all its dependent modules by default. If the VersionInfoFile setting is set to a filename, then the results will be logged, otherwise no results will be saved. For some critical modules (the engine DLL, for example) error dialogs will be used to report the attempt to load modules whose version numbers do not match those expected by the application. The user will be encouraged, but not required, to exit SalesBUILDER for Windows at this point. ------------------------------------------------------------ Release Notes 2.1.11 ------------------------------------------------------------ Bug Fix Failure in Attached Table Operation Causes Crash History and Origins: SalesBUILDER for Windows crashes after displaying an ODBC error dialog. The error is caused by a save failure in an attached table. This problem can occur if the database server runs out of disk space. Resolution: Most database operations now have primitive error handling, however the database may still be corrupted if an error occurs in the middle of an operation. SalesBUILDER for Windows now handles those errors gracefully, however data corruption may still occur if a database operation fails on any database, including the attached tables. ------------------------------------------------------------ Bug Fix Show Requirements Summary Option Not Working History and Origins: The ShowRequirements option available either through the SBW.INI or via the View | Options, Display tab Show Requirements Summary by Default does not work. The application behaves the same with the option checked or not checked. Desired behavior is when option is checked, the Road Map is display with system requirements. Resolution: When the ShowSummary option is set, the Requirements Summary window is shown the first time the user goes to the Requirements tab. ------------------------------------------------------------ Bug Fix Changing User ID or Password in Client/Server Mode Modifies Incorrect Database History and Origins: If the user ID or password is changed on the options menu while running client/server mode, only the local database will change. The net result is that you cannot log in to SalesBUILDER for Windows without either A) editing your SBDB.MDB directly with Microsoft Access to change the user ID and password field to match a valid account on the server or B) reinstalling SalesBUILDER for Windows. Local userid/password checking should be disabled when running client/server mode or the ability to modify the user ID and password should be disabled. Resolution: When SBW is running in client/server mode, it no longer logs into the local database. The user ID and password are only used for the connection to the server. The preference dialog for users has also been changed to disable editing of the user ID and password when running in client/server mode because it had no effect on the server. ------------------------------------------------------------ Release Notes 2.1.10 ------------------------------------------------------------ Note New System Diagram DLL (SBDIAG.DLL) Resolution: The System Diagram DLL (SBDIAG.DLL) has been integrated into SBW. For the most part, the display of a system diagram should not look any different than prior to this integration--the responsibility for the display has just been shifted from SBW.EXE to SBDIAG.DLL. The differences fall into 5 cateories: (1) Configuration Tab layout differences, (2) Level of interactivity, (3) the Parts Library, (4) the popup system diagram menu, and (5) some new SBW.INI settings. 1. Configuration Tab layout. The tab is divided into 3 layers: on top are the system icons, in the middle is the drawing area, and along the bottom is the system diagram status bar. The status bar contents track the mouse as it moves over the diagram. The leftmost four fields summarize the properties of the component instance currently under the cursor. The presence of the characters "D", "R", "M", and "A" signify that the instance is deleteable, replaceable, movable, and can be added to (as determined by the value of the sb_Interactive component attribute). The large field just to the right of these fields displays the current component instance's description. On the far right of the status bar are two fields which permit the display to be altered: a checkbox that toggles the 3D view and a listbox that permits zooming. The old panel that displayed the location of the "selected instance", the Additional Parts and Failed Requests list boxes, the 3D checkbox and the Zoom listbox has been removed. The instance information can be retrieved by first selecting an instance and then right clicking to bring up the system diagram popup menu and selecting the "Show Selected Item Details" menu item. The window that comes up is a floating window that will stay up until you close it (it becomes invisible if you change tabs but will reappear when you return). While open, it will change contents when the selected instance changes. The Additional Parts and Failed Requests data are also accessible from the system diagram popup menu (via the Show Additional Parts and Show Failed Requests menu items). 2. Level of interactivity. As menitioned above, the status bar contents tracks the mouse as it moves over the diagram. Additionally, items can be deleted, cut, copied, and pasted into the diagram by selecting an instance (left click) and then performing the desired operation via the system diagram popup menu (right click). Items cut or copied are automatically placed into the Windows clipboard. If the selected instance has dependent parts in the diagram they will be highlighted as well. If you left click and hold the mouse down for a couple of seconds on a movable item, the diagram will calculate and highlight the locations to which it could be dragged and dropped (its "Valid Destinations"). 3. Parts Library. The parts library is another floating window that can be brought up via the system diagram popup menu (right click) (Show Parts Library). The parts library is a categorized listing of parts that may be added to the current system. The contents of the parts library (both the categories and the parts) are determined by the model. The categories are components of the class PartsLibClass and the topmost categories are components of its subclass, PartsLibRootClass. If the class PartsLibRootClass does not exist in the model, then the parts library will not be shown. Subcategories are determined by the PartsLibTreeChildren attribute of the category. The parts themselves are determined by the PartsLibEquivClass attribute. This attribute should be set to the existing model class from which you wish to populate the parts library category ("Hardware" and "Software" in the example below). The current system's product line is used as a further filter on the parts listed. Listed parts may be dragged from the parts library onto the system diagram. // These definitions set up the Parts Library hierarchy // and are necessary for any models using the Parts Library Multivalued Component PartsLibTreeChildren; String PartsLibEquivClass; String PartsLibName; Boolean Presentable; class PartsLibSpec : Component { attributes: Presentable = FALSE; } class PartsLibClass : PartsLibSpec { attributes: PartsLibTreeChildren; PartsLibEquivClass; PartsLibName; } class PartsLibRootClass : PartsLibClass { } // Following is an example Parts Library hierarchy component PL_HW : PartsLibRootClass { values: PartsLibEquivClass = "Hardware"; PartsLibName = "The Metal"; } component PL_SW : PartsLibRootClass { values: PartsLibEquivClass = "Software"; PartsLibName = "The GUI Stuff"; } 4. System Diagram Popup Menu. Right clicking on the drawing area of the configurations tab will bring up a short menu of system diagram operations, most of which have been mentioned above. Additionally, a floating "Legend" can be displayed that details what the highlighting colors and the single character status bar codes mean. 5. New SBW.INI settings. In addition to the existing ini settings TopLevelComponentPerPage and SystemDiagramFont, there are seven new settings that can be used to change the look of the diagram. All of the system diagram ini settings are explained below. // TopLevelComponentPerPage=0, [Company Preference] // If =1 then each top level component // in the system diagram is printed on a separate page. TopLevelComponentPerPage=0 // SystemDiagramFont=, [Company Preference]. // If =, then will // be used to display the labels on the system // diagram drawing. If unset, then // the font "Arial" will be used. SystemDiagramFont=Arial // SystemDiagramFontSize=12, [Company Preference]. // If =, then will be // the max font size used to display the labels // on the system diagram drawing. If unset, // then 16 will be the max size. SystemDiagramFontSize=12 // SystemDiagram3D=1, [User Preference] // If =0, then no shading is provided // when displaying or printing the System // Diagram. This setting can be toggled // during the use of SBW. SystemDiagram3D=1 // SystemDiagram...Color=Red Green Blue, [Company Preference] // Determines the colors used when // interacting with the System Diagram. // Each of the color values must be between 0 and 255. SystemDiagramSelectColor=128 255 255 SystemDiagramHighlightAddColor=255 255 128 SystemDiagramHighlightReplaceColor=255 128 255 SystemDiagramDependentColor=128 128 255 SystemDiagramDestinationColor=255 128 0 ------------------------------------------------------------ Note Changes to System Diagram Model Attributes Resolution: The interactive system diagram DLL (SBDIAG.DLL) uses the CML attributes sb_ReplacementClasses and sb_PossibleReplacements differently from the old system diagram. Previously, the system diagram would look at these attributes on the drop target and compare their values to the type of the component being dropped. Now the system diagram looks at these attributes on the component being dropped and compares their values to the type of the component being dropped on. This behavior creates consistency among the attributes sb_ReplacementClasses, sb_ReplacementComponents (successor to sb_PossibleReplacements), sb_ContainerClasses, and sb_ContainerComponents. NOTE: This is a backwardly incompatible change and any models which used the sb_ReplacementClasses or sb_PossibleReplacements attributes should be examined for necessary changes; however, in the majority of cases, no changes need to be made because the set of replacements and replacees are equivalent. ------------------------------------------------------------ New Feature Ability to Disable Component Information in System Diagram Context or Motive for Implementation: The Component Info panel of the Configurations tab contains information that a customer does not want their users to see. They would like to be able to permanently disable this panel via SBW.INI. Resolution: SalesBUILDER for Windows maintains a preference that allows the functionality of the system diagram to be disabled. When the AllowInteractiveMode preference in the [Configurations] section of the SBW.INI is set to 0, all mouse movements and mouse clicks over the system diagram drawing are ignored. The effect of this is that no component instance information is displayed on the status bar, no instance may be selected (via left-clicking), and the system diagram popup menu (normally brought up by a right-click) is disabled. Note that disabling this menu disables all interactive operations on the diagram. This same preference, AllowInteractiveMode, used to control the interactive mode window, which no longer exists. The default value for this preference is 1 (note that it used to be 0). ------------------------------------------------------------ Bug Fix Product Descriptions Truncated in Quote Export History and Origins: If the product description extends beyond the width of the quote description column, exporting that quote truncates the product description (at the same point). Resolution: SalesBUILDER for Windows now supports the maximum length product descriptions (250 characters) and model numbers that the PCM supports (or 256) whichever is smaller. ------------------------------------------------------------ Bug Fix Lack of Bundling Files Prevents Bundling with Model Bundler History and Origins: If SalesBUILDER for Windows is used with a model that uses the Model Bundler instead of the PCM Bundler and consequently no bundling files are present, it is unable to recognize that no such files are needed and prevents bundling without them. Resolution: When running against the Model Bundler and no bundling files are present, SBW will create an empty PCM to be used when bundling. ------------------------------------------------------------ New Feature Starting SalesBUILDER for Windows a Second Time Context or Motive for Implementation: When attempting to start a second copy of the application on a single machine, focus should be brought to the already running incarnation of the application. This will simplify the situation for novice users. Resolution: If SalesBUILDER for Windows is launched while another copy is already loaded, focus will be brought to the original copy of SalesBUILDER for Windows. ------------------------------------------------------------ Release Notes 2.1.7 ------------------------------------------------------------ Bug Fix Problems with 256-color Bitmaps on Toolbar and Roadmap History and Origins: Bitmaps on buttons change colors and sometimes flash different colors in 256-color mode. The color changing happens at various times, including switching active application focus away from SalesBUILDER for Windows and then back again. The problem does not manifest itself in 16-color mode. In addition, clicking on the toolbar "star" in the Requirements Tab before a system is selected causes a crash in VGA and SVGA modes, but not with a particular third-party video driver. Resolution: SalesBUILDER for Windows now uses 16-color bitmaps on the toolbar and the roadmap instead of 256-color bitmaps. ------------------------------------------------------------ Bug Fix Missing IDs for Top-Level Browser Items no Longer Reported History and Origins: The IDREPORT.TXT produced by SBCMPFRM.EXE reports any IDs created by the compiler which were not specified in the form set source. This informs modelers who are manually maintaining form sets (i.e., not with FormBUILDER) whether they missed any locations where IDs should have been included. The report includes a message for every browser, indicating that an ID was created for the top-level browser item. Such ID's are indeed created during compilation, although they are not currently used by the runtime application; however, it is not possible in the FML syntax to specify an ID for a top-level browser item. Therefore, this message is misleading to modelers, since there is no way they can change the source to remedy the situation. The immediate way to fix this is to suppress that message. If there is some possibility that the top-level browser item ID might be used by applications in the future, then the FML syntax should be changed to allow it to specified explicitly. Resolution: Since it is not possible to specify the ID for a top level browser entry, the ID report no longer generates a warning about the ID missing for a top level browser entry. ------------------------------------------------------------ New Feature ID Report Lists Actual IDs Context or Motive for Implementation: It would be helpful if the Form Compiler's ID report listed the actual IDs created by the compiler, so that the modeler could easily cut and paste them back into the source. At the very least, a summary at the end of the report indicating "XX new IDs generated" would save the modeler from having to count lines to figure out how much to bump up NEXTID. (In a large formset, there can be many missing ID's.) Resolution: The ID report format has changed to include the IDs that are generated. Old format: module01.frm (157): Item: Form Context: frmSomeForm New format: module01.frm (157): Item: Form ID: 935 Context: frmSomeForm ------------------------------------------------------------ Release Notes 2.1.6 ------------------------------------------------------------ Bug Fix Export Requirements Report Empty Without Roadmap Loaded History and Origins: If selections are made without the Roadmap loaded, Export Requirements Report generates a zero-byte file. A side-effect of this bug is that future attempts to bring up the Roadmap result in a blank Roadmap. Resolution: The bug has been fixed and the Roadmap no longer affects the requirements report. ------------------------------------------------------------ Bug Fix Hourglass Needed When Expanding Parts Library List Items History and Origins: Expanding the Parts Library list can take some time, therefore the hourglass cursor should be used to indicate that some activity is occurring. Resolution: The hourglass cursor is displayed when a Parts Library item is expanded or collapsed. ------------------------------------------------------------ Bug Fix Need More Space Between Quantity and Description in Requirements Summary History and Origins: When an item description begins with a number (such as "500MB SCSI drive"), it is difficult to distinguish where the quantity stops and the description begins. More space between them would make the distinction clearer. Resolution: In the Requirements Summary, quantities and descriptions are now separated by three spaces instead of one to make it more apparent that the quantity is not part of the description. ------------------------------------------------------------ New Feature Forms Road Map to Improve Navigational Workflow Context or Motive for Implementation: A Road Map will provide a guide to the structure of a Form Set and eases movement between those forms. Resolution: The Road Map is a new feature to help improve the navigation through a requirements session. It groups forms in logical topics, tracks what part of the map has been visited and what parts are required. It also allows the user to navigate easily through the requirements session and create new request groups (iterations). The Road Map is located on the same palette as the requirements summary. If the road map is active then it will show up as an additional tab on the Requirements Summary palette. In order to use this new functionality, you need to do the following: 1) set the SBW.INI setting [Requirements] ShowRoadMap=1 2) add the Road Map definition to your model. The road map definition contains two types of classes: categories and iterations. All categories are components derived from the class SB_Category. A category can have zero or one form and can have zero to many subcategories. All iterations are derived from the class SB_Iterator. In order to define a road map you need the following attributes defined in your model: // forward declaration class SB_Category: Component; // SB_Required defines whether the category is required or not Boolean SB_Required; // SB_SubCategories contains a list of subcategories. This can be null. Multivalued SB_Category SB_SubCategories; // SB_Form names the form in the form set that the // user will go to when they navigate to this node. String SB_Form; // SB_CreationControl is defined on the class SB_Iterator // and is used to name the control in the form set // that starts this iteration. This is a required field. String SB_CreationControl; // SB_CreationForm is defined on the class SB_Iterator // and is used to name the form in the form set that // owns the creation control. This is a required field. String SB_CreationForm; // SB_GroupName is defined on the class SB_Iterator // and is used to name the group in the form set that // will be started from this node. This group must // correspond to an iteration name in the form set. // This is a required field. Then you must define the following classes in your model: class SB_Category: Component { attributes: SB_Required = FALSE; SB_SubCategories; SB_Form; } class SB_Iterator: SB_Category { attributes: SB_CreationControl; SB_CreationForm; SB_GroupName; } Then you must define a heirarchy of components derived from SB_Category and SB_Iterator. The root of the heirarchy has to be named SB_Cat_Root, without this component the road map will not show up. Note: the hierarchy is defined in the order from root to children. In order to use this in a model, the order has to be reversed or the children have to be forward declared. The example hierarchy below is for a portion of a fictional library. component SB_Cat_Root : SB_Category { productLines: // The product line specification can be used // to filter the categories. Only categories // that belong to the product line that is // being configured are available. plAll; values: // navigating to this form (double clicking // on this node) will go to the form frmInitialAll. SB_Form = "frmInitialAll"; // This category has two subcategories // Mysteries and Science Fiction. SB_SubCategories = { SB_Cat_Mysteries, SB_It_ScienceFiction }; description: // The description is used as this node's // description in the Road Map. "Book Store"; } component SB_Cat_Mysteries : SB_Category { productLines: plAll; values: // No definition of SB_Form so this // is an abstract category. SB_SubCategories = { SB_Cat_AgathaChristie, SB_Cat_ACDoyle }; description: "Mysteries"; } component SB_Cat_AgathaChristie : SB_Category { productLines: plAll; values: SB_Form = "frmAgathaChristie"; SB_Required = TRUE; description: "Agatha Christie Mysteries"; } component SB_Cat_ACDoyle : SB_Category { productLines: plAll; values: SB_Form = "frmACDoyle"; description: "Sherlock Holmes"; } component SB_Cat_ScienceFiction : SB_Iterator { productLines: plAll; values: SB_CreationControl = "btnSciFi"; SB_CreationForm = "frmSciFi"; SB_Form = "frmInitialAll"; SB_GroupName = "Science Fiction"; SB_SubCategories = { SB_Cat_StarTrek; SB_Cat_HHGTTG; }; description: "Sci Fi"; } component SB_Cat_StarTrek : SB_Category { productLines: plAll; values: SB_Form = "frmStarTrek"; description: "Start Trek Books"; } component SB_Cat_HHGTTG : SB_Category { productLines: plAll; values: SB_Form = "frmHHGTTG"; SB_Required = TRUE; description: "Hitch Hiker's Guide to the Galaxy" } ------------------------------------------------------------ Release Notes 2.1.5 ------------------------------------------------------------ Bug Fix Some Execution Paths Leave DynaSets Open History and Origins: Several database functions contain execution paths that could result in opened DynaSets remaining open. Resolution: The database functions have been corrected. ------------------------------------------------------------ Bug Fix "Invalid Use of Null" Error on Loading QuoteSheet History and Origins: A particular QuoteSheet has a valid country but a null currency. If both sCountry and sCurrency are NULL, SalesBUILDER for Windows assumes it is an old quotesheet and set sCountry=United States and sCurrency=$. SalesBUILDER for Windows failed to take into account that one of these values could be NULL. Resolution: If a QuoteSheet is loaded that contains a NULL country setting, "United States" will be assumed. If the QuoteSheet contains a NULL currency setting, then "$" will be assumed. ------------------------------------------------------------ Release Notes 2.1.4 ------------------------------------------------------------ Bug Fix SBREQENU.DLL or SBWENU.DLL Failed to Load History and Origins: Some users receive an error message that SalesBUILDER for Windows was unable to load SBREQENU.DLL, when saving a quotesheet. This can cause a crash, corrupting the SalesBUILDER for Windows database. Other users receive an error message that SalesBUILDER for Windows was unable to load SBWENU.DLL on startup. They are therefore unable to run the application unless they restart Windows. Resolution: There were two problems that could lead to this behavior: 1) The module name was different from the filename of the DLL, causing it not to be recognized by the application. This has been fixed. 2) The application could fail to recognize certain valid module handles passed to it by the operating system, so it wouldn't realize the module was loaded; these handles are now recognized as valid. ------------------------------------------------------------ Release Notes 2.1.2 ------------------------------------------------------------ New Feature SelectionSet Hierarchical Support on Iterative Forms Context or Motive for Implementation: A hierarchy of selection sets is desired where selections in a "parent" group of selection sets affects "child" groups, whereas "sibling" groups of selection sets do not. An example usage of hierarchical selection sets is an iterative form containing two dynamic controls: a selection set list of printers and a list of printer features which are constrained by the printer selection, which is further constrained by the processor selection on a non-iterative form. The processor selection should control the list of printers on the iterative forms, however the printer selection should only affect the printer feature list on the individual iterative form. Resolution: Dynamic list boxes in forms associated with iterations are now independent and replicated per iteration. The dynamic list box control specification is the same, and no additional information need be specified if the control appears in an iterative form. Given the following characteristics of dynamic list boxes and iterations: - dynamic list boxes are implemented via configuration engine SelectionSets, - SelectionSets are associated with a Class defined in the ProductBase (model), - only one SelectionSet for a Class is considered when filtering a particular SelectionSet candidate, and - multiple instances of an iteration generate multiple SelectionSets for a specific Class, additional semantics for filtering and identifying a SelectionSet during filtering have been added to accomodate dynamic list boxes in iterative forms. Iterative forms use the RequestGroup facility of the configuration engine. RequestGroups mirror, in the configuration engine request queue, the hierarchical structure of iterations created in the interface. Consequently, a dynamic list box is associated with a particular iteration (possibly the top level) and its associated SelectionSet is associated with the corresponding RequestGroup. During filtering, when a candidate of a particular SelectionSet (call this the source SelectionSet) is searching for a SelectionSet of a particular Class (call this the target SelectionSet), the current RequestGroup (iteration) is examined for the target SelectionSet. If found, this SelectionSet is used. If not found, the search proceeds up the RequestGroup hierarchy until the target SelectionSet is located or until no parent RequestGroup exists. If the target SelectionSet is not found in the RequestGroup hierarchy, SelectionSet filtering assumes that no such SelectionSet is defined, and normal engine search ensues. In addition to identifying the target SelectionSet, the semantics of adding selected candidates to %allInstances have been modified as well. When selected candidates are added to %allInstances during filtering, all selected candidates of the current iteration (RequestGroup) and all selected candidates of all ancestor iterations (RequestGroups) are added. Given that constraint evaluation during filtering selections in a dynamic control of an iteration cannot observe selections in a sibling iteration, conditions involving capacity required by selections across sibling iterations should be solved by requesting resource from a selection in a parent iteration. The quantity-based SelectionSet functionality will be available in SelectionSets created by iterations, thereby providing a means for addressing this capacity filtering requirement. ------------------------------------------------------------ New Feature Create New Customer Record and Associate with Quotesheet on Save Context or Motive for Implementation: A customer desires the ability to perform a "Save As" on a quotesheet that has already been saved with customer information and associate the quotesheet with a new customer record in the database. Currently, if the customer information is modified, the only choices are (1) replace the existing customer record with the new information and (2) save the quotesheet without a customer record. The request is for a third option that creates a new customer record and associates it with the quotesheet. Resolution: Now, when you save, but choose not to update the current customer information, you get a new dialog asking if you want to create a new customer based on current values; if you say "Yes", this is done; if you say "No", the quotesheet is saved with the old customer information. ------------------------------------------------------------ Bug Fix Wrong Iteration Deleted in View Iterations History and Origins: If multiple iterations go out from a form and View Iteration is used to delete an iteration, the incorrect iteration is sometimes deleted. Resolution: Fixed. The View Iteration dialog now works correctly for deleting and editing iterations. ------------------------------------------------------------ New Feature Tool/Status Bar Motive or Context for Implementation: A tool and status bar would provide several interface benefits to the application. It would reduce the clutter on forms, ease navigation, and provide one-stop-shopping for commonly used functions. Common buttons such as CONFIGURESYSTEM, ADDTOSYSTEM, RETURNTOPREVIOUS and a new "go to initial form" button can be placed on the toolbar instead of on each form. The bar could also maintain a forms history and provide FWD and BACK buttons. Resolution: There is a tool bar on SBW that is enabled by default. It may be disabled by setting the SBW.INI setting in the [Options] stanza ShowToolBar = 0. The tool bar contains the following at all times: - Progress monitor - The progress monitor is now located on the tool bar. If the tool bar is not shown then the old progress monitor is used. The tool bar contains the following when the requirements tab is active: - home button - navigates back to the initial form. - navigation button - shows window containing new floating palette requirements summary and possibly new road map. - new system button - creates a new system. - delete button - deletes the current form. If the form is part of the current product line's default requests, then this button has the same effect as the "reset form" button. If the form is the initial form of an iteration, this action deletes the iteration. If the form is the initial form of a product line, this action is the same as deleting the system. - reset form button - resets the current form. - configure button - configures the current system. - show configuration errors button (Optional) - This button will appear if there is a custom error handler. If there is a custom error handler, this button will call the sbw_ReportConfigError API function. - form help button - brings up form help for the current form if a help topic exists. - form label - shows the current form's name as well as any group names. For instance if you are creating a group "Texas" and you are on form "Support" the form label would show "Texas:Support". ------------------------------------------------------------ New Feature Floating Palette for Requirements Summary Context or Motive for Implementation: The current requirements summary takes up a lot of screen real estate. It often needs to be very wide in order to show the full labels, yet when it is very wide it tends to cover a good portion of the forms. Resolution: The requirements summary is now a floating palette. To view it select the menu option Window | Requirements Summary. This option is only available when the requirements tab is active. Selecting this option will show the requirements summary palette. If another tab is activated, then the palette will be hidden until the requirements tab is reactivated. The functionality of the requirements summary is the same as when it was attached to the QuoteSheet. ------------------------------------------------------------ New Feature SBW.INI Setting to Specify Default for System Diagram (Wireframe vs. 3-D) Context or Motive for Implementation It would be nice to be able to set the default system diagram style (wireframe vs. 3-D) in the SBW.INI file, rather than using the checkbox on the configurations tab every time. Resolution: The preference SystemDiagram3D=1 in the [Configurations] stanza of SBW.INI enables shading for a 3-D effect in the system diagram. If SystemDiagram3D=0, then no shading will be used in the system diagram. This setting can also be toggled within the application. ------------------------------------------------------------ Release Notes 2.1.1 ------------------------------------------------------------ Bug Fix Dynamic Labels not Shown in System Diagram History and Origins: The system diagram displays the component's rather than the label when the label is dynamic. Resolution: sb_GetInstanceDisplayInfo was not setting the system context correctly before evaluating the dynamic label. This has been corrected. ------------------------------------------------------------ Release Notes 2.0.7 ------------------------------------------------------------ New Feature Improve time to exit SBW Context and Motive for Implementation: It seems to take an unusually long time to exit SBW. Can this be improved? Resolution: A preference in the [Options] section has been added to sbw.ini called "FastExit". If set to 1, then the product base, the PCM, and the forms set will not be unloaded. This can significantly speed up exit time of SBW. The default value for this preference is 0. ------------------------------------------------------------ Release Notes 2.0.5 ------------------------------------------------------------ Bug Fix Icons Disappear when Icon on Second Row is Deleted History and Origins: If more systems are configured than will fit on a single row of the system icons bar, then a scroll bar is enabled to provide access to further icons in the second and subsequent rows. If a system represented by an icon in the second row is opened and then deleted, the icon bar remains on the second row even if no icons remain on that row. Resolution: The problem has been fixed. ------------------------------------------------------------ Bug Fix Selections in Query-Populated Controls Fail to Restore History and Origins: Selections from query-populated controls fail to load when restoring requirements from a previous session (from a quotesheet or exported requirements) that were saved using the current formset. Loads of the same requirements during the same session work properly. Resolution: The problem has been corrected. ------------------------------------------------------------ Feature Request Matching Behavior for Priorities on Static and Dynamic Control Entries Motive or Context for Implementation: The order of precedence for setting priority on dynamic component requests in the forms language should match the order of precedence for setting priority on static component requests. A priority set at the component level should override a priority set at the widget level. Widget level priorities should be used when the component priority is minus one (-1). Resolution: The priority for dynamically populated control entries is now determined first by the component Float attribute sb_DefaultRequestPriority. If the value of the component attribute is minus one (-1) then the priority of the entry will be determined by the priority of the widget (if one is assigned). If the attribute sb_DefaultRequestPriority has not been assigned to a component, then the priority of the attribute will be zero (0) and not the priority set by the widget. This is often not the desired behavior. To ensure that components without a priority do not receive a priority of zero (0), set a default priority of minus one (-1) for all components to permit widget priorities to take effect where applicable. To set a default priority of minus one (-1) for all components, assign the attribute sb_DefaultRequestPriority to the generic Component class with a default value of minus one (-1) using the following CML syntax: Float sb_DefaultRequestPriority; class Component { attributes: sb_DefaultRequestPriority = -1; } Note: This release note supercedes the description in the Forms Management Language Reference of the behavior of query-populated controls. ------------------------------------------------------------ Release Notes 2.0.4 ------------------------------------------------------------ Bug Fix Dynamic Listbox Shows Extra Checkmark Upon Return to Form History and Origins: This bug is manifested when the following actions are taken: make a selection in a ClassDynamicListBox; leave the form and then return to it; make another selection in the same listbox. When you make the new selection, the check mark for the old selection does not go away, even though only the new selection is shown in the Requirements Summary. This happens whether the navigation is done with buttons or via the requirements summary. Resolution: This bug has been fixed. Making a new selection in a ClassDynamicListBox now correctly overrides the previous selection. ------------------------------------------------------------ Bug Fix MultiChoice Browser Resets to Zero History and Origins: If a quantity in a multichoice browser is made active (as if to edit) but no edits are made and then focus is changed away from the quantity edit field, the quantity will reset to zero. Resolution: This behavior no longer occurs. If a quantity in a multichoice browser is activated, but not edited, the original quantity will remain (and not be reset to zero). ------------------------------------------------------------ New Feature Custom Failure Message Handling Context or Motive for Implementation: Customer wants to allow different kinds of error message handling: e.g., halt immediately for failure messages that are marked "fatal" in some way; logging messages vs. (or in addition to) popping-up dialog box, etc. One way to achieve this is to provide a "hook" for a customer-supplied error message handler, which could be registered and called instead of the standard error message handler. Resolution: Due to many customer demands for enhanced configuration failure handling in SalesBUILDER for Windows, the SalesBUILDER for Windows configuration error handling mechanism is now customizable. Customers can now create an interface for handling messages in whatever manner desired. To use the new configuration error handler, set [Configurations] CustomFailureHandler=1 in SBW.INI. Create a DLL named SBWCH.DLL (for SBW Custom Handlers) which contains the following three functions. long _far _pascal sbw_BeginConfig( long sysID, int hwndParent); long _far _pascal sbw_EndConfig( long sysID, int hwndParent ); long _far _pascal sbw_ReportConfigError( const char *errmsg, long *continueConfig); long _far _pascal sbw_ShowConfigErrors( long sysID, int hWndParent); sbw_BeginConfig is called immediately before SalesBUILDER for Windows calls sb_ConfigureSystem. The function takes the system ID that is currently being configured and the handle of the QuoteSheet that initiated the sb_ConfigureSystem call. The window handle can be used as the parent of any dialogs that are created in the DLL. sbw_EndConfig is called immediatedly after SalesBUILDER for Windows calls sb_ConfigureSystem. The function takes the system ID of the system that was just configured. sbw_ReportConfigError is only called during a sb_ConfigureSystem call if a constraint failure occurs. The constraint failure message from the engine is passed on to this function. A continuation flag is also passed to this function. To halt the configuration the flag should be set to 0, otherwise it should be set to 1. Between the time when this function is called and the time when it returns, only modal dialogs should be displayed. The DLL should not yield control back to SalesBUILDER for Windows before returning. If CustomFailureHandler=1, then a menu item will appear on the Window menu following configuration to allow the user to view the configuration failure messages for a system to be shown. This menu item calls sbw_ShowConfigErrors, which should handle the display of the messages. The function arguments are the system ID of the system in question and the window handle of the QuoteSheet that initiated the call. ------------------------------------------------------------ Release Notes 2.0.3 ------------------------------------------------------------ New Feature Export Diagram for One Top Level Component per Metafile Context or Motive for Implementation: The system diagram can be exported, however for large or complex systems, this one diagram contains too much information to be understood. Resolution: SalesBUILDER for Windows can now export one top level component per metafile. Now when you select export system diagram, you have the choice of saving to either a Windows metafile (WMF) or a list of WMF files. To export the system as a list of WMF files, give a file name with any other extension besides .WMF. SBW will create a file that looks like this: metafile.lst - [system1] name=The Big System component1=\ ... componentN=\ The format of the list file is the same as Window's ini files to make it easy to retrieve the data. Each file represents the drawing of a top level component. The user is responsible for deleting both the list file and each of the temporary files used for the metafiles. ------------------------------------------------------------ New Feature Search QuoteSheets by Description (or any field) Context or Motive for Implementation: The current Open QuoteSheet dialog does not allow you to search on QuoteSheet description. Quotesheet description is the most natural way to refer to a quotesheet. Resolution: The new QuoteSheet browser allows you to search on any field. To change the visible fields, use the Change View... button to bring up a dialog that allows you to change the visibility of each the available fields. ------------------------------------------------------------ New Feature Click on System Icon to Refresh System Diagram Context or Motive for Implementation: A customer would like SalesBUILDER for Windows to redraw a system that has been modified by an external application. This can be enabled by allowing the user to refresh the system diagram by clicking on the system icon. Resolution: The SBW.INI setting [Configurations] AlwaysRefresh=1 causes SalesBUILDER for Windows to refresh the system diagram every time a mouse-click is performed on the system icon on the configurations tab. ------------------------------------------------------------ New Feature Ability to Assign a Bitmap as a Form Background Context or Motive for Implementation: The appearance and usefulness of SalesBUILDER for Windows can be dramatically improved by using bitmaps as backgrounds on forms. Doing this converts SalesBUILDER for Windows from a text-based data-entry system into a graphically-oriented environment. Transferring static text into a bitmap allows fonts to be changed, and also helps in those rare instances where there are large numbers of widgets. Resolution: FormBUILDER and SalesBUILDER for Windows support a new attribute "Picture" defined on forms or dialogs. The attribute is used to display a bitmap on the background of a form or dialog. If the property is entered by hand it must be entered after the help and product line attributes and before the control definitions. Example form definition: < form declaration > { < optional help topic > < optional product lines > < optional picture > // Picture = "filename"; < control list > } Form @100 frmStoreFront 0, 0, 640, 400 { Picture = "store.bmp"; CheckBox cbOpen "Open" 10, 10, 200, 30 } In order for FormBUILDER to display the bitmap, the file specified in the picture property must be either in the current directory or have a fully qualified path name. At runtime, SalesBUILDER for Windows will look for the file in the bitmap directory, the model directory and the application directory. ------------------------------------------------------------ New Feature Optional Ability to Select Baseline for System Upgrade Context or Motive for Implementation: The old behavior allows that the first time an ADDTOSYSTEM is invoked, the current system is "baselined" before the configuration is begun. Subsequent ADDTOSYSTEMs will update the original baselined system, NOT necessarily the current system. This behavior consistently causes user confusion because it is fairly unintuitive. Also, if the user is playing around a lot with different configuration/upgrade scenarios, they should not have to invest the overhead (time OR space) to do a manual save. The ability is needed to allow the user to decide when to baseline and when not to. Also, if configuration is performed from an external or custom interface, the additional capability to baseline from outside SalesBUILDER for Windows is also needed. Resolution: If ResetRollbackOnConfig set to 1 in the [Options] section of SBW.INI then SBW will re-baseline a system when the ConfigureSystem button is pressed. With ResetRollbackOnConfig=0, the default setting, old behavior will be preserved: re-baselining will occur only after a QuoteSheet save. ------------------------------------------------------------ Bug Fix Requirements Summary Displays Zero-Valued Entries History and Origins: Since the control for the Requirements Summary was changed, the outline now includes all zero-valued entries in the display, including editfields and all table entries. For a formset with many entries, few of which are used for a given configuration, this makes the Requirements Summary extremely unwieldy to use. Only those entries with non-zero values should be displayed in the Requirements Summary. Resolution: The Requirements Summary now displays only controls with non-zero values. ------------------------------------------------------------ Release Notes 2.0.0 ------------------------------------------------------------ Bug Fix ProductBase Load Failure Causes Errors History and Origins: When the ProductBase fails to load, either because the correct files are not available locally or because the product base is not loaded into the database where it is expected, several (usually four) engine API errors are presented and then crashes SalesBUILDER for Windows. This is correct behavior except that if a database bridge is being used SalesBUILDER for Windows leaves both the DBADLL.DLL and the database specific DLL in memory. This prevents SalesBUILDER for Windows from logging into the database once the ProductBase has been loaded unless Windows is re-started. There should just be one error message which tells the user "ProductBase not found" and then the application should then exit and take all of its DLL's with it. Resolution: SalesBUILDER for Windows now reports that the ProductBase failed to load and exits gracefully when there is a ProductBase load failure. ------------------------------------------------------------ Bug Fix Default Requests Made from Cancelled Dialogs History and Origins: SalesBUILDER for Windows is sending in default requests when a dialog box is visited, but cancelled. This can lead to unexpected configuration results. Resolution: If you visit a dialog box that does not send in requests by default and select Cancel, then the default requests for the dialog are not sent in. If you revisit a dialog on which you have previously made selections and select Cancel, the selections you made in your last visit (in which you selected OK) will be sent in. If requests from a dialog should be sent in by default, the dialog should be declared as part of a product line. ------------------------------------------------------------ New Feature Version Checking of Required Modules Context or Motive for Implementation: If SalesBUILDER for Windows checked to make sure that all of its required modules (DLLs and VBXs) could be loaded, at load time, and that their versions matched the expected version, then mismatched DLLs and VBXs can be detected as causes of a reported error. Resolution: A new SBW.INI preference, VersionInfoFile, (in the [Options] section) has been added. If set to a filename, then SalesBUILDER for Windows will check for all its required modules before starting up. The results of this check will be written to the specified file. If modules are missing, then SBW will display a message to this effect and halt. If modules are present but are older than expected, SalesBUILDER for Windows will tell the user which version was found, and give a warning that the application may not operate properly, but give the user the option of continuing. If newer versions are found, then no warning/prompt is given. The format of the VersionInfoFile is a header line, "MODULE VERSION STATUS", followed by one line of information per module: . For example, if SBW expected to find sbfrm.dll stamped with version information 1.1.0.2 but found 1.1.0.3 then there will be a line in VersionInfoFile: sbfrm.dll 1.1.0.2 1.1.0.3 If the DLL could not be loaded at all, then the line would look like this: sbfrm.dll 1.1.0.2 Missing If the expected version was found, then the 3rd column would be left blank. ------------------------------------------------------------ Bug Fix Specifying the Server Model Directory from the Client History and Origins: When using the -D option with the SBW client (for Client/Server installations of SBW), an attempt is made to open the local file "INFILE.ASC" in the specified working directory, instead of going to the server for the ProductBase. SBW client correctly ignores "INFILE.ASC" when the -D option is not used. Resolution: The SBW Client no longer uses the -D option to specify the server model directory. There are two ways to specify the server model directory now. 1) On the command-line use the option "-SD " where is the path describing where the model is located. Alternatively, 2) Specify the server model directory in the SBW.INI file and in the [Options] stanza, set "SBHostServerDir=". When running the SBW Client, it will look for the ProductBase and the PCM in the server directory. The form set is still loaded locally and will use the directory specified with the -D option. SBW Client will no longer check to see if the ProductBase and PCM files exist on the local machine since these files are never used. Note: If the server model directory is specified and does not end with a '\' or '/' then a '/' is appended. This may not be appropriate for all server file systems so it is best to be explicit with the path and include the appropriate ending slash. ------------------------------------------------------------