<?xml version="1.0"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
		<channel><title>[Lantica Software Support Center] Recently Changed Articles</title><link>http://www.lantica.com/Support/rss/kb/recent_changes</link><description></description><item><title>Will Sesame run on my operating system?</title><description>Sesame is a 32 bit application that runs on the following operating systems:
&lt;ul&gt;
&lt;li&gt;Windows 95&lt;/li&gt;
&lt;li&gt;Windows 98&lt;/li&gt;
&lt;li&gt;Windows NT&lt;/li&gt;
&lt;li&gt;Windows 2000&lt;/li&gt;
&lt;li&gt;Windows ME&lt;/li&gt;
&lt;li&gt;Windows XP&lt;/li&gt;
&lt;li&gt;Windows Vista (32 bit)&lt;/li&gt;
&lt;li&gt;Windows Vista (64 bit as a 32 bit application)&lt;/li&gt;
&lt;li&gt;Windows 7 (32 bit)&lt;/li&gt;
&lt;li&gt;Windows 7 (64 bit as a 32 bit application)&lt;/li&gt;
&lt;li&gt;Windows 8 (32 bit)&lt;/li&gt;
&lt;li&gt;Windows 8 (64 bit as a 32 bit application)&lt;/li&gt;
&lt;/ul&gt;
As well as:
&lt;ul&gt;
&lt;li&gt;Linux (for Intel)&lt;/li&gt;
&lt;/ul&gt;</description><link>http://www.lantica.com/Support/kb/article/3</link><pubDate>Thu, 21 Feb 2013 13:25:58 GMT</pubDate><guid isPermaLink="false">2fff6d0b6cd159c7fb6aae31fd6cd7a7</guid></item><item><title>What are the minimum system requirements to run Sesame?</title><description>Sesame requires a Windows 95, 98, NT, ME, 2000, XP, Vista, Windows 7, Windows 8, or a Linux (for Intel) operating system. Minimum RAM requirements are the same as those required by the operating system. However, it is a good idea to have a total amount of RAM that is three times the size of your largest database. For network use over a LAN (local area network) or WAN (wide area network), Sesame requires installation of the TCP/IP (standard Internet) protocol on the network. The network server must be capable of running a Windows or Linux (for Intel) program on itself.</description><link>http://www.lantica.com/Support/kb/article/31</link><pubDate>Mon, 10 Dec 2012 14:59:53 GMT</pubDate><guid isPermaLink="false">116dc74b09eb7419e43c14ac70b145c5</guid></item><item><title>Change the state of a Checkbox from tri-state, to bi-state</title><description>&lt;p&gt;Checkbox Layout Elements (LEs), by default, are tri-state: Yes (click to check), No (click to uncheck), and Unknown/Undecided (click to raise box). The following code example makes your checkbox bi-state (Yes/No), with "Active" being the name of your LE:&lt;/p&gt;

&lt;pre&gt;
If @IsBlank(Active) Then
{
	Active = 1
}
&lt;/pre&gt;</description><link>http://www.lantica.com/Support/kb/article/261</link><pubDate>Wed, 25 Apr 2012 15:51:47 GMT</pubDate><guid isPermaLink="false">0e0942ce26b5ba061919e210a6b1d9a9</guid></item><item><title>Summarize all of the Layout Elements and their properties in an application</title><description>&lt;p&gt;From the design menu in Sesame Designer, choose "Document Application" under the "Application" folder. Enter or select a filename and click Accept. This will produce an HTML file summarizing all of the elements of your design and their properties. This is a quick way to produce an overall view and is useful when writing X-Commands, for example, as a means to reference the elements in your application.&lt;/p&gt;

&lt;p&gt;The resulting summary is organized into sections. Each section contains information about a different portion of your application.
&lt;ul&gt;
&lt;li&gt;Application Values - shows application settings such as Name, Unique Number, Image Path and Application Filename&lt;/li&gt;
&lt;li&gt;Start Up Programming &amp; Form - Shows startup form. Indicates whether this application has programming in On Application Open event&lt;/li&gt;
&lt;li&gt;Global Values - Lists Global Values and their current values&lt;/li&gt;
&lt;li&gt;Groups - Lists Security Groups, User IDs in the groups, and if they have passwords&lt;/li&gt;
&lt;li&gt;Databases - Lists databases in your application. Each database shows a list of fields in that database and includes its properties, such as name and data type&lt;/li&gt;
&lt;li&gt;Forms Summary - Lists Forms in your application. Each Form shows its name and database to which it's bound.&lt;/li&gt;
&lt;li&gt;Reports Summary - Lists Reports in your application. Each Report shows its name and database to which it's bound.&lt;/li&gt;
&lt;li&gt;Forms Detail - Detailed documentation for each Report including sections, section properties, elements, element properties, programmed events, attached specs, and security settings.&lt;/li&gt;
&lt;li&gt;Reports Detail - Detailed documentation for each Report including sections, section properties, elements, element properties, programmed events, attached specs, and security settings.&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;

&lt;p&gt;All of the settings for the summary page's look-and-feel use CSS (cascading style sheets), therefore you can easily change things such as font and color by creating a CSS file and placing it in your current working directory. (See &lt;a href = "http://www.lantica.com/support/kb/article/000195" target="_new"&gt;Create a CSS file to change the look-and-feel of  "Document Application" summary&lt;/a&gt; elsewhere in this section of the Knowledge Base)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Also, see &lt;i&gt;@StringArrayElementList&lt;/i&gt; in the Sesame Programming Guide - this function returns a list of all the elements on your Form. If you need to loop through all of your elements for reasons such as printing your values, or setting all the form elements to be read only, this function gives you everything you need.&lt;/p&gt;
Example:
&lt;pre&gt;
Var vMyStringArray as String
	// vMyStringArray will equal a semicolon separated list
	// of Element names. Ex: "Last;First;Company;Address"
	vMyStringArray = @StringArrayElementList()
&lt;/pre&gt;
</description><link>http://www.lantica.com/Support/kb/article/194</link><pubDate>Wed, 18 Apr 2012 16:36:49 GMT</pubDate><guid isPermaLink="false">d431da1a381caddd052064e0f99d50ee</guid></item><item><title>The Anatomy of a Sesame Application: Terminology</title><description>&lt;p&gt;A Sesame &lt;b&gt;application&lt;/b&gt; consists of one or more &lt;b&gt;databases&lt;/b&gt; that are in some way related - such as a Customer database, an Orders database, and an Inventory database. A database consists of all the records, and all the forms (as well as optional sub-forms) and reports that show these records. For example, an Orders database might consist of all the order records, the order form and the Orders By Month report.&lt;/p&gt;

&lt;p&gt;A &lt;b&gt;layout&lt;/b&gt; is a form or report. Since Sesame is form-based, you will create your databases by building and editing layouts (or forms). It defines how you will look at and use the parts of your information.&lt;/p&gt;

&lt;p&gt;A &lt;b&gt;layout element&lt;/b&gt; is anything you put on a layout or form. Sometimes referred to as an LE, they can be purely cosmetic (such as a line or box), display data from your database records, display the result of a calculation, or let you change information simply by clicking or making a selection from a pick-list. Layout elements are bound to the fields whose information they display.&lt;/p&gt;

&lt;p&gt;A &lt;b&gt;field&lt;/b&gt; is a component of a database and is where Sesame actually stores your data, such as a telephone number. A field is &lt;i&gt;not&lt;/i&gt; unique to a specific form. The same field can be displayed on different forms.&lt;/p&gt;

&lt;p&gt;A &lt;b&gt;record&lt;/b&gt; is a logical collection of fields. A record is displayed in a form. A form displays one record at a time.&lt;/p&gt;


&lt;p&gt;For example, an Orders &lt;b&gt;record&lt;/b&gt; may have &lt;b&gt;fields&lt;/b&gt; for OrderDate, CustomerName, and ShipToAddress. It is rare in Sesame that you will work with an actual field. Normally, you will work with layout elements. A layout element that displays the value (content) of a field is said to be &lt;b&gt;bound&lt;/b&gt; to that field. The only time that you will need to deal with an actual field is if you change its data type or its name.&lt;/p&gt;

&lt;p&gt;For more information on the anatomy of a Sesame application, see &lt;i&gt;Appendix 4: Advanced Concepts&lt;/i&gt; as well as the "Terminology" section under the &lt;i&gt;Designing a Sesame Application&lt;/i&gt; chapter  in the Sesame User Guide.&lt;/p&gt;

&lt;b&gt;Summary:&lt;b&gt;&lt;br /&gt;
An application, which consists of two files &#xE2;&#x20AC;&#x201D; application.db and application.dat &#xE2;&#x20AC;&#x201D; is comprised of one or more databases each with one or more forms and optional subforms. Forms and subforms are both comprised of layout elements. Most of those layout elements will be bound to fields.
&lt;ul&gt;
&lt;li&gt;Data is stored in fields.&lt;/li&gt;
&lt;li&gt;Fields are displayed on forms using layout elements, which can be thought of as placeholders for those fields.&lt;/li&gt;
&lt;li&gt;A layout element is unique to a specific form, and a form is defined by its elements.&lt;/li&gt;
&lt;li&gt;A field is not unique to a specific form. The same field can be displayed on different forms.&lt;/li&gt;
&lt;li&gt;Layout elements are bound to the fields whose information they display.&lt;/li&gt;
&lt;/ul&gt;
</description><link>http://www.lantica.com/Support/kb/article/232</link><pubDate>Tue, 10 Apr 2012 16:34:35 GMT</pubDate><guid isPermaLink="false">f2133d806b0ef98ccb855239b822bb0c</guid></item><item><title>Creating Subforms in Your Application</title><description>&lt;p&gt;Subforms are a way to view Records from a second database while in the Form of a master database - so that you can see Records from both databases at the same time. Therefore, you will need at least two databases in an application before you can create subforms, each based on a different database in the same application. (If you are unclear about the differences between a Sesame "database" and an "application", see &lt;a href="http://lantica.com/support/kb/article/000232" target="_blank"&gt;&lt;b&gt;The Anatomy of a Sesame Application: Terminology&lt;/b&gt;&lt;/a&gt;, elsewhere in this Knowledgebase, or consult your &lt;i&gt;Sesame User Guide&lt;/i&gt;.)&lt;/p&gt;

&lt;p&gt;You don't need to create relationships between databases before using your Subform. Sesame creates these relationships for you when you add a Subform to a Main Form.&lt;/p&gt;

&lt;p&gt;Because Subforms are dynamic, you can edit data, delete records and add records in a Subform.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Step one&lt;/b&gt; is to create a new database for the subform. (If you are not familiar with creating new databases/forms, or just need to brush up, see "Designing a Sesame Application" in the &lt;i&gt;Sesame User Guide&lt;/i&gt;.)&lt;/p&gt;

