<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://dbfront.com/rss" rel="self" type="application/rss+xml" />
		<title>dbFront</title>
		<description></description>
		<link>https://dbfront.com/</link>
			<item>
				<title>dbFront - 1.4.1 Stable with 39 features including a ProcedureAPI!</title>
				<link>https://dbfront.com/blog/post/2026-02-27-dbfront-141-procedureapi</link>
				<guid>https://dbfront.com/blog/post/2026-02-27-dbfront-141-procedureapi</guid>
				<pubDate>Fri, 27 Feb 2026 07:00:00 +0000</pubDate>
				<description><![CDATA[ <a href="https://dbfront.com/data/uploads/blog/2026/kanenori-mountain-6086083_1920.jpg" class="glightbox"><img src="https://dbfront.com/data/uploads/blog/2026/kanenori-mountain-6086083_1920.jpg" /></a><p>Lots has happened since the last blog post, which introduced dbFront 1.4.0.  The marketing gurus will tell you that I should have kept everyone informed, but I got busy.  Therefore, some of this post will be old news to the more adventurous, but not all.</p>

<h2>dbFront 1.4.1 - Introducing the ProcedureAPI</h2>

<p>dbFront 1.4.1 is the current stable release with 39 new features since 1.4.0. The most important feature introduced in this release of dbFront is the <strong>ProcedureAPI</strong>.  The ProcedureAPI allows stored procedures to do far more than return data or simple messages.  Using the ProcedureAPI, stored procedures can now enter into a full two-way conversation with dbFront, asking it to do things such as: prompt the user for additional information, retrieve information from another WebService, or generate reports.</p>

<p>When the Stored Procedure output style is set to "Server Directed" or "Automatic", dbFront examines the first result looking for a column named Action.  The value of that column determines how dbFront processes the stored procedure's remaining output.</p>

<p>dbFront currently supports the following action types:</p>

<ul>
	<li><strong><a href="https://dbfront.com/procedureapi#close">Close</a>:</strong> Exit with an optional message and optionally refresh the screen.</li>
	<li><strong><a href="https://dbfront.com/procedureapi#opendialog">OpenDialog</a>:</strong> Create a dialogue with optional: <strong>HTML Content</strong>, <strong>Form Fields</strong>, <strong>Custom Buttons</strong> and <strong>Table Results</strong>.  The updated <strong>Form Fields</strong> and <strong>Custom Button</strong> press are passed back to the procedure for further processing.</li>
	<li><strong><a href="https://dbfront.com/procedureapi#openreport">OpenReport</a>:</strong> Open the procedure output as a Report or Export.</li>
	<li><strong><a href="https://dbfront.com/procedureapi#opentable">OpenTable</a>:</strong> Redirect the user to a specific table.</li>
	<li><strong><a href="https://dbfront.com/procedureapi#openurl">OpenUrl</a>:</strong> Redirect the user to a URL.</li>
	<li><strong><a href="https://dbfront.com/procedureapi#sendemail">SendEmail</a>:</strong> Have dbFront send an email and return to the procedure for further processing.</li>
	<li><strong><a href="https://dbfront.com/procedureapi#webrequest">WebRequest</a>:</strong> Have dbFront send a WebRequest and return the results to the procedure for further processing.</li>
</ul>

<p>ProcedureAPI Examples</p>

<ul>
	<li><a href="https://dbfront.com/procedureapiparameters">Simple Report Parameters</a><br />
		Allows a stored procedure to display a dialogue with instructions and a prompt for missing parameters before proceeding.<br />
		 </li>
	<li><a href="https://dbfront.com/procedureapiopenreport">Simple Report Parameters + Output Selection</a><br />
		Extends the Report Parameters example and allows the user to choose to either Export to Excel or run a Quick Report.<br />
		 </li>
	<li><a href="https://dbfront.com/procedureapisearch">Advanced Find or Create</a><br />
		Creates an advanced and interactive lookup using a single stored procedure.  This same procedure is called repeatedly by dbFront with input from the self-created custom dialogue and responses from the web requests until the user is satisfied or the task is complete.</li>
</ul>

<p>For more details, see: <a href="https://dbfront.com/procedureapi">Procedure API</a></p>

<p><strong>IMPORTANT:</strong> If you plan to investigate the Procedure API, then we suggest upgrading to dbFront 1.4.2 to take advantage of the latest updates and fixes.</p>

<h2>dbFront 1.4.1 - Full Feature List</h2>

<p>Below is the detailed feature list. A number of the features were requested via the Q&A. Buried in this feature list are some very powerful features, some of which we are going to expand upon in future blog posts.</p>

<ul>
	<li><strong>Buttons:</strong>

		<ul>
			<li>Added a DebugShow to expose debug information at runtime. See: <a href="https://dbfront.com/buttons#main">Buttons Main</a></li>
			<li>Enhanced button visibility logic to only disable if fields are required or need to receive updates.</li>
		</ul>
	</li>
	<li><strong>Core:</strong> Added timeouts to regex expression handling to prevent ReDoS attacks.</li>
	<li><strong>CrystalReportHelper:</strong> List stored credentials, without the passwords. See: <a href="https://dbfront.com/crystalreporthelper#list">CrystalReportHelper</a></li>
	<li><strong>MyLayout:</strong>
		<ul>
			<li>Ability to discard/reset MyLayout.</li>
			<li>Removed admin details from MyLayout to make it match what regular users see.</li>
		</ul>
	</li>
	<li><strong>ProcedureAPI:</strong>
		<ul>
			<li>Added "Close" action, and "Refresh" attribute to terminal actions. See: procedureapi#Close</li>
			<li>Added "SendEmail" action to enable email notifications. See: procedureapi#SendEmail</li>
			<li>Added OpenReport to allow SPs to exit with a report type. See:<a href="https://dbfront.com/procedureapi#openreport">OpenReport</a></li>
			<li>Added support for Password fields.</li>
			<li>All messages/HTML are sanitized to block XSS or similar attacks.</li>
			<li>Embed Debug info in dialogues if DebugShow enabled. See:<a href="https://dbfront.com/procedureapi#debugging">Debugging ProcedureAPI</a></li>
			<li>Further ensure that password field contents are hidden in logs or debug info.</li>
			<li>Return the current UserId and Debug flag in request header.</li>
			<li>Updated OpenDialog to support Select fields. See:<a href="https://dbfront.com/procedureapi#opendialog">OpenDialog</a></li>
			<li>Allow {​%Form​Fields%}, {​%LogoUri%}, and {​%InspirationalQuote%} in form bodies.</li>
			<li>Procedure-driven forms with input submitted directly to the procedure for processing.</li>
			<li>Set the ClassList on the dialogue root. Allows full-screen dialogues and other enhanced effects.</li>
		</ul>
	</li>
	<li><strong>Readme:</strong> Updated Readme.html with improved structure and updated help.</li>
	<li><strong>RequestHandler:</strong>
		<ul>
			<li>Allow Anonymous/Public Requests, See: <a href="https://dbfront.com/qa/1366">Requests</a></li>
			<li>Anonymous Dialogs (e.g. Forgot Password, Register New User, ...)</li>
			<li>Simplified Parameters to the dbfHeader and dbfData</li>
		</ul>
	</li>
	<li><strong>SAML:</strong> Refreshed SAML library to improve compatibility.</li>
	<li><strong>SQLServer:</strong> Faster table structure query (Thanks Micheal).</li>
	<li><strong>Security:</strong>
		<ul>
			<li>Detect requests from a Cloudflare Tunnel and adjust security posture accordingly.</li>
			<li>Remove Windows Authentication from Login Screen (If Secured AND Remote (not LocalHost) AND No Connection uses Windows Authentication)</li>
			<li>Users can change their passwords if using Active Directory/Windows Authentication.</li>
		</ul>
	</li>
	<li><strong>Settings:</strong> Enabled setting ShowDomainName in WebApp.</li>
	<li><strong>SingleSignOn:</strong>
		<ul>
			<li>Handle users with large Azure group lists.</li>
			<li>Moved SSO/SAML validation from UI to Service which is more secure.</li>
			<li>Retrieve the Azure User Group Names (Extra config required)</li>
		</ul>
	</li>
	<li><strong>UrlDisplay:</strong> Added explicit option for Image URLs to avoid CORS risks and restrictions.</li>
	<li><strong>WebRequest:</strong>
		<ul>
			<li>Added ability to retrieve Html and Filter/Parse using XPath.</li>
			<li>The WebRequest Button action and the WebRequest ProcedureAPI share all functionality.</li>
		</ul>
	</li>
	<li><strong>dbFrontManager:</strong>
		<ul>
			<li>Added the dbFront Manager application to simplify the initial authentication.</li>
			<li>Alerts for invalid configurations or credentials (e.g. Microsoft Online Account).</li>
			<li>Create/maintain the local dbFrontAdmin user and dbFrontUsers group.</li>
			<li>Optionally select from a list of valid suggested configurations.</li>
		</ul>
	</li>
</ul>

<h2>dbFront 1.4.2 - More Procedure API & Bug Bounty</h2>

<p>The latest dbFront is still under active development, so we won't say much except to note that it solidifies the Procedure API while also incorporating significant security changes in response to a Bug Bounty we have been running over the past year.  More details to come...</p>

<h2>Summary</h2>

<p>The full release history for the 1.4.1 branch can be found at <a href="https://dbfront.com/releasehistory#v1.4.1">dbFront.com/releasehistory</a></p>

<p>We have been doing a lot of work to secure and enhance dbFront and to update the supporting documentation. If you have time, please consider creating or updating a review of dbFront at one of the following websites: </p>

<ul>
	<li><a href="http://www.linkedin.com/products/bigideasltd-dbfront?action=recommend">LinkedIn.com/products/bigideasltd-dbfront?action=recommend</a></li>
	<li><a href="http://www.g2.com/products/dbfront/take_survey">g2.com/products/dbfront/take_survey</a></li>
	<li><a href="http://www.capterra.com/p/143165/dbFront">Capterra.com/p/143165/dbFront</a></li>
	<li><a href="https://alternativeto.net/software/dbfront/about/">AlternativeTo.net/software/dbFront</a> (Don't forget to hit the <strong>like ♡ </strong> button).​​</li>
</ul>

<p>In place of a review... you can simply <strong>like ♡ </strong>dbFront at:</p>

<ul>
	<li><a href="https://alternativeto.net/software/dbfront/about/">AlternativeTo.net/software/dbFront</a></li>
</ul>

<p>The less effort we spend on sales and advertising, the more effort we can spend on improving and stabilizing dbFront.</p>

<p>Thanks - The Team at dbFront</p>

<p>Image by Kanenori from Pixabay</p>
 ]]></description>
			</item>
			<item>
				<title>dbFront 1.4.0 - With 37 New Features!</title>
				<link>https://dbfront.com/blog/post/dbfront-140-newest-feature-release</link>
				<guid>https://dbfront.com/blog/post/dbfront-140-newest-feature-release</guid>
				<pubDate>Thu, 09 Jan 2025 00:00:00 +0000</pubDate>
				<description><![CDATA[ <a href="https://dbfront.com/data/uploads/blog/2025-01-08/blog-post-1.4.0.jpg" class="glightbox"><img src="https://dbfront.com/data/uploads/blog/2025-01-08/blog-post-1.4.0.jpg" /></a><h2>dbFront 1.4.0</h2>

<p>dbFront 1.4.0 is the new feature release, boasting 37 new features. The blog post published in the middle of November focused on the layout changes in 1.4.0, three days later, we wrapped up the release. dbFront 1.3.2 was never made a feature release, so the features from 1.3.2 are included in this feature release.</p>

<h2>Features</h2>

<p>Three of the most significant features are:</p>

<p><strong>Layout Changes</strong>: We have already covered this in a previous blog post: <a href="https://dbfront.com/blog/post/2024-11-15-layout-changes">Layout Changes</a><br />
	<strong>Relationship Visibility</strong>: The ability to hide and show relationships dynamically. Similar to action buttons and field groups.<br />
	<strong>Run Procedure</strong>: Store procedures can now directly instruct dbFront to retrieve and return information from a web service.</p>

<p><br />
	Below is the detailed feature list, quite a few of the features were requested via the Q&A. Buried in this feature list are some very powerful features, some of which we are going to expand upon in future blog posts.</p>

<ul>
	<li><strong>Backups</strong>:

		<ul>
			<li>Enhanced configuration backup compares, including viewing all changes over time.</li>
			<li>Enhanced purge logic to retain at least 120 days of configuration history within 45 backups.</li>
		</ul>
	</li>
	<li><strong>Buttons</strong>:
		<ul>
			<li>Added the ability to edit any button's properties from the Table Prefs dialog.</li>
			<li>Directly set a button width. The default width is 120px.</li>
			<li>Optionally group buttons, with group names visible or not.</li>
			<li>Optionally position buttons below their form.</li>
		</ul>
	</li>
	<li><strong>Compare</strong>: Added "IfContains" and "IfNotContains", compare types. <a href="https://dbfront.com/qa/1427/add-if-contains-visibility-expression">QA:1427</a></li>
	<li><strong>Core</strong>: Updated multiple 3rd-Party components.</li>
	<li><strong>Expressions</strong>:
		<ul>
			<li>Added expressions for the parts of the Url. {url(domain)}, {url(root)}, {url(path)}, {url(fragment)}, {url(query)} as optional values to pass to procedures, visibility expressions, etc... <a href="https://dbfront.com/qa/1429/parse-browser-query-string-parameter-for-stored-procedure">QA:1429</a></li>
		</ul>
	</li>
	<li><strong>Fields</strong>: Added ability to edit any field's properties from the Table Prefs dialog. <a href="https://dbfront.com/qa/1376/show-field-preferences-gear-in-table-headers">QA:1376</a></li>
	<li><strong>Import</strong>: Added the ability to import PDF forms, similar to Excel or CSV. <a href="https://dbfront.com/qa/1083/load-pdf-form-data-into-database">QA:1083</a></li>
	<li><strong>Layout</strong>: Added the ability to rearrange the Table elements. (Table Grid, Custom Search Buttons, and Advanced Search), <a href="https://dbfront.com/qa/1436/ability-to-position-the-advanced-search-above-the-table">QA:1436</a></li>
	<li><strong>Lookups</strong>: Allow explicit sorting by View Fields.</li>
	<li><strong>MySQL</strong>: Replaced the MySQL Connector/Net with MySqlConnector to add built-in support for MySQL Server, MariaDB, Amazon Aurora, Azure Database for MySQL, Google Cloud SQL for MySQL, Percona Server and more... No longer requires a separate driver install. <a href="https://dbfront.com/qa/528/include-mysql-mariadb-connector-with-dbfront-install">QA:528</a></li>
	<li><strong>OpenURL</strong>: Extend OpenURL so that it can correctly load audio and video.</li>
	<li><strong>Procedures</strong>:
		<ul>
			<li>Procedures called by RunProcedure and WebRequest can refresh their results automatically and repeatedly. <a href="https://dbfront.com/qa/1433/dynamically-refresh-stored-procedure-results">QA:1433</a></li>
			<li>Stored Procedures can now make a request and process the result of a WebRequest. <a href="https://dbfront.com/qa/1443/how-can-can-use-dbfront-connect-saas-service-that-uses-oauth">QA:1443</a></li>
			<li>Updated SimpleTable output format to improve field formatting. (Dates, Blobs...)</li>
		</ul>
	</li>
	<li><strong>Relationships</strong>:
		<ul>
			<li>Added dynamic visibility to relationship tabs, similar to buttons and field groups. <a href="https://dbfront.com/qa/1008/conditionally-hide-child-tables-relationships-based-record">QA:1008</a></li>
			<li>Extended the Multi-Select functionality to compound relationships. <a href="https://dbfront.com/qa/1274/multiselect-with-composite-primary-key">QA:1274</a></li>
		</ul>
	</li>
	<li><strong>RequestHandling</strong>:
		<ul>
			<li>Handle callback requests from OAuth and other services via a Procedure. <a href="https://dbfront.com/qa/1443/how-can-can-use-dbfront-connect-saas-service-that-uses-oauth">QA:1443</a></li>
			<li>Improved help by displaying the expected Request URL in the config dialog.</li>
		</ul>
	</li>
	<li><strong>SQLServer</strong>:
		<ul>
			<li>Verify Executable access to stored procedures when saving preferences.</li>
			<li>Performance Analyzer for Linked Views to help track down view/column problems.</li>
			<li>Ability to DebugLog SQL Server messages to help monitor performance.</li>
		</ul>
	</li>
	<li><strong>Search</strong>:
		<ul>
			<li>Specify if the Advanced search is AlwaysOpen, DefaultOpen, or DefaultClosed. <a href="https://dbfront.com/qa/1409/have-table-open-with-advanced-search-already-expanded">QA:1409</a></li>
			<li>Adjust the Search fields to be Single or Range. <a href="https://dbfront.com/qa/1408/ability-search-integer-datatypes-for-exact-value-non-ranged">QA:1408</a></li>
			<li>Optionally turn a multi-select into a single select.</li>
		</ul>
	</li>
	<li><strong>Table</strong>:
		<ul>
			<li>Ability to configure a "BeforeFormLoadProcedure" to run a stored procedure that can do extra work to prepare the form data before the actual Select for the FormData. <a href="https://dbfront.com/qa/1419/prepare-form-data-before-load">QA:1419</a></li>
			<li>Display Attachment/Image thumbnails within the grid. <a href="http://dbfront.com/qa/1407/show-images-in-the-table-grid-instead-of-checkmarks">QA:</a><a href="https://dbfront.com/qa/1407/show-images-in-the-table-grid-instead-of-checkmarks">1407</a></li>
		</ul>
	</li>
	<li><strong>Testing</strong>: Automated client testing using <a href="https://dbfront.com/licensing#testscripts">Katalon Recorder (dbFront Site License)</a></li>
	<li><strong>WebRequest</strong>:
		<ul>
			<li>Ability to Indent received Json.</li>
			<li>Ability to receive a file (e.g. PDF) and either view or save it.</li>
			<li>Ability to set a Request Body including expressions.</li>
			<li>Ability to set a Request Header including expressions.</li>
			<li>Ability to set a RequestMethod [Get, Post, Head, Put, Delete]. <a href="https://dbfront.com/qa/1092/ability-to-send-http-post-requests">QA:1092</a></li>
		</ul>
	</li>
</ul>

<h2>Summary</h2>

<p>The full release history for the 1.4.0 branch can be found at <a href="https://dbfront.com/releasehistory">dbfront.com/releasehistory</a></p>

<p>We have been doing lots of work enhancing dbFront and updating the supporting documentation. If you have time, please consider reviewing or updating your review for dbFront at one of the following websites: </p>

<ul>
	<li><a href="http://www.linkedin.com/products/bigideasltd-dbfront?action=recommend">www.linkedin.com/products/bigideasltd-dbfront?action=recommend</a></li>
	<li><a href="http://www.g2.com/products/dbfront/take_survey">www.g2.com/products/dbfront/take_survey</a></li>
	<li><a href="http://www.capterra.com/p/143165/dbFront">www.capterra.com/p/143165/dbFront</a></li>
	<li><a href="http://www.alternativeto.net/software/dbfront">www.alternativeto.net/software/dbfront</a> (Don't forget to hit the [Like] button).​​</li>
</ul>

<p>In place of a review... you can simply <strong>like ♡ </strong>dbFront at:</p>

<ul>
	<li><a href="http://www.capterra.com/p/143165/dbFront">www.capterra.com/p/143165/dbFront</a></li>
	<li><a href="http://www.alternativeto.net/software/dbfront">www.alternativeto.net/software/dbfront</a></li>
</ul>

<p>The less effort we spend on sales and advertising, the more effort we can spend on improving and stabilizing dbFront.</p>

<p>Thanks - The Team at dbFront</p>

<p> </p>
 ]]></description>
			</item>
			<item>
				<title>Merry Christmas and a Happy New Year!</title>
				<link>https://dbfront.com/blog/post/2024-merry-christmas-and-a-happy-new-year</link>
				<guid>https://dbfront.com/blog/post/2024-merry-christmas-and-a-happy-new-year</guid>
				<pubDate>Tue, 24 Dec 2024 21:36:00 +0000</pubDate>
				<description><![CDATA[ <a href="https://dbfront.com/data/uploads/blog/2024-12-25/christmas-blog-post.png" class="glightbox"><img src="https://dbfront.com/data/uploads/blog/2024-12-25/christmas-blog-post.png" /></a><h2>Holiday wishes, from the team at dbFront</h2>

<p>It's winter here in Canada, and we get to celebrate a white Christmas, while some around our beautiful globe celebrate a green or even a brown Christmas. As we approach the end of 2024 and the beginning of 2025, we want to thank our loyal customers and those who joined us in 2024 for all your encouraging feedback and support so that we can steadily improve dbFront and make it a better product for all! </p>

<p>We want to wish everyone a very merry Christmas, and for those working over the holidays, thank you, thank you all!!!</p>

<p>We are working on a few new goodies for dbFront, but they were not quite ready, so we will need to reveal them early next year. See you all in 2025!</p>

<p> </p>
 ]]></description>
			</item>
			<item>
				<title>dbFront 1.4.0 - Layout Changes</title>
				<link>https://dbfront.com/blog/post/2024-11-15-layout-changes</link>
				<guid>https://dbfront.com/blog/post/2024-11-15-layout-changes</guid>
				<pubDate>Fri, 15 Nov 2024 00:00:00 +0000</pubDate>
				<description><![CDATA[ <a href="https://dbfront.com/data/uploads/blog/2024-11-19/blog-post-layout-changes.jpg" class="glightbox"><img src="https://dbfront.com/data/uploads/blog/2024-11-19/blog-post-layout-changes.jpg" /></a><p>In version 1.4.0 dbFront has added new layout functionality....<br />
	You can now rearrange the table grid, advanced search, and search buttons, create groups for buttons, change the placement of the buttons, and change the way the 'Advanced Search' is shown.</p>

<h2>Rearrange Grid Items</h2>

<p>To reposition the items click on the gear icon beside the form, then click on the layout tab. In the <strong>Table</strong> section, you can switch the element order by dragging the elements around. This allows you to place the Advanced Search above or below the table grid and the custom search buttons above, below, or in between.</p>

<h2>Button Placement/Groups</h2>

<p>You will find the <strong>Form Buttons </strong>section on the same tab. Here you can change the <strong>Position </strong>of the buttons from the left of the form to below it.</p>

<p>You may also notice in the <strong>Form Buttons</strong> section you can now hide or display <strong>Group Labels</strong>. That's right, dbFront has added the ability to make button groups, although the ability to group buttons currently only applies to custom buttons. The <strong>Display Custom </strong>option allows you to hide or display the group names for the buttons. For detailed information on how to use/implement the button groups, click the following link. <a href="https://dbfront.com/buttongroups" target="_blank">Select or Create button groups</a></p>

<h2>Advanced Search</h2>

<p>When you click on the <strong>Search Fields</strong> button you change the way the <strong>Advanced</strong> <strong>Search </strong>is seen. The options are <strong>Default Open, Default Closed,</strong> or <strong>Always Open</strong>.</p>

<h2>Summary</h2>

<p>You can view dbFront's release history at <a href="https://dbfront.com/releasehistory">dbfront.com/releasehistory</a></p>

<div class="linktarget" id="freetrial">
    <h2>Try dbFront for Free</h2>
    <p>dbFront offers a 30-day free trial so that you can download, install and test it in your environment. &nbsp;After the trial you can continue to use the FREE version of dbFront for up to 3 users. &nbsp;Please review the <a href="/video-tutorials">video tutorials</a> and plan to start a <a href="/download">free trial</a> today. &nbsp;We believe you will be impressed.</p>
<style>
.trailActionButtons { text-align: center; }
.trailActionButtons a.button {
    display: inline-block;
    width: 200px;
    margin: 0 10px;
}
</style>
<div class="trailActionButtons">
<a class="button blue" href="/download" style="font-size:14px;text-shadow:none;">Start Free Trial</a>
<a class="button orange" href="/demo2" style="font-size:14px;text-shadow:none;">View Live Demo</a>
</div>
<br/>

 ]]></description>
			</item>
			<item>
				<title>dbFront 1.3.1: The Newest Stable Release!</title>
				<link>https://dbfront.com/blog/post/2024-10-30-dbfrontrelease-131-stable</link>
				<guid>https://dbfront.com/blog/post/2024-10-30-dbfrontrelease-131-stable</guid>
				<pubDate>Wed, 30 Oct 2024 00:00:00 +0000</pubDate>
				<description><![CDATA[ <a href="https://dbfront.com/data/uploads/blog/2024-10-30/pexels-francesco-ungaro-1448653.jpg" class="glightbox"><img src="https://dbfront.com/data/uploads/blog/2024-10-30/pexels-francesco-ungaro-1448653.jpg" /></a><h2>dbFront 1.3.1</h2>

<p>dbFront 1.3.1 is now marked as stable and all new feature development is happening in the latest 1.4 release of dbFront.</p>

<p>The 1.3.1 release of dbFront offers 12 new features and 2 System Updates as compared to the 1.2.6 release of dbFront.</p>

<h3>Features:</h3>

<ul>
	<li>CrystalReports: Added output types: Html, Txt, Xml, Xlsx</li>
	<li>CrystalReports: Inline images in Html output</li>
	<li>CrystalReportsHelper: Updated for additional types.</li>
	<li>Exports: More meaningful Filenames for Reports and Exports. <a href="https://dbfront.com/qa/1329/prompt-user-filename-selecting-output-option-attachments" target="_blank">Q&A</a></li>
	<li>FileLink: Added read-only support for attachments stored on the file system. <a href="https://dbfront.com/qa/282/1-2-upload-file-to-shared-folder-and-save-link-in-database" target="_blank">Q&A</a></li>
	<li>Procedure: The ServerDirected results of OpenTable or OpenUrl can now specify a 'Message' column. See:<a href="https://dbfront.com/RunProcedure" target="_blank">RunProcedure</a></li>
	<li>Procedures: Added full support for stored procedures that return multiple results sets. <a href="https://dbfront.com/qa/365/return-multiple-result-sets-from-a-stored-procedure" target="_blank">Q&A</a></li>
	<li>ReportTemplates: Ability to Copy an existing Report Template.</li>
	<li>Scrolling: Added ability to scroll through table instead of paging. <a href="https://dbfront.com/qa/536/vertical-scroll-bar-on-table-section-instead-of-paging" target="_blank">Q&A</a></li>
	<li>Security: Added support for separate User and Group containers and LDAP filters</li>
	<li>ZipExport: Export a ZIP package containing the PDF report and all referenced attachments. <a href="https://dbfront.com/qa/1332/ability-download-attachments-and-linked-files-with-reports" target="_blank">Q&A</a></li>
	<li>ZipExport: Include FileLink attachments in Zip package.</li>
</ul>

<h3>System Updates:</h3>

<ul>
	<li>Table: Renamed "Table Fields" to "Table" in config.</li>
	<li>Core: Updated multiple 3rd-Party components.</li>
</ul>

<p>It also has 26 bug fixes with its most important fix covering:</p>

<ul>
	<li><b>LayoutGroups:</b> Fixed serious issue where field contents in a server hidden group still partially visible to administrators might be deleted on save.</li>
</ul>

<p>The full release history for the 1.3.1 branch can be found at <a href="https://dbfront.com/releasehistory#v1.3.1" target="_blank">Release History 1.3.1</a></p>

<h2>dbFront 1.4.0</h2>

<p>In progress we have our upcoming feature release, dbFront 1.4.0. Currently, this release has <strong>33</strong> new features some of which include new functionality for buttons and WebRequests. There is a whole pile of new functionality in dbFront release in 1.4.0 and we will cover that in more detail when it is released in early November.</p>

<h2>Summary</h2>

<p>dbFront has seen steady development since its beginning in 2014. We are dedicated to helping you build awesome, easy to use database applications and we look forward to working with you in the future.</p>

<div class="linktarget" id="freetrial">
    <h2>Try dbFront for Free</h2>
    <p>dbFront offers a 30-day free trial so that you can download, install and test it in your environment. &nbsp;After the trial you can continue to use the FREE version of dbFront for up to 3 users. &nbsp;Please review the <a href="/video-tutorials">video tutorials</a> and plan to start a <a href="/download">free trial</a> today. &nbsp;We believe you will be impressed.</p>
<style>
.trailActionButtons { text-align: center; }
.trailActionButtons a.button {
    display: inline-block;
    width: 200px;
    margin: 0 10px;
}
</style>
<div class="trailActionButtons">
<a class="button blue" href="/download" style="font-size:14px;text-shadow:none;">Start Free Trial</a>
<a class="button orange" href="/demo2" style="font-size:14px;text-shadow:none;">View Live Demo</a>
</div>
<br/>

 ]]></description>
			</item>
			<item>
				<title>Finally a dbFront Users group</title>
				<link>https://dbfront.com/blog/post/2023-03-01-dbfront-users-group</link>
				<guid>https://dbfront.com/blog/post/2023-03-01-dbfront-users-group</guid>
				<pubDate>Mon, 22 Jan 2024 00:00:00 +0000</pubDate>
				<description><![CDATA[ <a href="https://dbfront.com/data/uploads/blog/2024-01-22/header.jpg" class="glightbox"><img src="https://dbfront.com/data/uploads/blog/2024-01-22/header.jpg" /></a><style type="text/css">.actionButtons { text-align: center; }
.actionButtons a.button {
    display: inline-block;
    width: 250px;
    margin: 0 10px;
}
</style>
<p>As I support dbFront, often using Zoom, I have the privilege of seeing some of the cool systems that users have built using dbFront.  Sometimes a support session turns into a mini-demo before we get down to fixing the issue at hand.  I have often thought that it would be great if various dbFront users could learn directly from each other but I have always cringed at the idea of setting up and managing a social network.  The dbFront Q/A was purposely designed to be a Q/A site (much like StackOverFlow) and not a discussion forum.</p>

<blockquote>The best time to plant a tree was 30 years ago. The second best time is now.<br />
	— unknown</blockquote>

<p>With the new year I realized that there were just too many practical benefits to a user group and so after some research selected Linked-In as the location for the group.</p>

<div class="actionButtons"><a class="button blue" href="https://www.linkedin.com/groups/14390032/" target="_blank">Click to Join the <b>dbFront Users</b> group</a></div>

<h2>The Purpose</h2>

<p>At its simplest level, dbFront is fairly easy to understand and implement, but a core part of the functionality comes from the database structure and server.  A properly designed data structure and correctly configured dbFront install can yield some impressive results but that requires a level of experience.</p>

<p>The purpose of this group is to allow dbFront users/admins to share tips, experiences, best practices, challenges, solutions, and generally support each other to build cool stuff.  Some of the discussions that might be covered are:</p>

<ul>
	<li>How to inject business rules and processes (Triggers, Stored Functions/Procedures, Views, ...),</li>
	<li>How to effectively use html/css to improve the end-user experience,</li>
	<li>How to safely implement the security,</li>
	<li>How to efficiently integrate with other systems using either dbFront or database functionality.</li>
</ul>

<p>The answers to these questions can be highly dependent on the needs of a specific system.</p>

<h3>Meetings and Training</h3>

<p>A hope is that this group could facilitate training via online events.  Possibly via a periodic online meeting.</p>

<h3>Help Set Direction</h3>

<p>I also plan to poll group members for your opinions on various dbFront feature suggestions and look for general advice on the direction for dbFront.</p>

<h3>Not Replacing Support</h3>

<p>This group is not intended to replace the existing support avenues such as the Knowledge Base (<a href="https://dbFront.com/kb" target="_blank">dbFront.com/kb</a>), the Q&A (<a href="https://dbFront.com/qa" target="_blank">dbFront.com/qa</a>) or our other support options (<a href="https://dbFront.com/support" target="_blank">dbFront.com/support</a>)</p>

<h3>Moderation</h3>

<p>I intend to take a light touch with moderation but all posts containing links, or from new users will be moderated.  If anyone wants to market their dbFront related services then please talk to me and I will find an appropriate solution.</p>

<h2>Why Linked-In?</h2>

<p>Linked-In is a well-known, solid, and interconnected business network where the majority of dbFront users already have an account. For most dbFront users it requires a single click to join the group.  It also helps us that there is no extra infrastructure or cost other than the actual admin.</p>

<h2>Let's Connect</h2>

<div class="actionButtons"><a class="button blue" href="https://www.linkedin.com/groups/14390032/" target="_blank">Click to Join the <b>dbFront Users</b> group</a></div>

<p>See you there.</p>
 ]]></description>
			</item>
			<item>
				<title>Thank you for 2023, stay with us as we go Mobile!</title>
				<link>https://dbfront.com/blog/post/2024-01-10-thankyou-goingmobile</link>
				<guid>https://dbfront.com/blog/post/2024-01-10-thankyou-goingmobile</guid>
				<pubDate>Wed, 10 Jan 2024 00:00:00 +0000</pubDate>
				<description><![CDATA[ <a href="https://dbfront.com/data/uploads/blog/2024-01-10/header.jpg" class="glightbox"><img src="https://dbfront.com/data/uploads/blog/2024-01-10/header.jpg" /></a><h2>Thank you, Thank you, Thank you...</h2>

<p>The snow is deep here in Canada as we bid farewell to 2023. As we start the New Year we extend our deepest gratitude to you our clients.  Not only have you continued to fund dbFront's growth but you have also continued to provide positive feedback and valuable ideas that we hope to implement over the coming years as dbFront matures.</p>

<p>Please know that we are hard at work making dbFront more powerful, more flexible, more mobile (yes Mobile) all while doing our best to keep things simple and solid.</p>

<h2>Notable Clients</h2>

<p>We would love to name the notable clients who have funded many of the features that have become core to dbFront.  Suffice it to say, without their funding, much of the functionality that makes up dbFront would not exist today.  We may name those clients in the future,... with their permission of course.  The current licensing cost does not leave much room for new feature development.  If there is a specific feature you would love to see then please consider funding it.  Please see the following list for some suggestions:  <a href="https://dbfront.com/qa/questions/feature-request/todo?sort=votes" target="_blank">Feature Requests</a>.   In comparison here is the list of features that have been requested and added.  <a href="https://dbfront.com/qa/questions/feature-request/done?sort=votes" target="_blank">Completed Feature Requests</a>.</p>

<h2>Stability with dbFront 1.2.6</h2>

<p>dbFront 1.2.6 is now the Stable release.  Version 1.2.6 has been functioning as the feature release for some time and accumulated a good set of fixes and we are confident that it is ready for our most demanding clients.  A deeper explanation of what is in dbFront 1.2.6 can be found in the <a href="https://dbfront.com/blog/post/2023-09-26-dbfront-126-release" target="_blank">blog post on dbFront 1.2.6</a>.</p>

<h3>Custom Search</h3>

<p>One of the most significant features completed in the 1.2.6 release of dbFront is Custom Search Buttons.  Custom Search Buttons allow administrators and users to create single-click filter buttons that are placed just below the tables.  The filtering expressions can optionally include SQL, or prompt for user input.</p>

<p>This allows users to quickly move between different views of the same data which makes for happy users…  Because finding what you need is key to being productive and happy!</p>

<p>To see how to set up and use Custom Search buttons, check out the corresponding blog post: <a href="https://bigideas.ltd/blog/2022-12-21-custom-quick-search-buttons" target="_blank">Custom Quick Search Buttons</a></p>

<h2>Featuring dbFront 1.3.1</h2>

<p>The latest version of dbFront 1.3.1 has been promoted to the feature release.  This is a smaller release that includes all of the updates from 1.3.0 and 1.3.1.  The most notable additions are:</p>

<ul>
	<li>Crystal Reports: Updated Crystal Report functionality including new output types.</li>
	<li>Security: Support for separate User and Group containers and LDAP filters.</li>
	<li>Export: Ability to export a report and all referenced attachments as a ZIP package.</li>
	<li>FileLinks: Added Read-Only support for attachments stored on the file system.</li>
	<li>Procedures: Full support for Stored Procedures that return multiple result sets.</li>
	<li>Report Templates: Improved editing functionality.</li>
</ul>

<p>More details to follow.  To get a sneak peek see: <a href="https://dbfront.com/releasehistory#v1.3.1" target="_blank">dbFront 1.3.1 release history</a> or download the Beta build from <a href="https://dbfront.com/download" target="_blank">dbfront.com/download</a>.</p>

<h2>Going Mobile</h2>

<p>Traditional mobile applications are expensive to build and maintain.  We could have built a single dbFront mobile app, but it would have stretched our resources, and the app would have been too generic to meet most client needs.  Individual clients would not have been able to create and distribute their own custom HR or Finance app for their own internal users.</p>

<p>With the continued advance of web standards, specifically PWA (Progressive Web App) technology, it's now possible to install apps directly from correctly designed websites.  These apps work across multiple platforms (desktop, IOS, Android, ...) and don't need an app store to install.  If desired, individual clients could convert their dbFront PWA-enabled install to an app store-ready IOS or Android app with a minimal amount of effort.</p>

<p>We are actively working on turning the dbFront client into one or multiple user-installable web application(s).  The deeper off-line functionality will take time to develop.  As noted above, additional funding to support the mobile application development would be appreciated.  To vote on this feature please see <a href="https://dbfront.com/qa/247/android-ios-app-for-dbfront" target="_blank">Android / IOS app for dbFront</a>.</p>

<p>We hope to have something to play with in the very near future.</p>

<h2>Summary</h2>

<p>dbFront has seen active development for more than 10 years and there is no plan to stop anytime soon.  The release history can be found at <a href="https://dbfront.com/releasehistory#v1.3.1" target="_blank">https://dbfront.com/releasehistory</a></p>

<div class="linktarget" id="freetrial">
    <h2>Try dbFront for Free</h2>
    <p>dbFront offers a 30-day free trial so that you can download, install and test it in your environment. &nbsp;After the trial you can continue to use the FREE version of dbFront for up to 3 users. &nbsp;Please review the <a href="/video-tutorials">video tutorials</a> and plan to start a <a href="/download">free trial</a> today. &nbsp;We believe you will be impressed.</p>
<style>
.trailActionButtons { text-align: center; }
.trailActionButtons a.button {
    display: inline-block;
    width: 200px;
    margin: 0 10px;
}
</style>
<div class="trailActionButtons">
<a class="button blue" href="/download" style="font-size:14px;text-shadow:none;">Start Free Trial</a>
<a class="button orange" href="/demo2" style="font-size:14px;text-shadow:none;">View Live Demo</a>
</div>
<br/>

 ]]></description>
			</item>
			<item>
				<title>dbFront 1.2.6 Feature Release</title>
				<link>https://dbfront.com/blog/post/2023-09-26-dbfront-126-release</link>
				<guid>https://dbfront.com/blog/post/2023-09-26-dbfront-126-release</guid>
				<pubDate>Tue, 26 Sep 2023 00:00:00 +0000</pubDate>
				<description><![CDATA[ <a href="https://dbfront.com/data/uploads/blog/balloonrelease_1600.jpg" class="glightbox"><img src="https://dbfront.com/data/uploads/blog/balloonrelease_1600.jpg" /></a><p>With the release of dbFront 1.2.6, we now wrap up the 1.2 branch of dbFront.</p>

<p>dbFront 1.2.6 will soon be marked as stable and all new feature development will happen in the latest 1.3 release of dbFront.</p>

<p style="background:#eee;border:1px solid #ccc;padding:5px 10px;">Notice: Licenses with Support & Maintenance that have expired for two years will require a full purchase to upgrade</p>

<h2>dbFront Version 1.2.6 Features</h2>

<p>This release includes thirteen new features and multiple fixes.<br />
	New Features:</p>

<ul>
	<li>AdvancedSearch: Extended the length of the search field from 50 to 200. <a href="https://dbfront.com/qa/1244">Q&A</a></li>
	<li>CustomSearch: Ability to set constant values and ranges or NULL.</li>
	<li>CustomSearch: Added "Custom Search" action buttons. <a href="https://dbfront.com/qa/509">Q&A</a></li>
	<li>CustomSearch: Includes support for Prompt Fields and optional Range Fields. <a href="https://dbfront.com/qa/509">Q&A</a></li>
	<li>CustomSearch: Includes support for Search SQL Expressions. <a href="https://dbfront.com/qa/509">Q&A</a></li>
	<li>CustomSearch: Optionally, Clear, Overwrite or Merge with Advanced Search.</li>
	<li>CustomSearch: Users can create/edit their own search buttons.</li>
	<li>Layout: Added "TableOnly" layout. Currently requires disabling insert. <a href="https://dbfront.com/qa/553">Q&A</a></li>
	<li>MassUpdate/Delete: Updated to handle search filters based on Filter Buttons.</li>
	<li>MassUpdate/Delete: Updated to handle search filters based on Related Views.</li>
	<li>SystemMonitor: Rebuilt IP-based activity monitoring and layout.</li>
	<li>Table: Added ability to set 'Sticky' table columns that remain on screen. <a href="https://dbfront.com/qa/1299">Q&A</a></li>
	<li>WebRequest: Added option to call Stored Procedure to process the results. <a href="https://dbfront.com/qa/1314">Q&A</a></li>
</ul>

<h2>Custom Search</h2>

<p>One of the most significant features completed in the 1.2.6 release of dbFront is Custom Search Buttons.  Custom Search Buttons allow administrators and users to create single-click filter buttons that are placed just below the tables.  The filtering expressions can optionally include SQL, or prompt for user input.</p>

<p>This allows users to quickly move between different views of the same data which makes for happy users…  Because finding what you need is key to being productive and happy!</p>

<p>To see how to set up and use Custom Search buttons, check out the corresponding blog post: <a href="https://bigideas.ltd/blog/2022-12-21-custom-quick-search-buttons">Custom Quick Search Buttons</a></p>

<h2>dbFront 1.3.0</h2>

<p>Waiting in the wings is dbFront 1.3.0 which is nearly ready to be a feature release.  More details to follow.  To get a sneak peek see: <a href="https://dbfront.com/releasehistory#v1.3.0">dbfront.com/releasehistory#v1.3.0</a> or download the Beta build from <a href="https://dbfront.com/download">dbfront.com/download</a>.</p>

<h2>Summary</h2>

<p>dbFront has seen active development for more than 10 years and there is no plan to stop anytime soon.  The release history can be found at <a href="https://dbfront.com/releasehistory">dbfront.com/releasehistory</a></p>

<div><div class="linktarget" id="freetrial">
    <h2>Try dbFront for Free</h2>
    <p>dbFront offers a 30-day free trial so that you can download, install and test it in your environment. &nbsp;After the trial you can continue to use the FREE version of dbFront for up to 3 users. &nbsp;Please review the <a href="/video-tutorials">video tutorials</a> and plan to start a <a href="/download">free trial</a> today. &nbsp;We believe you will be impressed.</p>
<style>
.trailActionButtons { text-align: center; }
.trailActionButtons a.button {
    display: inline-block;
    width: 200px;
    margin: 0 10px;
}
</style>
<div class="trailActionButtons">
<a class="button blue" href="/download" style="font-size:14px;text-shadow:none;">Start Free Trial</a>
<a class="button orange" href="/demo2" style="font-size:14px;text-shadow:none;">View Live Demo</a>
</div>
<br/>
</div>
 ]]></description>
			</item>
			<item>
				<title>ChatGPT &amp; dbFront handle Depreciation</title>
				<link>https://dbfront.com/blog/post/2023-03-01-chatgpt-and-dbfront-handle-depreciation</link>
				<guid>https://dbfront.com/blog/post/2023-03-01-chatgpt-and-dbfront-handle-depreciation</guid>
				<pubDate>Wed, 01 Mar 2023 04:05:00 +0000</pubDate>
				<description><![CDATA[ <a href="https://dbfront.com/data/uploads/blog/2023-03-01/depreciation.jpg" class="glightbox"><img src="https://dbfront.com/data/uploads/blog/2023-03-01/depreciation.jpg" /></a><style type="text/css">.chatGPT-response {
    padding:25px 25px 25px 60px;
    margin-bottom:25px;
    border:5px solid lightgrey;
    border-radius: 25px;
    background-color: rgba(247,247,248) !important;
    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC0AAAAtCAMAAAANxBKoAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAkUExURXDGsRyohhCjfy6vj0y6n8Po3////+Hz76Xcz4fRv2rGrwAAAFAB4ZUAAAAMdFJOU///////////////ABLfzs4AAAAJcEhZcwAAFiQAABYkAZsVxhQAAAHRSURBVEhLtZXbkoMgEERNQBDy//+73T0zgpqt0qrdfgiGHOaOWT7L631PL7CLP9/Rctsy9XpiGsZ9vac/oJOvF13pvJZS1+3riTOdajHV5juzTnQC11pODYdaaz37vutEw6YB2X0cXRzpVqrF20RuSKFUbZgONOLoWpmoPeHYygfTRDPWAtNpmwPobkEaNL2WgojxKTYZhei0UjsNg63TK35VoohBDwhvr0zQsJjhVTS/IwCcL2zSaq6ooLVlNBwjTdhlikjgSsMdrDhNykNncepI02lxQQPFAStLZ6HOcc90WdkhCwYrHJ0jySqT27YtjgyTpJswvsfNlucj3SwcdIuOKaeR+GZm2qA75xdmzTEVNHYYnYpgO6Tfokd/glYvuaIIujc4FzTm+EyjeXsRqio40zwPTbY5VmZW3RmRwJAxM91JMXrcG5R80KqAtNOaBu+0z57TsMHv1E57mZCktRwORHcYCHjQUSa7A3KCHJDA1PhBI3C/wWBjCNl9u6CmQXOMZEWsJismbNeg9Zqqm70VLFJdqFkTbUYpHyIcj3FyzTR+zx3vMzQpp5SxxjSFjrQpXFzgrzQmmgVcjzFTX+lf9a/0s//LJ8aXJ//zy+cHUVsZLHlo8jQAAAAASUVORK5CYII=) no-repeat
    15px 25px;
    background-size: 32px !important;
}

.chatGPT-response p:first-child {
    margin-top: -5px;
}
.chatGPT-response p:last-child {
    margin-bottom: 0px;
}
.chatGPT-response table {
    font-size: .8em;
    margin-left: 2.5%;
    width: 95%;
    border: 1px solid #d8d8d8;
}

.chatGPT-response tr, .chatGPT-response td, .chatGPT-response th {
    vertical-align: middle;
}

.chatGPT-response th {
    background: #e5e5e5;
    padding: 0.5rem;
}

.chatGPT-response td {
    padding: 0.5rem;
    border: 1px solid #d8d8d8;
}

pre code {
    font-size: .8em;
    max-height: 800px;
}
</style>
<p>Today we look at how you can use ChatGPT and dbFront to rapidly create or extend custom database applications. In this case we are going to add a module to handle asset depreciation.</p>

<p>Asset depreciation refers to the decline in value of an asset over time due to usage, wear and tear, and obsolescence. Tracking asset depreciation is essential to ensure accurate financial reporting, to meet taxation requirements, and to plan for asset replacements.</p>

<h2>Generating the Database Structure</h2>

<p>ChatGPT describes itself as a "powerful language model that can generate natural language responses to any given prompt." Today we are going to examine ChatGPT's functionality as we attempt to generate the required database structure for an asset depreciation module. We are going to start with a simple request.</p>

<ol>
	<li>Browse to <a href="https://chat.openai.com/">chat.openai.com</a>, and either login or create an account,</li>
	<li>Start a new chat and ask "Create a database to track asset depreciation",</li>
	<li>In response ChatGPT quickly generates a response that looks similar to the following.</li>
</ol>

<div class="chatGPT-response">
	<p>Sure! I can help you create a simple database to track asset depreciation. Here's an example schema that you can use as a starting point:</p>

	<p><strong>Asset Table</strong></p>

	<table>
		<thead>
			<tr>
				<th>Column Name</th>
				<th>Data Type</th>
				<th>Description</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td>asset_id</td>
				<td>integer</td>
				<td>unique identifier for the asset</td>
			</tr>
			<tr>
				<td>asset_name</td>
				<td>varchar(50)</td>
				<td>name of the asset</td>
			</tr>
			<tr>
				<td>purchase_date</td>
				<td>date</td>
				<td>date the asset was purchased</td>
			</tr>
			<tr>
				<td>purchase_price</td>
				<td>decimal(10, 2)</td>
				<td>purchase price of the asset</td>
			</tr>
			<tr>
				<td>useful_life</td>
				<td>integer</td>
				<td>expected useful life of the asset (in years)</td>
			</tr>
			<tr>
				<td>salvage_value</td>
				<td>decimal(10, 2)</td>
				<td>estimated salvage value of the asset</td>
			</tr>
			<tr>
				<td>depreciation_method</td>
				<td>varchar(20)</td>
				<td>method used to calculate depreciation (e.g. straight line, double declining balance, etc.)</td>
			</tr>
		</tbody>
	</table>

	<p><strong>Depreciation Table</strong></p>

	<table>
		<thead>
			<tr>
				<th>Column Name</th>
				<th>Data Type</th>
				<th>Description</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td>depreciation_id</td>
				<td>integer</td>
				<td>unique identifier for the depreciation entry</td>
			</tr>
			<tr>
				<td>asset_id</td>
				<td>integer</td>
				<td>identifier for the asset that was depreciated</td>
			</tr>
			<tr>
				<td>depreciation_date</td>
				<td>date</td>
				<td>date that the asset was depreciated</td>
			</tr>
			<tr>
				<td>depreciation_amount</td>
				<td>decimal(10, 2)</td>
				<td>amount that the asset was depreciated for this period</td>
			</tr>
			<tr>
				<td>book_value</td>
				<td>decimal(10, 2)</td>
				<td>book value of the asset after depreciation</td>
			</tr>
		</tbody>
	</table>

	<p>With this schema, you can record the details of each asset, including its purchase date, purchase price, expected useful life, and depreciation method. You can then create depreciation entries for each asset at regular intervals (e.g. monthly, quarterly, or yearly), recording the amount of depreciation for that period and the book value of the asset after depreciation. You can use this information to calculate the current value of your assets and plan for future purchases or upgrades.</p>
</div>

<p>What is interesting is that the structure includes a short explaination describing how this structure can be used. I noticed that it did not include a supporting table for the "depreciation_method" so I updated my request as follows.</p>

<blockquote>
	<p>Create a database to track asset depreciation and include the depreciationmethod</p>
</blockquote>

<p>I then received an updated structure that included the missing table.</p>

<p>Once I was satisfied with the data structure I then made the following request to get the TSQL and some sample data.</p>

<blockquote>
	<p>Generate the TSQL create statements including the relationships and 10 rows of sample data in each table</p>
</blockquote>

<p>ChatGPT responded with the TSQL code as follows. It paused during the code generation but I just told it to <strong>continue</strong> and it completed with only one minor hiccup in the sample data.</p>

<pre><code>-- Creating the DepreciationMethods table
CREATE TABLE DepreciationMethods (
    DepreciationMethodID INT PRIMARY KEY,
    DepreciationMethodName VARCHAR(50)
);

-- Creating the Assets table
CREATE TABLE Assets (
    AssetID INT PRIMARY KEY,
    AssetName VARCHAR(50),
    PurchaseDate DATE,
    PurchaseCost DECIMAL(18,2),
    SalvageValue DECIMAL(18,2),
    UsefulLife INT,
    DepreciationMethodID INT,
    FOREIGN KEY (DepreciationMethodID) REFERENCES DepreciationMethods(DepreciationMethodID)
);

-- Creating the Depreciation table
CREATE TABLE Depreciation (
    DepreciationID INT PRIMARY KEY,
    AssetID INT,
    [Year] INT,
    [Month] INT,
    DepreciationAmount DECIMAL(18,2),
    AccumulatedDepreciation DECIMAL(18,2),
    FOREIGN KEY (AssetID) REFERENCES Assets(AssetID)
);

-- Inserting sample data into the DepreciationMethods table
INSERT INTO DepreciationMethods (DepreciationMethodID, DepreciationMethodName)
VALUES 
        (1, 'Straight Line'),
        (2, 'Double Declining Balance'),
        (3, 'Sum of Years Digits');

-- Inserting sample data into the Assets table
INSERT INTO Assets (AssetID, AssetName, PurchaseDate, PurchaseCost, SalvageValue, UsefulLife, DepreciationMethodID)
VALUES 
        (1, 'Computer', '2022-01-01', 1000.00, 100.00, 5, 1),
        (2, 'Printer', '2022-02-01', 500.00, 50.00, 3, 2),
        (3, 'Forklift', '2021-07-01', 5000.00, 1000.00, 10, 1),
        (4, 'Office Chair', '2022-03-15', 100.00, 10.00, 7, 3),
        (5, 'Delivery Van', '2021-01-01', 20000.00, 2000.00, 5, 2),
        (6, 'Construction Equipment', '2020-06-01', 50000.00, 5000.00, 8, 1),
        (7, 'Copier', '2022-02-15', 1500.00, 150.00, 4, 2),
        (8, 'Office Desk', '2021-11-01', 200.00, 20.00, 10, 3),
        (9, 'Delivery Truck', '2020-05-01', 50000.00, 5000.00, 7, 1),
        (10, 'Conference Table', '2022-01-15', 800.00, 80.00, 5, 2);

-- Inserting sample data into the Depreciation table
INSERT INTO Depreciation (DepreciationID, AssetID, [Year], [Month], DepreciationAmount, AccumulatedDepreciation)
VALUES
        (1, 1, 2022, 1, 166.00, 166.00),
        (2, 1, 2022, 2, 166.00, 332.00),
        (4, 1, 2022, 4, 166.00, 498.00),
        (5, 1, 2022, 5, 166.00, 664.00),
        (6, 2, 2022, 1, 50.00, 50.00),
        (7, 2, 2022, 2, 66.67, 116.67),
        (8, 2, 2022, 3, 83.33, 200.00),
        (9, 2, 2022, 4, 50.00, 250.00),
        (10, 2, 2022, 5, 33.33, 283.33),
        (11, 3, 2021, 7, 416.67, 416.67),
        (12, 3, 2022, 1, 416.67, 833.34),
        (13, 3, 2022, 7, 416.67, 5000.00),
        (14, 4, 2022, 3, 9.52, 9.52),
        (15, 4, 2022, 4, 13.61, 23.13),
        (16, 4, 2022, 5, 11.00, 34.13),
        (17, 5, 2022, 1, 8000.00, 8000.00),
        (18, 6, 2022, 1, 6250.00, 6250.00),
        (19, 6, 2022, 6, 6250.00, 31250.00),
        (20, 7, 2022, 2, 300.00, 300.00),
        (21, 7, 2022, 3, 360.00, 660.00),
        (22, 7, 2022, 4, 216.00, 876.00),
        (23, 8, 2021, 11, 4.17, 4.17),
        (24, 8, 2022, 1, 4.17, 8.33),
        (25, 8, 2022, 11, 4.17, 45.83),
        (26, 9, 2020, 5, 5208.33, 5208.33),
        (27, 9, 2021, 1, 5208.33, 10416.67),
        (28, 9, 2021, 5, 5208.33, 31250.00),
        (29, 10, 2022, 1, 160.00, 160.00),
        (30, 10, 2022, 2, 160.00, 320.00);
</code>
</pre>

<p>One point that could be made is that the Asset table is thin on any details not related to depreciation. In this case that is useful because the intention would be to connect this depreciation functionality to an exist asset management database via a <strong>1 - 1</strong> join. Not all assets require depreciation.</p>

<p>I went further asking ChatGPT to generate the required stored procedure which would calculate the yearly depreciation.</p>

<blockquote>
	<p>Generate the Procedure required to calculate the depreciation</p>
</blockquote>

<p>The result was an incomplete procedure and requesting it to <strong>continue</strong>, did not result in a useful function.</p>

<p>I then sent three separate requests as follows, one for each depreciation type.</p>

<blockquote>
	<p>Generate the Procedure required to calculate the depreciation for "Straight Line"</p>

	<p>Generate the Procedure required to calculate the depreciation for "sum of years digits"</p>

	<p>Generate the Procedure required to calculate the depreciation for "Double-Declining-Balance"</p>
</blockquote>

<p>Followed by a request to create a procedure that would call the correct procedure based on the depreciation type.</p>

<blockquote>
	<p>Generate a procedure called CalculateDepreciation, that will call CalculateSLDepreciation or CalculateDDBDepreciation or CalculateSYDDepreciation based on the Depreciation type of the asset</p>
</blockquote>

<p>This resulted in four separate procedures as follows.</p>

<pre><code>/**************************************************************************/
CREATE PROCEDURE CalculateSLDepreciation
        @AssetID INT,
        @Year INT
AS
BEGIN
        DECLARE @UsefulLife INT
        DECLARE @AcquisitionCost MONEY
        DECLARE @SalvageValue MONEY
        DECLARE @DepreciationRate FLOAT
        DECLARE @AccumulatedDepreciation MONEY = 0
        DECLARE @DepreciationAmount MONEY

        SELECT @UsefulLife = UsefulLife, @AcquisitionCost = AcquisitionCost, @SalvageValue = SalvageValue
        FROM Asset
        WHERE AssetID = @AssetID

        IF @UsefulLife IS NULL OR @AcquisitionCost IS NULL OR @SalvageValue IS NULL
        BEGIN
                RAISERROR('Asset not found or incomplete data', 16, 1)
                RETURN
        END

        SET @DepreciationRate = (@AcquisitionCost - @SalvageValue) / @UsefulLife

        IF @DepreciationRate IS NULL
        BEGIN
                RAISERROR('Invalid useful life', 16, 1)
                RETURN
        END

        WHILE MONTH(DATEFROMPARTS(@Year, 1, 1)) <= 12
        BEGIN
                SET @DepreciationAmount = @DepreciationRate

                IF @DepreciationAmount > (@AcquisitionCost - @AccumulatedDepreciation)
                        SET @DepreciationAmount = @AcquisitionCost - @AccumulatedDepreciation

                IF @DepreciationAmount < @SalvageValue - @AccumulatedDepreciation
                        SET @DepreciationAmount = @SalvageValue - @AccumulatedDepreciation

                INSERT INTO Depreciation (AssetID, DepreciationDate, DepreciationAmount, AccumulatedDepreciation)
                VALUES (@AssetID, DATEFROMPARTS(@Year, MONTH(DATEFROMPARTS(@Year, 1, 1)), 1), @DepreciationAmount, @AccumulatedDepreciation)

                IF MONTH(DATEFROMPARTS(@Year, 1, 1)) + 1 > 12
                        BREAK

                SET @Year = @Year + 1

                IF @DepreciationAmount < @SalvageValue
                        BREAK

                SET @AccumulatedDepreciation = @AccumulatedDepreciation + @DepreciationAmount
        END
END

/**************************************************************************/
CREATE PROCEDURE CalculateDDBDepreciation
        @AssetID INT,
        @Year INT
AS
BEGIN
        DECLARE @UsefulLife INT
        DECLARE @AcquisitionCost MONEY
        DECLARE @SalvageValue MONEY
        DECLARE @DepreciationRate FLOAT
        DECLARE @AccumulatedDepreciation MONEY = 0
        DECLARE @DepreciationAmount MONEY

        SELECT @UsefulLife = UsefulLife, @AcquisitionCost = AcquisitionCost, @SalvageValue = SalvageValue
        FROM Asset
        WHERE AssetID = @AssetID

        IF @UsefulLife IS NULL OR @AcquisitionCost IS NULL OR @SalvageValue IS NULL
        BEGIN
                RAISERROR('Asset not found or incomplete data', 16, 1)
                RETURN
        END

        SET @DepreciationRate = 2.0 / @UsefulLife

        IF @DepreciationRate IS NULL
        BEGIN
                RAISERROR('Invalid useful life', 16, 1)
                RETURN
        END

        WHILE MONTH(DATEFROMPARTS(@Year, 1, 1)) <= 12
        BEGIN
                SET @DepreciationAmount = (@AcquisitionCost - @AccumulatedDepreciation) * @DepreciationRate

                IF @DepreciationAmount > (@AcquisitionCost - @AccumulatedDepreciation)
                        SET @DepreciationAmount = @AcquisitionCost - @AccumulatedDepreciation

                IF @DepreciationAmount < @SalvageValue - @AccumulatedDepreciation
                        SET @DepreciationAmount = @SalvageValue - @AccumulatedDepreciation

                INSERT INTO Depreciation (AssetID, DepreciationDate, DepreciationAmount, AccumulatedDepreciation)
                VALUES (@AssetID, DATEFROMPARTS(@Year, MONTH(DATEFROMPARTS(@Year, 1, 1)), 1), @DepreciationAmount, @AccumulatedDepreciation)

                IF MONTH(DATEFROMPARTS(@Year, 1, 1)) + 1 > 12
                        BREAK

                SET @Year = @Year + 1

                IF @DepreciationAmount < @SalvageValue
                        BREAK

                SET @AccumulatedDepreciation = @AccumulatedDepreciation + @DepreciationAmount
        END
END

/**************************************************************************/
CREATE PROCEDURE CalculateSYDDepreciation
        @AssetID INT,
        @Year INT
AS
BEGIN
        DECLARE @UsefulLife INT
        DECLARE @AcquisitionCost MONEY
        DECLARE @SalvageValue MONEY
        DECLARE @DepreciationRate FLOAT
        DECLARE @AccumulatedDepreciation MONEY = 0
        DECLARE @DepreciationAmount MONEY

        SELECT @UsefulLife = UsefulLife, @AcquisitionCost = AcquisitionCost, @SalvageValue = SalvageValue
        FROM Asset
        WHERE AssetID = @AssetID

        IF @UsefulLife IS NULL OR @AcquisitionCost IS NULL OR @SalvageValue IS NULL
        BEGIN
                RAISERROR('Asset not found or incomplete data', 16, 1)
                RETURN
        END

        SET @DepreciationRate = 1 / ((@UsefulLife * (@UsefulLife + 1)) / 2)

        IF @DepreciationRate IS NULL
        BEGIN
                RAISERROR('Invalid useful life', 16, 1)
                RETURN
        END

        WHILE MONTH(DATEFROMPARTS(@Year, 1, 1)) <= 12
        BEGIN
                SET @DepreciationAmount = (@AcquisitionCost - @AccumulatedDepreciation) * @DepreciationRate * 
                        (DATEDIFF(month, DATEFROMPARTS(@Year, 1, 1), DATEADD(year, 1, DATEFROMPARTS(@Year, 1, 1))) + 1) / 12

                IF MONTH(DATEADD(month, DATEDIFF(month, -1, DATEFROMPARTS(@Year, 1, 1)), -1)) = 12
                BEGIN
                        SET @DepreciationAmount = @DepreciationAmount - (@AcquisitionCost - @AccumulatedDepreciation - @DepreciationAmount) * @DepreciationRate
                END

                IF @DepreciationAmount < @SalvageValue - @AccumulatedDepreciation
                        SET @DepreciationAmount = @SalvageValue - @AccumulatedDepreciation

                INSERT INTO Depreciation (AssetID, DepreciationDate, DepreciationAmount, AccumulatedDepreciation)
                VALUES (@AssetID, DATEFROMPARTS(@Year, MONTH(DATEFROMPARTS(@Year, 1, 1)), 1), @DepreciationAmount, @AccumulatedDepreciation)

                IF MONTH(DATEFROMPARTS(@Year, 1, 1)) + DATEDIFF(month, DATEFROMPARTS(@Year, 1, 1), DATEADD(year, 1, DATEFROMPARTS(@Year, 1, 1))) > 12
                        BREAK

                SET @Year = @Year + 1

                IF @DepreciationAmount < @SalvageValue
                        BREAK

                SET @AccumulatedDepreciation = @AccumulatedDepreciation + @DepreciationAmount
        END
END

/**************************************************************************/
CREATE PROCEDURE CalculateDepreciation
        @AssetID INT,
        @Year INT
AS
BEGIN
        DECLARE @DepreciationMethod VARCHAR(50)

        SELECT @DepreciationMethod = DepreciationMethod
        FROM Asset
        WHERE AssetID = @AssetID

        IF @DepreciationMethod = 'Straight-Line'
        BEGIN
                EXEC CalculateSLDepreciation @AssetID, @Year
        END
        ELSE IF @DepreciationMethod = 'Double-Declining-Balance'
        BEGIN
                EXEC CalculateDDBDepreciation @AssetID, @Year
        END
        ELSE IF @DepreciationMethod = 'Sum-of-Years-Digits'
        BEGIN
                EXEC CalculateSYDDepreciation @AssetID, @Year
        END
        ELSE
        BEGIN
                RAISERROR('Invalid depreciation method', 16, 1)
                RETURN
        END
END</code></pre>

<h2>Testing the Results</h2>

<p>The next step was to test the results and create the structure and the procedures to verify that they worked as a whole.</p>

<h3>Observations on the Structure</h3>

<p>The data structure appeared to hold together quite well and only required minor correction. The sample data was able to load into the structures and the lookup values were relevant. The depreciation values were incorrect but sufficient as far as sample data was concerned.</p>

<p>Depending on how I asked, ChatGPT could generate a variety of different structures.</p>

<ul>
	<li>Sometimes a column for the SalvageValue was present, sometimes not,</li>
	<li>The DepreciationMethod could be a missing, a simple attribute, or a foreign key with lookup table,</li>
	<li>The date of the depreciation could either be stored in a Date column named EntryDate, or else it might be broken up in to Year and Month columns, or ChatGPT might generate a Period table.</li>
	<li>When I asked ChatGPT to name all tables in the singular it create an entirely new structure.</li>
</ul>

<p>It was helpful to have ChatGPT return different structures since each structure showed specific benefits. I found that there was too much variety in the ChatGPT results for them to be brushed of as simple canned responses.</p>

<h3>Observations on the Code</h3>

<p>The stored procedures were <strong>very disappointing</strong>. The code looked plausible and showed just enough undertanding to awaken hope. Upon deeper examination it was clear that the code contained massive logic errors, invalid object names and references and/or could not compile. The procedures were nowhere near ready to run.</p>

<h3>Observations on the Source</h3>

<p>When I asked ChatGPT for its sources, it responded as follows.</p>

<div class="chatGPT-response">
	<p>This answer was generated solely by me, ChatGPT, a language model created by OpenAI. The database structure and sample data were based on my own understanding of asset depreciation, and the stored procedure was written by me using T-SQL syntax.</p>
</div>

<p>When I asked ChatGPT for "specific references for your understanding", it responded as follows.</p>

<div class="chatGPT-response">
	<p>As an artificial intelligence language model, I don't have subjective opinions or personal experiences. However, the understanding of asset depreciation used in my answer is based on general accounting principles and industry best practices. Some relevant sources for information on this topic include:</p>

	<ul>
		<li>The Generally Accepted Accounting Principles (GAAP) and International Financial Reporting Standards (IFRS) for accounting treatment of asset depreciation.</li>
		<li>The U.S. Internal Revenue Service (IRS) tax code and publications for tax-related depreciation rules.</li>
		<li>Accounting textbooks and online courses for comprehensive explanations and examples of asset depreciation methods and calculations.</li>
		<li>Industry-specific guides and regulations for asset depreciation in particular sectors, such as real estate, manufacturing, or mining.</li>
	</ul>

	<p>I used this general understanding of asset depreciation to create a basic relational database structure and stored procedure that could be used to manage depreciation in a simple system.</p>
</div>

<p>I also followed up by running various searches for sample code or data structures for Asset Depreciation and found very little that came anywhere close to the results that ChatGPT returned.</p>

<p>I will leave it to others to figure out how ChatGTP actually arrived at its understanding of depreciation and what that means for us mere mortals.</p>

<h2>Adding the UI & bringing dbFront into the mix</h2>

<p>The next logical step was to have ChatGPT generate a UI for the data structure it generated.</p>

<h3>ChatGPT generated UI</h3>

<p>When I asked ChatGPT to create a single page UI for the data structure it responded as follows.</p>

<div class="chatGPT-response">
	<p>As an AI language model, I cannot generate a user interface (UI) for you, but I can provide you with a general idea of what a single-page UI for this data structure might look like.</p>
</div>

<p>It then proceeded to list out what it felt were the specific requirements for the UI. The rest of the reponse follows.</p>

<div class="chatGPT-response">
	<p>Assuming you want a UI that allows you to view, add, edit, and delete assets and their depreciation information, here are some possible components:</p>

	<ol>
		<li>
			<p>A navigation bar at the top of the page that includes links to different sections of the app (e.g. "Dashboard", "Assets", "Depreciation Methods", "Reports").</p>
		</li>
		<li>
			<p>A dashboard section that provides an overview of your assets and their current depreciation status (e.g. a summary of assets by category, a chart of depreciation expenses over time, etc.).</p>
		</li>
		<li>
			<p>An "Assets" section that allows you to view and manage your assets. This section could include:</p>
		</li>
	</ol>

	<ul>
		<li>
			<p>A table that lists all of your assets, with columns for asset name, purchase date, cost, salvage value, useful life, and current depreciation status.</p>
		</li>
		<li>
			<p>Buttons or icons that allow you to add a new asset, edit an existing asset, or delete an asset.</p>
		</li>
		<li>
			<p>A modal window or form that appears when you click on an asset in the table, allowing you to view and edit its details.</p>
		</li>
	</ul>

	<ol start="4">
		<li>A "Depreciation Methods" section that allows you to view and manage the different depreciation methods available in your system. This section could include:</li>
	</ol>

	<ul>
		<li>
			<p>A table that lists all of the depreciation methods, with columns for method name, description, and formula.</p>
		</li>
		<li>
			<p>Buttons or icons that allow you to add a new method, edit an existing method, or delete a method.</p>
		</li>
		<li>
			<p>A modal window or form that appears when you click on a method in the table, allowing you to view and edit its details.</p>
		</li>
	</ul>

	<ol start="5">
		<li>A "Reports" section that allows you to generate reports on your assets and depreciation expenses. This section could include:</li>
	</ol>

	<ul>
		<li>
			<p>A dropdown menu that allows you to select a report type (e.g. "Asset List", "Depreciation Schedule", "Expense Report").</p>
		</li>
		<li>
			<p>A form that allows you to specify parameters for the report (e.g. date range, asset category, etc.).</p>
		</li>
		<li>
			<p>A preview pane that displays a preview of the report, with options to export it as a PDF or Excel file.</p>
		</li>
	</ul>

	<ol start="6">
		<li>A footer section that includes links to your company's social media pages, contact information, and legal notices.</li>
	</ol>

	<p>Of course, the exact design and functionality of the UI will depend on your specific needs and preferences. But this should give you a general idea of what a single-page UI for this data structure might look like.</p>
</div>

<p>Not willing to give up so quickly, I asked it to "Generate a web application to maintain those tables.". ChatGPT then proceeded to spit out a basic PHP web application. A fair bit of prompting was required before it would spit out the entire application. With more direction and prompting, ChatGPT moved to jQuery, AJAX and Datatables.net to generate a more advanced application.</p>

<p>Some things that stood out were:</p>

<ul>
	<li>The generated UI is heavily tied to the data structure so any data structure changes would result in significant refactoring.</li>
	<li>The UI was simplistic and additional functionality would require a significant amount of work and experience.</li>
	<li>ChatGPT left out pieces, possibly expecting you to specifically ask for the missing items.</li>
	<li>The generation limits force you to request specific pieces of the UI or database structure and then stitch them together.</li>
	<li>Because of these issues and the previous failures with the stored procedures I abandoned the generated UI.</li>
</ul>

<h3>Using dbFront for the UI</h3>

<p>I then opened dbFront and pointing it to the database that contained the newly created asset depreciation structures.</p>

<p>In short order I had a UI that satisfied 5 out of the 6 UI requirements that ChatGPT had outlined.</p>

<ol>
	<li>A navigation menu showing the core tables,</li>
	<li>A home screen with instructions.</li>
	<li>An assets view that allowed you to fully manage all aspects of the asset. In addition you had the option of calculating next years depreciation.</li>
	<li>A maintenance screen for the depreciation methods,</li>
	<li>Reports were available on the home screen and related asset.</li>
	<li>A fully configurable footer.</li>
</ol>

<p>The only missing item was a dashboard containing a summary of the data with a chart. The asset summary and chart could be created using a Crystal Report or export to an Excel template containing a chart.</p>

<p>Because dbFront generates it's UI dynamically, it automatically follows along as the database structure changes. This also applies to any of its template based reports or exports. This is specifically helpful because it allows a DBA to continue working on the database structure without having to recreate the UI.</p>

<h2>Demo</h2>

<p>We took the Depreciation Calculator database structure and the dbFront config and migrated it to our demo environment so that you can see it in action.</p>

<p>Below is a link to the Demo environment and also a link where you can download the source. For the demo environment, you can use the usernames <strong>dbAdmin</strong> or <strong>dbGuest</strong> and the password "<strong>password</strong>".</p>

<ul>
	<li><strong><a href="https://demo.dbfront.com/dbfront/?d=AssetManagement" target="_blank">Depreciation Calculator Demo</a></strong></li>
	<li><strong><a href="https://dbfront.com/depreciationcalculator" target="_blank">Source Code and Instructions</a></strong></li>
</ul>

<h2>Wrap Up</h2>

<p>There is a significant amount of hype around ChatGPT and some of that hype is deserved, but not all. What ChatGPT generates looks impressive but it fails to show real comprehension of the actual material and therefore it can't self correct. It simply regurgitates plausible looking answers. ChatGPT's inability to self correct is most obvious when it generates reasonable looking code that is incomplete, incorrect, or won't compile. Correcting code salad (think "word salad") is not trivial and often requires a rewrite.</p>

<p>ChatGPT appears to have a good ability to assemble what belongs together and even some concept of sequence. But it just can't do the logic to wire things together correctly and validate that what it is doing is correct.</p>

<p>What we can <strong>salvage</strong> from this experiment is that ChatGPT showed an interesting ability to assemble a reasonable looking data structure for a known business problem. Any errors in the structure were easy to fix and the ability to generate sample data was useful. The caveat is that ChatGPT requires direction by someone who understands the business requirements and the implications of any database structure decisions.</p>

<p>dbFront again proved to be a dynamic and solid choice when it came time to build the UI.</p>

<p>To check out dbFront, go to <a href="https://dbfront.com">dbFront.com</a>.</p>

<p>In the next blog post we are going to try to solve a more complex business problem with ChatGPT & dbFront. Till then.</p>
 ]]></description>
			</item>
			<item>
				<title>How to Create a Report</title>
				<link>https://dbfront.com/blog/post/2023-01-10-how-to-create-a-report</link>
				<guid>https://dbfront.com/blog/post/2023-01-10-how-to-create-a-report</guid>
				<pubDate>Tue, 10 Jan 2023 04:56:00 +0000</pubDate>
				<description><![CDATA[ <a href="https://dbfront.com/data/uploads/blog/2023-01-10/header.jpg" class="glightbox"><img src="https://dbfront.com/data/uploads/blog/2023-01-10/header.jpg" /></a><p>Today we look at how you can use dbFront to create quick reports. For an example we will be building a report to view the age of submitted expense reports using the <a href="https://dbfront.com/expensereporter">Expense Report</a> app.</p>

<h2>Setup</h2>

<p>To create a new report, click on the <strong>Quick Print</strong> button. By default this button is only available to Administrators but you can easily enable it for your regular users.</p>

<p><a href="/data/uploads/blog/2023-01-10/report-creation.png" class="glightbox"><img alt="report%20creation" src="/data/uploads/blog/2023-01-10/report-creation.png" title="Report Creation" /></a></p>

<p>From here, you can now prepare the report. If it is merely a one-time report, click run after you have selected the template and table columns.</p>

<p>If you are going to need to report on the same thing repeatedly, you can save the report as a button. Just provide a caption for the button and save your report.</p>

<h3>Report Type</h3>

<p>There are two report types to select from:</p>

<p><strong>Multirow Report:</strong> this combines multiple records into a single table; this is used when you want to look at a cross-section of your data such as a Staff Listing or ToDo List.</p>

<p><strong>Single Row Report:</strong> this returns a single record in a specific table with all related rows. This is used when you need to report on the selected record (for example printing an invoice with its details).</p>

<h3>Output</h3>

<p>This sets how the report will be outputted. When the report button is first created, you can only have one method of output. Available options are: Csv, Excel (if you want to export the data), PDF, Quick View, and Print at Server.</p>

<p>If the report is saved then you can add more output options:</p>

<p><a href="/data/uploads/blog/2023-01-10/adding-outputs.gif" class="glightbox"><img alt="adding%20outputs" src="/data/uploads/blog/2023-01-10/adding-outputs.gif" title="Adding Print Outputs" /></a></p>

<p>When you add PDF as an output option, you will also be able to setup the page format for the PDF file:</p>

<p><a href="/data/uploads/blog/2023-01-10/pdf-page-layout.png" class="glightbox"><img alt="pdf%20page%20layout" src="/data/uploads/blog/2023-01-10/pdf-page-layout.png" title="PDF Page Layout" /></a></p>

<p>When Excel is added as an output option, an Excel tab is added that allows you to use an existing Excel spreadsheet template for outputting to. For more information on how to use this feature, please refer to the article on <a href="https://dbfront.com/exceltemplates" target="_blank">Excel templates</a> in the knowledge base.</p>

<h3>Details</h3>

<p>Here you can customize what fields to report on as well as how you want the information ordered.</p>

<p><a href="/data/uploads/blog/2023-01-10/adding-rows.gif" class="glightbox"><img alt="adding%20rows" src="/data/uploads/blog/2023-01-10/adding-rows.gif" title="Adding Rows" /></a></p>

<p>Administrators can add SQL filter expressions to further refine the report if necessary. An example of an expression:</p>

<p><a href="/data/uploads/blog/2023-01-10/sample-expression.png" class="glightbox"><img alt="sample%20epxression" src="/data/uploads/blog/2023-01-10/sample-expression.png" title="Sample Expression" /></a></p>

<h3>Child Tables</h3>

<p>If the table you are reporting on has child tables, you can add rows from those tables to the report. These child tables will show up in the Options list as <strong>Table_name::Rows</strong>:</p>

<p><a href="/data/uploads/blog/2023-01-10/child-table.png" class="glightbox"><img alt="child%20table" src="/data/uploads/blog/2023-01-10/child-table.png" title="Child Table" /></a></p>

<p>Adding these to the Field/Rows section will add new tabs that you can now use to add specific rows and columns from the child tables to the current report.</p>

<p><a href="/data/uploads/blog/2023-01-10/adding-child-table.gif" class="glightbox"><img alt="adding%20child%20table" src="/data/uploads/blog/2023-01-10/adding-child-table.gif" title="Adding Child Tables" /></a></p>

<h3>Report</h3>

<p>If the report tab is visible it means that there are available report templates that you can choose to use. These templates can be edited to further customize the output.</p>

<p>A final note about these reports. While the Quick View and PDF allow for a formatted, static view of the specific data, keep in mind that the CSV/Excel output will be more useful in terms of allowing users to work with the data directly and create graphs and reports within Excel that are better suited for their purposes.</p>

<h2>The Example</h2>

<p>We are going to build a report to show all expenses that have an age of at least 20 days. As we want to see all expenses, we want a multirow report.</p>

<p>In the Details tab, we add the “Age” field in the Fields/Rows section, add ‘vAge” into the Sort Order as we are going to sort on age in descending order and then add an expression in the Filter field so that we only get items that have an age of 20 days or more. We are also going to remove the “Purpose” and “Expense Report ID” from the Fields/Rows section.</p>

<p><a href="/data/uploads/blog/2023-01-10/details-tab.png" class="glightbox"><img alt="details%20tab" src="/data/uploads/blog/2023-01-10/details-tab.png" title="Details Tab" /></a></p>

<p>With the report now setup, we can run it and see what the results are:</p>

<p><a href="/data/uploads/blog/2023-01-10/sample-report.png" class="glightbox"><img alt="sample%20report" src="/data/uploads/blog/2023-01-10/sample-report.png" title="Sample Report" /></a></p>

<p>This is an example of a report using single row as the report type and having a child table (in this case, data from the Expense Detail table) added to the report:</p>

<p><a href="/data/uploads/blog/2023-01-10/sample-report-with-child-table.png" class="glightbox"><img alt="sample%20report%20with%20child%20table" src="/data/uploads/blog/2023-01-10/sample-report-with-child-table.png" title="Sample Report with Child Table" /></a></p>

<h2>Wrap Up</h2>

<p>With the ability to create quick custom reports and exports, the user has another tool to better visualize the data that they need to work with whether as a static one-time report or outputted data in a spreadsheet. To check out how these features work, go to <a href="https://dbfront.com/licensing">dbFront.com</a>, download and explore these features and more.</p>
 ]]></description>
			</item>
	</channel>
</rss>
