<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.foxite.com/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>ReportSculptor</title><link>http://weblogs.foxite.com/reportsculptor/default.aspx</link><description>Report Sculptor is free reporting framework for VFP9 </description><dc:language>en-US</dc:language><generator>CommunityServer 2.0 (Build: 60217.2664)</generator><item><title>Report Sculptor 1-2-3 Series. Getting started / OOP Reporting</title><link>http://weblogs.foxite.com/reportsculptor/archive/2008/10/22/7142.aspx</link><pubDate>Wed, 22 Oct 2008 09:22:00 GMT</pubDate><guid isPermaLink="false">8827bd1c-7596-4a8f-b0de-f59ce9ede522:7142</guid><dc:creator>ReportSculptor</dc:creator><slash:comments>0</slash:comments><comments>http://weblogs.foxite.com/reportsculptor/comments/7142.aspx</comments><wfw:commentRss>http://weblogs.foxite.com/reportsculptor/commentrss.aspx?PostID=7142</wfw:commentRss><wfw:comment>http://weblogs.foxite.com/rsscomments/7142.aspx</wfw:comment><description>&lt;p&gt;&amp;#160; &lt;br /&gt;&lt;strong&gt;     &lt;br /&gt;So you have visited Report Sculptor website,&amp;#160; then finally found some time to download files. And now what ?&amp;#160; &lt;strong&gt;&lt;img title="SculptorSchema" height="318" alt="SculptorSchema" src="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/SculptorSchema.jpg" width="267" align="left" border="0" /&gt;&lt;/strong&gt;       &lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;     &lt;br /&gt;&lt;/strong&gt;As you are probably still confused with all that stuff that you saw on website (and I don't blame you!),&amp;#160; &lt;br /&gt;perhaps it is time to finally offer some guidlines and explanations to those of you who might&amp;#160; be interested     &lt;br /&gt;in all this.&amp;#160; &lt;br /&gt;    &lt;br /&gt;In this blog series I will try to break the ice little bit, and show you that no matter how     &lt;br /&gt;complex it all might seem&amp;#160; to you at this point (&lt;em&gt;What a heck is on that picture ?!?&lt;/em&gt;),     &lt;br /&gt;Report Sculptor is actually all about &lt;strong&gt;simplicity&lt;/strong&gt; and&amp;#160; pretty much down to earth when it comes     &lt;br /&gt;to class of reporting problems it is trying to solve.&amp;#160; And as you will later see, it is all very very easy     &lt;br /&gt;to understand and get on with it !&amp;#160; &lt;br /&gt;    &lt;br /&gt;This time around I will not get you tired with long pages explaining theory and complex OOP buildup     &lt;br /&gt;behind these features,&amp;#160; but try to make it more like jumpstart manual, explaining how to get advantage     &lt;br /&gt;of this whole thing, in shortest possible time!&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;Trust me, I did not go through all this, to make things more difficult, quiet opposite :)     &lt;br /&gt;You will be versatile in RS reporting before you even know it!&amp;#160; (&lt;em&gt;You Already know it!&lt;/em&gt; )     &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;But enough talk, let's get down to business :)     &lt;br /&gt;We will start first with things that naturally come first;     &lt;br /&gt;&lt;strong&gt;     &lt;br /&gt;Download and initial setup       &lt;br /&gt;&lt;/strong&gt;There are two files you have to download in new version 0.90 Beta     &lt;br /&gt;(First and second download link respectively);     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;1) RsDev.Zip&amp;#160; &lt;br /&gt;2) RsServer.zip&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;I will start explaining in reversible order starting with file #2&amp;#160; first, simply because there is really &lt;em&gt;nothing to explain&lt;/em&gt; there. This file (RsServer.zip)&amp;#160; &lt;br /&gt;is just conveniently packed server deployment, which will be simply dumped (unzipped) somewhere along with your application when     &lt;br /&gt;the right time comes. As simple as that; Unzip and dump whole thing right next to your own app.&amp;#160;&amp;#160; (be that server or client machine)&amp;#160; &lt;br /&gt;    &lt;br /&gt;So let's forget about it all together and proceed with setting up your own RS Reporting - 'Laboratory'&amp;#160; &lt;br /&gt;    &lt;br /&gt;We will take rsDev.zip and unzip it in directly on your ( presumably c:\ ) drive.     &lt;br /&gt;So, after you agree to (annoying) WinZip license and finally create C:\RsDev&amp;#160;&amp;#160; folder with all subfolders underneath, you will open your FoxPro9     &lt;br /&gt;and consecutively look for ReportScuptorDemo.pjx&amp;#160;&amp;#160; located in root folder. When project opens up, go to project tab 'Code'&amp;#160; and run myRS.prg.     &lt;br /&gt;After that you can run second program marked here, to verify that everything is working.&amp;#160; You will get VFP9 preview of &lt;em&gt;HelloWorld&lt;/em&gt;&amp;#160; prg sample.&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&amp;#160;&lt;a href="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic01.png"&gt;&lt;img title="RsDemoPic01" height="361" alt="RsDemoPic01" src="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic01_thumb.png" width="453" border="0" /&gt;&lt;/a&gt;     &lt;br /&gt;&lt;strong&gt;Picture 1&amp;#160; Report Sculptor Demo Project&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;We will take closer look inside myRS.prg later, because there are few important things there regarding later deployment, but we will come back to it     &lt;br /&gt;once we actually need it.&amp;#160; You don't have RS Report to deliver (at this point)&amp;#160; so why bother. Instead I will just say that every time you open this     &lt;br /&gt;demo 'RS LAB' you always &lt;strong&gt;run this program first&lt;/strong&gt;, in order to set up development environment.&amp;#160; This program essentially calls compiled     &lt;br /&gt;ReportSculptor.app which in turn, automatically sets up RS Global Object, initializes GdiPlusX and then sets procedure to itself, so &lt;strong&gt;you are set&lt;/strong&gt;     &lt;br /&gt;to run all form samples.     &lt;br /&gt;    &lt;br /&gt;While running demo forms is nice, and you see many nice RS samples, perhaps you don't get to understand much out of it. So we will not go this way.     &lt;br /&gt;This is jumpstart crush-course not site-seeing (you probably managed to do that by now already) so instead, we are going straight to the     &lt;br /&gt;core of the matter. Develop Report! Believe it or not, by the end of this blog post alone you will be able to develop your very first;     &lt;br /&gt;(or first in a long time) ;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Free Report&lt;em&gt;&amp;#160;&lt;/em&gt;&lt;/strong&gt;&amp;#160; &lt;br /&gt;(Fully OOP at that!)     &lt;br /&gt;    &lt;br /&gt;Before we do that, let's try doing something like a little &lt;em&gt;hypnotherapy,&lt;/em&gt; where you try put all troubling thoughts and fears some place else, and     &lt;br /&gt;&lt;em&gt;free your mind&lt;/em&gt;&amp;#160; to learn something only relatively new. Therefore try to erase from your brain all those complex listener constructions     &lt;br /&gt;with GDI+ custom rendering, successors,&amp;#160; decorators etc. You will much easier understand all this - if you forget all that and have 'clean start'&amp;#160; :)&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;So as clock is ticking. We are sliding back in time.&amp;#160;&amp;#160; &lt;br /&gt;Now, as your memory takes you couple of decades back in time when (FRX) designers were not even invented yet (let alone listeners) laser jet cost     &lt;br /&gt;in a 4000$ range, you can almost hear an awful &lt;a href="http://upload.wikimedia.org/wikipedia/en/4/4d/Epson_MX-80.jpg" target="_blank"&gt;noise&lt;/a&gt; coming from next door...&amp;#160; So what was happening there making that much of a noise ?     &lt;br /&gt;&amp;#160;&lt;em&gt;Account's department is printing payrolls!&lt;/em&gt;&amp;#160; &lt;br /&gt;But wait minute!&amp;#160; All this is happening some 20 years back, they did not have modern report designers back then!&amp;#160; So how the heck     &lt;br /&gt;they were doing it ??&amp;#160;&amp;#160; Well it was hard but obviously not impossible. And more or less everybody did some of that.&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160; &lt;br /&gt;Let see now, how do we write one very ordinary report without comfort of having Report Designer at hand.     &lt;br /&gt;That is not to keep you permanently in stone age of reporting, but simply to remember basics, which will help you greatly&amp;#160; &lt;br /&gt;understand how Report Sculptor Engine works!&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Write As You Go&amp;#160; / Line By Line&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&lt;/strong&gt;So let now run this little program within your \rsDev\rsDev.pjx&amp;#160;&amp;#160; 'Report Laboratory'     &lt;br /&gt;In order for this to work you have to execute&amp;#160; myRS.prg&amp;#160; first and set up RS development environment. Then create new prg     &lt;br /&gt;and add below code;     &lt;br /&gt;    &lt;br /&gt;&lt;font size="2"&gt;******* Open &amp;amp; Relate tables      &lt;br /&gt;&lt;font face="Courier New" color="#0000ff"&gt;Close Tables All        &lt;br /&gt;use (Addbs(_oRSGO.RS_root) + 'data\categories' ) In 0 Shared order categoryid         &lt;br /&gt;use (Addbs(_oRSGO.RS_root) + 'data\products' ) In 0 Shared&amp;#160; order categoryid         &lt;br /&gt;select products         &lt;br /&gt;set relation to categoryid into categories         &lt;br /&gt;go top         &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;    &lt;br /&gt;&lt;font face="Courier New" color="#008040" size="2"&gt;*set device to printer prompt &amp;amp;&amp;amp;If you want to send it to printer      &lt;br /&gt;*set Printer on&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/p&gt; ****** And then produce raw output on screen using ?/?? commands&amp;#160; &lt;br /&gt;  &lt;p&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&lt;strong&gt;?&amp;#160; &lt;br /&gt;? '&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RS Example of Raw Printing '         &lt;br /&gt;? Replicate('-',80)         &lt;br /&gt;scan         &lt;br /&gt;&amp;#160;&amp;#160; ?&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160; ?? Str(Products.categoryid,5,0) at 10         &lt;br /&gt;&amp;#160;&amp;#160; ?? Products.productname at 20         &lt;br /&gt;&amp;#160;&amp;#160; ?? Transform(Products.unitprice,'$$$,$$$.00') at 60         &lt;br /&gt;&amp;#160;&amp;#160; ?&amp;#160;&amp;#160; &lt;br /&gt;endscan         &lt;br /&gt;? Replicate('-',80)         &lt;br /&gt;? 'End of report' &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New" color="#008040" size="2"&gt;&lt;strong&gt;*set device to screen&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;When you run this prg, you shall see raw report lines scrolling on your screen. When I have sent this to&amp;#160; &lt;br /&gt;MDI format (via MS Office Document Image Writer) I got 3 pages of raw, character based report.    &lt;br /&gt;I amended picture a bit to illustrate flow of lines as if this was to be sent to physical printer. So here it is;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Picture 2&amp;#160; Raw Report &lt;/strong&gt;    &lt;br /&gt;&amp;#160;&lt;a href="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic02.png"&gt;&lt;img title="RsDemoPic02" height="673" alt="RsDemoPic02" src="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic02_thumb.png" width="702" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;    &lt;br /&gt;So what do we got here ;&amp;#160; &lt;br /&gt;Not much I agree, but enough to understand order of events in physical terms, when this report is to be printed out on matrix or even laser printer     &lt;br /&gt;in character mode.&amp;#160;&amp;#160; Red lines illustrate &lt;strong&gt;&lt;font color="#ff0000"&gt;Page By Page&lt;/font&gt;&lt;/strong&gt; flow of report, while blue lines illustrate &lt;strong&gt;&lt;font color="#0000ff"&gt;Line by Line&lt;/font&gt;&lt;/strong&gt; flow happening within those pages.     &lt;br /&gt;    &lt;br /&gt;Essentially, page is drawn from top to bottom, line by line (only way line printers were able to print them)     &lt;br /&gt;up to certain&lt;strong&gt;&lt;font color="#ff0000"&gt; Page Break Point&lt;/font&gt;&lt;/strong&gt; where printer would simply eject it, and start writing new one. This motion would continue until entire report is written.     &lt;br /&gt;Paper space below that page break point would be&amp;#160; '&lt;font color="#ff00ff"&gt;Non Printable Area&lt;/font&gt;'&amp;#160; and would vary from printer to printer.&amp;#160; &lt;br /&gt;    &lt;br /&gt;Note that we did not define any page headers or footers, report groups or anything like that. This is very very basic report level. You can see that     &lt;br /&gt;data records are ordered by category and you can see the point where &lt;em&gt;CategoryId&lt;/em&gt;&amp;#160; (group) changes, but since we did not make any &lt;em&gt;provisions&lt;/em&gt;     &lt;br /&gt;for this &lt;em&gt;event&lt;/em&gt; , then nothing is actually happening except &lt;em&gt;our eye noticing&lt;/em&gt; it. Report lines simply flow one after the other as we scan through     &lt;br /&gt;'Products' table.     &lt;br /&gt;    &lt;br /&gt;Main reason I took you back to this basic level is that;     &lt;br /&gt;&lt;font color="#800040"&gt;&lt;font color="#000000"&gt;If you understood what you have seen above, then you already have in dept understanding of RS Engine.        &lt;br /&gt;&lt;font color="#800040"&gt;&lt;strong&gt;&lt;u&gt;RS Paging Engine down under, acts pretty much the same way!&lt;/u&gt;&lt;/strong&gt;&amp;#160;&lt;/font&gt;         &lt;br /&gt;        &lt;br /&gt;You saw that along this code I issued '&lt;font color="#ff0000"&gt;set device&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#000000"&gt; to printer.'&amp;#160; and then redirected output to a printer (MDI you saw) therefore for the sake      &lt;br /&gt;of easy understanding &lt;em&gt;Consider it simply a new &lt;strong&gt;device.&lt;/strong&gt;&lt;/em&gt;&amp;#160; &lt;br /&gt;'Only' difference between your Printer as device, and RS Engine &lt;strong&gt;as device&lt;/strong&gt; is that RS Engine is actually an &lt;strong&gt;&lt;em&gt;Object&lt;/em&gt;&lt;/strong&gt;&amp;#160; rich in functionalities.       &lt;br /&gt;Now since it is an object, instead of doing 'set device to . '&amp;#160;&amp;#160; You get to hold object reference of rsEngine object in a variable.&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font color="#800040"&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;         &lt;br /&gt;local oRS as rsEngine           &lt;br /&gt;oRS=getRsObject(thisform)           &lt;br /&gt;oRS.OpenSession()           &lt;br /&gt;With oRS           &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;    &lt;br /&gt;And RSEngine 'device' is now ON     &lt;br /&gt;Having done so, I could now continue and recode above shown raw report 1:1, by calling short named RsEngine methods matching     &lt;br /&gt;to&amp;#160; ?/??&amp;#160; output commands;&amp;#160;&amp;#160; &lt;font color="#800040"&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;         &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#800040"&gt;&lt;font color="#000000"&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;         &lt;br /&gt;.lf()           &lt;br /&gt;.lw(25, '&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; RS Example of Raw Printing ')           &lt;br /&gt;.           &lt;br /&gt;Endwith&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;font color="#800040"&gt;&lt;font color="#000000"&gt;     &lt;p&gt;&lt;font color="#0000ff" size="2"&gt;&lt;/font&gt;&lt;/p&gt;      &lt;p&gt;&lt;font size="2"&gt;&lt;font color="#0000ff"&gt;And so for.&lt;/font&gt;&amp;#160; It would eventually appear almost the same as shown on picture above.&amp;#160;&amp;#160; &lt;br /&gt;          &lt;br /&gt;Now there IS big difference between just having printer open with '&lt;font color="#ff0000"&gt;set device&lt;/font&gt; to printer' and&amp;#160; having rsEngine Object instantiated and held as           &lt;br /&gt;object reference. RS Engine is fully blown FoxPro object &lt;strong&gt;rich&lt;/strong&gt; with methods and functionalities which give you           &lt;br /&gt;&lt;strong&gt;Full Power and almost complete control&lt;/strong&gt;&amp;#160; over every aspect of page rendering, and consecutively Report creation.&amp;#160; Next to flashing out records           &lt;br /&gt;line by line, and flipping pages one after the other, RS Engine is capable of doing many more things!&amp;#160;&amp;#160; &lt;br /&gt;          &lt;br /&gt;However, Let's focus on ONE particular feature;&amp;#160; &lt;strong&gt;RS Engine can render native FoxPro controls on RS Report surface&lt;/strong&gt;.&amp;#160; &lt;br /&gt;Note that idea and method here is NOT to make a snapshot of Form controls (which is doable as well) but to reproduce them           &lt;br /&gt;&lt;strong&gt;in a practical reporting context&lt;/strong&gt;.&amp;#160; &lt;/font&gt;&lt;font size="2"&gt;This feature alone brings up entirely &lt;em&gt;&lt;strong&gt;new reporting paradigm&lt;/strong&gt;&lt;/em&gt; when it comes to VFP reporting;           &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;      &lt;p&gt;&lt;font size="2"&gt;&lt;strong&gt;Visual OOP Report as VFP9 Form&amp;#160; &lt;br /&gt;(In steps 1-2-3 )&amp;#160;&amp;#160; &lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;   &lt;/font&gt;    &lt;p&gt;&lt;font color="#000000"&gt;&lt;strong&gt;         &lt;br /&gt;Step 1&amp;#160;&amp;#160; &lt;br /&gt;Create an empty Form, Open &amp;amp; Relate Data via Form.DE           &lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;   &lt;font color="#000000"&gt;     &lt;br /&gt;So we&amp;#160; add native VFP form to our RS Demo Project.&amp;#160; Note that all controls used here will be &lt;strong&gt;native&lt;/strong&gt; VFP controls. This is not some firm requirement       &lt;br /&gt;or anything like that;&amp;#160; RS can ran from almost any kind of Forms and use &lt;strong&gt;your own&lt;/strong&gt; (framework) controls.&amp;#160; I hereby use native controls simply to       &lt;br /&gt;demonstrate how RS in fact gives whole &lt;em&gt;new Role&lt;/em&gt; to our aging VFP Form Designer &amp;amp; all it's 'dwellers'. As you will later see, Form Designer       &lt;br /&gt;becomes not exactly 'Inspector Gadget' , but workable Report Designer at least.&amp;#160; &lt;/font&gt;&lt;/font&gt;  &lt;p&gt;&lt;font color="#800040"&gt;&lt;font color="#000000"&gt;&lt;strong&gt;Then&lt;/strong&gt; we open Form Data environment where we Open &amp;amp; Relate Products -&amp;gt; Categories&amp;#160; via common&amp;#160; categoryId field and index tag         &lt;br /&gt;These tables can be found under data folder of RS Demo Project structure and belong to our old friend TasTrade.Dbc         &lt;br /&gt;Product table is parent, and it is ordered by index Tag categoryID. Just like we had it in that raw text report earlier.&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&lt;/font&gt;      &lt;br /&gt;&lt;font color="#000000"&gt;&lt;strong&gt;Picture 3 &lt;/strong&gt;Open &amp;amp; Relate Data         &lt;br /&gt;&lt;/font&gt;&lt;a href="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic03.png"&gt;&lt;img title="RsDemoPic03" height="378" alt="RsDemoPic03" src="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic03_thumb.png" width="498" border="0" /&gt;&lt;/a&gt;       &lt;br /&gt;      &lt;br /&gt;      &lt;br /&gt;&lt;font color="#000000"&gt;&lt;strong&gt;Step 2&lt;/strong&gt;&amp;#160; &lt;br /&gt;&lt;strong&gt;Building Report Sctructure&amp;#160; &lt;br /&gt;&lt;/strong&gt;&amp;#160; &lt;br /&gt;We add (in this case 3) borderless empty containers painted white, &lt;strong&gt;according to reporting structure&lt;/strong&gt; we want to build.&amp;#160; &lt;br /&gt;We also add couple of buttons, one to run it and one to release form while in development mode. That is not really necessary, as all this can         &lt;br /&gt;run from invisible form without user interaction. I just added buttons here so we can play with it easier.&amp;#160; I also set form back color to little         &lt;br /&gt;bit darker gray, for better visibility.&amp;#160; &lt;br /&gt;        &lt;br /&gt;Then we &lt;strong&gt;name containers intuitively&lt;/strong&gt; into&amp;#160; 'Detail_Header' ,&amp;#160; 'Detail' , 'Detail_Footer'&amp;#160; respectively&amp;#160;&amp;#160; &lt;br /&gt;&lt;/font&gt;&amp;#160; &lt;br /&gt;&lt;strong&gt;Picture 4&lt;/strong&gt;&amp;#160; Building Report Structure&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&lt;a href="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic04.png"&gt;&lt;img title="RsDemoPic04" height="493" alt="RsDemoPic04" src="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic04_thumb.png" width="725" border="0" /&gt;&lt;/a&gt;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160; &lt;br /&gt;      &lt;br /&gt;&lt;font color="#000000"&gt;Then we reopen Form.DE window and simply start dragging and dropping fields directly on form surface.        &lt;br /&gt;Now there is little bit of 'grunt work'&amp;#160; involved here. Next to above structuring of report we also have to do resizing, aligning,         &lt;br /&gt;setting textbox &lt;strong&gt;format/input masks&lt;/strong&gt; moving objects around etc.&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font color="#000000"&gt;(Bear in mind that this is all built from scratch right here&amp;amp;now, whereas you can have for instance &lt;em&gt;template form&lt;/em&gt; having all necessary objects ready         &lt;br /&gt;to be filled up. Not to even mention, that since we use &lt;strong&gt;real objects&lt;/strong&gt; we can do much better then just have templates.&amp;#160; (Class libraries later)         &lt;br /&gt;        &lt;br /&gt;&lt;strong&gt;Picture 5&lt;/strong&gt;&amp;#160; Grunt Work&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;a href="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic05.png"&gt;&lt;font color="#800040"&gt;&lt;img title="RsDemoPic05" height="476" alt="RsDemoPic05" src="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic05_thumb.png" width="774" border="0" /&gt;&lt;/font&gt;&amp;#160;&lt;/a&gt;&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;When we groomed and aligned our textboxes and labels properly, we distribute them (cut&amp;amp;paste) to respective container bands.     &lt;br /&gt;All labels will go to header container and all textboxes will go to detail container preserving alignment all along.&amp;#160; &lt;br /&gt;    &lt;br /&gt;Then finally we put all this together into&amp;#160; actual report via code;&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Step 3&amp;#160;&amp;#160; Stage Data Flow&lt;/strong&gt;     &lt;br /&gt;    &lt;br /&gt;We will now stage simple Scan/EndScan data flow which will &lt;em&gt;flash&amp;#160; &lt;/em&gt;form containers we just built &lt;em&gt;as report bands&lt;/em&gt; , and then we run     &lt;br /&gt;our report (form).     &lt;br /&gt;    &lt;br /&gt;What do I mean by flashing containers as bands ?&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;Just as ?/??&amp;#160; commands can output some strings and increment some internal line counter, RS Engine have method called     &lt;br /&gt;&lt;strong&gt;.FlashContainer()&lt;/strong&gt; which does similar thing, but renders &lt;strong&gt;entire containers&lt;/strong&gt; from our active form to our RS report.     &lt;br /&gt;After container and all contained objects are transported to our report surface, RS engine will simply increase current vertical     &lt;br /&gt;page position maintained in a property called .nTop&amp;#160; (just like VFP increases _plineno ) and writing will continue with next band     &lt;br /&gt;(container in this case) .&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;So report writing principle is again the same as we saw before on raw text example;&amp;#160; &lt;em&gt;Write As You Go&lt;/em&gt;&amp;#160; but with one major difference!     &lt;br /&gt;&lt;strong&gt;It is no longer Line By Line!&lt;/strong&gt;&amp;#160; Now instead of going line by line, advances are made vertically &lt;em&gt;Band By Band,&amp;#160; &lt;/em&gt;where 'Band' is actual     &lt;br /&gt;(.Flash)Container and it's height in pixels.&amp;#160; &lt;br /&gt;And just like in that raw report example; When RS Engine reach some &lt;strong&gt;Page Break Point&amp;#160; &lt;/strong&gt;it adds new page and report continues.     &lt;br /&gt;    &lt;br /&gt;Now since RS Engine is fully blown object, this running 'motion' rises various&amp;#160; &lt;strong&gt;events&lt;/strong&gt;&amp;#160;&lt;strong&gt;&amp;#160;&lt;/strong&gt;such are;     &lt;br /&gt;&lt;strong&gt;Page Footer&lt;/strong&gt; any time page break point is reached     &lt;br /&gt;&lt;strong&gt;Page Header&lt;/strong&gt; any time new page is &lt;em&gt;appended&lt;/em&gt;.&amp;#160; &lt;br /&gt;There are of course more events happening along, but let's keep it simple for better understanding.&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;Back to our example;     &lt;br /&gt;For simplicity purposes, I will not draw directly Page Headers/Footers but rather let RS Engine render default ones.&amp;#160;&amp;#160; &lt;br /&gt;(Hence&amp;#160; these default PH/PF are customizable, and can be actually your own class objects, so you already get first glimpse of OOP kicking     &lt;br /&gt;inn to help productivity.)&amp;#160; &lt;br /&gt;    &lt;br /&gt;So, since RS Engine will handle Headers and Footers, we are left with very simple task / code to write.&amp;#160; See right side of the picture, and     &lt;br /&gt;watch markings/comments carefully ;&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Picture 6&lt;/strong&gt;&amp;#160;&amp;#160; Putting it all together     &lt;br /&gt;&amp;#160; &lt;a href="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic06.png"&gt;&lt;img title="RsDemoPic06" height="509" alt="RsDemoPic06" src="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic06_thumb.png" width="796" border="0" /&gt;&lt;/a&gt;&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;What you can see on the right side (in green) is something that vaguely resembles FRX detail band with header and footer, but is this     &lt;br /&gt;time situated right here in our code to illustrate that you in fact fully control report flow and order of events.&amp;#160; &lt;br /&gt;This very simple record loop on products table will be actually &lt;strong&gt;driving&lt;/strong&gt; our report.     &lt;br /&gt;As you can see above I added one more label and textbox to footer band to show product count ( as simple reccount() ) and Voila!&amp;#160; &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Our report is ready!&lt;/strong&gt;&amp;#160; &lt;br /&gt;When you run this form and click run button, you get fully blown report ready to be printed exported etc.&amp;#160; &lt;br /&gt;I will &lt;em&gt;expose&lt;/em&gt; it via VFP9 native Preview/Print in this case.     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Picture 7&lt;/strong&gt; Our first OOP Report     &lt;br /&gt;&lt;a href="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic07.png"&gt;&lt;img title="RsDemoPic07" height="717" alt="RsDemoPic07" src="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic07_thumb.png" width="789" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;RS Engine Behavior&lt;/strong&gt;     &lt;br /&gt;Now let see how did engine behave in this case. As you will see, pretty similar as that raw report flow presented earlier;     &lt;br /&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;Page Break&lt;/strong&gt;&lt;/font&gt; point is followed by &lt;font color="#8080ff"&gt;&lt;strong&gt;Page footer&lt;/strong&gt;&lt;/font&gt; band rather then &lt;font color="#ff00ff"&gt;nonprintable area&lt;/font&gt; in this case, but other then that principle is almost the same.     &lt;br /&gt;Very simple and intuitive! So have look at picture below to easily understand basic order of events when executing OOP Data Report     &lt;br /&gt;with containers as report bands;     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Picture 8&lt;/strong&gt; Print As Yu Go / Band By Band     &lt;br /&gt;&lt;a href="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic08.png"&gt;&lt;img title="RsDemoPic08" height="544" alt="RsDemoPic08" src="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic08_thumb.png" width="873" border="0" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;However, this order of events is not something carved in stone. Since RS Engine is an object, it is all driven by properties. So here are some of them     &lt;br /&gt;that control way page sections are unfolding;     &lt;br /&gt;    &lt;br /&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;.lAutoFirstPage=.t.&amp;#160;&amp;#160; &lt;font color="#008000"&gt;&amp;amp;&amp;amp;&amp;#160;&amp;#160; Decides if .OpenSession()&amp;#160; method automatically adds first page or you want to do it&lt;/font&gt;.       &lt;br /&gt;&lt;/font&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&lt;font color="#008000"&gt;       &lt;br /&gt;************************************** Page/Report Format and orientation&amp;#160;&amp;#160; &lt;br /&gt;.&lt;/font&gt;rsPageFormat ='A4'&amp;#160; &lt;font color="#008000"&gt;&amp;amp;&amp;amp;or 'LETTER','A3' (and the rest to follow soon)&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&lt;/font&gt;.rsPageOrientation='PORTRAIT'&amp;#160; &lt;font color="#008040"&gt;&amp;amp;&amp;amp;Orientation        &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&lt;font color="#008000"&gt;************************************** Default Page Header Footers &lt;/font&gt;      &lt;br /&gt;.lAutoPageHeader=.t.&amp;#160; &lt;font color="#008000"&gt;&amp;amp;&amp;amp; Decides if engine will flash Page Header (or maybe want to do it yourself)        &lt;br /&gt;&lt;/font&gt;.lAutoPageFooter =.t.&amp;#160; &lt;font color="#008000"&gt;&amp;amp;&amp;amp; The same as with Page Header&amp;#160;&amp;#160; &lt;br /&gt;&lt;/font&gt;.oPageHeader = oPageHeaderContainerRef&amp;#160; &lt;font color="#008000"&gt;&amp;amp;&amp;amp; directly 'pin' some container reference as Page Header        &lt;br /&gt;&lt;/font&gt;.oPageFooter = oPageFooterContainerRef&amp;#160;&amp;#160; &lt;font color="#008000"&gt;&amp;amp;&amp;amp; As for header&amp;#160; &lt;br /&gt;        &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&lt;font color="#008000"&gt;****************************************Default Font (true types only)&lt;/font&gt;       &lt;br /&gt;.rsFontName&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = &amp;quot;Arial&amp;quot;       &lt;br /&gt;.rsFontSize&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; = 8       &lt;br /&gt;.rsFnStyleNo&amp;#160;&amp;#160;&amp;#160;&amp;#160; = 1&amp;#160; &lt;font color="#008000"&gt;&amp;amp;&amp;amp;Bold, 0 Regular, 2 Italic, 4 Underlined, 128 Strikethrough , and composites        &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New" color="#0000ff" size="2"&gt;&lt;font color="#008000"&gt;       &lt;br /&gt;****************************************relative on the fly / default positioning&amp;#160;&amp;#160; &lt;br /&gt;&lt;font color="#0000ff"&gt;.pgRemainder &lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;amp;&amp;amp;&amp;#160; How many pixels remain before page break point is reached.         &lt;br /&gt;.&lt;font color="#0000ff"&gt;nTop&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;amp;&amp;amp;&amp;#160; Current Vertical Position on page         &lt;br /&gt;&lt;font color="#0000ff"&gt;.nColumnLeft=25&lt;/font&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;amp;&amp;amp;&amp;#160; Default Left&amp;#160; &lt;br /&gt;************************************* ***See sample form #10 for more properties and methods ***         &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;    &lt;br /&gt;Love being in control ?&amp;#160; I thought so ;)&amp;#160; &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Where does this lead us ?&amp;#160; &lt;br /&gt;&lt;/strong&gt;This was by all means very simple report. It was meant to be this way, so you can understand basic RS Engine motions easily.&amp;#160; &lt;br /&gt;As they say;&lt;em&gt; 'You got to learn to walk first before you try flying.'&lt;/em&gt;&amp;#160;&amp;#160; so this example was greatly simplified (or downplayed if you wish)     &lt;br /&gt;showcase of power&amp;#160; and flexibility this approach gives you, so you can get on your own two feet by understanding very basics.&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;I understand that by now you are probably bored to death with 'Product By Category' type of report samples, so let see some     &lt;br /&gt;&lt;strong&gt;real life examples &lt;/strong&gt;of how you can assert and exercise this power to much greater extend.&amp;#160; &lt;br /&gt;    &lt;br /&gt;Therefore, take look at following report example published in RS Report &amp;amp; Code Gallery.&amp;#160; &lt;br /&gt;It is quiet good example of power brought to you by above presented paradigm of &lt;strong&gt;code driven report with containers as report bands&lt;/strong&gt;.&amp;#160; &lt;br /&gt;So please have look at it&amp;#160;&amp;#160; &lt;a title="http://www.report-sculptor.com/community/gallerymenu#GroupingOnMultipleInnerBands" href="http://www.report-sculptor.com/community/gallerymenu#GroupingOnMultipleInnerBands"&gt;http://www.report-sculptor.com/community/gallerymenu#GroupingOnMultipleInnerBands&lt;/a&gt;&amp;#160; &lt;br /&gt;Those of you who follow this blog post with an open RS Demo Project in front of you, can open and run form sample #15.&amp;#160; &lt;/p&gt;  &lt;p&gt;Some of you might say or think&amp;#160; 'Big deal, I can do such thing with FRX' .    &lt;br /&gt;I am sure you can :)&amp;#160; It has been done already many times despite some FRX limitations in this respect, but report itself is not the point here!&amp;#160; &lt;br /&gt;What I have presented you in this blog post was actually about something else.&amp;#160; If you look inside code there (#15) then that form itself,     &lt;br /&gt;you will realize one major difference compared to &lt;em&gt;'common solutions' &lt;/em&gt;to this I would say common reporting requirement     &lt;br /&gt;(multiple bands with grouping on each);&amp;#160;&amp;#160; &lt;br /&gt;If you remember how much of your time and energy you have spent by now on smartly preprocessing cursors, creating dummy indexes and     &lt;br /&gt;relations,&amp;#160; 'overheating'&amp;#160; PrintWhen clauses, adding report variables, UDFs (and what not.)&amp;#160; on various reporting problems like this in the     &lt;br /&gt;past, You just might like the fact that with RS;     &lt;br /&gt;&lt;em&gt;     &lt;br /&gt;It is no longer &lt;strong&gt;you trying to 'trick'&lt;/strong&gt; predefined FRX paradigm &amp;amp; order of events so you get result report you wish,       &lt;br /&gt;It is&lt;strong&gt; &lt;/strong&gt;you who &lt;strong&gt;create&amp;#160; your own paradigm&lt;/strong&gt; - So you simply do as you wish.&amp;#160;&amp;#160; &lt;br /&gt;&lt;/em&gt;RS Engine is there to provide services so you can accomplish that task, but &lt;strong&gt;you&lt;/strong&gt; are the one who &lt;strong&gt;set the rules&lt;/strong&gt; to the game :)&amp;#160; &lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;    &lt;br /&gt;&lt;font color="#800080"&gt;Having spelled out this little 'rant' about FRX,&amp;#160; I have to clarify once more that RS is not something trying to replace or compete      &lt;br /&gt;with FRX/RD.&amp;#160; Report Sculptor is designed to compliment FRX based reporting in cases like like those published under gallery/samples;       &lt;br /&gt;When FRX have to be 'pushed beyond limits'&amp;#160; in order to achieve certain results, or report is impossible to build with FRX/RD.&amp;#160; &lt;br /&gt;I wrote RS for this kind of reasons.&amp;#160; However, when ordinary report comes which have no any special requirements;&amp;#160; &lt;br /&gt;Then I would myself use FRX/RD!&amp;#160; I might pass it through RS to get PDF&amp;#160; or TIF version, but I would still write it with FRX/RD.&amp;#160;&amp;#160; &lt;br /&gt;At this point building standard stereotype reports with FRX is still much easier. However do not underestimate (yourself and)       &lt;br /&gt;power of OOP concept.&amp;#160; Things might change in the future :)       &lt;br /&gt;&lt;/font&gt;    &lt;br /&gt;Talking about OOP;     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;Little game at the end&amp;#160; &lt;br /&gt;'Bonus Question'&amp;#160; &lt;br /&gt;      &lt;br /&gt;&lt;/strong&gt;If you take that simple form we just created together (picture #7 ) and then consecutive result that comes out of it (picture #8)&amp;#160; &lt;br /&gt;it might look to you like 'case closed' What else is there to say ?&amp;#160; However, let's not overlook few details (&lt;em&gt; 'Devil lies in details'&lt;/em&gt;&amp;#160;&amp;#160;&amp;#160; )     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;1)&lt;/strong&gt; It is &lt;strong&gt;100% OOP&lt;/strong&gt; report in terms of &lt;strong&gt;elements used&lt;/strong&gt;.&amp;#160; &lt;br /&gt;&lt;strong&gt;2)&lt;/strong&gt; Despite being very primitive, it is already&amp;#160; (90% ) &lt;em&gt;&lt;strong&gt;&lt;font color="#008000"&gt;reusable reporting structure&lt;/font&gt;&lt;/strong&gt;&lt;/em&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;If you take form we just have put together, and &lt;strong&gt;clean up&lt;/strong&gt; all containers bands, leaving them &lt;strong&gt;empty&lt;/strong&gt; and then also remove all&amp;#160; &lt;br /&gt;cursor objects object from DE, what do we get ? Your 'bonus question' to win this game is;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;&lt;font color="#804000" size="3"&gt;Discover 'offending' line of code, preventing you to save this form as&amp;#160; &lt;em&gt;Reusable reporting class&lt;/em&gt;? &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Picture 9&lt;/strong&gt;&amp;#160; OOP Bonus Question     &lt;br /&gt;&amp;#160;&lt;a href="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic09.png"&gt;&lt;img title="RsDemoPic09" height="467" alt="RsDemoPic09" src="http://www.report-sculptor.com/blogpictures/GettingonwithReportSculptor_E449/RsDemoPic09_thumb.png" width="562" border="0" /&gt;&lt;/a&gt;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;    &lt;br /&gt;You guessed it right. It is line #1 :)     &lt;br /&gt;&lt;em&gt;&lt;strong&gt;&lt;font color="#804000"&gt;&lt;strike&gt;           &lt;br /&gt;select products&lt;/strike&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;If you erase this line and save this form with emptied containers into your own class library,&amp;#160; &lt;br /&gt;you just made your first&amp;#160; &lt;strong&gt;report designer class!&lt;/strong&gt;&amp;#160; Although primitive, you could even use it, to do produce simple record listings .     &lt;br /&gt;    &lt;br /&gt;All you would have to do next time, is add cursors to Form.DE and then drag &amp;amp; drop some fields from there onto form surface     &lt;br /&gt;align &amp;amp; groom&amp;#160; textboxes/labels and distribute them to those empty band containers. There would be &lt;strong&gt;no code required&lt;/strong&gt; any more.&amp;#160; &lt;br /&gt;Very primitive OOP buildup in this case was sufficient to reach 'no code required' situation, and turned this very primitive demonstration form     &lt;br /&gt;into simple reporting class.&amp;#160; &lt;br /&gt;    &lt;br /&gt;Ultimate prize on this bonus question you just won - is your own Reporting Freedom. So go out there and cash it :)     &lt;br /&gt;    &lt;br /&gt;And that would be all for now,&amp;#160;&amp;#160; &lt;br /&gt;&lt;em&gt;&lt;strong&gt;In the next blog;&lt;/strong&gt;       &lt;br /&gt;&lt;/em&gt;We will further expand on this brand new reporting concept, and show how to do nested report groups, organize totaling etc.&amp;#160; &lt;br /&gt;'&lt;strong&gt;1-2-3&lt;/strong&gt;' part of the blog, will be on &lt;strong&gt;how to compile and deploy your application&lt;/strong&gt; with RS reporting enabled.     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;&lt;font color="#800080"&gt;Stay tuned &amp;amp; Enjoy using Report Sculptor :)        &lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://weblogs.foxite.com/aggbug.aspx?PostID=7142" width="1" height="1"&gt;</description><category domain="http://weblogs.foxite.com/reportsculptor/archive/category/1094.aspx">ReportSculptor</category></item><item><title>Report Sculptor - New Version 0.90</title><link>http://weblogs.foxite.com/reportsculptor/archive/2008/10/14/7079.aspx</link><pubDate>Tue, 14 Oct 2008 07:18:00 GMT</pubDate><guid isPermaLink="false">8827bd1c-7596-4a8f-b0de-f59ce9ede522:7079</guid><dc:creator>ReportSculptor</dc:creator><slash:comments>0</slash:comments><comments>http://weblogs.foxite.com/reportsculptor/comments/7079.aspx</comments><wfw:commentRss>http://weblogs.foxite.com/reportsculptor/commentrss.aspx?PostID=7079</wfw:commentRss><wfw:comment>http://weblogs.foxite.com/rsscomments/7079.aspx</wfw:comment><description>&lt;font color="#000080"&gt;   &lt;p&gt;&lt;font color="#000080"&gt;Report Sculptor is &lt;strong&gt;Free &lt;/strong&gt;Reporting Framework, complement and extension to standard VFP9 reporting, which focuses on providing alternative ways of designing reports with VFP9. Major goal of this project is Fully OOP Reporting, Cross Format, Open, Extensible and Free of all known constrains. Next to providing many new and significant ready to use functionalities, it is also intended to become solid foundation for building Your personal OOP reporting solutions. &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;&lt;/p&gt;   &lt;font color="#ff0000"&gt;*** Time to re-download!      &lt;br /&gt;&lt;/font&gt;&lt;a href="http://www.report-sculptor.com/downloads"&gt;http://www.report-sculptor.com/downloads&lt;/a&gt;     &lt;br /&gt;    &lt;br /&gt;&lt;font color="#000080"&gt;This version bring significant changes in terms of easy integration, and also many new features.      &lt;br /&gt;Demo Project now have 14 samples. See samples from #6 and up in particular.       &lt;br /&gt;If first version was 'Pilot Beta' this version is actually more like 'production grade' beta.       &lt;br /&gt;See / Try&amp;#160; report samples yourself.&amp;#160;&amp;#160; &lt;/font&gt;&lt;/font&gt;  &lt;p&gt;&lt;font color="#000080"&gt;In this version;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;- Greatly simplified Deployment and customization of Rs Engine      &lt;br /&gt;(See Readme.TXT for set of instructions for easy RS integration)       &lt;br /&gt;- Simple Excel Replication added&amp;#160;&amp;#160; (See Form samples #09 and&amp;#160; #11/PageTab5&amp;#160; )       &lt;br /&gt;- Added Frx Wrapper for codeless (visual) chaining of FRX reports via pageframe. (Form #12)       &lt;br /&gt;- Improved grid rendering for fitting headerless grids into preprinted forms (#14)       &lt;br /&gt;- Improved RS SmartText       &lt;br /&gt;(Venture into text programming if necessary - See Form Sample #11 / PageTab3)       &lt;br /&gt;- Added FlashContainer() method which turns your form containers into actual       &lt;br /&gt;report bands (Form Sample #15)       &lt;br /&gt;- Engine now supports A4, LETTER, A3&amp;#160; (With most of standard page formats to follow)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;And few more 'goodies' here and there :)      &lt;br /&gt;---------------------------------------------------------------------------------------------------------       &lt;br /&gt;Note:       &lt;br /&gt;For Previewing/Printing hard copies) in real life apps,       &lt;br /&gt;at this point in time I still recommend using standard VFP9 standard Preview&amp;amp;Print facility.       &lt;br /&gt;Via oRS.Output( 2 , [.t.] )&amp;#160; method.&amp;#160;&amp;#160; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;FYI&amp;#160; RS Native Preview/Print facility is still under development.      &lt;br /&gt;------------------------------------------------------------------------------------------------------------&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;ReportSculptor Highlights;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;* * *&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;- Independent Reporting Engine (Pure VFP object) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;- Report Scripting (Low to high level)      &lt;br /&gt;Report from Arrays, Collections, Database Structures, Project files etc.       &lt;br /&gt;Loop through and (Script) Write-as-You-Go. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;- WYSIWYG Design of Free Reporting pages      &lt;br /&gt;Visual Report Composition (Page By Page)       &lt;br /&gt;Using native form objects, ActiveX snapshots etc. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;- FRX Interpreter      &lt;br /&gt;Allowing you to process any FRX report in order to combine resulting pages with other report contents. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;- Report from Text files (RS SmartText)      &lt;br /&gt;Merge Plain Text with your data and then additionally decorate it with nice fonts, using simple html formatting tags and scripting embeded within text.       &lt;br /&gt;      &lt;br /&gt;&lt;/font&gt;&lt;font color="#000080"&gt;-Report From Excel files (Included now)      &lt;br /&gt;Simple Excel replication alowing You to       &lt;br /&gt;use Excel Contents directly as part of your reports. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;And Finally;      &lt;br /&gt;- Introducing Fully OOP Reporting to VFP9       &lt;br /&gt;Enter into exciting new world of totally free and Fully OOP Reporting. Use your own Grids, Listboxes, Checkboxes, Textboxes, Labels, Shapes, Containers etc. and build your own OOP Reporting functionalities. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;When do I need Report Sculptor ?      &lt;br /&gt;For Extremes; Very Simple and Very Complex Reports.       &lt;br /&gt;To produce simple record listing, all that is needed is a single function call, pointing to any grid on a form. (Combined with run time grid creation can cut quiet a bit number of Frx-es shipped with your App.) &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;When you need tricky, non-standard and/or Complex Multi Part Reports then these are perfect matches for Report Sculptor. These were one of main reasons for building this framework. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;On Output Side. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;Anything you do with ReportSculptor can be; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;Previewed and Printed via      &lt;br /&gt;- Report Sculptor Modeless Preview/Print Form       &lt;br /&gt;- VFP9 Native Preview/Print       &lt;br /&gt;- XFRX Preview/Print. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;Or Exported to files      &lt;br /&gt;- Ultrafast PDF Export (via DorinV wrapper for HaruPdf OpenSource library)       &lt;br /&gt;- Multipage TIF       &lt;br /&gt;- XFF intermediate format, which can be directly converted to many other formats supported by XFRX. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;* * * &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;This is Free &amp;amp; Open Project! - Contributing Authors Welcome.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;Also, bear in mind that this still work in progress, which requires lot of your support and feedback to get better over period of time. Please try features and send me your feedback.      &lt;br /&gt;It will be of great value to me to improve and robust this tool.&amp;#160; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;Thank You for all constructive feedback I received so far &amp;amp; &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;Enjoy using ReportSculptor :)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#000080"&gt;Djordjevic Srdjan      &lt;br /&gt;Limassol, Cyprus       &lt;br /&gt;      &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://weblogs.foxite.com/aggbug.aspx?PostID=7079" width="1" height="1"&gt;</description></item></channel></rss>