&lt;p&gt;To add a new Form, select &lt;i&gt;Forms -&gt; Add New Database&lt;/i&gt;. Enter the name for this new database and form (though the name of your form and the name of your database &lt;i&gt;can&lt;/i&gt; be the same, it is not necessary). This opens up a new, blank Form. Use the &lt;em&gt;Layout Element Adder&lt;/em&gt; to add the desired Layout Elements (or LE's). When you are finished, save your work. You now have both a new database and a new form. Close the design tab.&lt;/p&gt;

&lt;p&gt;At this point, your menu tree should show the new database that you have just created and its new form at the same level as the original, existing database. It should be directly beneath the orignial and not indented. This shows that the two databases are independent.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Step two&lt;/b&gt; is to add the form you have just created to the original, existing form in your application as a Subform.&lt;/p&gt;

&lt;p&gt;Open the main form or Parent Record (the original, existing form) in Designer. Click on the form where you want to place your subform. In the &lt;i&gt;Layout Element Adder&lt;/i&gt;, select element type: &lt;b&gt;Subform&lt;/b&gt;. The &lt;i&gt;Bind Element To&lt;/i&gt; must remain Unbound. If you wish to label your subform, do so now with the text of your choice - this will appear above the subform by default, though you can move it if you wish. Click on the &lt;i&gt;Add Element to Form&lt;/i&gt; button.&lt;/p&gt;

&lt;p&gt;Sesame should now be displaying the &lt;i&gt;Subform Settings&lt;/i&gt; dialog window. This consists of 5 sections, which control the way the subform and underlying linking mechanisms are established:&lt;br /&gt;
&lt;ol&gt;
	&lt;li&gt;Select a Form - This dropdown menu lists all the eligible forms in your database. Select the form you wish to use as the subform.&lt;/li&gt;
	&lt;li&gt;Select Subrecord Type - This menu lists the available link types. Here, you will tell Sesame how to decide which records in the database are conidered &lt;i&gt;children&lt;/i&gt; of the parent record. The two choices are &lt;i&gt;Automatic (Natural Links)&lt;/i&gt; or &lt;i&gt;Matching Field Values (Relational Links)&lt;/i&gt;. For more on this, see the Sesame User Guide or the Knowledgebase article listed below.)&lt;/li&gt;
	&lt;li&gt;Select Records to Display - For both Natural and Relational Links you will see three sets of choices.&lt;br /&gt;
    &lt;ol&gt;
		&lt;li&gt;&lt;i&gt;Make Natural Child Record:&lt;/i&gt; This is the most common choice. Records in the subform are automatically linked to corresponding records in the main/parent form. The correct child records will appear in the subform based on your settings. (If &lt;i&gt;Relational Links&lt;/i&gt; is selected, this option changes to &lt;i&gt;Show Related Child Records&lt;/i&gt;, but the same logic applies.) Child records can also be accessed by opening the subform by itself. In this case all the records are shown mixed together.&lt;/li&gt;
		&lt;li&gt;&lt;i&gt;Show Existing Natural Child Records:&lt;/i&gt; If the main/parent database already has a subrecord database(s) with appropriate linking, they'll be listed in a dropdown menu here. If one of these is selected, Sesame will use a pre-existing relationship, as would occur if another subform had already been created (in other words, the same records from the database will be shown as in the subform that initially created the existing field definition).&lt;/li&gt;
		&lt;li&gt;&lt;i&gt;Create a New Database with Shared Template:&lt;/i&gt; If this choice is selected it clones the selected form and database, but without any data. This is useful when you need to add a form as a subform, which does not already exist. The records added using this subform won't mix with records added using other subforms, even though the subforms look identical. &lt;i&gt;"Shared Template"&lt;/i&gt; means that all databases/forms that share a template will be kept in synch. So, if you add an LE to one form, all forms will have that element.&lt;/li&gt;
    &lt;/ol&gt;
	&lt;li&gt;Set Subform Properties - You must assign a &lt;i&gt;Field Name&lt;/i&gt; to the subform, and, if applicable, pick the matching fields for a Relational Link.&lt;/li&gt;
	&lt;li&gt;Select a View - Here, you will select whether you want to display the records in the subform in &lt;i&gt;Table&lt;/i&gt; or &lt;i&gt;Form&lt;/i&gt; view. (Form view shows LE's arranged on the form just as it was designed, while Table View shows records in a spreadsheet-like view with rows and columns - this is the most common choice for a subform as you can view multiple records at one time in this view).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Click &lt;i&gt;OK&lt;/i&gt; and your subform is now added to the form. You can now resize or reposition the subform on the main form to your liking. Make sure to Save the layout once you've got everything looking the way you want it to look! Reconcile or save your design. (See the Knowledgebase articles: &lt;a href="http://www.lantica.com/support/kb/article/000077" target="_blank"&gt;&lt;b&gt;Reconciling an Application&lt;/a&gt;&lt;/b&gt; and &lt;a href="http://www.lantica.com/support/kb/article/000208" target="_blank"&gt;&lt;b&gt;Reconcile Application Options&lt;/a&gt;&lt;/b&gt; for more info on the Reconcile process.)&lt;/p&gt; 

&lt;p&gt;Looking back at the menu tree, you will see that the newest database is now indented under the original,existing database, rather than being directly underneath it.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;strong&gt;See also:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the &lt;i&gt;Sesame User Guide&lt;/i&gt;:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt; Section 3-Designing a Sesame Application, Section 5-Creating Subforms, Section 7-Navigating Forms, 13-Working with Subforms.&lt;/li&gt; 
&lt;/ul&gt;
&lt;p&gt;From the Sesame &lt;i&gt;Quick-Start Tutorial:&lt;/i&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Building an Application with Subforms (If you do not have these manuals, go to Lantica.com to download them -- See this Knowledgebase article &lt;a href="http://www.lantica.com/support/kb/article/000252" target="_blank"&gt;&lt;b&gt;Download Sesame Documentation (Guides, Manuals, etc.)&lt;/b&gt;&lt;/a&gt; for instructions on how to do so.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other Knowledgebase Articles:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://www.lantica.com/support/kb/article/000097" taget="_blank"&gt;Should I choose Natural or Relational Subforms?&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.lantica.com/support/kb/article/000177" target="_blank"&gt;Change the background color of an individual cell in a form/subform&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://lantica.com/support/kb/article/000174" target="_blank"&gt;Can I choose which Layout Elements are displayed on a subform?&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://lantica.com/support/kb/article/000158" target="_blank"&gt;Renaming a Subform in Sesame Designer&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.lantica.com/support/kb/article/000256" target="_blank"&gt;Accurately Adjust the Width of a Table-View Subform&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://lantica.com/support/kb/article/000094" target="_blank"&gt;Sum Up Subform Values&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://lantica.com/support/kb/article/000230" target="_blank"&gt;Post a Value From a Parent Form to a Subform&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://lantica.com/support/kb/article/000118" target="_blank"&gt;Universal and Simple Searches in Subforms&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description><link>http://www.lantica.com/Support/kb/article/260</link><pubDate>Tue, 10 Apr 2012 16:29:44 GMT</pubDate><guid isPermaLink="false">0594490a0d12d48c4fc4e1cfdb54d3db</guid></item><item><title>Moving Sesame to a New Computer</title><description>&lt;p&gt;It may become necessary, at some point, to move Sesame from one computer to another or to add computers to your existing network. Even more likely, you may need to update your Sesame software. With each new version Sesame provides tools and techniques for making database management easier and more efficient. Because Sesame's developers, technicians and consultants work so closely with Sesame users, suggestions for improvement and fixes are constantly being tested and implemented. These developments are actualized in the form of newer Sesame versions.&lt;/p&gt;

&lt;p&gt;Common concerns for Sesame users during these occasions include whether the installation CD is necessary and what happens to their settings and data.&lt;/p&gt;

&lt;p&gt;If you do not have your Sesame installation CD for any reason, you may visit Lantica.com and choose from a number of options in the "Downloads" section. From here, you can download the newest version of Sesame. &lt;/p&gt;

&lt;p&gt;Following the instructions below will allow your data to transfer seamlessly. Should you run into snags along the way there's always a way to find a solution (&lt;a href="http://lantica.com/support/kb/article/000201" target="_new"&gt; Where Can I Find More Information, Such as Online Help, with Sesame and Sesame Designer?&lt;/a&gt;) check out some of the other Knowledgebase articles listed below, take a look on the User Forum, or contact &lt;a href="mail to:customer_support@lantica.com"&gt;Technical Support&lt;/a&gt;.&lt;/p&gt; 

&lt;p&gt;Moving Sesame is really quite painless. Because there is more than one configuration possible, however, differences in how to do so exist. Therefore, it may be necessary to make a few minor changes depending on your particular situation.&lt;/p&gt;

&lt;h3&gt;Standalone Single User:&lt;/h3&gt;
&lt;p&gt;With the default install the Sesame program files can be found accordingly: The Sesame program files are in the &lt;i&gt;C:\Sesame2\Program&lt;/i&gt; folder. Data files are in &lt;i&gt;C:\Sesame2\Data&lt;/i&gt;. Documents are in &lt;i&gt;C:\Seame2\Docs&lt;/i&gt;. Settings and configuration files are in &lt;i&gt;C:\Sesame2&lt;/i&gt; folder.  
To move to a new computer follow these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copy the entire &lt;i&gt;Sesame2&lt;/i&gt; folder from your old computer (either by right-clicking on the folder and choosing &lt;i&gt;Copy&lt;/i&gt;, or clicking on the folder and using the Ctrl-C shortcut). This will copy the contents of the folder, including all of its subfolders. Paste this folder directly onto your new computer's C:\ drive (either by right-clicking and choosing &lt;i&gt;Paste&lt;/i&gt;, or using the Ctrl-V shortcut) if the two computers are connected via a network cable. You can also copy and paste to your new computer via a thumb-drive. There are no hidden or read-only files or folders.&lt;/li&gt;

&lt;li&gt;On your new computer, open &lt;i&gt;Sesame2 -&gt; Program&lt;/i&gt;. Right-click on &lt;i&gt;Sesame&lt;/i&gt; (not SDesigner) and choose &lt;i&gt;Send to Desktop (Create Shortcut)&lt;/i&gt;. This will create the shortcut on your desktop.&lt;br /&gt;
Alternatively, you may also right-click on your desktop and choose &lt;i&gt;New Shortcut&lt;/i&gt; from this dropdown menu. In the location line type: &lt;i&gt;C:\Sesame2\Program\Sesame.exe&lt;/i&gt; and click &lt;b&gt;Next&lt;/b&gt;. Sesame will automatically set up the proper icons for your shortcuts.
Name your shortcut Sesame.&lt;/li&gt;

&lt;li&gt;Right-click on the shortcut you've just created and select &lt;i&gt;Properties&lt;/i&gt;. In the &lt;i&gt;Start In:&lt;/i&gt; box, change the words &lt;i&gt;C:\Seseame2\Program&lt;/i&gt; to &lt;i&gt;C:\Sesame2&lt;/i&gt; (essentially, you're just deleting the "\Program"). This is critical, as this will allow Sesame to find its configuration files.&lt;/li&gt;
&lt;li&gt;Repeat steps 2 and 3 of Sesame Designer (substitute &lt;i&gt;sdesigner.exe&lt;/i&gt; for &lt;i&gt;sesame.exe&lt;/i&gt;) and name the shortcut &lt;i&gt;Sesame Designer&lt;/i&gt;.&lt;/li&gt; 
&lt;/ol&gt;
  
&lt;h3&gt;Multi-User Client Server Installation:&lt;/h3&gt;
&lt;p&gt;There are two different processes for this case - one for the server and one for the client computer(s). They are similar to the steps used for standalone systems, with some changes in the shortcuts.&lt;/p&gt; 

&lt;ol&gt;
&lt;li&gt;Copy the entire &lt;i&gt;Sesame2&lt;/i&gt; folder from all computers - both client and server (either by right-clicking on the folder and choosing &lt;i&gt;Copy&lt;/i&gt;, or clicking on the folder and using the Ctrl-C shortcut). This will copy the contents of the folder, including all of its subfolders. Paste this folder directly onto your new computer's C:\ drive (either by right-clicking and choosing &lt;i&gt;Paste&lt;/i&gt;, or using the Ctrl-V shortcut) if the two computers are connected via a network cable (for both client and server). You can also copy and paste to your new computer via a thumb-drive. There are no hidden or read-only files or folders.&lt;br /&gt;
If you are only installing new clients, just copy the folder from the old to the new clients. If you are only putting in a new server, just copy the folder from the old server to the new server.&lt;/li&gt;
&lt;li&gt;Find the network name of each of the clients &lt;b&gt;and&lt;/b&gt; the server by right-clicking in &lt;i&gt;My Computer&lt;/i&gt; on each machine and finding the line telling you the &lt;i&gt;Computer name&lt;/i&gt; (or by right-clicking on the Sesame shortcut on the &lt;b&gt;old&lt;/b&gt; computer(s) and choosing &lt;i&gt;Properties&lt;/i&gt;).
&lt;li&gt;&lt;i&gt;For a new server installation:&lt;/i&gt; On the new server, create a new Sesame Server shortcut by right-clicking on your desktop and choosing &lt;i&gt;New Shortcut&lt;/i&gt; from the dropdown menu. In the "location" line, type:&lt;br /&gt;&lt;br /&gt;
&lt;b&gt;C:\Sesame2\Program\Sesame.exe -Server NameOfServer&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
(where &lt;i&gt;NameOfServer&lt;/i&gt; is the network &lt;i&gt;Computer Name&lt;/i&gt; of your server) and click &lt;b&gt;Next&lt;/b&gt;. Name your shortcut &lt;i&gt;Sesame Server&lt;/i&gt; and click &lt;b&gt;Finish&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;For new client installations:&lt;/i&gt; After copying the old client Sesame2 directory to the C: drive on each new &lt;i&gt;client computer&lt;/i&gt;, create a new shortcut on the desktop by right-clicking and choosing &lt;i&gt;New Shortcut&lt;/i&gt; from the dropdown menu. In the location line type:&lt;br /&gt;&lt;br /&gt;
&lt;b&gt;C:\Sesame2\Program\Sesame.exe -Client NameOfServer&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
(where &lt;i&gt;NameOfServer&lt;/i&gt; is the network &lt;i&gt;Computer Name&lt;/i&gt; of your server) and click &lt;b&gt;Next&lt;/b&gt;. Name your shortcut &lt;i&gt;Sesame Client&lt;/i&gt; and click on &lt;b&gt;Finish&lt;/b&gt;.&lt;/li&gt; 
&lt;li&gt;Right-click on your new shortcut and choose &lt;i&gt;Properties&lt;/i&gt;. Change the words in &lt;i&gt;Start in:&lt;/i&gt; to read &lt;i&gt;C:\Sesame2&lt;/i&gt;, by removing the &lt;i&gt;\program&lt;/i&gt;.&lt;/li&gt; 

&lt;p&gt;&lt;b&gt;See these other Knowledgebase article for more information:&lt;/b&gt;&lt;br /&gt;
&lt;a href="http://www.lantica.com/support/kb/article/000014" target="_new"&gt;My machine name has spaces in it. How can I get Sesame to start a server on this machine?&lt;/a&gt;&lt;br /&gt; 
&lt;a href="http://www.lantica.com/support/kb/article/000090" target="_new"&gt;What does Client/Server mean?&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.lantica.com/support/kb/article/000023" target="_new"&gt;What do I need to let multiple users connect to my database?&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.lantica.com/support/kb/article/000017" target="_new"&gt;Can I run more than one Sesame server?&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.lantica.com/support/kb/article/000093" target="_new"&gt;What does the message "Failed to create a local socket: Unknown" mean?&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.lantica.com/support/kb/article/000022" target="_new"&gt;How many clients can connect to a Sesame server?&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.lantica.com/support/kb/article/000019" target="_new"&gt;Do I have to buy a separate program to run Client/Server?&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.lantica.com/support/kb/article/000137" target="_new"&gt;Troubleshooting Client/Server Connection Issues&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://lantica.com/support/kb/article/000139" target="_new"&gt;Reconfiguring Norton Security Suite To Allow Client/Server Connections&lt;/a&gt;&lt;/p&gt;
	
</description><link>http://www.lantica.com/Support/kb/article/259</link><pubDate>Thu, 05 Apr 2012 20:32:01 GMT</pubDate><guid isPermaLink="false">e8234beed40965790a428069f7d2c4b2</guid></item><item><title>Creating and Using a Lookup Table</title><description>&lt;p&gt;A fast and easy way to store and retrieve frequently used information during a data entry session.&lt;/p&gt;

&lt;p&gt;A Lookup Table is a table of values stored in memory as an array. It's like having a small database within your database. It can contain information that's frequently needed during a data entry session, such as a state sales tax rates, shipping zones, discounts rates for different order levels, or state or province abbreviations.&lt;/p&gt;

&lt;p&gt;The example below shows one method. In this example, a few state names are stored in the table along with their abbreviations and (imaginary) tax rates.&lt;/p&gt;

&lt;p&gt;Create your Lookup Table array in the &lt;i&gt;Global Code&lt;/i&gt; section of the form as a stat (static) variable. This way, it is available to your form element programs during the entire data entry session:&lt;br /&gt;

&lt;pre&gt;
/*
Declaring a "Lookup Table" array with 50
rows and 3 columns. The array can store 
50 x 3 or 150 values, populated below. The
table/array goes into the form's Global Code,
while the programs that access it are connected
to form elements and their events.
*/

stat LU1 as array{50, 3] of String

LU1[1, 1] = "AL"; LU1[1, 2] = "Alabama"; LU1{1, 3] = "5.67"
LU1[2, 1] = "AK"; LU1[2, 2] = "Alaska"; LU1[2, 3] = "0.00"
LU1[3, 1] = "AR"; LU1[3, 2] = "Arkansas"; LU1[3, 3] = "6.25"
LU1[4, 1] = "AZ"; LU1[4, 2] = "Arizona"; LU1[4, 3] = "6.50"
// and so forth for the rest of the states
&lt;/pre&gt;

&lt;p&gt;With this array available to the form's elements, you can use programming to retrieve the information you need.&lt;/p&gt;

&lt;p&gt;The following &lt;i&gt;On Element Change&lt;/i&gt; program for the State Abbrev element looks for a match on the state abbreviation. If it finds it in the table, it fills the State Name and Tax Rate. The loop is stopped as soon as a match is found. If no match is found by the time the loop expires, the user is notified, the lookup elements are cleared, and the cursor is returned to State Abbrev:&lt;br /&gt;
&lt;pre&gt;
Var i as Int
Var foundit as Int
/*
The "Lookup Table" array was created and populated in Global Code. Now run a loop routine in the array until it finds first match on the State Abbrev field and returns the corresponding values to the other fields.
*/

If State Abbrev &lt;&gt; "" Then
{
	Foundit = 0
	State Abbrev = ToUpper(State Abbrev)
	i = 1
	While (i &lt;= 50) And (foundit = 0)
	{
		If LU1[i, 1] = State Abbrev Then
		{
			State Name = LU2[I, 2]
			Tax Rate = LU1[i, 3]
			foundit = 1
		}
		i = i + 1
	}
	If foundit = 0 Then
	{
		@Msgbox("'" + State Abbrev + " ' not found in table.", "", "")
		Clear(State Name, Tax Rate)
	}
}
&lt;/pre&gt;

&lt;p&gt;Another way to populate (fill) a Lookup Table is to have your programming read in a delimited external text file, parse the values in it, and distribute those values to the array. This way, when you want to update the information in the table, you simply edit the text file - you don't have to update your programming unless the number of columns and/or rows exceeds the array declaration. See the &lt;a href="http://www.lantica.com/support/kb/article/000248" target="_new"&gt;&lt;b&gt;Parsing a Delimited File&lt;/b&gt;&lt;/a&gt; and &lt;a href="http://www.lantica.com/support/kb/article/000250" target="_new"&gt;&lt;b&gt;Importing Records with Programming Only&lt;/b&gt;&lt;/a&gt; examples elsewhere in the Knowledge Base or in Appendix 2 of the Sesame Programming Guide.&lt;/p&gt;

&lt;p&gt;This, and other programming examples, can be found in Appendix 2 of the &lt;i&gt;Sesame Programming Guide.&lt;/i&gt;&lt;/p&gt;
</description><link>http://www.lantica.com/Support/kb/article/249</link><pubDate>Tue, 03 Apr 2012 14:49:19 GMT</pubDate><guid isPermaLink="false">9331aeaf64d248cf696dd4d833bc4d2d</guid></item><item><title>Importing Records Using Programming Only</title><description>&lt;p&gt;Automatically add new records to a database by importing them on-the-fly from a delimited ASCII file.&lt;/p&gt;

&lt;p&gt;The following program uses Sesame's &lt;i&gt;CreateNewRecord()&lt;/i&gt; command to automatically add new records to a database. It reads a delimited (ASCII) file and parses and distributes its data to the elements in the new records. It can be launched from a command button on the form as an "On Element Entry" program. This program accommodates any delimiter you choose to specify, as well as a "value" qualifier such as double quote marks. The only requirements are a consistent delimiter and a carriage return separating each record in the text file. See the comments within the program for more details.&lt;/p&gt;

&lt;blockquote&gt;&lt;strong&gt;Note:&lt;/strong&gt; When using a program like this, be careful to ensure that your programming parameters match the delimited text file you are importing. Otherwise, you could wind up with "garbage" records in the database. Test programs such as this on a copy of the database before being used in the actual database.&lt;/blockquote&gt;

&lt;p&gt;It is recommended that you use Sesame's import/export facilities for the routine importing of delimited text files into a database.  (See the section on importing data in the Sesame User Guide and the &lt;a href="http://www.lantica.com/support/kb/article/000246" target="_new"&gt;&lt;b&gt;Export/Import programming to/from a file&lt;/b&gt;&lt;/a&gt; article elsewhere in the Knowledge Base for more information.). The program below showcases Sesame's ability to process delimited text files and create new records from them with programming alone, as well as its uses for loops and arrays.&lt;/p&gt;

&lt;p&gt;
/* &lt;br /&gt;
Sample delimited text file parser program. Parses a delimited text file and creates new database records from it. Expects text file named C:\Sesame2\addresses.txt. Change to suit. Maximum 30 values per record (change to suit) in format such as:&lt;/p&gt;

&lt;p&gt;"Tim Jones", "123 Main St", "Irvine", "CA", "92566"&lt;br /&gt;
 &lt;blockquote&gt; -or-&lt;/blockquote&gt;
Tim Jones;123 Main St;Irvine,CA;92566&lt;br /&gt;
&lt;br /&gt;
This program expects Name, Address, City, State, and Zip fields. Change to suit.&lt;br /&gt;
&lt;br /&gt;
A consistent field delimiter is required along with 1 record per line in the text file.&lt;br /&gt;
*/&lt;/p&gt;

&lt;pre&gt;
var t as array[30] of string  //  Change to suit
var vFileHandle as Int
var vLine as String
var counter as Int
var nn as Int

Subroutine parseline()
var i as Int = 1
var vq as String = @Chr(34)  //  value qualifier (")
var fd as String = ", "    //  field delimiter

	// Initialize the Array values for each new record line
	For i = 1 to DimLimit(1, t)
		T[i] = ""
	Next
	// Reset Array Count
	i=1
&lt;/pre&gt;

&lt;p&gt;
/* &lt;br /&gt;
If text file does not contain a 'value qualifier' (vq) char such as quote (") then do not specify a value for vq in the above declare.&lt;br /&gt;
*/&lt;/p&gt;

&lt;pre&gt;
If vq &lt;&gt; "" Then
{
	If @Left(vLine, 1) - vq Then
	{
		vLine = @Replfir(vLine, vq, "")
      }
	If @Right(vLine, 1) = vq Then
	{
		vLine = @Repllas(vLine, vq, "")
	}
}
&lt;/pre&gt;

&lt;p&gt;/*&lt;br /&gt;
Use a delimiter unlikely to be part of any value in case actual delimiter is a comma or other character that could be part of value.&lt;br /&gt;
*/&lt;/p&gt;

&lt;pre&gt;
vLine = @Replace(vLine, vq + fd + vq, "|")

While @Len(vLine) &gt; 0
{
	T[i] = Split(vLine, "|")
	i = i + 1
}

End Subroutine

//####### MAIN PROGRAM #######

If @AskUser("Import C:\Sesame2\addresses.txt file", "and create new database records?", "") Then
{
	If not FileExists("C\Sesame2\addresses.txt") Then
	{
		@MsgBox("Sorry.", "Couldn't find Addresses.txt file.", "")
	}
	Else
	{
		vFileHandle = fileopen("C:\Sesame2\adresses.txt")
		If vFileHandle &gt;= 0
		{
			FileSeek(vFileHandle, 0)
			While FilePos(vFileHandle) &lt; FileSize(vFileHandle)
			{
				FileReadLn(vFileHandle, vLine)
				If @Len(vLine &gt; 20 Then
				{
					Parseline()
					nn = @CreateNewRecord()
					Name = t[1]
					Address = t[2]
					City = [3]
					State = t[4]
					Zip = [5]
					Counter = counter + 1
				}
			}
			FileClose(vFileHandle)
			@MsgBox("Imported " + counter + " records.", "", "")
		}
	}
}
Else
{
	@MsgBox("Import operation abandoned.", "", "")
}	
&lt;/pre&gt;

&lt;p&gt;This, and other programming examples, can be found in Appendix 2 of the &lt;i&gt;Sesame Programming Guide&lt;/i&gt;&lt;/p&gt;</description><link>http://www.lantica.com/Support/kb/article/250</link><pubDate>Tue, 03 Apr 2012 14:48:23 GMT</pubDate><guid isPermaLink="false">8e1914a8385ef285f3e841f2a9f0805e</guid></item><item><title>Parsing a Delimited File</title><description>&lt;p&gt;The following sample program can be used as a template for programs to parse delimited files, as well as for programs that create a database Lookup Table from the values in a delimited text file. (See the Sesame Programming Guide, or the &lt;a href="http://www.lantica.com/support/kb/article/000249" target="_new"&gt;&lt;b&gt;Creating and Using a Lookup Table&lt;/b&gt;&lt;/a&gt; article elsewhere in the Knowledge Base.)&lt;/p&gt;

&lt;p&gt;The example below opens a semicolon delimited file (myfile.txt), reads through it, and parses and distributes its values.&lt;/p&gt;

For this example, myfile.txt contains the following data:&lt;br /&gt;

&lt;pre&gt;
	Tom;Bill;Jim;Edna
	Janice;Alec;Mark;Cliff
	Fred;Greg;Linda;Joanne;
&lt;/pre&gt;

&lt;p&gt;The main program opens myfile.txt and sets the file position (FileSeek) to 0. A &lt;i&gt;While&lt;/i&gt; loop is then started, its condition being that the file position (FilePos) is less than the length of the file (FileSize).&lt;/p&gt;

&lt;p&gt;With each loop, the FileReadLn command reads the next line in the file, then the &lt;i&gt;parseline&lt;/i&gt; subroutine is called.&lt;/p&gt;

&lt;p&gt;Parseline prints the current line to the WriteLn window, then a &lt;i&gt;For-Next&lt;/i&gt; loop parses the values in the line, distributing them into the six-element array named "t". Each parsed value is then individually written to the WriteLn() window. When finished, the WriteLn window displays the following:&lt;br /&gt;

&lt;pre&gt;
	Tom;Bill;Jim;Edna
	Tom
	Bill
	Jim
	Edna
	Janice;Alec;Mark;Cliff
	Janice
	Alec
	Mark
	Cliff
	Fred;Greg;Linda;Joanne
	Fred
	Greg
	Linda
	Joanne	
&lt;/pre&gt;

&lt;p&gt;See &lt;a href="http://www.lantica.com/support/kb/article/000250" target="_new"&gt;&lt;b&gt;Importing Records with Programming Only&lt;/b&gt;&lt;/a&gt;  (elsewhere in the Knowledge Base, or Appendix 2 of the Sesame Programming Guide) for a program that processes a delimited file and creates new records from it for the database.&lt;/p&gt;

&lt;pre&gt;
/*
Delimited text file parser sample program.
Parses a semicolon-delimited text file named myfile.txt.
Each line in the file expected to contain six values,
in a format similar to any of these:

Jim;Tom;Edna;Jane
Jim,Tom,Edna,Jane
Jim Tom Edna Jane
Jim|Tom|Edna|Jane

Set vDelim variable below to appropriate delimiter
*/

Subroutine parseline()
var I as Int =1
	
	WriteLn(vLine)
	While @Len(vLine) &gt; 0
	{
		t[i] = Split(vLine, vDelim)
		WriteLn(t[i])
		i = i + 1
	}
End Subroutine

	vFileHandle = FileOpen("C:\Sesame\myfile.txt")
	If vFileHandle &gt;= 0
	{
		FileSeek(vFileHandle, 0)
		While FilePos(vFileHandle) &lt; FileSize(vFileHandle)
	{
		FileReadLn(vFileHandle, vLine)
		If vLine &lt;&gt; "" Then
		{
			Parseline()
		}
	}
	FileClose(vFileHandle)
}
Else
{
	WriteLn("Open failed: " + @Str(vFileHandle))
}
&lt;/pre&gt;

&lt;p&gt;This, and other programming examples, can be found in Appendix 2 of the &lt;i&gt;Sesame Programming Guide&lt;/i&gt;&lt;/p&gt;









</description><link>http://www.lantica.com/Support/kb/article/248</link><pubDate>Tue, 03 Apr 2012 14:46:44 GMT</pubDate><guid isPermaLink="false">c589c8f81dd4ccdcd32c31adbfc5303a</guid></item><item><title>Creating a Follow-Up Scheduler</title><description>&lt;p&gt;&lt;big&gt;&lt;strong&gt;Uses:&lt;/big&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt; 
   &lt;li&gt; Program a form to display a follow-up menu on demand (making the need to manually type in a follow-up date unnecessary).&lt;/li&gt;
   &lt;li&gt; Learn how to do "arithmetic" with data values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This sample program displays a pop-up selection list with the following callback intervals (change to suit):&lt;/p&gt;

&lt;code&gt;&lt;blockquote&gt;
Today, Tomorrow, Next Weekday, 5 days, 10 days, 15 days, 20 days, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday, User-entered date
&lt;/code&gt;&lt;/blockquote&gt;

&lt;p&gt;Because the @PopupMenu() function displays the list in alphabetical order, the days of the week selections follow a  &lt;i&gt;A-Monday, B-Tuesday...&lt;/i&gt; format, to keep them together and in proper sequence.&lt;/p&gt;

&lt;p&gt;When you make a selection (other than &lt;i&gt;User-entered date&lt;/i&gt;), Sesame automatically fills the CallbackDate field with the date that corresponds to it, then moves you to the next element on the form.&lt;/p&gt;

&lt;p&gt;The program can be attached to a Command Button's &lt;i&gt;On Element Entry&lt;/i&gt; event.&lt;/p&gt;

&lt;pre&gt;
var CallbackTemp as string

CallbackTemp = @PopupMenu("User-entered date;Today;Tomorrow;Next Weekday;5 Days;10 Days;14 Days;20 Days;A-Monday;B-Tuesday;C-Wednesday;D-Thursday;E-Friday;F-Saturday;G-Sunday", "SELECT A CALL BACK DATE");

If @Instr(CallbackTemp, "-") = 3 Then
{
	CallbackTemp = @Del(CallbackTemp, 1, 4);
	If @Dow$(@Date + 1) = CallbackTemp Then CallbackDate = @Date + 1
	Else if @Dow$(@Date + 2) = CallbackTemp Then CallbackDate = @Date + 2
	Else if @Dow$(@Date + 3) = CallbackTemp Then CallbackDate = @Date + 3
	Else if @Dow$(@Date + 4) = CallbackTemp Then CallbackDate = @Date + 4
	Else if @Dow$(@Date + 5) = CallbackTemp Then CallbackDate = @Date + 5
	Else if @Dow$(@Date + 6) = CallbackTemp Then CallbackDate = @Date + 6
	Else if @Dow$(@Date + 7) = CallbackTemp Then CallbackDate = @Date + 7
	CNext
}

If CallbackTemp = "User-entered date" Then
{
	@Msg("Type in the Callback Date and press Enter")
	Clear(CallbackDate)
	Goto CallbackDate
}

If CallbackTemp = "Today" Then
{
	CallbackDate = @Date
	CNext
}

If CallbackTemp = "Tomorrow" Then
{
	CallbackDate = @Date + 1;
	CNext
}

If CallbackTemp = "Next Weekday" Then
{
	If @Dow$(@Date) = "Friday" Then CallbackDate = @Date + 3
	Else If @Dow$(@Date) = "Saturday" Then CallbackDate = @Date + 2
	Else CallbackDate = @Date + 1
	CNext
}

If CallbackTemp = "" Then
{
	ThrowFocus(CallbackDate)
}
Else
{
	CallbackDate = @Date + Tn(@Num(CallbackTemp))
}
&lt;/pre&gt;

&lt;p&gt;&lt;i&gt;&lt;b&gt;By placing the following optional program in the "On Element Change" event for CallbackDate, you'll be alerted if you accidently enter a date that's in the past, or too far in the future:&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;

&lt;pre&gt;
If CallbackDate &gt; @Date + 30 Then
{
        If @AskUser("Follow-up date is more than 30 days away!", "Do you really want to leave it that way?", "") Then
	{
		CNext
	}
}
Else
{
	ThrowFocus(CallbackDate)
}

If CallbackDate &lt;&gt; "" Then
{
	If CallbackDate &lt; @Date Then
	{
                If @AskUser("Follow-up date is earlier than today!", "Do you really want to leave it that way?", "") Then
	{
		CNext
	}
	Else
	{
		ThrowFocus(CallbackDate)
	}
	}
}
&lt;/pre&gt;

&lt;p&gt;This, and other programming examples, can be found in "Appendix 2: Advanced Programming Examples" in the &lt;i&gt;Sesame Programming Guide&lt;/i&gt;&lt;/p&gt;</description><link>http://www.lantica.com/Support/kb/article/255</link><pubDate>Tue, 03 Apr 2012 14:45:14 GMT</pubDate><guid isPermaLink="false">a4c47c54d23c9518076dedd3c0a92509</guid></item><item><title>Setting Up The Sesame ODBC (Open Database Connectivity) drive on Windows 7 (64-bit)</title><description>&lt;p&gt;&lt;b&gt;&lt;i&gt;"How can I set up the Sesame ODBC  drive on Windows 7, 64-bits? I am using a 32 bit program Crystal Report that I want to connect to Sesame with ODBC driver."&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Be very careful in following these steps:&lt;/p&gt;

&lt;ol&gt;
        &lt;li&gt;Copy sesodbc.dll from the Setup32 directory to C:\Windows\SysWOW64&lt;/li&gt;
	&lt;li&gt;Open the Windows Registry Editor&lt;/li&gt;
	&lt;li&gt;Make a backup of every key before you change it just in case&lt;/li&gt;
	&lt;li&gt;Browse to HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI\ODBC Drivers&lt;/li&gt;
	&lt;li&gt;Right click on ODBC Drivers and choose New-&gt;String Value&lt;/li&gt;
	&lt;li&gt;Name the new string value "Sesame ODBC Driver", without the quotes.&lt;/li&gt;
	&lt;li&gt;Set the value data of that new string value to "Installed", without the quotes.&lt;/li&gt;
	&lt;li&gt;Browse to HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI&lt;/li&gt;
	&lt;li&gt;Right click on ODBCINST.INI and choose New-&gt;Key&lt;/li&gt;
	&lt;li&gt;Name the new key "Sesame ODBC Driver", without the quotes.&lt;/li&gt;
	&lt;li&gt;Right Click on Sesame ODBC Driver and choose New-&gt;String Value&lt;/li&gt;
	&lt;li&gt;Name the new string value "Driver", without the quotes.&lt;/li&gt;
	&lt;li&gt;Set the value data of Driver to "C:\Windows\SysWOW64\sesodbc.dll", without the quotes.&lt;/li&gt;
	&lt;li&gt;Right Click on Sesame ODBC Driver and choose New-&gt;String Value&lt;/li&gt;
	&lt;li&gt;Name the new string value "Setup", without the quotes.&lt;/li&gt;
	&lt;li&gt;Set the value data of Driver to "C:\Windows\SysWOW64\sesodbc.dll", without the quotes.&lt;/li&gt;
	&lt;li&gt;Right Click on Sesame ODBC Driver and choose New-&gt;String Value&lt;/li&gt;
	&lt;li&gt;Name the new string value "CPTimeout", without the quotes.&lt;/li&gt;
	&lt;li&gt;Set the value data of Driver to "&lt;not pooled&gt;", without the quotes.&lt;/li&gt;
	&lt;li&gt;Close the windows Registry Editor&lt;/li&gt;
	&lt;li&gt;Open a command line and browse to C:\Windows\SysWOW64\&lt;/li&gt;
	&lt;li&gt;Type "odbcconf REGSVR C:\Windows\SysWOW64\sesodbc.dll"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At this point, you should see the Sesame under the Drivers tab when you execute C:\Windows\SysWOW64\odbcad32.exe&lt;/p&gt;
</description><link>http://www.lantica.com/Support/kb/article/257</link><pubDate>Tue, 03 Apr 2012 14:37:20 GMT</pubDate><guid isPermaLink="false">3111eb6c1fe988ae1c5a5ba29bf867c6</guid></item><item><title>Accurately Adjust the Width of a Table-View Subform</title><description>&lt;p&gt;A Table-View Subform shows subrecords arranged in a table or spreadsheet-like view. There are scroll-bars to view other parts of the subform if it cannot be seen. A good example of this is the &lt;i&gt;Cities&lt;/i&gt; subform within the &lt;i&gt;Countries&lt;/i&gt; sample database provided with Sesame.  &lt;/p&gt;

&lt;p&gt;To correctly adjust the width of the subform table follow this simple formula:&lt;br / &gt;
&lt;code&gt;Table row header width + Combined widths of subform LEs + Vertical scrollbar width&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The &lt;b&gt;Table row header width&lt;/b&gt; can be set using the sesame.ini file (see &lt;i&gt;Appendix 7&lt;/i&gt; of the&lt;i&gt; Sesame User Guide&lt;/i&gt; for more information on all the possible .ini file entries):&lt;/p&gt;
&lt;p&gt;&lt;font face="verdana"&gt;
TABLE ROW HEADER WIDTH: Sets the width in pixels of the record number column appearing in Table View and Table View Subforms.&lt;br /&gt;	
Example: TABLE ROW HEADER WIDTH: 50&lt;br /&gt;
Default: 70
&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;The &lt;b&gt;Combined widths of subform LEs&lt;/b&gt; (layout elements) can be found by opening the form in SDesigner. Using the Countries.db as an example, you would open this database, and then open the "Cities" subform. There are two LEs in this subform: "City" and "Population". Under the Look/Position tab in the Property Viewer window, you will find each of the element's widths. Adding these measurements together gives you the combined widths of the subform LEs (City=&lt;b&gt;140&lt;/b&gt; + Population=&lt;b&gt;80&lt;/b&gt; = &lt;b&gt;220&lt;/b&gt;).&lt;/p&gt;

&lt;p&gt;The &lt;b&gt;Verticle scrollbar width&lt;/b&gt; on a table subform is 19.&lt;/p&gt;

&lt;p&gt;Therefore, your formula, using the Countries.db as an example would be:&lt;/p&gt;

&lt;p&gt;&lt;b&gt;70 + 220 + 19 = 309&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Thus, the &lt;i&gt;Cities&lt;i&gt; table-view subform will need to be at least 309 pixels long. (Almost every measurement in Sesame refers to the number of pixels, not including some widths in Reports and the PrintString command.)&lt;/p&gt;
</description><link>http://www.lantica.com/Support/kb/article/256</link><pubDate>Tue, 03 Apr 2012 14:27:04 GMT</pubDate><guid isPermaLink="false">6440c594522fe2ebdff3e75a040ffbd3</guid></item><item><title>Loop through all the LE's in a record to make them all read-only</title><description>&lt;pre&gt;
#include "sbasic_include.sbas"
var vElements as String
vElements = @StringArrayElementList()

If key &lt; 1000 then
{
	StringArrayAttributes(vElements, ATTR_ID_READ_ONLY, 1)
}
Else
{
	StringArrayAttributes(vElements, ATTR_ID_READ_ONLY, 0)
}
&lt;/pre&gt;
</description><link>http://www.lantica.com/Support/kb/article/254</link><pubDate>Tue, 03 Apr 2012 13:51:10 GMT</pubDate><guid isPermaLink="false">5d3c00355fe363050e45df5d365806cb</guid></item><item><title>Documentation addition to @SpecCommand</title><description>&lt;p&gt;The documentation for the @SpecCommand is insufficient in the Sesame Programming Guide. To run an export, this command requires more arguments than the documentation shows: (filename, custom separator, custom delimiter, tabbed, custom, no separator, ignore fixed, all, none, header). These correspond to the fields in the export dialog and the RunExportSpec command. Below is an example of how to export a set of data from a file. Spec is saved as "All Data".&lt;/p&gt;

&lt;pre&gt;
#include "sbasic_include.sbas"
var vRt as String
/*
Arguments:
Filename
Custom separator character
Custom delimiter character
Tabbed
Use custom separator
No separator
Ignore fixed
All
None
Use custom delimiter
Header
*/
	vRt = @SpecCommand(SPEC_OPERATION_LOAD, SPEC_TYPE_EXPORT, "All Data")
	vRt = @SpecCommand(SPEC_OPEATION_RUN, SPEC_TYPE_EXPORT, myfile.txt, ";", "", "0", "1", "0", "1", "0", "1", "0", "0") 
&lt;/pre&gt;
</description><link>http://www.lantica.com/Support/kb/article/253</link><pubDate>Tue, 03 Apr 2012 13:46:35 GMT</pubDate><guid isPermaLink="false">2b35f73b0bd47267130f7d7ac41a8f40</guid></item><item><title>Download Sesame Documentation (Guides, Manuals, etc.)</title><description>&lt;p&gt;Your Sesame Application should be accompanied by all of the appropriate documentation upon download. Looking in your Sesame2 folder (usually found on your local hard drive - usually the C: drive - or wherever the application was downloaded to) you should see another folder named "Docs". In this folder you should see PDF versions of:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;The User Guide&lt;/li&gt;
	&lt;li&gt;The Programming Guide&lt;/li&gt;
	&lt;li&gt;The Quick-Start Tutorial&lt;/li&gt;
	&lt;li&gt;The Q&amp;A Translation Guide&lt;/li&gt;
	&lt;li&gt;Sample Word Merge Documents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To download these manuals, go to: &lt;a href="http://lantica.com/Support/downloads.html" target="_new"&gt;Lantica.com/Support/downloads.html&lt;/a&gt;. You will need to enter your Customer Number and Password under the "Existing Users" section. (If you no longer have, or cannot remember, this information - contact &lt;a href="mailto:customer_service@lantica.com?Subject=Customer # / Password Request"&gt; Customer Service&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once you have entered this information, you will be taken to a page with all of the available Sesame Plus downloads. For the documentation listed above, click on "Sesame 2.0 Manuals".&lt;/p&gt;

&lt;p&gt;From here, you can also download the Sesame Errata and Changes (changes/corrections made to the existing Sesame documentation), the supplemental manual for the Command Button Menu (earlier versions of Sesame displayed menus in a tree-like style, whereas the newest version displays these menus in the Command Button style), sample Sesame Applications, Sesame dictionary files (for spell-check features), and the SBasic Include file for programming - among others. &lt;/p&gt;</description><link>http://www.lantica.com/Support/kb/article/252</link><pubDate>Mon, 02 Apr 2012 18:06:08 GMT</pubDate><guid isPermaLink="false">fb7befd8053f927957459713948de3c0</guid></item><item><title>Change the background color of a Checkbox depending on its value</title><description>&lt;p&gt;You can accomplish this by programming the On Draw events of the checkboxes
so that they change their background color depending on their value. This code changes the background color from white to gray depending on the value as you click the checkbox.&lt;/p&gt;

&lt;pre&gt;
If @IsBlank(MycheckBox) Then
{
	RGBColor(MyCheckBox, -1, -1, -1, 122, 122, 122)
}
Else
{
	RGBColor(MyCheckBox, -1, -1, -1, 255, 255, 255)
}
&lt;/pre&gt;
</description><link>http://www.lantica.com/Support/kb/article/251</link><pubDate>Mon, 02 Apr 2012 17:58:23 GMT</pubDate><guid isPermaLink="false">a1f82f054df81e8c89ccf59d13b2795d</guid></item><item><title>Export/Import programming to/from a file</title><description>&lt;p&gt;You can export all of your programming in a Sesame database form to a standard text file for review or editing with any text editor. (Available on the &lt;i&gt;File&lt;/i&gt; menu of the Program Editor) With some programming already in the form, select &lt;i&gt;File/Export All to Text File&lt;/i&gt;. The Program Editor will display a Programming File dialog box. Name the file, adding the ".pgm" extension, and click OK.&lt;/p&gt;

&lt;p&gt;The file that is saved is a plain text file. When editing the file outside of Sesame, it is important that you do not modify the heading line for each programming function:&lt;/p&gt;

&lt;pre&gt;
** PROGRAMMING SECTION: [INVOICE #] {On Element Change] **
If @IsBlank(Invoice #)
{
	Invoice # = @Number
}
&lt;/pre&gt;

&lt;p&gt;These are the lines that starts/end with **. They are the keys that tell Sesame where to place the programming when you import the file.&lt;/p&gt;

&lt;p&gt;Importing is done the same as exporting. From the Program Editor's File Menu, select &lt;i&gt;File/Import from Text File&lt;/i&gt;. The same dialog will display showing all files with a ".pgm" extension. If you gave your file a different extension, drop down the Show window and change it to display &lt;i&gt;All Files&lt;/i&gt;.&lt;/p&gt;

&lt;blockquote&gt;&lt;b&gt;Note:&lt;/b&gt; When you import a file into the Program Editor, any element listed in the imported file will overwrite any programming for that element in the editor. Any existing programming in an element/event programming slot in the editor that is not addressed in the imported file will remain unchanged.&lt;/blockquote&gt;

&lt;p&gt;See also: &lt;a href="http://www.lantica.com/support/kb/article/000247" target="_new"&gt;&lt;b&gt;Save All Programs Attached to a Layout to a Disk File&lt;/b&gt;&lt;/a&gt;.</description><link>http://www.lantica.com/Support/kb/article/246</link><pubDate>Mon, 02 Apr 2012 15:34:17 GMT</pubDate><guid isPermaLink="false">c572944e61b87f98465048eaf5558753</guid></item><item><title>Save All Programs Attached to a Layout to a Disk File</title><description>&lt;p&gt;You can optionally save all the programs attached to your current layout to a disk file without leaving the Program Editor. At any time, you can click the Program Editors File menu then click &lt;i&gt;Exports All to Text File&lt;/i&gt;. Type a valid path, followed by a filename, then click &lt;i&gt;Accept&lt;/i&gt;. Sesame will save all your programming to a plain text file, and include a heading for each separate program. In the following example, "Merge Letters" is the name of the programmed form element, and "On Element Entry" is the even that triggers the programming.&lt;/p&gt;

&lt;pre&gt;
** PROGRAMMING SECTION:  [Merge Letters] [On Element Entry] **
Var vLetter as String	// The name of the selected merge letter
Var vAllText as String	// The entire text of the merge doc
Etc...
&lt;/pre&gt;

&lt;p&gt;When saving a program to file this way, name the file descriptively, so that you can later tell from the filename which database and layout it came from. Programming saved to a file in this manner can be easily opened in a text editor and then copied and pasted in the Program Editor of the same or another Sesame application.&lt;/p&gt;

&lt;p&gt;See also: &lt;a href="http://www.lantica.com/support/kb/article/000246" target="_new"&gt;&lt;b&gt;Export/Import programming to/from a file&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;</description><link>http://www.lantica.com/Support/kb/article/247</link><pubDate>Mon, 02 Apr 2012 15:31:59 GMT</pubDate><guid isPermaLink="false">244e13e05c0c3f2188b6aca41c04bef9</guid></item><item><title>Create a Command Button that adds a bullet point in a field</title><description>&lt;p&gt;After creating a Command Button on your Form add the following:&lt;/p&gt;

&lt;pre&gt;
// Where the name of the field in which you wish to add the bullet is called "Notes"
Notes = Notes + @Char(149)
&lt;/pre&gt;

</description><link>http://www.lantica.com/Support/kb/article/245</link><pubDate>Thu, 29 Mar 2012 18:13:39 GMT</pubDate><guid isPermaLink="false">f65b29544e7103037e80d882a2534f6f</guid></item><item><title>SBasic Command Families</title><description>&lt;p&gt;&lt;i&gt;For a full list of the commands in each family, as well as examples see the Sesame Programming Guide&lt;/i&gt;&lt;/p&gt;

&lt;h2&gt;Array Commands&lt;/h2&gt;
&lt;h3&gt;&lt;i&gt;Formal Array Information&lt;/i&gt;&lt;/h3&gt;
&lt;p&gt;If you have declared an array (see the &lt;i&gt;Variables&lt;/i&gt; section in the Sesame Programming Guide), commands such as &lt;i&gt;Dims&lt;/i&gt;, &lt;i&gt;DimLimit&lt;/i&gt;, &lt;i&gt;ElementType&lt;/i&gt; can return information about its dimensions and type. Formal arrays require that you know in advance how large your array needs to be. In situations where the dimensions may vary, SBasic provides Dynamic Arrays (below).&lt;/p&gt;

&lt;h3&gt;&lt;i&gt;Generic Arrays&lt;/i&gt;&lt;/h3&gt;
&lt;p&gt;A Generic Array is a reference to an existing array variable, and can be used to sort an array of &lt;i&gt;any&lt;/i&gt; element type. Because it is a reference to the array, rather than the array itself, SBasic does not have direct access to it. Use a Generic Array only if you want to pass an array to another function as an argument.&lt;/p&gt;

&lt;p&gt;SBasic includes a set of access functions that can get values from a Generic Array and set elements (values) in arrays. To get an idea of how these functions can be used in a subroutine designed for generic arrays, see the &lt;i&gt;Using Generic Arrays&lt;/i&gt; sample program in &lt;i&gt;Appendix 2&lt;/i&gt; of the Sesame Programming Guide.&lt;/p&gt;

&lt;h3&gt;&lt;i&gt;Dynamic Arrays&lt;/i&gt;&lt;/h3&gt;
&lt;p&gt;Dynamic Arrays are not variables that you declare. They are created, destroyed and accessed using SBasic functions. They allow you to create and use arrays that are sized at runtime based on factors such as field value or the result of a calculation.&lt;/p&gt;

&lt;h3&gt;&lt;i&gt;String Arrays&lt;/i&gt;&lt;/h3&gt;
&lt;p&gt;In many situations, you might find StringArrays more intuitive and easier to deal with than the more formal arrays above. A StringArray is simply a list separated values (usually by a semicolon(;)).The String Array family of commands provides powerful tools to work with this list &lt;/p&gt;

&lt;p&gt;&lt;pre&gt;
var aa as string
	aa = "one;two;three;four"
&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;This could also be a string array of field/layout element names, items for a selection list, etc. When creating string arrays, care must be taken to avoid spaces on either side of the semicolon separator.&lt;/p&gt;

&lt;p&gt;Using StringArray commands  you can: find/get one or more values out of a the list, add/edit/delete values in the list, change the order of the values in the list, find out how many values are in the list, strip the duplicate values out of the list, change the separator, or work with more than one list at a time.&lt;/p&gt;

&lt;h2&gt;Binary Math Commands&lt;/h2&gt;
&lt;p&gt;Allow you to operate on the individual bits in an integer. Very valuable for storing a series of yes/no choices in a very compact way.&lt;/p&gt;

&lt;h2&gt;Date/Time Commands&lt;/h2&gt;
&lt;p&gt;Use these to get and work with dates and times. Can be used to work with dates and times that appear in your own data, to return values from your local or server computer, as well as return portions of dates, such as the month or day of the week. &lt;/p&gt;

&lt;p&gt;Sesame's internal date format is YYYY/MM/DD. If you use Text/String functions such as @Right or @Left to operate on dates, you should do so using this format. For example, to assemble a date which is the first day of the current month:&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;var vTheFirst as Date
	vTheFirst = @Left(@Date, 8) + "01"
&lt;/pre&gt;&lt;/p&gt;

&lt;h2&gt;Drawing Commands&lt;/h2&gt;
&lt;p&gt;Provide a number of low level drawing capabilities that allow you to draw directly on your forms. Typically, each command accepts an element and a set of pixel coordinates. The element serves as an "anchor" point for the drawing. The coordinates are relative to the position of this element, though the drawing is not limited to the confines of the element. Once a drawing is done, it will be remembered and refreshed when the form is drawn until you either clear the drawing or close the form.&lt;/p&gt;

&lt;p&gt;Use drawing commands to provide information or visual representations of your data. Allow you to draw a variety of pictures, charts, predefined or user-defined shapes, text on your forms to provide messages/instructions, and control the color and font of drawn items.&lt;/p&gt;

&lt;h2&gt;Element Attributes Commands&lt;/h2&gt;
&lt;p&gt;These are the properties of layout elements, including color, position, etc. Provide tools you can use to control the look and some of the behaviors of your forms and reports as they are used.&lt;/p&gt;

&lt;p&gt;Some Element Attribute commands operate on individual elements. These can be used to do things like make an element visible based on the User ID, change the color of an element, or set search criteria that will be filled in if you return to the Retrieve Spec. Many of these attributes already have separate commands (such as Visibility) that can be used, but this family of commands allow you to affect any attribute of an element by learning only one command, even if more attributes are added to elements later on.&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;
// Change the label of an element
#include "sbasic_include.sbas"

	Attribute(Company, ATTR_ID_LABEL, "Company Name")
	ForceRedraw()&lt;/pre&gt;&lt;/p&gt;
&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Some Element Attribute commands allow you to work on a single element, while others operate on groups of elements. The latter allow you to affect settings like ReadOnly or Visibility on your entire form, or create custom Undo capabilities. For a list of modifiable element attributes, see the Sesame Programming Guide.&lt;/p&gt;

&lt;h2&gt;Element Reference Commands&lt;/h2&gt;
&lt;p&gt;Many SBasic commands require a reference to the actual element as an argument (as opposed to the value in that element), such as the Element Attribute and the User Interface commands. Element Reference commands return and work with references to the elements on your form, allowing you to create generic ways to provide element references to other commands that require them. Using this family of commands you can get and use a list of element names based on different criteria, get information about an element, and create and manage a reference to an element.&lt;/p&gt; 

&lt;h2&gt;Event Management Commands&lt;/h2&gt;
&lt;p&gt;These provide control over how Sesame handles different events, such as a key being pressed. They also allow you to trigger your SBasic event programming without actually causing the event itself, for example, triggering a command button on a different form. With this family of commands you can control which keystrokes Sesame responds to, set a program to run on a timer, tell Sesame to notice additional events and run a program when they occur, get information about the last event, and trigger code on other forms.&lt;/p&gt;

&lt;h2&gt;External Database Application Management Commands&lt;/h2&gt;
&lt;p&gt;There are several families of External Database Application management commands or "X-Commands". Each family serves a different purpose, but they all operate on records in an external database - which may be in a different application, another database in the current application, or even the same database in which you are currently working. &lt;/p&gt;

&lt;h3&gt;&lt;i&gt;Application Commands&lt;/h3&gt;&lt;/i&gt;
&lt;p&gt;Using the Application commands you can load (open) and unload external applications (&lt;i&gt;DeferredOpenApplication, UnloadApplication&lt;/i&gt;).&lt;/p&gt;  

&lt;h3&gt;&lt;i&gt;XResultSet Commands&lt;/h3&gt;&lt;/i&gt;
&lt;p&gt;The XResultSet family of commands are the most flexible of the X-commands. If you are using any other commands for external database access, consider using these instead - they allow you to retrieve records, get and set values, delete records, reparent natural child records, and more. Because these commands access the database records directly, you don't need a form to do things like mass update a group of records, sort, or even run a report. They are also faster than the other X-commands, in most cases. The XResultSet commands also provide flexible search criteria.&lt;/p&gt;

&lt;p&gt;To use these commands, first get a result set by using a command like @XResultSetSearch. Then, use the handle (a number that tells Sesame which group of records you want to work with) that is returned in the other XResultSet commands you call. When you are finished with a particular group of record, release your result set with XResultSetClose.&lt;/p&gt;

&lt;p&gt;In addition to the above, using these commands you can also manage and navigate the records in a result set, get and change values in the result set records, and print a report in an external database.&lt;/p&gt;

&lt;h3&gt;&lt;i&gt;X-Lookup Commands&lt;/h3&gt;&lt;/i&gt;
&lt;p&gt;The commands in the X-Lookup family retrieve values from an external database. They differ in the number of records they return, the number of values from each record they return, and what they do with the returned values. Some of the commands in this family include &lt;i&gt;statement&lt;/i&gt; as well as &lt;i&gt;function versions&lt;/i&gt;. Statements do not return a value. Functions make the retrieved value available. (For more on statements and functions, see the &lt;i&gt;XLookup Commands&lt;/i&gt; section in the Sesame Programming Guide). The &lt;i&gt;function&lt;/i&gt; versions of the "X" family commands are more versatile than their &lt;i&gt;statement&lt;/i&gt; counterparts. For example, you can place an @XLookup function inside another function which then uses the retrieved value in further processing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; If an "X" family &lt;i&gt;statement&lt;/i&gt; cannot retrieve the external value, the target or destination element will remain unchanged. In contrast, if an "X" family &lt;i&gt;function&lt;/i&gt; is unsuccessful, it will return an empty value (""), and the target of the assignment, if any, will be blanked. For this reason, these functions should be used with a &lt;i&gt;conditional&lt;/i&gt;, such as&lt;i&gt; If something&lt;/i&gt; &lt;&gt; "" (is not blank) &lt;i&gt;then&lt;/i&gt; do the lookup. The something is usually a reference to the key in the current record that the program will use to find the matching external record. If the &lt;i&gt;key&lt;/i&gt; is blank, the function will return a blank value. In such a case, you might &lt;i&gt;not&lt;/i&gt; want the existing value in the current record to be changed (blanked).&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Most of the commands in this family take four arguments - &lt;i&gt;filename, key, ext_key, &lt;/i&gt;and &lt;i&gt;source&lt;/i&gt;. A few also take a fifth -&lt;i&gt; target&lt;/i&gt;. For an explanation of these arguments, see the Sesame Programming Guide.&lt;/p&gt;

&lt;p&gt;With this family of commands you can: get a single value from the first matching record, get a single value from all matching records, get multiple values from the first matching record, and get multiple values from all matching records.&lt;/p&gt;

&lt;h2&gt;File I/O Commands&lt;/h2&gt;
&lt;p&gt;Allow you to create, append to, read and delete external text files from programming. With these commands you can generate entries in a log file when certain conditions are (or aren't) met, store and update subsidiary information in plain text files and bring them into your applications, read the contents of a delimited text file into an SBasic array, parse out the individual values, then distribute them to your database elements, as well as many others.&lt;/p&gt;

&lt;h2&gt;Financial Commands&lt;/h2&gt;
&lt;p&gt;The financial commands provide functions that are specific to financial calculations, such as loans, amortization and interest calculations.&lt;/p&gt;

&lt;h2&gt;Forms/Records Commands&lt;/h2&gt;
&lt;p&gt;Provide tools for you to manage your form values, subform values, records and result set navigation from SBasic. In general, commands that begin with "Form" or "@Form" allow you to specify a particular form. Those that do not - operate on the current form. This family of commands allows you to work with values or records, and navigate result sets.&lt;/p&gt;

&lt;h2&gt;Macros and Program Control Commands&lt;/h2&gt;
&lt;p&gt;Provides essential tools for automating your applications. Macro commands run a macro. Program control commands perform an automation task, or transfer focus and program control to another element. &lt;/p&gt;

&lt;h2&gt;Mathematical Commands&lt;/h2&gt;
&lt;p&gt;Provides a variety of mathematical functions. In addition to general math, these functions also include trigonometry, the ability to round numeric values, work with a list of numeric values, and generate a random number.&lt;/p&gt;

&lt;h2&gt;Menu Tree Commands&lt;/h2&gt;
&lt;p&gt;Enable the programmer to manipulate the items on Sesame's Command Menu tree. They allow you to control which commands are available and how they appear. They can be used in conjunction with @UserID, @Group and/or @UserParameter to make different menu choices available to different users.&lt;/p&gt;

&lt;h2&gt;Network Commands&lt;/h2&gt;
&lt;p&gt;These commands can be used to interact with websites, manage email, communicate with other Sesame servers, etc. They include email, alternate Sesame server, FTP, HTTP, and TCP/IP.&lt;/p&gt;

&lt;h2&gt;Operating System Commands&lt;/h2&gt;
&lt;p&gt;Allow you to interact with your operating system to perform tasks like file management and work with external programs.&lt;/p&gt;

&lt;h2&gt;Printing Commands&lt;/h2&gt;
&lt;p&gt;If you want to enhance an application by adding the ability for users to print merge letters, data, summaries, reports or formatted documents on-the-fly, this family of commands has the tools. These commands also include easy ways to merge your data into external documents and to print out your forms as well as controlling print settings, getting information about the current page, and selecting a printer.&lt;/p&gt;

&lt;h2&gt;Reports Commands&lt;/h2&gt;
&lt;p&gt;Most of SBasic works in almost any context, however, there are a few commands that apply specifically to reports. With these commands you can: make a report break based on whatever criteria you want, print out a report with or without user interaction, and postprocess the HTML in a report before it's sent to the printer.&lt;/p&gt;

&lt;h2&gt;Spec Management Commands&lt;/h2&gt;
&lt;p&gt;When you retrieve records, sort, import, export, etc., you use a Spec to set the options and specific behavior for the task. Outside of SBasic, you work with your Specs using the Spec Manager and the Spec Window. To work with your Specs in programming, you use the Spec Management commands. Each type of Spec has a pair of SBasic commands to load and run that type of Spec. There is also a single command that can load and run any kind of Spec, as well as performing a variety of other operations.&lt;/p&gt;

&lt;h2&gt;State Information Commands&lt;/h2&gt;
&lt;p&gt;"State" refers to "how things are now".&lt;br /&gt;
The State Commands are designed to answer questions such as:&lt;br /&gt;
"What mode am I in?"&lt;br /&gt;
"Which database is this?"&lt;br /&gt;
"Who is using me now?"&lt;br /&gt;
"What was the last Invoice Number used?"&lt;br  /&gt;
"Are things changed/blank/unique?"&lt;br  /&gt;
"What is my Form doing/allowed to do?"&lt;br /&gt;
"Did an error just occur?"           &lt;br /&gt;                ...and so on&lt;/p&gt;


&lt;h2&gt;Text/String Commands&lt;/h2&gt;
&lt;p&gt;Works with pieces of text, also called &lt;i&gt;strings&lt;/i&gt;. Many SBasic programming tasks involve taking apart, putting together or otherwise manipulating text. These commands provide the tools to do so. With Text/String commands you can: measure, replace or remove part of, find something in, or change the look of the text, as well as produce particular characters.&lt;/p&gt;

&lt;h2&gt;Typecast Commands&lt;/h2&gt;
&lt;p&gt;Explicitly instruct Sesame to treat a particular value as a certain type. This is important when working with different types of values. Sesame will try to guess what you intend, but it is better to not make computers guess. These commands are useful for adding a piece of text to a number, concatenating two numbers together (rather than adding them), or subtracting dates to get the numbers of days between them.&lt;/p&gt;

&lt;h2&gt;User Interaction Commands&lt;/h2&gt;
&lt;p&gt;Communicating with the user is a common programming requirement. This command family offers the tools for getting and giving information. You can show a message, ask for information, offer a list of choices, make your own custom dialog box, and intercept keystrokes.&lt;/p&gt;

&lt;h2&gt;User Interface Commands&lt;/h2&gt;
&lt;p&gt;Provides tools to control how the Sesame interface looks and what options it offers you as you work. Also includes tools to control the look and behavior of your forms.&lt;/p&gt;

&lt;h3&gt;&lt;i&gt;Element Commands&lt;/i&gt;&lt;/h3&gt;
&lt;p&gt;Affect elements that you create on your Forms and Reports. For example you can: change the look, size, position or behavior of your elements. You will also find additional commands for Text, Subform, Tab Group, Image, and List elements (such as Combo Boxes and List Boxes).(See the &lt;i&gt;Element Attributes Commands&lt;/i&gt; for a wider range of controllable attributes.) &lt;/p&gt;

&lt;h3&gt;&lt;i&gt;Menubar, Application Menu and Command Tree Commands&lt;/i&gt;&lt;/h3&gt;
&lt;p&gt;Affect parts of Sesame itself, including the menubar and the Command Tree. With these commands you can: show a panel of customized buttons instead of the Command Tree, change the Sesame Menu Bar or Command Tree state, and make a different Sesame Tab than the Application Menu the default Sesame Tab.&lt;/p&gt;

&lt;h3&gt;&lt;i&gt;Sesame Interface Commands&lt;/i&gt;&lt;/h3&gt;
&lt;p&gt;Commands to change the behavior of the Sesame interface. With these commands you can: change the wording or language of Sesame interface elements, enable/disable warnings, change where a popup list appears, or play a sound.&lt;/p&gt;

&lt;h3&gt;&lt;i&gt;Memory Menu Commands&lt;/i&gt;&lt;/h3&gt;
&lt;p&gt;List of values that appears when you press Alt-Enter. Normally, Sesame maintains this list for you, but you can control it with the commands in this section.&lt;/p&gt;

&lt;h2&gt;XML Commands&lt;/h2&gt;
&lt;p&gt;Because XML is an extremely common format, the XML files used and created by Sesame are useable in many other applications and programs, and vice-versa. Unlike HTML, which has a set of predefined tags, XML allows the author to define their own tags and notes, based on the needs of their application. These commands are able to read, create and parse XML file formats.&lt;/p&gt;</description><link>http://www.lantica.com/Support/kb/article/244</link><pubDate>Thu, 29 Mar 2012 17:22:24 GMT</pubDate><guid isPermaLink="false">ecc5899793c23c532f552d5d8503d93a</guid></item><item><title>Natural vs. Relational Linking</title><description>&lt;p&gt;Subforms offer two different types of linking: &lt;i&gt;Natural&lt;/i&gt; and &lt;i&gt;Relational&lt;/i&gt;. Natural linking is the default. While natural linking has the advantage being simple and fast, it is also inflexible. Once a record is set as a child of another record, it cannot be moved to be a child of a different parent record. The parent record can delete its children, or add more children, but it cannot share a child with another parent record. This can lead to data normalization problems. To remedy this, Sesame also provides relational linking.&lt;/p&gt;

&lt;p&gt;Relational linking retains the same parent/child relationship as natural linking. The difference is in the method by which any particular parent record recognizes its child records. Where natural linking has a direct pointer from the parent record to the child record, relational linking provides the addition of &lt;i&gt;Key Field&lt;/i&gt; set. This key field set stores the name of a field in the parent and the name of a field in the child. For any of the records that are of the correct type to be considered a child of a particular parent record, the data in the parent's key field and the child key field must match. Relational linking is even more flexible than a simple match between two fields. The parent's key field acts as "Retrieve Spec" and can use the same syntax as the retrieve form uses for that field type.&lt;/p&gt;

&lt;p&gt;A simple way to understand the basic difference between relational and natural linking is to imagine two families: the Nevilles and the Orvilles. The Nevilles all hold each others hands. The Neville parents recognize their own children because they are holding the eldest child's hand. The eldest child holds the next oldest child's hand, on down the line of children to the youngest. The Nevilles are a naturally bound family. The Orvilles are relational. The parent wears a tee shirt that says "Orville" on the front. The children each have tee shirts that say "Orville" on the back. The parent knows the children by matching the names on the tee shirts. &lt;/p&gt;

&lt;p&gt;Deciding whether to use natural or relational linking is simpler than understanding either. Just ask yourself if the data in the subform you are designing will repeat, unaltered, under more than one parent record. If the data will repeat, then it is wise to use relational linking, otherwise, or if in doubt, use natural linking. If the data must be unique to each parent, as in the example of logged transactions, natural linking is the natural choice.&lt;/p&gt;

&lt;p&gt;For more information, see &lt;i&gt;Appendix 4 - Advanced Concepts&lt;/i&gt; in the Sesame User Guide and the Knowledgebase article: &lt;a href="http://www.lantica.com/support/kb/article/000097" target="_new"&gt;&lt;b&gt;"Should I choose Natural or Relational Subforms?"&lt;/b&gt;&lt;/a&gt;.&lt;/p&gt;</description><link>http://www.lantica.com/Support/kb/article/243</link><pubDate>Thu, 29 Mar 2012 16:42:07 GMT</pubDate><guid isPermaLink="false">43631cf73106c021a629ee8a5f14487c</guid></item><item><title>Creating a drop-down Customer list to allow Users to choose contacts in other Forms</title><description>&lt;p&gt;You may want to use something along these lines:&lt;/p&gt;

&lt;pre&gt;
Var vList as String
// Get all contacts from Contact form
vList = @XlistValues(@FN, "Contacts!Contacts")
// Initialize the Combo Box with unique sorted values
PopulateListElement(TransName, @UniqueStringArray(@SortStringArray(vList,0)))
&lt;/pre&gt;

&lt;p&gt;However, It is often a good idea to use variables in cases where you could (but probably shouldn't) nest functions. By using intervening string variables, you can use WriteLn to see the values of the variable during development to make sure that each step of the procedure is running the way you want it to:&lt;/p&gt;

&lt;pre&gt;
Var vList as String
Var vList2 as String
Var vList3 as String
// Get all contacts from Contact form
vList = @XlistValues(@FN, "Contacts!Contacts")
// Initialzie the Combo Box with unique sorted values
vList2 = @SortStringArray(vList, 0)
vList3 = @UniqueStringArray(vList2)
PopulateListElement(TransName, vList3)
&lt;/pre&gt;

&lt;p&gt;It adds visual clarity to the code, and makes it easier to debug. It may run a bit slower, but can be easily optimized after you know that it's working. Variables are many times faster and safer than elements. Only use an element to get the value initially, or to write the final result back.&lt;/p&gt;</description><link>http://www.lantica.com/Support/kb/article/242</link><pubDate>Thu, 29 Mar 2012 16:28:26 GMT</pubDate><guid isPermaLink="false">cfc459a513656f26ddba06134aeef6f8</guid></item><item><title>Print all retrieved records using PrintString commands</title><description>&lt;p&gt;&lt;em&gt;"I love Sesame's ability to print all retrieved records and the available Printstring commands to print forms in my format. But, is there any way to combine these two? I have forms in my database that use "Print" command  buttons, which include all the Printstring commands needed. Is there coding that can print all retrieved records using these Printstring commands?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can call your PrintString code in Mass Update. &lt;/p&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;p&gt;ou can also loop through all your records in code by doing something like:&lt;/p&gt;

&lt;pre&gt;
Var vCount as Int
Var vLoop as Int
Var vPos as Int

SUBROUTINE PrintIt()
	// All your print code
END SUBROUTINE

	vPos = @ResultSetCurrentPosition()
	vCount = @ResultSetTotal()
	For vLoop = 1 to vCount
		ResultSetCurrentPosition(vLoop)
		PrintIt()
	Next
	ResultSetCurrentPosition(vPos)
&lt;/pre&gt;</description><link>http://www.lantica.com/Support/kb/article/241</link><pubDate>Thu, 29 Mar 2012 16:04:33 GMT</pubDate><guid isPermaLink="false">e623c6959230e27bf6c6d2f6abab017e</guid></item><item><title>Debugging Your Code: Types of Errors </title><description>&lt;p&gt;Errors are a part of programming. Knowing how to find and fix your mistakes is as important as knowing how to write the code in the first place. Logical Errors occur while your code is running. Syntax Errors occur while your code is compiling. The following is a more detailed description of the types of errors you will likely encounter while programming in Sesame. For debugging techniques, see this Knowledge Base article.&lt;/p&gt;

&lt;b&gt;Syntax Errors&lt;/b&gt;&lt;br /&gt;
These are caught by testing your program in the Programming Editor. Syntax Errors occur when a section of code has been mistyped/misspelled, causing Sesame to misunderstand your instructions. A syntax error does &lt;i&gt;not&lt;/i&gt; prevent you from saving a program. You can save your work - errors and all - and close the editor, the return to it later for further work. (Any programming is automatically, temporarily saved when you exit/close the Program Editor window. To permanently save all of your programming changes, click &lt;i&gt;Save Layout Design&lt;/i&gt; on the &lt;i&gt;Commands&lt;/i&gt; menu.) Examples of syntax errors include:&lt;br /&gt;

&lt;ul&gt;
  &lt;li&gt;Misspelling an Element name&lt;/li&gt;
  &lt;li&gt;Misspelling an SBasic call&lt;/li&gt;
  &lt;li&gt;Leaving out a parenthisis&lt;/li&gt;
  &lt;li&gt;Calling a procedure with the wrong number or type of arguments&lt;/li&gt;
&lt;/ul&gt; &lt;/p&gt;

&lt;b&gt;Logical Errors&lt;/b&gt;&lt;br /&gt;
Logical Errors occur when Sesame is doing exactly what you told it to, and that is the problem. These include :&lt;br /&gt;
&lt;ul&gt;
  &lt;li&gt;Dividing by zero&lt;/li&gt;
  &lt;li&gt;Checking an incorrect condition&lt;/li&gt;
  &lt;li&gt;Incorrectly bracing conditionals&lt;/li&gt;
  &lt;li&gt;Looping forever&lt;/li&gt;
&lt;/ul&gt; &lt;/p&gt;

&lt;table border="2"&gt;
&lt;tr&gt;
&lt;th&gt;Type of Error&lt;/th&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Incorrect&lt;/th&gt;
&lt;th&gt;Correct&lt;/th&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Warning&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Warning: layout element name [name] contains operator characters.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The layout element name contains characters which make it illegal for use in programming. This is only a warning. If the layout element is not referred to in programming, this will not cause an error.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Missing closing quotes in String.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Strings must have both opening and closing quotes.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vStr = "Sesame&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vStr = "Sesame"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Missing close comment.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Comments opened using /* must be closed.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/* This is a comment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/* This is a comment */&lt;/code&gt;&lt;?td&gt;
&lt;/tr&gt;&lt;tr&gt; 
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Unclosed character constant.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Characters (Chars) must have both opening and closing single quotes.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vChar = 'A&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vChar = 'A'&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Declaration expected.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Error occurs on or before the referenced line.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Statement expected.&lt;/td&gt;
&lt;td&gt;Error occurs on or before the referenced line.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Statement or End-Of-File expected&lt;/td&gt;
&lt;td&gt;Error occurs on or before the referenced line.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Subroutine name expected.&lt;/td&gt;
&lt;td&gt;A subroutine declarations is missing the name.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Subroutine()&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Subroutine MySub()&lt;/code&gt;&lt;/tf&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Function name expected.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;A function declaration is missing the name.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Function() as Int&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Function MyFunc()  As Int&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Variable declaration list expected.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The program contains "var" without completing the declaration.&lt;/td&gt;
&lt;td&gt;&lt;code&gt; var&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;var vInt as Int&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Static declarations after dynamic declarations are not allowed.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;All declarations of static variables must occur before any declaration of dynamic variables&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Static declarations in functions and subroutines are not allowed.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Static variables may only be declared outside of a function or subroutine&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Variable name expected.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Program uses a for-next loop with an invalid or missing index variable.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;For = 1 to 20&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;For vInt =1 to 20&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Expression is expected.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Program is missing an expression.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vTotal =&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vTotal = (Unit * Price)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Parameter declaration expected.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;A procedure declaration has a trailing comma in the parameters area.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Subroutine TestMe( var a as Int,   )&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Subroutine TestMe( var a as Int,  var b as Int&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Formal parameter declaration expected.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;A procedure declaration has an incomplete parameter.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Subroutine TestMe( var )&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Subroutine TestMe( var a as Int )&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Subroutine or label expected.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;GoTo used without specifying target.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GoTo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GoTo CalculateMe&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax.Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Label expected.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;GoTo used without specifying target.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GoTo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GoTo CalculateMe&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Assignment operator expected.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Statement missing an equal sign (=).&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vInt Units&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vInt = Units&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Term expected&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Program contains an incomplete expression.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vInt = 3 +&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vInt = 3 + 5&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Symbol expected [symbol], symbol found [symbol2].&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Usually indicates that an open symbol, such as (, occurs without a matching close symbol. [symbol] shows the found open symbol. [symbol2] shows the symbol found instead of the expected close symbol.&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;code&gt;If(vInt = 5 Then&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;i&gt;produces the error: Symbol expected [)], symbol found [THEN].&lt;/i&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Direct reference for var parameter expected.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The program attempts to pass a static value to a function or subroutine which is expecting a variable to be passed by reference.&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;i&gt;Example:&lt;/i&gt;&lt;br /&gt;&lt;pre&gt;
Function  TestMe(var vInt as Int) as Int
	Return 5
End Function

Var vInt2 as Int	
vInt2 = TestMe("test")&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Label used as jump target but label definition is missing.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;GoTo statement references a label which does not exist in the procedure.&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;i&gt;Example: If there is no label defined as GoHere:, the following statement would produce this error.&lt;/i&gt;&lt;/p&gt;
&lt;code&gt;GoTo GoHere&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Type expected.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;A declaration is missing the type.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;var vInt as &lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;var vInt as Int&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Type mismatch error (operation is not defined for the types of the operands).&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Program attempts to perform an operation which is illegal for the types of the operands.&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;i&gt;Example: if vFullName and vLastName are both type String, the following statement would produce this error because Strings cannot be subtracted from each other.&lt;/p&gt;
&lt;code&gt;FirstName = vFullName - vLastName&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Type mismatch error (types of formal and actual parameter must match for VAR parameter).&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The program attempts to pass a value to a function/subroutine which is of a different type than is declared for that function or subroutine.&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;i&gt;Example: The following code would produce this error because the type of the variable being passed is not the same as the type declared.&lt;/i&gt;&lt;/p&gt;
&lt;pre&gt;
Function TestMe(var vInt as Int) as Int
	Return 5
End Function

Var vStr as String
Var vInt2 as Int

vStr = "Test"
vInt2 = TestMe(vStr)&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Type mismatch (both operands must be of the same type).&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Both operands (specifies what data is to be manipulated or operated on) must be of the same type.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Boolean expression expected.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Program expects an expression or value of the specified type.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;String expression expected.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;String expression expected.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Numeric expression expected (int, double, char, bool, date, time).&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Program expects an expression or value of the specified type.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;String type expected.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Program expects an expression or value of the specified type.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;String expected&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Program expects an expression or value of the specified type.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Unknown identifier.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Identifier does not exist or is undeclared. Identifiers must be declared before they are used.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Loop invariants (FOR-NEXT-counter) must be simple local variables.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Variables used to index loops must be declared locally.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;GOTO not allowed here.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt; Program attempted to use a GoTo to jump out of the current function or subroutine.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Navigation programming not allowed here.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Navigation programming is not legal if running SBasic standalone.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Redefinition of identifiers is not allowed.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Indentifiers may only be declared once within any particular scope.&lt;/td&gt; 
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Variable or function not defined.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Variable or function does not exist or is undeclared. Variables and functions must be declared before they are used.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Array name expected.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Program attempts to access a generic array using = instead of a generic array call, such as SetIntElement.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Number of dimensions does not match definition.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The number of dimensions in the array does not match the array declaration.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Number of formal parameters does not match number of actual parameters.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The number of parameters used does not match the procedure declaration.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Syntax/Compile&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Indexing operator [ ] not allowed on generic arrays.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Program attempts to index a generic array instead of using a generic array call, such as SetIntElement.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Runtime Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Function does return a value.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;A function must return a value.&lt;/td&gt;
&lt;td&gt;&lt;pre&gt;
Function MyFunc() as Int
End Function&lt;/pre&gt;&lt;/td&gt;
&lt;td&gt;&lt;pre&gt;
Function MyFunc() as Int
	Return 1
End Function&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Runtime Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Illegal type (operation not allowed).&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The operation is illegal for the data types.&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;i&gt;Example:&lt;/i&gt;&lt;/p&gt;
&lt;code&gt;vString = "FirstName" / "LastName"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Runtime Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Division by zero.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Program attempted to divide by zero.&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;i&gt;Example:&lt;/i&gt;&lt;/p&gt;
&lt;code&gt;Bonus = Salary / 0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Runtime Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Array not dimensioned.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;An array was declared, but not dimensioned.&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Runtime Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Wrong number of dimensions in array access.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Program uses an array accessor function using a different number of dimensions than the array being accessed.&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;i&gt;Example:&lt;/i&gt;&lt;/p&gt;
&lt;pre&gt;var MyArray as Array[10, 2] of Int
MyArray[5] = 3&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Runtime Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Max. array index negative while creating array.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;An array has been declared with a negative dimension.&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;i&gt;Example:&lt;/i&gt;&lt;/p&gt;
&lt;code&gt;var MyArray as Array[-1] of Int&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Runtime Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Array index zero while accessing the array.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The program attempted to access an array using an index of  0 (zero).&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;i&gt;Example:&lt;/i&gt;&lt;/p&gt;
&lt;code&gt;vInt = vaMyArray[0]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Runtime Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Array index negative while accessing an array.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The program attempted to access an array using a negative index.&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;i&gt;Example&lt;/i&gt;&lt;/p&gt;
&lt;code&gt;vInt = vaMyArray[-1]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Runtime Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Array index overflow.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;The program attempted to access an array using an index larger than the array dimension.&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;i&gt;Example:&lt;/i&gt;&lt;/p&gt;
&lt;pre&gt;var vaMyArray as Array[10] of Int
vInt = vaMyArray[15]&lt;/pre&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Runtime Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Runtime type mismatch while accessing an array.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Program attempted to access a generic array using an accessor function for a different data type.&lt;/td&gt;
&lt;td colspan="2"&gt;&lt;i&gt;Example:  Attempted to access an array of type String using SetIntElement.&lt;/i&gt;&lt;td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Runtime Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;@CGR: pv and fv must have the same sign.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Present Value and Future Value must have the same sign.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vCGR = @CGR(100, -500, 10)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vCGR = @CGR(100, 500, 10)&lt;/code&gt;&lt;/td
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Runtime Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;@FV: i must be &gt;= -1;&lt;br /&gt; @PMT: i must be &gt;= -1;&lt;br /&gt; @PV: i must be &gt;= -1.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;Program attempted to use one of these financial functions with an interest rate parameter of less than -1&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Internal Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Constant pool overflow.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Internal Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Runtime stack overflow.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Internal Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Internal error: Runtime stack underflow.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Internal Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Internal Error: Call stack empty while looking for invocation record.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Internal Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Internal Error: Invocation record not found on call stack.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Internal Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Internal Error: jump target not defined.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Internal Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Internal Error: variable name could not be defined.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;
&lt;td&gt;Internal Error&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Internal SBasic Error. Contact Technical Support.&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;td&gt;&amp;nbsp&lt;/td&gt;&lt;td&gt;&amp;nbsp&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;strong&gt;For information, see "Using the Programming Editor" in the Sesame Programming Guide.&lt;/strong&gt;&lt;/p&gt;</description><link>http://www.lantica.com/Support/kb/article/220</link><pubDate>Thu, 29 Mar 2012 14:34:42 GMT</pubDate><guid isPermaLink="false">de8c1afcc85db1d887061c4a6f21a31d</guid></item></channel></rss>
