home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Thinkpad Essentials 1997
/
cd1may97.iso
/
confpos2
/
SBW.Z
/
relnotes.txt
next >
Wrap
Text File
|
1996-09-19
|
103KB
|
3,110 lines
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 <attribute name> {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 <attrname>.
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 <widgetName> <left, top, width,
height>
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:
<formName> : <widgetName> [ (<priority>)] [MANDATORY] {
FROM <className>
[WHERE "<whereClause>"]
[DISPLAY <attributeName>]
[WITH DEFAULT]
[INITIALIZEDBY <attributeListName>] }
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 <widgetName> <left, top, width,
height>
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=<hostname>: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 =<fontName>, then <fontName> 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 =<fontSize>, then <fontSize> 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=<Window's temp dir>\<name of temp meta file 1>
...
componentN=<Window's temp dir>\<name of temp meta file N>
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: <module name> <expected
version> <nothing, found version, or "Missing">.
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 <server model
directory>" where <server model directory> 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=<server model directory>".
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.
------------------------------------------------------------