<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><atom:link href="http://www.alchemysolutions.com/RSSRetrieve.aspx?ID=13864&amp;Type=RSS20" rel="self" type="application/rss+xml" /><title>alchemy</title><description>alchemy</description><link>http://www.alchemysolutions.com/</link><lastBuildDate>Fri, 18 May 2012 10:03:43 GMT</lastBuildDate><docs>http://backend.userland.com/rss</docs><generator>RSS.NET: http://www.rssdotnet.com/</generator><item><title>Microsoft Offers $60,000 in Azure Services to Startups</title><description>&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 12.5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 20px; font-family: helvetica, arial, clean, sans-serif;"&gt;The cloud is a fantastic place to incubate a tech startup. There are zero computing infrastructure costs and setup times are nil. And, of course, the cloud offers true elasticity and scalability. That's why Microsoft is offering $60,000 worth of cloud services to startups through their &lt;a href="http://www.microsoft.com/bizspark/Plus/Default.aspx" target="_blank" title="BizSpark Plus"&gt;BizSpark Plus&lt;/a&gt; program.&lt;/p&gt;
&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 12.5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 20px; font-family: helvetica, arial, clean, sans-serif;"&gt;Who's eligible? Any member of &lt;a href="http://www.techstars.com/"&gt;TechStars&lt;/a&gt;, &lt;a href="http://globalacceleratornetwork.com/"&gt;Global Accelerator Network&lt;/a&gt;, &lt;a href="http://www.seedcamp.com/"&gt;Seedcamp&lt;/a&gt;, &lt;a href="http://dogpatchlabs.com/"&gt;Dogpatch Labs&lt;/a&gt; and a host of other tech startup organizations.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 12.5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 20px; font-family: helvetica, arial, clean, sans-serif;"&gt;The cloud just makes sense for startups. Most go from virtually zero web traffic to LA-style gridlock overnight. The Windows Azure cloud effortlessly scales to handle the demand. And it's a lot cheaper than ramping up extra servers.&lt;/p&gt;
&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 12.5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 20px; font-family: helvetica, arial, clean, sans-serif;"&gt;The platform is also flexible&amp;mdash;it works with virtually any programming language and platform, including Java, PHP, .NET node.js.&amp;nbsp;&lt;/p&gt;
&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 12.5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 20px; font-family: helvetica, arial, clean, sans-serif;"&gt;If that wasn't enough, Microsoft will connect startups with their enterprise and mid-market customers.&lt;/p&gt;
&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 12.5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 14px; line-height: 20px; font-family: helvetica, arial, clean, sans-serif;"&gt;This is only the latest BizSpark program. It has been supporting startups for years&amp;mdash;and introducing them to .NET and other Microsoft technology, of course. This new Azure program starts today, but won't last forever. The first year of Azure services (up to $60,000) is free. The second year is half-price.&lt;/p&gt;
</description><link>http://www.alchemysolutions.com/RSSRetrieve.aspx?ID=13864&amp;A=Link&amp;ObjectID=397761&amp;ObjectType=56&amp;O=http%253a%252f%252fwww.alchemysolutions.com%252f_blog%252falchemy%252fpost%252fMicrosoft_Offers_%252460%252c000_in_Azure_Services_to_Startups%252f</link><guid isPermaLink="true">http://www.alchemysolutions.com/_blog/alchemy/post/Microsoft_Offers_$60,000_in_Azure_Services_to_Startups/</guid><pubDate>Tue, 31 Jan 2012 01:03:00 GMT</pubDate></item><item><title>HP Goes Green with Power-Sipping Servers</title><description>&lt;p&gt;Data centers are huge, power-hungry and inefficient. They consume electricity and IT budgets at staggering rates. HP wants to change that. The company's enterprise server division is developing efficient, compact machinery that's set to shatter our views of the traditional data center.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The &lt;a href="http://h17007.www1.hp.com/us/en/whatsnew/june/060611-3.aspx" title="HP EcoPod"&gt;HP Performance Optimized Data Center 240a&lt;/a&gt;, or HP EcoPOD, is about 1/10th the size of a traditional data center, and it's portable. The system fits into two 40-foot shipping containers and&amp;nbsp;&lt;span style="text-align: -webkit-auto;"&gt;includes integrated power, cooling, security, fire suppression, management and monitoring suites. The whole thing is built in a factory to customer specs and comes pre assembled. Simply unpack it and plug it together. That means the&amp;nbsp;EcoPOD can be ready to serve up data and crunch numbers within 12 weeks of placing an order with HP. The typical data center takes more than 24 months to get up and running.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="text-align: -webkit-auto;"&gt;Once assembled, the EcoPod is just 45 feet long and 23 feet wide. Despite its diminutive size, the data center can house 44 standard 50-server racks for a total of 2,200 servers with more than 7,000 server nodes. And there's space for 24,000 large-form-factor hard drives, too.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="text-align: -webkit-auto;"&gt;The system comes with two &lt;/span&gt;&lt;a href="http://www.activepower.com/solutions/ups-systems/cleansource-ups-60hz/" title="CleanSource UPS"&gt;CleanSource flywheel-based UPS&lt;/a&gt; systems that can crank out up to 2.3MW, giving users more than enough time to switch to generators if there's an interruption in power.&lt;/p&gt;
&lt;p&gt;&lt;span style="text-align: -webkit-auto;"&gt;To keep it all from melting down, the EcoPOD uses Adaptive Cooling. The system pumps in outside air to cool the servers whenever possible and cranks up the A/C to cool things off depending on the environment and server load. Adaptive Cooling can push more than 3800 cubic feet of air over the servers every minute.&lt;/span&gt;&lt;/p&gt;
&lt;p style="text-align: -webkit-auto;"&gt;The EcoPOD uses half the energy of a typical data center. A data center's efficiency is measured by Power Usage Effectiveness (PUE)&amp;mdash;how much of its total power consumption is actually used for computing. A data center with a PUE of 1 would use all of its electricity for computing. A data center with a PUE of 2 would only use half its energy for computing. The EcoPOD has an average PUE between 1.05 and 1.3, depending on server load and cooling system use. Normal data centers only manage a PUE of 2.4.&amp;nbsp;&lt;/p&gt;
&lt;p style="text-align: -webkit-auto;"&gt;The EcoPOD is also inexpensive&amp;mdash;it costs just $500,000 a year to run. Brick-and-mortar data centers cost nearly &lt;strong&gt;31 times&lt;/strong&gt; that to run.&lt;/p&gt;
&lt;p style="text-align: -webkit-auto;"&gt;The Alchemy &lt;a href="http://www.alchemysolutions.com/legacy-modernization-products/"&gt;NeoTools&lt;/a&gt; suite of mainframe migration software runs natively on HP servers.&lt;/p&gt;
&lt;p style="text-align: -webkit-auto;"&gt;Sources: &lt;a href="http://h17007.www1.hp.com/us/en/whatsnew/june/060611-3.aspx" title="HP EcoPOD"&gt;HP&lt;/a&gt;, &lt;a href="http://gizmodo.com/5840347/why-google-needs-to-peep-at-the-worlds-most-efficient-data-center"&gt;Gizmodo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style="line-height: 22px; text-align: -webkit-auto; font-family: georgia, times, 'liberation serif', serif; font-size: 15px; color: #333333;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/p&gt;
</description><link>http://www.alchemysolutions.com/RSSRetrieve.aspx?ID=13864&amp;A=Link&amp;ObjectID=371567&amp;ObjectType=56&amp;O=http%253a%252f%252fwww.alchemysolutions.com%252f_blog%252falchemy%252fpost%252fHP_Goes_Green_with_Power-Sipping_Servers%252f</link><guid isPermaLink="true">http://www.alchemysolutions.com/_blog/alchemy/post/HP_Goes_Green_with_Power-Sipping_Servers/</guid><pubDate>Mon, 19 Dec 2011 20:19:00 GMT</pubDate></item><item><title>Alchemy Solutions at the 2011 Microsoft BUILD Conference</title><description>&lt;p&gt;Alchemy Solutions sent a few of its developers to attend the unveiling of Windows 8 at the 2011 Microsoft BUILD conference in Anaheim California.&lt;/p&gt;
&lt;p&gt;The conference concentrated on a brand new runtime (WinRT) and its support for the new Metro touch-first application style.  WinRT is a new API rewritten from the kernel up, emphasizing asynchronous methods and patterns throughout to ensure responsiveness. Metro, on the other hand, is a very clean, no-chrome touch-screen interface. At first it appeared to be a bit gimmicky, but as the conference went on it was clear there were many uses for this UI.  It&amp;rsquo;s definitely an improvement over traditional windows when using touch for navigation.&lt;/p&gt;
&lt;p&gt;At Alchemy we&amp;rsquo;ve been discussing ways to simplify user access to NeoBatch Job Monitoring and Reporting services. The Metro UI certainly looks like a great candidate for this task. We are also considering Metro/WinRT advances in NeoKicks and NeoData.  And as always, we will try to drive the language improvements in the .NET framework into Fujitsu&amp;rsquo;s COBOL products.&lt;/p&gt;
&lt;p&gt;Microsoft gave us some tablets preloaded with Windows 8 &amp;mdash;this was clearly one of the conference highlights. The tablets will allow us to get a jump on laying out how we can integrate our products with Windows 8 and Metro. From our perspective, the conference was a success not only for Microsoft&amp;rsquo;s Metro UI but for Alchemy as well.&lt;/p&gt;
</description><link>http://www.alchemysolutions.com/RSSRetrieve.aspx?ID=13864&amp;A=Link&amp;ObjectID=320697&amp;ObjectType=56&amp;O=http%253a%252f%252fwww.alchemysolutions.com%252f_blog%252falchemy%252fpost%252fAlchemy_Solutions_at_the_2011_Microsoft_BUILD_Conference%252f</link><guid isPermaLink="true">http://www.alchemysolutions.com/_blog/alchemy/post/Alchemy_Solutions_at_the_2011_Microsoft_BUILD_Conference/</guid><pubDate>Tue, 11 Oct 2011 19:32:00 GMT</pubDate></item><item><title>COBOL Warnings – Highlights possible issues you may not have known about.</title><description>&lt;p class="content"&gt;I had a recent inquiry into why all the warnings in Fujitsu COBOL and why have them, and how could they turn off warnings in not only COBOL, but in other&amp;nbsp; mixed languages.&amp;nbsp; I guess I go back to moments in my life, when I was warned &amp;ldquo;don&amp;rsquo;t do that&amp;rdquo;, and like any kid, I may have not heeded the advice, to my later dismay.&amp;nbsp; Warnings are really your friend.&amp;nbsp; They may seem overwhelming at times, but they may point out important things in your code, that many times you don&amp;rsquo;t even know existed.&amp;nbsp; &lt;/p&gt;
&lt;p class="content"&gt;The person with the warnings was coming from another&amp;nbsp; COBOL vendor.&amp;nbsp; As he looked through them, he found spots identifying problems that he had encountered intermittent issues with that he never knew existed before, as the other COBOL vendor did not warn on them.&amp;nbsp; For example, extremely long COMPUTES are warned on, as you may exceed intermediate fields.&amp;nbsp; It does not mean the code will not work, but it brings your attention to the thought that it should be checked, that depending on the values in the compute, you may come up with a different value than you would like, the same as if you wanted to add 99 + 99, and put it in a PIC 99 field.&amp;nbsp; Another one of my favorites is if someone has an IF statement, such as &amp;ldquo;IF Field1 EQUALS (&amp;lsquo;A&amp;rsquo; or &amp;lsquo;B&amp;rsquo;)&amp;rdquo;, where if you note the parenthesis, it makes you wonder, as parenthesis are resolved first.&amp;nbsp; Fujitsu is solid enough to run like that, but it is better to resolve those warnings.&amp;nbsp; I have found Fujitsu COBOL to be thorough in its checking of the code, and taking the time to resolve warnings many time fixes things you did not even know you had issues with on your prior environment.&amp;nbsp; So, I would take the steps to clean up the the warnings, rather than turn them off.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;For my purposes, I have a test &amp;ldquo;warnings&amp;rdquo; program, which I will include at the end of this blog.&amp;nbsp; You can see the flow the program is using, and the way the checking is being done. You may copy this code and try it out, to see how the warnings will react, or add your own warnings in.&amp;nbsp; This code is given as is, and it is up to the end recipient to use as they wish.&lt;/p&gt;
&lt;p&gt;If you still wish to turn off warnings, under Fujitsu COBOL you can do it with the compiler option &amp;ldquo;FLAG(x)&amp;rdquo;, where &amp;ldquo;x&amp;rdquo; is the compiler error level you want.&amp;nbsp; For example "FLAG(E)&amp;rdquo; will only show you critical errors.&amp;nbsp; You can consult the manuals for more compiler option and level information.&lt;/p&gt;
&lt;p&gt;The following are screen snapshots of the project properties of where you can modify your compiler options for COBOL, C#, and VB.NET.&amp;nbsp; Under NetCOBOL for .NET, it is part of your compiler options as it is under all of COBOL for Fujitsu.&amp;nbsp; For more information on how to set CSharp or VB.NET Warnings or Error levels, please consult the Microsoft manuals.&lt;/p&gt;
&lt;p&gt;(Note: You can double click on a picture to expand it).&lt;/p&gt;
&lt;p&gt;COBOL&lt;/p&gt;
&lt;p&gt;&lt;a rel="example_group" href="/images/blog/clip_image002.jpg" target="_blank"&gt;&lt;img alt="" style="border: 0px none;" src="/images/blog/clip_image002_thumb_0.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="content"&gt;&amp;nbsp;CSharp&lt;/p&gt;
&lt;p&gt;&lt;a rel="example_group" href="http://www.alchemysolutions.com/sites/default/files/clip_image004.jpg" rel="nofollow"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="example_group" href="/images/blog/csharp_lg.jpg" target="_blank"&gt;&lt;img alt="" style="border: 0px none;" src="/images/blog/csharp_thumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;VB.NET&lt;/p&gt;

