Hi:
I agree with almost everything you say for complicated reports .. .especially those with a lot of CALL DEFINES or ACROSS or COMPUTE blocks. But for the
original problem program output in this forum posting, I think that DATA _NULL_ is a viable alternative.
It's never taken me days to work out a DATA _NULL_ to compare it to a PROC REPORT. Once you understand that N=PS still works with ODS and DATA _NULL_ and array processing still works and that if you have generic columns, you can write a variable number of ACROSS columns -- a lot is possible. In my last SGF paper, I showed creating a standard demographic report using both PROC REPORT and DATA _NULL_...the only thing different was that the PROC REPORT data needed some pre-PROC massaging and the DATA _NULL_ version of the program needed a custom Table template and N=PS to work.
I used a custom Table template in my example, not a custom style template. I think that custom Table templates added to DATA _NULL_ -- especially with the ability to define generic columns is a really neat feature of ODS. And, since a Table template allows you to change the style elements for the output and do traffic lighting, it has a lot of the features of call define (although, PROC REPORT can do FORMAT changes in a CALL DEFINE and Table templates can't do that directly.)
In fact, Table template syntax is more like PROC REPORT syntax, than any of the other template syntaxes (in my opinion). Both Tagset templates and Table templates have define blocks and Table templates have a COLUMN statement like PROC REPORT.
cynthia
Papers:
http://nesug.org/Proceedings/nesug05/dp/dp14.pdf
http://www.lexjansen.com/pharmasug/2008/sas/sa08.pdf