Modified({fieldname}) no longer works

4D finally did away with the Modified({fieldname}) command.

I’ve replaced it in our code base with

Old({fieldname})#fieldname

4D recommends using the Form Event and On Data Change event.

Keep code base clean – avoid unnecessary variable assignments

Can’t tell you how frustrating it is to find the context of a variable stripped away by a meaningless re-assgiment (login required).

From Clean Code: A Handbook of Agile Software Craftsmanship:

The name of a variable, function, or class, should answer all the big questions. It
should tell you why it exists, what it does, and how it is used

 // doing this totally strips away any meaningful context $my_temp_variable = $employee_salaries[$an_employee_name]; $gross_salary = $bonus_factor * $my_temp_variable; // hopefully the language constructs allow full variable interaction $gross_salary = $bonus_factor * $employee_salaries["Fred"] 

Embedding CSS file in html e-mail

Sending html e-mails opens a whole can of worms on the many ways e-mail can be viewed. There is also no guarantee your e-mail will look as intended.

Instead of linking to a remote css file that may be blocked, or prompt the user with a scary ‘prevented external content to load’ error message, we can use PHP to pull the file directly. This adheres to the DRY principle and keeps the code base clean.

Use the file_get_contents function in place of linking a style sheet via an html style element.

I would also recommend a try/catch block in case the file_get_contents command fails.

Solution

In head section:

 <style type="text/css" media="screen">	<!-- we do this to embed the file contents into the e-mail.	<?php echo file_get_contents("../common/css/blueprint/screen.css"); ?>	--> </style> 

Blueprint CSS is total win

Having not played around with CSS frameworks before I found this one very appealing.

Really, it accomplishes something I used to spend an inordinate time doing: creating a simple set of CSS rules that bring all browsers to a common level playing field.

My favorite aspect is the concept of 24 columns easily split into classes span-x where x is a number of columns.

Check out blueprintcss.com for more information.

Porting DATE_TO_CHAR function to PostgreSQL

This allows multiple data stores but without rewriting all sql queries. Note you have to create two functions, one to accept dates, the other to accept times.

Specifically the 4D SQL function DATE_TO_CHAR. Luckily PostgreSQL has the equivalent as a formatting function to_char.

For business reasons it’s not practical to replace all instances of DATE_TO_CHAR to to_char.

Solution

Create a function in the postgresql data base that maps the DATE_TO_CHAR function to to_char. Luckily the formatting options I need are available.

Now SELECT DATE_TO_CHAR(DateField1, "YYYY-MM-DD") FROM Table1 will return the correct value regardless of the database queried. It’s important to note this works great for getting integer values from dates and casting as date objects. If queries rely on returning non-iso formatting your mileage may vary.

 -- Function: date_to_char(date, text) CREATE OR REPLACE FUNCTION date_to_char(date, text) RETURNS text AS $BODY$ DECLARE BEGIN RETURN to_char($1,$2)::text; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION date_to_char(date, text) OWNER TO postgres; 
 -- Function: date_to_char(time without time zone, text) CREATE OR REPLACE FUNCTION date_to_char(time without time zone, text) RETURNS text AS $BODY$ DECLARE BEGIN RETURN to_char($1,$2)::text; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION date_to_char(time without time zone, text) OWNER TO postgres;