&lt;p&gt;&lt;a rel="example_group" href="/images/blog/vbnet_lg.jpg" target="_blank"&gt;&lt;img alt="" style="border: 0px none;" src="/images/blog/vbnet_thumb.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;TEST WARNING COBOL PROGRAM:&lt;/p&gt;
&lt;p&gt;IDENTIFICATION DIVISION.&lt;br /&gt;
PROGRAM-ID. TESTJMWARN.&lt;br /&gt;
ENVIRONMENT DIVISION.&lt;br /&gt;
CONFIGURATION SECTION.&lt;br /&gt;
SPECIAL-NAMES.&lt;br /&gt;
REPOSITORY.&lt;br /&gt;
DATA DIVISION.&lt;br /&gt;
WORKING-STORAGE SECTION.&lt;br /&gt;
01 WS-ANY-KEY&amp;nbsp;&amp;nbsp; PIC X VALUE SPACES.&lt;br /&gt;
01 WS-COUNTER&amp;nbsp;&amp;nbsp; PIC 99 VALUE&amp;nbsp; 0.&lt;br /&gt;
* JMN1900I-W: The level-number hierarchy is invalid.&lt;br /&gt;
* Note:&amp;nbsp; Data is still visible, and usable.&lt;br /&gt;
01 WS-LEVEL-NUMBER-HIERARCHY-INV.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 05&amp;nbsp; WSF2-3.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 15&amp;nbsp; WSF2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIC X(3) VALUE "ABC".&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp; WSF3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIC X(3) VALUE "DEF".&lt;br /&gt;
* JMN2232I-W: The length of the redefining item cannot exceed the length of the redefined item. The redefining item overlaps no items other than ones explicitly specified.&lt;br /&gt;
* Note: Implications are that in this case, P-LINE-DATA will not have all 15 characters.&amp;nbsp; I recommend cleaning these up, as the other&lt;br /&gt;
*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; concern is that your memory mapping may not be as you want it.&lt;br /&gt;
01 WS-REDEFINE-A.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 05&amp;nbsp; P-LINE-DATA&amp;nbsp;&amp;nbsp; PIC X(10) VALUE "ABCDE12345".&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 05&amp;nbsp; P-LINE-O&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; REDEFINES P-LINE-DATA.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp; P-FIELD1 PIC X(5).&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp; P-FIELD2 PIC X(10).&amp;nbsp;&lt;br /&gt;
01 WS-REDEFINE-B.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 05&amp;nbsp; P-LINE-DATB&amp;nbsp; PIC X(15) VALUE SPACES.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 05&amp;nbsp; P-LINE-OO&amp;nbsp;&amp;nbsp;&amp;nbsp; REDEFINES P-LINE-DATB.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp; P-FIELDA PIC X(5).&lt;br /&gt;
*JMN2705I-W: The VALUE clause cannot be specified for an item specified in a REDEFINES clause or for its subordinate item. The VALUE clause is ignored.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
*Note: P-FIELDB's data will not be placed in P-LINE-DATA at the start of the program - I don't think any compiler will do this.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&amp;nbsp; P-FIELDB PIC X(10) VALUE "0987654321".&amp;nbsp;&lt;br /&gt;
* JMN1020I-W - The literal must start in AREA B.&lt;br /&gt;
* The above warning is strictly a warning and does not affect the code.&lt;br /&gt;
01&amp;nbsp; SERVICE-D-NOTE-1.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 05&amp;nbsp; FILLER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIC X(13) VALUE SPACES.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 05&amp;nbsp; FILLER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PIC X(61) VALUE&lt;br /&gt;
&amp;nbsp; "NOTE: FOR 3P3W APPLICATIONS:&amp;nbsp; A NEUTRAL SPACE IS INCLUDED IN ".&lt;br /&gt;
&amp;nbsp; 01 MYTABLE-SUB&amp;nbsp;&amp;nbsp; PIC 99.&lt;br /&gt;
&amp;nbsp; 01 MYTABLE.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 05 MYITEMS&amp;nbsp;&amp;nbsp;&amp;nbsp; PIC X(2) OCCURS 5 TIMES.&lt;br /&gt;
PROCEDURE DIVISION.&lt;br /&gt;
*****************************************************************&lt;br /&gt;
* BEGIN of JM* Examples...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PERFORM 1020I-JMN1020I-W THRU 1020I-EXIT.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PERFORM 1041I-JMN1041I-W THRU 1041I-EXIT.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PERFORM 1900I-JMN1900I-W THRU 1900I-EXIT.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PERFORM 2506I-JMN2506I-W THRU 2506I-EXIT.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PERFORM 2508I-JMN2508I-W THRU 2508I-EXIT.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PERFORM 2540I-JMN2540I-W.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PERFORM 2682I-JMN2682I-W THRU 2682I-EXIT.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOVE SPACES TO WS-ANY-KEY.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISPLAY "PRESS ENTER TO FINISH DEMO" UPON CONSOLE.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ACCEPT WS-ANY-KEY FROM CONSOLE.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STOP RUN.&lt;br /&gt;
* End of JM* Examples...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
*****************************************************************&lt;br /&gt;
1020I-JMN1020I-W.&lt;br /&gt;
* JMN1020I-W - The literal must start in AREA B(See Working Storage for field in example).&lt;br /&gt;
* The above warning is strictly a warning and does not affect the code.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISPLAY SERVICE-D-NOTE-1 upon console.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Accept ws-any-key from console.&lt;br /&gt;
1020I-EXIT.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXIT.&lt;br /&gt;
1041I-JMN1041I-W.&amp;nbsp;&amp;nbsp;&lt;br /&gt;
*&amp;nbsp; JMN1041I-W: A separator must follow the character string. A separator after the&lt;br /&gt;
*&amp;nbsp; character string is assumed.&amp;nbsp;&amp;nbsp;&lt;br /&gt;
*&amp;nbsp; logic still works OK&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISPLAY "ENTER A 'J' " UPON CONSOLE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ACCEPT WS-ANY-KEY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM CONSOLE.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF WS-ANY-KEY="J"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISPLAY "You selected J" Upon CONSOLE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISPLAY "'J' NOT ENTERED " UPON CONSOLE.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISPLAY "ENTER TO CONTINUE " UPON CONSOLE.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ACCEPT WS-ANY-KEY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM CONSOLE.&lt;br /&gt;
1041I-EXIT.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXIT.&lt;/p&gt;
&lt;p&gt;1900I-JMN1900I-W.&lt;br /&gt;
* JMN1900I-W: The level-number hierarchy is invalid.&lt;br /&gt;
* Note:&amp;nbsp; Data is still visible, and usable.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISPLAY "WS-LEVEL-NUMBER-HIERARCHY-INV ",&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WS-LEVEL-NUMBER-HIERARCHY-INV UPON CONSOLE.&lt;br /&gt;
1900I-EXIT.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXIT.&lt;/p&gt;
&lt;p&gt;2506I-JMN2506I-W.&lt;br /&gt;
* JMN2506I-W: A statement must be specified in a conditional statement or an in-line PERFORM statement. It is accepted as written.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOVE SPACES TO&amp;nbsp; MYITEMS(1), MYITEMS(2), MYITEMS(3)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MYITEMS(4), MYITEMS(5).&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOVE "AA"&amp;nbsp;&amp;nbsp;&amp;nbsp; TO MYITEMS(1), MYITEMS(2), MYITEMS(3).&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PERFORM VARYING MYTABLE-SUB FROM 5 BY -1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UNTIL MYITEMS(MYTABLE-SUB) NOT = SPACE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END-PERFORM&lt;br /&gt;
2506I-EXIT.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXIT.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2508I-JMN2508I-W.&lt;br /&gt;
* JMN2508I-W&amp;nbsp; 450&amp;nbsp; NEXT SENTENCE cannot be specified in an IF or SEARCH statement with an&lt;br /&gt;
* explicit scope terminator. It is accepted as written.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOVE SPACES TO WS-ANY-KEY.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF WS-ANY-KEY = ' '&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF WS-ANY-KEY = 'A' OR 'B' OR ' '&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NEXT SENTENCE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISPLAY "JMN2508I-W TEST IN ELSE AFTER NEXT SENT"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UPON CONSOLE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END-IF&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISPLAY "JMN2508I-W TEST AFTER END-IF" UPON CONSOLE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISPLAY "JMN2508I-W TEST AFTER FINAL ELSE" UPON CONSOLE.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISPLAY "JMN2508I-W TEST END" UPON CONSOLE.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ACCEPT WS-ANY-KEY FROM CONSOLE.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOVE SPACES TO WS-ANY-KEY.&lt;br /&gt;
2508I-EXIT.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXIT.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
2540I-JMN2540I-W.&lt;br /&gt;
* JMN2540I-W The paragraph containing the EXIT statement can only consist of the procedure-name and the&lt;br /&gt;
*&amp;nbsp; EXIT statement itself. The EXIT statement is considered to be a CONTINUE statement in this context.&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOVE 0 TO WS-COUNTER.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PERFORM 2540I-COUNT-LOOP 3 TIMES.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF WS-COUNTER &amp;gt; 1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MOVE 12 TO WS-COUNTER&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END-IF&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISPLAY "2540I-JMN2540I-W AFTER PERFORM LOOP "&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UPON CONSOLE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXIT.&lt;br /&gt;
2540I-COUNT-LOOP.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; COMPUTE WS-COUNTER = WS-COUNTER + 1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISPLAY "2540I-COUNT-LOOP " UPON CONSOLE&lt;br /&gt;
2540I-FELL-THRU.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISPLAY "2540I-FELL-THRU " UPON CONSOLE.&lt;br /&gt;
* Try to get a clean exit by adding an EXIT here after demonstration.&lt;br /&gt;
* Note: to fix problem, try adding a clean exit at the point you wish to exit,&lt;br /&gt;
*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; and possibly make it a perform through...&lt;br /&gt;
2540I-CLEAN-EXIT.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXIT.&lt;br /&gt;
2682I-JMN2682I-W.&lt;br /&gt;
* JMN2682I-W: A parenthesis cannot be specified in an abbreviated combined relation condition. The parenthesis is assumed to be valid.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF WS-ANY-KEY = ('A' OR 'B' OR ' ')&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISPLAY&amp;nbsp; "JMN2682I-W&amp;nbsp; parenthesis still OK " upon console&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DISPLAY&amp;nbsp; "JMN2682I-W&amp;nbsp; parenthesis Not OK " upon console&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End-if.&lt;br /&gt;
2682I-EXIT.&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EXIT.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
END PROGRAM TESTJMWARN.&lt;/p&gt;
</description><link>http://www.alchemysolutions.com/RSSRetrieve.aspx?ID=13864&amp;A=Link&amp;ObjectID=315499&amp;ObjectType=56&amp;O=http%253a%252f%252fwww.alchemysolutions.com%252f_blog%252falchemy%252fpost%252fCOBOL_Warnings_%25e2%2580%2593_Highlights_possible_issues_you_may_not_have_known_about%252f</link><guid isPermaLink="true">http://www.alchemysolutions.com/_blog/alchemy/post/COBOL_Warnings_–_Highlights_possible_issues_you_may_not_have_known_about/</guid><pubDate>Fri, 07 Oct 2011 20:56:00 GMT</pubDate></item><item><title>Comparing ADO.NET and ODBC for embedded SQL</title><description>&lt;p&gt;When new users approach NetCOBOL for .NET and are using embedded SQL in their COBOL code, one question we often get is whether to use ODBC or ADO.NET as the database access mechanism. NetCOBOL for .NET supports both and the good news is that choosing between the two can be as simple as changing configuration settings in your application&amp;rsquo;s configuration file (usually with the help of the NetCOBOL for .NET provided Runtime Environment Setup Utility). This is because the NetCOBOL compiler and runtime are responsible for handling all the work of translating your embedded SQL queries into calls that are made to the database that you specify. &lt;/p&gt;
&lt;p&gt;So why have two different access mechanisms? The answer is that the two access mechanisms do behave differently. The simplest way I can think to distill the difference is to say that ODBC provides a feature set that supports common COBOL programming behaviors better, but ADO.NET can in some cases yield better performance. For new users, I would recommend that you start by using ODBC and then when you are looking to tune the performance of your application, you try testing with ADO.NET to see if a) you aren&amp;rsquo;t affected by the feature limitations of using ADO.NET and b) you actually get a performance benefit from using it.&lt;/p&gt;
&lt;p&gt;The rest of this blog post will try to give you some more specifics about how the two access mechanisms differ. The fundamental reason for most of the feature limitations in ADO.NET stems from the fact that ADO.NET does not support server side cursors. COBOL applications tend to use lots of cursors so what&amp;rsquo;s a COBOL runtime to do? The answer is that the NetCOBOL runtime emulates needed cursor behavior using client side cursors. There simply isn&amp;rsquo;t a way, however, to get the same database consistency mechanisms with client side cursors that you can get with server side cursors, so only optimistic concurrency is supported with ADO.NET. &lt;/p&gt;
&lt;p&gt;If you are going to try to use ADO.NET, you will definitely want to read through the &amp;ldquo;Notes on Using ADO.NET&amp;rdquo; topic found in the NetCOBOL for .NET User&amp;rsquo;s Guide. It provides you with a long list of feature limitations that exist when using ADO.NET as the access mechanism, many of which are the upshot of not having server side cursor support. &lt;/p&gt;
&lt;p&gt;So, now to the good parts of using ADO.NET. The most important point is really that Microsoft has invested a lot in making the ADO.NET data access drivers perform very well and this can result in better performance for COBOL applications as well. Note, however, that this is not universally the case. If you have an application that uses updatable cursors that select large numbers of rows, but only read a few, ADO.NET will perform poorly and consume lots of memory. This is again because a lot more data is going to be loaded on the client side rather than just using a server side cursor.&lt;/p&gt;
&lt;p&gt;Another reason why ADO.NET may be a better choice is due to transaction integration. With ADO.NET, the data access driver uses what is sometimes referred to as a lightweight transaction manager that can manage multiple coordinated transactions within an application without being promoted to a heavyweight transaction that has to be managed by Microsoft&amp;rsquo;s Distributed Transaction Coordinator (DTC). If you aren&amp;rsquo;t coordinating transactions between your COBOL code and other parts of your application, then this won&amp;rsquo;t affect you, but heavyweight distributed transactions perform orders of magnitude slower than lightweight transactions, which can be a significant consideration if you are using them. &lt;/p&gt;
&lt;br /&gt;
</description><link>http://www.alchemysolutions.com/RSSRetrieve.aspx?ID=13864&amp;A=Link&amp;ObjectID=316355&amp;ObjectType=56&amp;O=http%253a%252f%252fwww.alchemysolutions.com%252f_blog%252falchemy%252fpost%252fComparing_ADONET_and_ODBC_for_embedded_SQL%252f</link><guid isPermaLink="true">http://www.alchemysolutions.com/_blog/alchemy/post/Comparing_ADONET_and_ODBC_for_embedded_SQL/</guid><pubDate>Fri, 07 Oct 2011 18:53:00 GMT</pubDate></item><item><title>NeoData / SQL Server Profiler - Trace results from SQL Server</title><description>&lt;p&gt;Have you ever wanted to see what Microsoft SQL Server sees while your application runs?  You can log/trace SQL Server events while the NeoData engine interacts with COBOL dynamically converting your ISAM instructionsto SQL Server context.  As a matter of fact, all interactions to your SQL Server database, including your ESQL are viewable through the SQL Server Profiler.&lt;/p&gt;
&lt;p&gt;If you are trying to debug your NeoData application, it is suggested to use the NeoData Trace log feature first, to which you can find an earlier blog on that topic as well. &lt;/p&gt;
&lt;br /&gt;
You can do additional information gathering, by using a Microsoft SQL Server tool called "SQL Server Profiler".  It shows you the syntax of the SQL Server Instructions and problems found. It helped me find out that I had inadvertently copied a table under SQL Server and that SQL Server cannot have two tables with the same index name, in the same Database!&lt;br /&gt;
&lt;br /&gt;
Microsoft SQL Server Profiler is a graphical interface to SQL Trace for monitoring your Database transactions. SQL Server Profiler shows how SQL Server resolves queries internally. You can record and save information about these transactions through the Profiler to a file or table to view&lt;br /&gt;
after the application completes.  You can create a template (.tdf) file that you can use when you want to trace.&lt;br /&gt;
&lt;br /&gt;
The purpose of this blog is to give a starting point into SQL Server Profiler, to assist you.  If you have questions about details of SQL Server, you&amp;rsquo;ll need to go to the usual sources of SQL Server assistance such as the help files, MSDN or other Microsoft support channels.&lt;br /&gt;
&lt;br /&gt;
Like any tracing, SQL Server Profiler takes additional resources when running, and tracing should only be used when necessary, as it will have some impact on your application, depending on use.&lt;br /&gt;
&lt;br /&gt;
Steps under SQL Server 2008 to create a TRACE file. (At the end of this blog are screen snapshots of the tool in use).&lt;br /&gt;
- connect to SQL Server by logging in.&lt;br /&gt;
- Go to the Tools menu - Select SQL Server Profiler.&lt;br /&gt;
- Log Back in again, at the log-in prompt to get you into the profiler.&lt;br /&gt;
-  At  this point you are brought to the Trace Properties screen, where you can set up if you want to record to a file(.trc), to a database table, or neither or both.  The system tells you where it is going to store the table.  For my run it was in the &amp;ldquo;System.database.master.tables (then I named the table dbo.traceExample).&lt;br /&gt;
&lt;br /&gt;
To open a SQL Server Trace File, you can go into the SQL Server Profiler and open it, or under Windows Explorer, right click on the ".trc" file, select "Open With", select "SQL Trace Tool".&lt;br /&gt;
&lt;br /&gt;
You can copy the text from your SQL Statement from the trace, then go into SQL Server and paste the copied query into Query Execute box, and see the results or the error.&lt;br /&gt;
&lt;br /&gt;
Additional Links you may wish to reference :&lt;br /&gt;
http://msdn.microsoft.com/en-us/library/ms181091.aspx (High Level Description)&lt;br /&gt;
http://msdn.microsoft.com/en-us/library/ms187929.aspx (Additonal how to use detail)&lt;br /&gt;
&lt;br /&gt;
Screen Shots of the SQL Server Profiler tool in action.&lt;br /&gt;
&lt;br /&gt;
Step 1.  Log into SQL Server Management Studio.&lt;br /&gt;
&lt;br /&gt;
(normal log in).&lt;br /&gt;
&lt;br /&gt;
Step 2. Select the SQL Server Profiler Tool:&lt;br /&gt;
&lt;p&gt;&amp;nbsp;&lt;a target="_blank" href="/images/blog/SQL_Server_image1_large.png" rel="example_group"&gt;&lt;img alt="" src="/images/blog/SQL_Server_image1_thumb.png" style="border: 0pt none;" /&gt;&lt;/a&gt; &lt;/p&gt;
Step 3: Log into the SQL Server Profiler tool (screen looks very much like the Management Studio log-in).&lt;br /&gt;
&lt;br /&gt;
&lt;a target="_blank" href="/images/blog/SQL_Server_image2_large.png" rel="example_group"&gt;&lt;img alt="" src="/images/blog/SQL_Server_image2_thumb.png" style="border: 0pt none;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Step 3: Set up the parameters of how you wish to run the profiler.  Enter the properties, press the run button at the bottom.  The snapshot is meant to let you know that you are on the right screen.  On this screen, you can set up if you wish to record to a trace file, as described earlier. You can specify what events you wish to use on the other tab.  You can save the entries into a table in SQL Server as well!&lt;br /&gt;
&lt;br /&gt;
&lt;a href="/images/blog/SQL_Server_image3_large.png" rel="example_group"&gt;&lt;img alt="" src="/images/blog/SQL_Server_image2_thumb.png" style="border: 0pt none;" /&gt;&lt;/a&gt;&lt;a target="_blank" href="/images/blog/SQL_Server_image3_large.png"&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Step 4 &amp;ndash; View your output.  At this point, you can start your application if not already started.  Below is what the screen will look like while you are running.&lt;br /&gt;
&lt;br /&gt;
&lt;a target="_blank" href="/images/blog/SQL_Server_image4_large.png" rel="example_group"&gt;&lt;img alt="" src="/images/blog/SQL_Server_image4_thumb.png" style="border: 0pt none;" /&gt;&lt;/a&gt;&lt;br /&gt;
</description><link>http://www.alchemysolutions.com/RSSRetrieve.aspx?ID=13864&amp;A=Link&amp;ObjectID=316402&amp;ObjectType=56&amp;O=http%253a%252f%252fwww.alchemysolutions.com%252f_blog%252falchemy%252fpost%252fneodata-sql-server-profiler%252f</link><guid isPermaLink="true">http://www.alchemysolutions.com/_blog/alchemy/post/neodata-sql-server-profiler/</guid><pubDate>Mon, 14 Nov 2011 23:25:00 GMT</pubDate></item><item><title>NeoData Log/Trace File creation</title><description>&lt;p&gt;Did you know that you can debug the NeoData events that occur while your program is running, by updating your App.Config file that is associated with the Executable/solution or project you are running? This information is valuable in tracing the events that are happening in your COBOL program interacting with NeoData.&lt;/p&gt;
&lt;p&gt;There are two different types of logging you can do, but the first one, going to a file is strongly recommended, especially if you wish to send the information off to Support. The second one is writing to your Event Log, and will only be touched upon briefly.&lt;/p&gt;
&lt;p&gt;The NeoData Help does a very nice job of covering the set-up of the trace logging and should be read in conjunction to this blog article.&lt;/p&gt;
&lt;p&gt;This blog contains the following items:&lt;/p&gt;
* &lt;a href="#1"&gt;Set-up example of your NeoData Config File for writing to a trace log&lt;/a&gt;&lt;br /&gt;
* &lt;a href="#2"&gt;Sample output of the different levels of tracing you can turn on&lt;/a&gt;&lt;br /&gt;
* &lt;a href="#3"&gt;Sample full App.config file.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name="1"&gt;&lt;/a&gt;
&lt;h4&gt;Set-up Example/Instructions for setting up a trace/log of your NEOData Events using your Config File&lt;/h4&gt;
* Open up your App.Config file which is part of your solution that contains  your COBOL programs. &lt;br /&gt;
&lt;br /&gt;
* Go to the System Diagnostics section and you can copy/paste into the App.Config file the following:&lt;br /&gt;
Optionally change the Tracing level, path/file name to log to, listener name/type of listener, but, it should work just as is.  You will need to change where you want the log stored(Look for &amp;ldquo;C:\MyData&amp;rdquo; as the folder, and change to your location. Be careful not to overlay existing code you may need:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;system.diagnostics&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The following section assigns determines the verbosity of tracing in NeoData.  1= errors only, 2=warnings also, 3=info also, 4=verbose. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Tracing beyond warning level should typically be disabled in production systems--&amp;gt;&lt;br /&gt;
&amp;lt;switches&amp;gt;&lt;br /&gt;
&amp;lt;add name="NeoDataTraceSwitch" value="4" /&amp;gt;   &amp;lt;!&amp;mdash;   **Optionally Change **--&amp;gt; &lt;br /&gt;
&amp;lt;/switches&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The following section assigns NeoData trace results to an external file. This is expensive in verbose mode(4), but useful in some debugging cases --&amp;gt;&lt;br /&gt;
&amp;lt;trace autoflush="true"&amp;gt;&lt;br /&gt;
&amp;lt;listeners&amp;gt;&lt;br /&gt;
&amp;lt;add name="TestTracer"    &amp;lt;!&amp;mdash;   **Optionally Change **--&amp;gt; &lt;br /&gt;
type="System.Diagnostics.TextWriterTraceListener, System, Version=2.0.3600.0, Culture=neutral,  PublicKeyToken=b77a5c561934e089"&lt;br /&gt;
initializeData="C:\MyData\NeoDataTrace.log" /&amp;gt;  &amp;lt;!&amp;mdash;   **Change Folder Location **--&amp;gt; &lt;br /&gt;
&amp;lt;/listeners&amp;gt;&lt;br /&gt;
&amp;lt;/trace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/system.diagnostics&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Optionally set the NeoData Trace Switching (1-4) described below as you need them. &lt;br /&gt;
&lt;br /&gt;
* Optionally change the listener name.&lt;br /&gt;
&lt;br /&gt;
* Specify the type of &amp;ldquo;Systems.Diagnostics&amp;rdquo; Event logging you wish to do, being either TextWriterTraceListener (recommended strongly), or EventLogTraceListener (which goes to your Event Log).&lt;br /&gt;
&lt;br /&gt;
You can point to a file location that you wish to write to, by using the &amp;ldquo;initializeData&amp;rdquo; field, and either giving a relative path, with just a file name, or specifying a full path as in the example contained in this blog(Shows C:\MyData\NeoDataTrace.log").&lt;br /&gt;
&lt;br /&gt;
You have four levels of output that you can do based on the NeoDataTraceSwitch.&lt;br /&gt;
&lt;br /&gt;
They are 1= Errors Only, 2=warnings also, 3=info also, 4=verbose.&lt;br /&gt;
&lt;br /&gt;
(1) only gives you errors that have happened,&lt;br /&gt;
&lt;br /&gt;
(2) thru (4) successively give you more information.&lt;br /&gt;
&lt;br /&gt;
The higher the level you set the more data is generated, so the larger the file,  the greater the impact to the application. If you run with a high level in a long application, your file will be very large, and it may noticeably impact performance. For this reason, only use the setting you need for the time you want to trace what is happening in your application in conjunction with NEOData. The sample output file shows the output that is generated depending on the NeoDataTraceSwitch level set (1,4)&lt;br /&gt;
&lt;br /&gt;
&lt;a name="2"&gt;&lt;/a&gt;
&lt;h4&gt;Sample NEOData Log File Output&lt;/h4&gt;
** With a 1 on.. errors only, (note &amp;ndash; no errors, so nothing shown)&lt;br /&gt;
&lt;br /&gt;
** With a 2 On...warnings also (note &amp;ndash; simple message showing DataMapper startup)&lt;br /&gt;
&lt;br /&gt;
NdInfo: 2011-02-11T15:36:59: DataMapper static startup beginning&lt;br /&gt;
&lt;br /&gt;
** with a 3 on... warnings and info.&lt;br /&gt;
&lt;br /&gt;
NDFullCycleReadOnlyTest.exe Information: 0 : NdInfo: NeoData Runtime Version: 2.0.10.0&lt;br /&gt;
&lt;br /&gt;
NdInfo: 2011-02-11T15:38:17: Attempting to open Data Map C:\Alchemy\DocumentationAndSamplesWIP\NEODataFullCycle\NDFCYCLE.ndp&lt;br /&gt;
&lt;br /&gt;
NdInfo: 2011-02-11T15:38:17: DataMapper static startup beginning&lt;br /&gt;
&lt;br /&gt;
NdInfo: 2011-02-11T15:38:17: Successfully opened and deserialized Data Map C:\Alchemy\DocumentationAndSamplesWIP\NEODataFullCycle\NDFCYCLE.ndp&lt;br /&gt;
&lt;br /&gt;
NDFullCycleReadOnlyTest.exe Information: 0 : NdInfo: Map Version: 2.0.6.0&lt;br /&gt;
&lt;br /&gt;
NdInfo: 2011-02-11T15:38:17: WindowedTableMgr instantiating, with local AllowsBulkCopy=True&lt;br /&gt;
&lt;br /&gt;
NdInfo: 2011-02-11T15:38:17: Successfully restored dependencies for Data Map&lt;br /&gt;
&lt;br /&gt;
NdInfo: 2011-02-11T15:38:17: Successfully opened file&lt;br /&gt;
&lt;br /&gt;
** With a 4 on ... verbose (the most information).&lt;br /&gt;
&lt;br /&gt;
NDFullCycleReadOnlyTest.exe Information: 0 : NdInfo: NeoData Runtime Version: 2.0.10.0&lt;br /&gt;
&lt;br /&gt;
NdInfo: 2011-02-11T15:41:15: Attempting to open Data Map C:\Alchemy\DocumentationAndSamplesWIP\NEODataFullCycle\NDFCYCLE.ndp&lt;br /&gt;
&lt;br /&gt;
NdInfo: 2011-02-11T15:41:15: DataMapper static startup beginning&lt;br /&gt;
&lt;br /&gt;
NdInfo: 2011-02-11T15:41:15: DataMapper instantiating, with Global AllowsBulkCopy=True&lt;br /&gt;
&lt;br /&gt;
NdInfo: 2011-02-11T15:41:15: DataMapper static startup ending&lt;br /&gt;
&lt;br /&gt;
NdInfo: 2011-02-11T15:41:16: Successfully opened and deserialized Data Map C:\Alchemy\DocumentationAndSamplesWIP\NEODataFullCycle\NDFCYCLE.ndp&lt;br /&gt;
&lt;br /&gt;
NDFullCycleReadOnlyTest.exe Information: 0 : NdInfo: Map Version: 2.0.6.0&lt;br /&gt;
&lt;br /&gt;
NdInfo: 2011-02-11T15:41:16: WindowedTableMgr instantiating, with local AllowsBulkCopy=True&lt;br /&gt;
&lt;br /&gt;
NdInfo: 2011-02-11T15:41:16: Successfully restored dependencies for Data Map&lt;br /&gt;
&lt;br /&gt;
NdInfo: 2011-02-11T15:41:16: Successfully opened file&lt;br /&gt;
&lt;br /&gt;
NdInfo: 2011-02-11T15:41:18: Comparing the next two lines for equality: result True&lt;br /&gt;
&lt;br /&gt;
Src: 30303332&lt;br /&gt;
&lt;br /&gt;
Dst: 30303332&lt;br /&gt;
&lt;br /&gt;
&lt;a name="3"&gt;&lt;/a&gt;
&lt;h4&gt;Sample: App.Config&lt;/h4&gt;
Please note, if you use code from this App.config file, you will need to change at a minimum, the &amp;ldquo;C:\MyData&amp;rdquo;, to a folder location on your system, or create a folder called &amp;ldquo;C:\MyData&amp;rdquo;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;&lt;br /&gt;
&amp;lt;configuration&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;system.diagnostics&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The following section assigns determines the verbosity of tracing in NeoData.  1= errors only, 2=warnings also, 3=info also, 4=verbose. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Tracing beyond warning level should typically be disabled in production systems--&amp;gt;&lt;br /&gt;
&amp;lt;switches&amp;gt;&lt;br /&gt;
&amp;lt;add name="NeoDataTraceSwitch" value="4" /&amp;gt;&lt;br /&gt;
&amp;lt;/switches&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The following section assigns NeoData trace results to an external file. This is expensive in verbose mode(4), but useful in some debugging cases --&amp;gt;&lt;br /&gt;
&amp;lt;trace autoflush="true"&amp;gt;&lt;br /&gt;
&amp;lt;listeners&amp;gt;&lt;br /&gt;
&amp;lt;add name="TestTracer"&lt;br /&gt;
type="System.Diagnostics.TextWriterTraceListener, System, Version=2.0.3600.0, Culture=neutral,  PublicKeyToken=b77a5c561934e089"&lt;br /&gt;
initializeData="C:\MyData\NeoDataTrace.log" /&amp;gt;&lt;br /&gt;
&amp;lt;/listeners&amp;gt;&lt;br /&gt;
&amp;lt;/trace&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/system.diagnostics&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;fujitsu.cobol&amp;gt;&lt;br /&gt;
&amp;lt;runtime&amp;gt;&lt;br /&gt;
&amp;lt;environmentSettings&amp;gt;&lt;br /&gt;
&amp;lt;add key="@CBR_EXFH_API" value="VDBFileHandler" /&amp;gt;&lt;br /&gt;
&amp;lt;add key="@CBR_EXFH_LOAD" value="C:\Program Files\Alchemy Solutions\NeoData V2\V2\VDBFH.dll " /&amp;gt;&lt;br /&gt;
&amp;lt;add key="GOODFILE" value="C:\MyData\NDFCYCLE.ndp,EXFH" /&amp;gt;&lt;br /&gt;
&amp;lt;add key="GOODFILE_IDX" value="C:\MyData\GOODFILE" /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/environmentSettings&amp;gt;&lt;br /&gt;
&amp;lt;/runtime&amp;gt;&lt;br /&gt;
&amp;lt;/fujitsu.cobol&amp;gt;&lt;br /&gt;
&amp;lt;/configuration&amp;gt;
</description><link>http://www.alchemysolutions.com/RSSRetrieve.aspx?ID=13864&amp;A=Link&amp;ObjectID=316425&amp;ObjectType=56&amp;O=http%253a%252f%252fwww.alchemysolutions.com%252f_blog%252falchemy%252fpost%252fNeoData_LogTrace_File_creation%252f</link><guid isPermaLink="true">http://www.alchemysolutions.com/_blog/alchemy/post/NeoData_LogTrace_File_creation/</guid><pubDate>Fri, 07 Oct 2011 18:56:00 GMT</pubDate></item><item><title>Set Project Output Path, so all projects run from same folder.</title><description>&lt;p&gt;Are you encountering the situation where you wish that rather than adding references to other projects or DLL&amp;rsquo;s, in order to bring them into your bin directory, that you could simply specify that all your programs went into the same folder?  The simplest way to run applications under .NET is to have them all in the same folder.  This typically, while debugging is in the debug\bin folder.  This may also mean that you are finding yourself placing other dependant DLL&amp;rsquo;s in the same folder.  One easy solution is to change your Output Path in your project, and other projects that share DLL's.  You get there by selecting &amp;ldquo;Project Properties&amp;rdquo;, then the &amp;ldquo;Build&amp;rdquo; tab, then setting the OutPut Path.  Setting the output path to where you keep all your programs, will allow them to be found, as this is the path this Solution/project will run from and expect to find it&amp;rsquo;s program it needs. &lt;/p&gt;
&lt;br /&gt;
&lt;a href="/images/blog/output_path_thumb.jpg" target="_blank" rel="example_group"&gt;&lt;img alt="" style="border: 0pt none;" src="/images/blog/output_path_thumb.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;
</description><link>http://www.alchemysolutions.com/RSSRetrieve.aspx?ID=13864&amp;A=Link&amp;ObjectID=316470&amp;ObjectType=56&amp;O=http%253a%252f%252fwww.alchemysolutions.com%252f_blog%252falchemy%252fpost%252fset-output-path-run-from-same-folder%252f</link><guid isPermaLink="true">http://www.alchemysolutions.com/_blog/alchemy/post/set-output-path-run-from-same-folder/</guid><pubDate>Mon, 14 Nov 2011 23:32:00 GMT</pubDate></item><item><title>Should You Pay for COBOL Runtimes?</title><description>&lt;p&gt;Having established in my previous blog what &lt;a target="_blank" href="http://alchemysolutions.gelfuzion.net/_blog/alchemy/post/Why_COBOL_Runtimes/"&gt;&amp;ldquo;COBOL runtimes&amp;rdquo;&lt;/a&gt; are, in this blog I&amp;rsquo;ll consider whether you should pay for COBOL runtime licenses &amp;ndash; i.e. the right to ship and use COBOL runtime libraries with your applications.&lt;/p&gt;
&lt;p&gt;After establishing what we should, or might, pay for, I&amp;rsquo;ll approach the subject of runtime charges by explaining some of the history of COBOL runtimes which established a model for COBOL runtime charges and then discuss what is a reasonable model today. &lt;/p&gt;
&lt;h3&gt;Assumption: We Pay for Added Value&lt;/h3&gt;
&lt;p&gt;
Generally speaking we pay for goods and services that add value to our lives or company operations. If you don&amp;rsquo;t believe an item adds value you won&amp;rsquo;t pay for it &amp;ndash; or will pay grudgingly if you are not given a choice which, for example, is how many people view taxes.&lt;/p&gt;
&lt;p&gt;When you buy a COBOL compiler you expect it to compile your COBOL programs and give you code that will execute. If there was no COBOL runtime library, you would take that code and execute it on any computer that supported that code and would clearly need no license to do that. However, there is a COBOL runtime library that needs to be shipped, so does that add value worth paying for? Or is it a component that just supports your COBOL code so is only delivering the functionality you paid for when you purchased the COBOL compiler?
&lt;/p&gt;
&lt;p&gt;A look at COBOL runtime history will give us some insights into perceived value for COBOL runtimes through the years.&lt;/p&gt;
&lt;h3&gt;COBOL Runtime History&lt;/h3&gt;
&lt;h4&gt;Space &amp;ndash; The First Frontier&lt;/h4&gt;
&lt;p&gt;The issue of COBOL runtime licenses really surfaced with the advent of computers with microprocessors where it became possible to develop and compile programs on one computer but execute them on many other computers. The initial microcomputers, and later PCs, that were available from the mid &amp;lsquo;70s to the mid &amp;lsquo;80s didn&amp;rsquo;t have a lot of memory - 16KB was standard on the initial IBM PC introduced in 1981, with 640KB forming an upper bound for several years after that. It was a pretty challenging feat to execute COBOL programs in that amount of memory, particularly large applications that involved large data divisions and many modules. Creating a COBOL compiler wasn&amp;rsquo;t just a matter of turning the COBOL statements into executable code, the compiler vendors also had to provide the means of switching code in and out of memory as you couldn&amp;rsquo;t have everything in there at once. Thus the COBOL runtime wasn&amp;rsquo;t just providing subroutines to support the execution of COBOL statements, it was providing a virtual operating environment in which the compiled COBOL programs would execute.&lt;/p&gt;
&lt;p&gt;Early COBOL vendors could therefore argue that when you used their COBOL runtime library on another computer you were using a specialized operating environment developed by them to allow your COBOL programs to execute. Without this environment your programs wouldn&amp;rsquo;t fit &amp;ndash; the operating systems of those days wouldn&amp;rsquo;t be able to cope with the loads.&lt;/p&gt;
&lt;p&gt;
A reasonable case for added value.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Reaching Beyond COBOL&lt;/h4&gt;
An ongoing challenge for COBOL compiler creators was (and is) that the COBOL standard (a generally accepted definition of COBOL) develops slowly but the wishes of those using COBOL compilers develop at least as quickly as their understanding of what is possible on the current operating platform (i.e. much faster than the standard). COBOL vendors would therefore add the ability to do things that went beyond standard COBOL. Some of the abilities were provided by extensions to the language, such as extensions to the DISPLAY statement to display data on a full screen rather than single lines being relayed to a terminal, and others were provided by adding subroutines to the COBOL runtime library &amp;ndash; i.e. routines you invoked directly, and not just routines the compiler was invoking under the covers to support a COBOL statement.&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;
Where the additional functionality was provided as additional subroutines, there was again a reasonable case for the COBOL runtime library adding value wherever it was installed.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;Cross-Platform Environment&lt;/h4&gt;
&lt;p&gt;
ISVs (Independent Software Vendors) create software to sell to others. For business applications many of them have chosen COBOL because it is supported across many different platforms. As long as they stick to a standard that is supported across platforms these software companies can write their applications once and deliver them on many different computers &amp;ndash; a good business move as you can&amp;rsquo;t always determine which types of computer your potential customers will purchase.&lt;/p&gt;
&lt;p&gt;Several COBOL vendors designed their compilers so that they generated an intermediate code that was not targeted at any particular machine. Their runtime libraries were actually runtime environments that created virtual computers that executed the intermediate code. Provided the vendor developed a runtime environment for a particular computer, you could compile your COBOL programs once and run the code on any of the supported computers.&lt;/p&gt;
&lt;p&gt;Providing an execution environment was a reasonable added value.&lt;/p&gt;
&lt;h4&gt;Cash Cow for Vendors&lt;/h4&gt;
&lt;p&gt;
Of course, any COBOL compiler vendor that has charged for use of its COBOL runtimes now has quite a nice cash flow as applications continue to be written and distributed that rely on those runtimes. This can be really nice for the vendors but painful to the customers if the perceived added value has diminished.&lt;/p&gt;
&lt;h3&gt;Today&amp;rsquo;s Perspective on Historical Added Value&lt;/h3&gt;
Now that &amp;ldquo;micro computers&amp;rdquo; are no longer small, operating systems for those environments have advanced well beyond the additional capabilities offered by COBOL compiler vendors and the historical justifications for COBOL runtimes providing added value have weakened:&lt;br /&gt;
&lt;br /&gt;
1. Memory management &amp;ndash; fitting a lot into a small space&lt;br /&gt;
Today memory is plentiful and operating systems handle memory management well. It no longer makes sense for COBOL compiler vendors to insert their own layer of memory management on top of the operating system. Even if they do it is difficult to argue that they are providing added value.&lt;br /&gt;
2. Reaching beyond COBOL &amp;ndash; providing additional abilities&lt;br /&gt;
While micro-processor operating systems were young there were many obvious functions that business programs needed and adding them to the COBOL environment was the only way a COBOL compiler vendor could make the functions available to their customers. With well-developed operating systems everything a user wants is provided and each new release provides abilities beyond what the user might have imagined. The task for COBOL (or other language) compilers is to make all operating-system-provided functions available as quickly as possible. The best way to do that is to get out of the way by providing direct access to operating system functions &amp;ndash; for example by integrating well with the .NET Framework.&lt;br /&gt;
COBOL runtime libraries have little opportunity for providing added value.&lt;br /&gt;
3. Cross-Platform Environment&lt;br /&gt;
The need for a cross-platform environment is greatly reduced today compared to 10 or 20 years ago when there were many more possible target environments. It is quite viable for ISVs to target a single platform such as Windows because the market of Windows users is quite big enough for most companies&amp;rsquo; ambitions. Also, performance expectations often mean that providing a virtual environment for executing intermediate code results in poorer performance than available with code that is compiled for a specific platform. Even if you create intermediate code your compiler vendor may provide you with an additional pre-execution step to change that code to the object code for the target platform. The runtime environment is no longer giving the added value of a portable virtual computer.&lt;br /&gt;
&lt;h3&gt;The Added Value Trap&lt;/h3&gt;
Any company that saw the added value of the COBOL runtimes offered by a compiler vendor and chose to take advantage of that added value may now find themselves in a trap. The trap can work in two ways:&lt;br /&gt;
&lt;br /&gt;
1. The added value has diminished or disappeared (as in the case of the COBOL runtime providing memory management) but the COBOL runtime charges remain. The functionality is available elsewhere free but there&amp;rsquo;s a sizeable cost in converting your applications to use that free model.&lt;br /&gt;
2. Whether or not the added value remains, the company has invested years of development effort in creating code that depends on the COBOL runtime environment. The cost of converting to another environment is so high that the compiler vendor can increase their COBOL runtime charges almost at will. Although the initial price of the runtime charge was considered a good investment for the added value provided, that is no longer the case.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Conclusion &amp;ndash; Only Pay for COBOL Runtimes IF:&lt;br /&gt;
You HAVE to have the added value offered&lt;br /&gt;
AND are willing to deal with the added-value trap&lt;br /&gt;
OR are confident you have an iron-clad escape plan&lt;/h3&gt;
&lt;h3&gt;Free Runtime Philosophy and Benefits&lt;/h3&gt;
NetCOBOL compilers have been created with the following principles:&lt;br /&gt;
&lt;br /&gt;
* Generate code that works seamlessly with the operating environment&lt;br /&gt;
* Give the programmer direct access to operating-system functions - do not insert run-time layers between the COBOL program and the operating system&lt;br /&gt;
* Only extend the COBOL language when required to make COBOL programs work seamlessly with the target environment (such as the .NET Framework)&lt;br /&gt;
&lt;br /&gt;
Consequently the NetCOBOL runtime libraries are primarily there to support the compilation and execution of the COBOL syntax. This makes it easy for Alchemy Solutions to provide the runtime licenses for free and not place that additional financial burden on their NetCOBOL customers.&lt;br /&gt;
&lt;br /&gt;
The compiler development philosophy also means that users of NetCOBOL compilers can usually take advantage of new functionality in the operating system as soon as it is available &amp;ndash; they don&amp;rsquo;t have to wait for Fujitsu to develop COBOL-specific support for that functionality as can be the case if most operating system interactions have to go through a COBOL runtime layer.&lt;br /&gt;
&lt;br /&gt;
If you think this philosophy makes sense, check out the NetCOBOL family of compilers or pick the brains of one of our reps who have a good understanding of most COBOL compiler-related issues and questions.
</description><link>http://www.alchemysolutions.com/RSSRetrieve.aspx?ID=13864&amp;A=Link&amp;ObjectID=316482&amp;ObjectType=56&amp;O=http%253a%252f%252fwww.alchemysolutions.com%252f_blog%252falchemy%252fpost%252fshould-you-pay-for-cobol-runtimes%252f</link><guid isPermaLink="true">http://www.alchemysolutions.com/_blog/alchemy/post/should-you-pay-for-cobol-runtimes/</guid><pubDate>Mon, 14 Nov 2011 23:34:00 GMT</pubDate></item><item><title>Creating your own NeoBatch SQL Reports in VS2010</title><description>&lt;p&gt;With the release of Visual Studio 2010 and SQL Server 2008 R2, the way reports were being done for VS2008 has been changed and such we need to change the way we create our NeoBatch reports.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll do a quick walkthrough of how to create a simple report for NeoBatch&lt;/p&gt;
Creating the Project&lt;br /&gt;
&lt;br /&gt;
1. Start up Visual Studio 2010&lt;br /&gt;
&lt;br /&gt;
2. Go to File &amp;ndash;&amp;gt; New Web Site, Select Visual C# and choose  ASP.NET Reports Web Site, Click OK.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="/images/blog/slq_reports1_lg.png" target="_blank" rel="example_group"&gt;&lt;img alt="" src="/images/blog/slq_reports1_thumb.png" style="border: 0pt none;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
3. Visual Studio should start up the Report Wizard, Configure your connection to your NeoBatch SQL Database, Click Next, Save the Connection if you want.&lt;br /&gt;
&lt;br /&gt;
&lt;arel href="/images/blog/slq_reports2_lg.png" target="_blank"&gt;&lt;img alt="" src="/images/blog/slq_reports2_thumb.png" style="border: 0pt none;" /&gt;&lt;br /&gt;
&lt;br /&gt;
4. Choose your database objects, for this simple chart we are just going to select the jobs table from our NeoBatch Database.&lt;br /&gt;
&lt;br /&gt;
&lt;arel href="/images/blog/slq_reports3_lg.png" target="_blank"&gt;&lt;img alt="" src="/images/blog/slq_reports3_thumb.png" style="border: 0pt none;" /&gt;&lt;br /&gt;
&lt;br /&gt;
5. Click Finish, and then cancel to quit the wizard.&lt;br /&gt;
&lt;br /&gt;
The Wizard should quit and leave you with a project with the database connection but no chart created.&lt;br /&gt;
&lt;arel href="/images/blog/slq_reports4_lg.png" target="_blank"&gt;&lt;img alt="" src="/images/blog/slq_reports4_thumb.png" style="border: 0pt none;" /&gt;&lt;br /&gt;
&lt;br /&gt;
Configuring your DataSet&lt;br /&gt;
&lt;br /&gt;
1. DoubleClick on the NeoBatchDataSet.xsd file in the solution explorer&lt;br /&gt;
&lt;br /&gt;
2. Select the TableAdapter control and drag it from the tool box onto the main window.&lt;br /&gt;
&lt;br /&gt;
3. This should open the Table Adapter Configuration Wizard. Select the NeoBatchConnection String created when the project was created.&lt;br /&gt;
&lt;br /&gt;
4. Select the &amp;ldquo;Use SQL statements&amp;rdquo; option.&lt;br /&gt;
&lt;br /&gt;
5.  Add the following SQL Query:&lt;br /&gt;
&lt;br /&gt;
SELECT TOP 10 [job].[name] , SUM(S.CpuTime) as TotalCpu FROM JOB INNER JOIN Step S on S.JobId = Job.JobId GROUP BY Job.Name ORDER BY  SUM(S.CpuTime) DESC&lt;br /&gt;
&lt;br /&gt;
Click Finish.&lt;br /&gt;
&lt;br /&gt;
6. Rename the TableAdapter to Durations.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="/images/blog/slq_reports5_lg.png" target="_blank" rel="example_group"&gt;&lt;img alt="" src="/images/blog/slq_reports5_thumb.png" style="border: 0pt none;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Creating your Chart&lt;br /&gt;
&lt;br /&gt;
For this quick example we are going to make a chart that displays the durations of the jobs which have been run in NeoBatch.&lt;br /&gt;
&lt;br /&gt;
This is similar to a report found in the VS 2008 Reports&lt;br /&gt;
&lt;br /&gt;
1. Right click on the black report and select the Insert &amp;ndash;&amp;gt; Chart Optionimage&lt;br /&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="/images/blog/slq_reports6_lg.png" target="_blank"&gt;&lt;img alt="" src="/images/blog/slq_reports6_thumb.png" style="border: 0pt none;" /&gt;&lt;/a&gt; &lt;/p&gt;
2.  For this example we are going to do a simple column graph. The first one in the upper left had part of the screen.&lt;br /&gt;
&lt;br /&gt;
&lt;arel href="/images/blog/slq_reports7_lg.png" target="_blank"&gt;&lt;img alt="" src="/images/blog/slq_reports7_thumb.png" style="border: 0pt none;" /&gt;&lt;br /&gt;
&lt;br /&gt;
Click OK, Select your Dataset you created when creating the project and click ok again, It should then drop a chart onto your report page.&lt;br /&gt;
&lt;br /&gt;
3.  Right click on the NeoBatchDataSet under report data on the left side of visual studio and select &amp;ldquo;Add DataSet&amp;hellip;&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
Name the new DataSet, &amp;ldquo;DurationSet&amp;rdquo; and select the Durations Dataset and click ok.&lt;br /&gt;
&lt;br /&gt;
&lt;arel href="/images/blog/slq_reports8_lg.png" target="_blank"&gt;&lt;img alt="" src="/images/blog/slq_reports8_thumb.png" style="border: 0pt none;" /&gt;&lt;br /&gt;
&lt;br /&gt;
4. Drag the name value to the category fields on the bottom, and TotalCpu to the data fields section on the top.&lt;br /&gt;
&lt;br /&gt;
5.  Right click on the Y- Axis on the left part of the chart, and select &amp;ldquo;Axis Properties&amp;rdquo;. Click on the number section and change the value from Default to Number. Click OK.&lt;br /&gt;
&lt;br /&gt;
&lt;arel href="/images/blog/slq_reports9_lg.png" target="_blank"&gt;&lt;img alt="" src="/images/blog/slq_reports9_thumb.png" style="border: 0pt none;" /&gt;&lt;br /&gt;
&lt;br /&gt;
Do the same for the X-Axis, however for this axis under Axis Options, change the interval to 1.&lt;br /&gt;
&lt;br /&gt;
&lt;arel href="/images/blog/slq_reports10_lg.png" target="_blank"&gt;&lt;img alt="" src="/images/blog/slq_reports10_thumb.png" style="border: 0pt none;" /&gt;&lt;br /&gt;
&lt;br /&gt;
6. Select Default.aspx, Click on the arrow in the upper right hand corner, this will open the ReportViewer Tasks. Select choose DataSources. For DurationSet select ObjectDataSource2.&lt;br /&gt;
&lt;br /&gt;
&lt;arel href="/images/blog/slq_reports11_lg.png"&gt;&lt;img alt="" src="/images/blog/slq_reports11_thumb.png" style="border: 0pt none;" /&gt;&lt;br /&gt;
&lt;br /&gt;
7. Running the project should now display a report:&lt;br /&gt;
&lt;br /&gt;
&lt;arel href="/images/blog/slq_reports12_lg.png" target="_blank"&gt;&lt;img alt="" style="border: 0pt none;" src="/images/blog/slq_reports12_thumb.png" /&gt;&lt;br /&gt;
&lt;br /&gt;
8.  From here you can clean up the report, rename a few things, and have a fairly decent looking report. Open-mouthed smile&lt;br /&gt;
&lt;br /&gt;
&lt;a href="/images/blog/slq_reports13_lg.png" target="_blank" rel="example_group"&gt;&lt;img alt="" style="border: 0pt none;" src="/images/blog/slq_reports13_thumb.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Questions? Thoughts? Comments?
&lt;/arel&gt;&lt;/arel&gt;&lt;/arel&gt;&lt;/arel&gt;&lt;/arel&gt;&lt;/arel&gt;&lt;/arel&gt;&lt;/arel&gt;&lt;/arel&gt;
</description><link>http://www.alchemysolutions.com/RSSRetrieve.aspx?ID=13864&amp;A=Link&amp;ObjectID=317406&amp;ObjectType=56&amp;O=http%253a%252f%252fwww.alchemysolutions.com%252f_blog%252falchemy%252fpost%252fcreating-neobatch-sql-reports-vs2010%252f</link><guid isPermaLink="true">http://www.alchemysolutions.com/_blog/alchemy/post/creating-neobatch-sql-reports-vs2010/</guid><pubDate>Mon, 14 Nov 2011 23:34:00 GMT</pubDate></item><item><title>Diagnosing a Resource Leak</title><description>&lt;p&gt;We had a customer report an issue with their NeoKicks converted application, where NeoData was apparently exhausting pooled SQL connections.  It certainly seemed odd, given the fact that their load was relatively low.  To help us debug, we had them create a crash dump of IIS using the Debug Diagnostic Tool from Microsoft.&lt;/p&gt;
&lt;p&gt;Once I got a crash dump, I fired up Windbg, attached to the crash dump, and loaded SOS by issuing:&lt;/p&gt;
&lt;br /&gt;
.loadby sos mscorwks&lt;br /&gt;
&lt;br /&gt;
Since this is a .NET solution and the error was related to running out of pooled connections, I could dump the objects with references (that the GC won&amp;rsquo;t collect) using !dumpheap. &lt;br /&gt;
&lt;br /&gt;
Glancing through the output, I found the following:&lt;br /&gt;
&lt;br /&gt;
&lt;a rel="example_group" target="_blank" href="/images/blog/resource_leak1_lg.png"&gt;&lt;img alt="" width="452" height="127" src="/images/blog/resource_leak1_thumb.png" style="border:0pt none;" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The highlighted number above is the count of the object for each type.  The reason this one in particular is odd is that the WorkerSession object represents a current, running transaction.  The WorkerSession object contains things like open file handles, etc.  If there are 525 active transactions with each containing a few NeoData files, then it is certainly possible the SQL connection pool is exhausted.  Since this server wasn&amp;rsquo;t under a lot of load (just had been running for a while), 525 seems way too high.  I would expect this to be in the 1-10 range.  Luckily, we can dig in a little deeper to see who has a reference to these objects in Windbg. &lt;br /&gt;
&lt;br /&gt;
The next step is to get more information about each one of these objects.  You can use:&lt;br /&gt;
&lt;br /&gt;
!dumpheap -type Alchemy.NeoKicks.WorkerSession&lt;br /&gt;
&lt;br /&gt;
to dump out the references to that object type. &lt;br /&gt;
&lt;br /&gt;
&lt;a rel="example_group" href="/images/blog/resource_leak2_lg.png" target="_blank"&gt;&lt;img alt="" width="451" height="236" style="border:0pt none;" src="/images/blog/resource_leak2_thumb.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I&amp;rsquo;ve highlighted the address for one of the objects in the listing from !dumpheap.  I just picked one at random.  I want to find out what has references to this object, to see what might be preventing this object from being garbage collected.  To do this, I use the following:&lt;br /&gt;
&lt;br /&gt;
!gcroot 000000016fa53470&lt;br /&gt;
&lt;br /&gt;
&lt;a rel="example_group" href="/images/blog/resource_leak3_lg.png" target="_blank"&gt;&lt;img alt="" width="451" height="211" style="border:0pt none;" src="/images/blog/resource_leak3_thumb.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I looked at a few other objects (again, using !gcroot) and found that they were all being ultimately held by a System.Threading._TimerCallback object. &lt;br /&gt;
&lt;br /&gt;
This was getting interesting!  Why in the world would a TimerCallback object have a reference to my WorkerSession object?  I decided it was time to go looking through our NeoKicks code to see where a TimerCallback was used.  It turns out, a WorkerSession object can contain a Timer object that is used when a CICS START is issued so that the transaction will execute on a thread pool thread (and optionally on a time interval).  These objects should have gotten cleaned up by the GC, since these tasks run immediately and return.&lt;br /&gt;
&lt;br /&gt;
I decided to look through the documentation for Timer objects in the MSDN documentation and found the following:&lt;br /&gt;
&lt;br /&gt;
&amp;ldquo;When a timer is no longer needed, use the Dispose method to free the resources held by the timer.&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
Now we&amp;rsquo;re getting somewhere.  Sure enough, although we implement IDisposable for the WorkerSession object, we were not calling Dispose on the Timer object.  I added the Dispose() call, and re-ran a test that reproduced the problem and the issue went away.&lt;br /&gt;
&lt;br /&gt;
The moral of this story &amp;ndash; if you are using System.Threading.Timer objects in your code, you must call Dispose() on the object when you&amp;rsquo;re done.  Otherwise, you will end up with a memory leak!
</description><link>http://www.alchemysolutions.com/RSSRetrieve.aspx?ID=13864&amp;A=Link&amp;ObjectID=317413&amp;ObjectType=56&amp;O=http%253a%252f%252fwww.alchemysolutions.com%252f_blog%252falchemy%252fpost%252fdiagnosing-neokicks-resource-leak%252f</link><guid isPermaLink="true">http://www.alchemysolutions.com/_blog/alchemy/post/diagnosing-neokicks-resource-leak/</guid><pubDate>Mon, 14 Nov 2011 23:36:00 GMT</pubDate></item><item><title>Querying Census Data</title><description>&lt;p&gt;I was building a tool to generate some random data for testing with the goal that the data is readable.  I wanted to get actual city/state/zip code information so I began looking at the census.gov website for the type of data that is available.  I stumbled across several &lt;a href="http://www.census.gov/genealogy/names/names_files.html"&gt;&amp;ldquo;names files&amp;rdquo;&lt;/a&gt; that contain first and last names and their frequency.  The last name file was about 2MB in size &amp;ndash; perfect for generating some random customer names.&lt;/p&gt;
&lt;p&gt;I opened the file in notepad and started looking through the file to find how common my last name is in comparison to others.  Sure, the Find&amp;hellip; feature in notepad works &amp;ndash; but a SQL query would be better at pulling out the data that I wanted.&lt;/p&gt;
&lt;br /&gt;
Since the format of the file was fixed record size (not comma or tab delimited), I realized that the easiest solution would be to use NeoData to create a map for the fields in the file and import directly into a SQL server table.&lt;br /&gt;
&lt;br /&gt;
Each record contains a record like this:&lt;br /&gt;
&lt;br /&gt;
01 NAME-RECORD.&lt;br /&gt;
05 NAME PIC X(15).&lt;br /&gt;
05 FREQ PIC 9.999.&lt;br /&gt;
05 FILLER PIC X.&lt;br /&gt;
05 CUM-FREQ PIC ZZ.999.&lt;br /&gt;
05 FILLER PIC X(2).&lt;br /&gt;
05 RANK PIC 9(5).&lt;br /&gt;
&lt;br /&gt;
So I fired up NeoData and created a sequential file mapping using the COBOL description above, and added a line sequential endpoint pointing to the dist.all.txt file.&lt;br /&gt;
&lt;br /&gt;
&lt;a rel="example_group" href="/images/blog/cenus_data1_lg.png" target="_blank"&gt;&lt;img alt="" style="border:0pt none;" src="/images/blog/cenus_data1_thumb.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Next, I created a SQL mapping with the name field set as the primary key (since it is unique in this file) and added a SQL Endpoint to point to a test database:&lt;br /&gt;
&lt;br /&gt;
&lt;a rel="example_group" href="/images/blog/cenus_data2_lg.png" target="_blank"&gt;&lt;img alt="" style="border:0pt none;" src="/images/blog/cenus_data2_thumb.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Now it is just a matter of running the converter, to convert from the line sequential input to the SQL database:&lt;br /&gt;
&lt;br /&gt;
&lt;a rel="example_group" href="/images/blog/cenus_data3_lg.png" target="_blank"&gt;&lt;img alt="" style="border:0pt none;" src="/images/blog/cenus_data3_thumb.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I now have 88,799 records in my SQL table!  Now for the fun part &amp;ndash; fire up SQL Management studio and run some queries.  I wanted to see how some of the names of my coworkers compare to each other.  I used the following query:&lt;br /&gt;
&lt;br /&gt;
SELECT [NAME]&lt;br /&gt;
,[FREQ]&lt;br /&gt;
,[CUM-FREQ]&lt;br /&gt;
,[RANK]&lt;br /&gt;
FROM [VidRent].[dbo].[NAME-RECORD]&lt;br /&gt;
WHERE [NAME] IN ( 'HOLLIS', 'ANDERSON', 'COOK', 'PAULSON', 'ROBSON', 'LANGER' )&lt;br /&gt;
ORDER BY [RANK] ASC&lt;br /&gt;
&lt;br /&gt;
And it gave me the following results:&lt;br /&gt;
&lt;br /&gt;
&lt;a rel="example_group" href="/images/blog/cenus_data4_lg.png" target="_blank"&gt;&lt;img alt="" style="border:0pt none;" src="/images/blog/cenus_data4_thumb.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
It turned out to be a trivial exercise to map this Census data into SQL Server using the data conversion feature in NeoData, and now the data is in a form that is easy to consume for my data generator.  So when you have a text file that can easily be described with a COBOL record, you can easily convert it into SQL Server using NeoData following steps similar to these.&lt;br /&gt;
</description><link>http://www.alchemysolutions.com/RSSRetrieve.aspx?ID=13864&amp;A=Link&amp;ObjectID=317417&amp;ObjectType=56&amp;O=http%253a%252f%252fwww.alchemysolutions.com%252f_blog%252falchemy%252fpost%252fquerying-census-data%252f</link><guid isPermaLink="true">http://www.alchemysolutions.com/_blog/alchemy/post/querying-census-data/</guid><pubDate>Mon, 14 Nov 2011 23:37:00 GMT</pubDate></item><item><title>Why COBOL Runtimes?</title><description>&lt;p&gt;You may notice that we make a big thing on our website about the fact that the &amp;ldquo;runtimes&amp;rdquo; with NetCOBOL are free so you may well be asking &amp;ldquo;What are COBOL runtimes and why are they necessary?&amp;rdquo; I&amp;rsquo;ll aim to answer the two questions in this post.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve done any programming, you should be aware that a compiler takes your program that is written in some human-readable form and converts it to code that can be executed by the computer. (Actually the code produced by the compiler is rarely ready to execute immediately &amp;ndash; it typically needs some further processing, but those are details that are not relevant to the runtime issue.) For very simple programs a compiler could generate the machine code that implements the statements coded. However, for complex languages like COBOL and complex programs, there is more going on than the COBOL compiler can reasonably handle by converting every line into the precise machine code that would be a match for the statements.
&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;A COBOL Compiler Example&lt;/h3&gt;
For example, suppose we have the following COBOL statement:&lt;br /&gt;
ADD A TO B GIVING C&lt;br /&gt;
&lt;br /&gt;
The COBOL compiler has to be able to handle multiple combinations of items A, B and C. The items can have different types (e.g. BINARY, PACKED-DECIMAL, DISPLAY), different numbers of digits, different placements of decimal points, and different sign storage methods. They may be stored in different areas such as WORKING-STORAGE, the FILE-SECTION, or the LINKAGE SECTION. They may be items that are shared with other programs executing at the same time. Because of the many different possible combinations it rarely makes sense for the COBOL compiler to attempt to generate code that deals precisely with every item, rather it is more likely to generate code like this:&lt;br /&gt;
&lt;br /&gt;
* Call a routine to fetch an item of type A and put it in a common format&lt;br /&gt;
* Call a routine to fetch an item of type B and put it in a common format&lt;br /&gt;
* Call a routine that will add these two numbers together and return the result in the common format&lt;br /&gt;
* Call a routine to put the result in the format required for item C and store it in the appropriate location&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;
Even for a simple statement like the above addition we may have four or more subroutines required to produce the result. All these routines are provided in modules that are linked with the compiled code and form part of what we call the &amp;ldquo;COBOL runtime&amp;rdquo;. Without these routines the compiled code wouldn&amp;rsquo;t work &amp;ndash; if you were able to execute it, it would just come back with a long stream of &amp;ldquo;subroutine not found&amp;rdquo; errors.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Greater Complexity Enlarges COBOL Runtime Requirement&lt;/h3&gt;
To the routines required to execute statements you then have to add functions to support everything else that allows a program to exist in today&amp;rsquo;s operating environments such as:&lt;br /&gt;
&lt;br /&gt;
* Loading the code into the right area of memory with the right permissions&lt;br /&gt;
* Reading and writing files&lt;br /&gt;
* Printing data&lt;br /&gt;
* Interfacing with a graphical environment&lt;br /&gt;
&lt;p&gt;
* Providing a means for programs to be debugged&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Runtime Library, Runtime Licenses and &amp;ldquo;Runtimes&amp;rdquo;&lt;/h3&gt;
All these different requirements add up to the code you write depending upon a fairly large library of routines that are called when the program executes, i.e. at &amp;ldquo;run time&amp;rdquo;. The library of routines is therefore called the &amp;ldquo;runtime library&amp;rdquo; and you need to ship it with your applications.&lt;br /&gt;
&lt;br /&gt;
Because you are shipping software created by someone else (companies like Fujitsu and Alchemy Solutions) you usually need a license to do that and this is called a &amp;ldquo;runtime license&amp;rdquo;. Depending on the context when you see the term &amp;ldquo;COBOL runtimes&amp;rdquo; it either refers to the runtime library, if referring to what you ship, or the license (a legal document) that gives you the right to ship the runtime library.&lt;br /&gt;
</description><link>http://www.alchemysolutions.com/RSSRetrieve.aspx?ID=13864&amp;A=Link&amp;ObjectID=317421&amp;ObjectType=56&amp;O=http%253a%252f%252fwww.alchemysolutions.com%252f_blog%252falchemy%252fpost%252fwhy-cobol-runtimes%252f</link><guid isPermaLink="true">http://www.alchemysolutions.com/_blog/alchemy/post/why-cobol-runtimes/</guid><pubDate>Mon, 14 Nov 2011 23:41:00 GMT</pubDate></item><item><title>Why NetCOBOL Delivers Quality and Reliability</title><description>&lt;p&gt;I recently recalled that I wrote the article below in 2003 for a technical publication but I don&amp;rsquo;t think it ever saw the light of day. It still contains a number of relevant points that those interested in developing quality code or owning a quality COBOL compiler may find useful, so I&amp;rsquo;m making the article available here. It is based on an interview with Mr. Masaaki Uchida, at that time General Manager of the compiler development group at Fujitsu in Japan, and adds points derived from other research available at the time.&lt;/p&gt;
&lt;p&gt;Check out the article if any of the following interest you:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;    How Fujitsu &lt;strong&gt;builds reliability&lt;/strong&gt; into the NetCOBOL family of COBOL compilers&lt;/li&gt;
    &lt;li&gt;    What it takes to build &lt;strong&gt;high quality software&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;    Insights into &lt;strong&gt;Japanese software development&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;    &lt;strong&gt;Using tools&lt;/strong&gt; to &lt;strong&gt;boost code quality&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;    Comparing traditional development methodologies with open source methodologies&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Use the bookmarks to jump to the parts of most interest to you, as it is a longish article!&lt;br /&gt;
&lt;br /&gt;
&lt;a href="/downloads/NetCOBOL-for-Linux-a-Mix-of-Japanese-and-Open-Quality.pdf" target="_blank"&gt;NetCOBOL for Linux &amp;ndash; A Mix of Japanese and Open Quality&lt;/a&gt;&lt;br /&gt;
</description><link>http://www.alchemysolutions.com/RSSRetrieve.aspx?ID=13864&amp;A=Link&amp;ObjectID=317478&amp;ObjectType=56&amp;O=http%253a%252f%252fwww.alchemysolutions.com%252f_blog%252falchemy%252fpost%252fquality-cobol-compiler%252f</link><guid isPermaLink="true">http://www.alchemysolutions.com/_blog/alchemy/post/quality-cobol-compiler/</guid><pubDate>Mon, 14 Nov 2011 23:40:00 GMT</pubDate></item><item><title>NeoBatch SQL Reports and you</title><description>&lt;p&gt;Picture this: You are an active NeoBatch user, you are constantly running jobs working with your JCL batch operations, day in and day out. After making some changes to your JCL, you notice that it&amp;rsquo;s slowed down a bit. After some more changes, you think you have it going faster again, but you start to wonder: Is there a way to look at the history of the jobs that you&amp;rsquo;ve run, and present them in a graph or chart? The answer is yes, there is. You&amp;rsquo;re looking for NeoBatch SQL Reports.&lt;/p&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;h3&gt;What are SQL Reports&lt;/h3&gt;
&lt;p&gt;SQL Server Reporting Services (SSRS) is a part of Microsoft SQL Server which is capable of generating a variety of interactive and printed reports. SSRS competes with Crystal Reports and other business intelligence tools, and is included in Developer, Standard, and Enterprise editions of Microsoft SQL Server as an install option.Reports are defined in Report Definition Language (RDL), an XML markup language. Reports can be designed using recent versions of Microsoft Visual Studio, with the included Business Intelligence Projects plug-in installed or with the included Report Builder, a simplified tool that does not offer all the functionality of Visual Studio. Reports defined by RDL can be generated in a variety of formats including Excel, PDF, CSV, XML, TIFF (and other image formats), and HTML Web Archive. SQL Server 2008 SSRS can also prepare reports in Microsoft Word (DOC) format. Simply put, SQL reports are fairly easy to create and allow you to show off the data in your SQL database visually, quickly and efficiently.&lt;/p&gt;
&lt;p&gt;
&lt;img alt="" width="621" height="474" src="/images/blog/neobatch1_thumb.bmp" style="border:0pt none;" /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;h3&gt;SQL Reports and NeoBatch&lt;/h3&gt;
&lt;p&gt;Alchemy Solutions has developed SQL reports which work with SSRS to display data about NeoBatch jobs you have run either on your local system or on a NeoBatch Server installation.&lt;/p&gt;
&lt;p&gt;The current version of NeoBatch SQL Reports requires SQL Server 2008 and Visual Studio 2008. You also need to have SSRS installed and setup correctly. This article assumes you have done this.&lt;/p&gt;
&lt;p&gt;Take a few moments to browse through the reports provided with NeoBatch, and envision the possibilities.&lt;/p&gt;
&lt;br /&gt;
&lt;img alt="" width="636" height="486" src="/images/blog/neobatch2_thumb.bmp" style="border:0pt none;" /&gt;&lt;br /&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;h3&gt;Running the Reports&lt;/h3&gt;
&lt;p&gt;The steps below provide general guidelines for generating NeoBatch SQL reports. See Exercise 14 of the NeoBatch documentation for more details.&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Generate some data.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You need to have some data in your NeoBatch database in order to generate reports on that data. Data associated with multiple days will help, since some of the graphics are displayed with a timeline.&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Launch the NeoBatch SQL reports.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To find the NeoBatch SQL reports, head to your NeoBatch install directory. Once there, click on the samples directory, and then the SQLReports folder, and start up the NeoBatchSQLReports solution.&lt;/p&gt;
&lt;p&gt;If your database is not on your local system, you may need to change the Data Source in the reports. This can be accomplished by right-clicking on the Data Source for the report and changing the connection string appropriately. By default, it is set to your local system and a database named &amp;ldquo;NeoBatch&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;When it comes to viewing the reports, you have two different options available. You can either view the reports from the Report Viewer option, or view the reports from your browser. If you have not set up a report server, the report viewer is the default option. You can change the deployment location by going into the project properties and changing the TargerServerURL.&lt;/p&gt;
&lt;br /&gt;
&lt;img alt="" src="/images/blog/neobatch3_thumb.bmp" style="border:0pt none;" /&gt;&lt;br /&gt;
&lt;p&gt;&amp;nbsp;You may get a warning about no deployment server setup if you have not set one up. If you would like to continue just using the report viewer, that&amp;rsquo;s fine too.&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3: View the SQL Reports &lt;/strong&gt;
All right! The SQL reports should be running and displaying all sorts of information about your NeoBatch database.&lt;/p&gt;
&lt;p&gt;The first page here is a summary of your NeoBatch system with a timeline chart first displaying the number of jobs you have performed in the last month.&lt;/p&gt;
&lt;br /&gt;
&lt;img alt="" width="650" height="513" src="/images/blog/neobatch4_thumb.bmp" style="border:0pt none;" /&gt;&lt;br /&gt;
&lt;p&gt;&amp;nbsp;Keep in mind that the default time window is 30 days in the past from tomorrow. So it will display jobs that you have executed the day you run the report. If you want to focus on a more specific time window, simply change the dates and times at the top of the window. These dates and times will carry through the entire report.&lt;/p&gt;
&lt;p&gt;Scrolling down, you can see several other reports that display other metrics stored in your database, such as the average NeoBatch job duration, the jobs that took the longest to complete, and when the server was busiest. Let&amp;rsquo;s click on your job with the highest duration and see what it shows us!&lt;/p&gt;
&lt;p&gt;Clicking on that job should take you to a different report, this one showing you different information about that particular job, such as how many minutes of CPU time the job used up, and the data input and output of the job. &lt;/p&gt;
&lt;br /&gt;
&lt;img alt="" width="648" height="511" src="/images/blog/neobatch5_thumb.bmp" style="border:0pt none;" /&gt;&lt;br /&gt;
&lt;p&gt;&amp;nbsp;You can also click on the Job ID or any of the jobs displayed in the graphics to drill down even further into the NeoBatch database, displaying data about a specific job id. Pretty neat, huh?&lt;/p&gt;
&lt;br /&gt;
&lt;img alt="" width="654" height="559" src="/images/blog/neobatch6_thumb.bmp" style="border:0pt none;" /&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;h3&gt;Do you have SQL report stories of your own?&lt;/h3&gt;
&lt;p&gt;If you have any cool SQL report stories you would like to share or if you have any suggestions for reports, please leave a comment below.&lt;/p&gt;
</description><link>http://www.alchemysolutions.com/RSSRetrieve.aspx?ID=13864&amp;A=Link&amp;ObjectID=317487&amp;ObjectType=56&amp;O=http%253a%252f%252fwww.alchemysolutions.com%252f_blog%252falchemy%252fpost%252fneobatch-sql-reports-and-you%252f</link><guid isPermaLink="true">http://www.alchemysolutions.com/_blog/alchemy/post/neobatch-sql-reports-and-you/</guid><pubDate>Mon, 14 Nov 2011 23:40:00 GMT</pubDate></item></channel></rss>
