× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



On 09-Feb-2015 09:53 -0600, Rene van der Kraats wrote:

<<SNIP>>

I'm dabbling with Query/400 (just for entertainment, mind you) but,
never having used this program before, it's a bit hard to get into
the right 'mind-set'.

I have these database files with a layout similar to this:

DATE SYMBOL VALUE
01/01/2015 AAA 50
01/01/2015 BBB 40
01/01/2015 CCC 20
01/02/2015 AAA 60
01/02/2015 BBB 35
01/02/2015 CCC 25
01/03/2015 AAA 40
01/03/2015 BBB 25
01/03/2015 CCC 23

etc...

I'm trying to produce a query where it calculates the delta between
similar symbols, per day.

So:

01/01/2015 AAA = 50
01/02/2015 AAA = 60 -> delta compared to previous day = 10
01/03/2015 AAA = 40 -> delta compared to previous day = 20

...and so on, for each symbol.

I think I need to build some query result fields roughly like

delta = abs(VALUE(current date) - VALUE(current date - 1))

(I hope this makes sense), but I cannot figure out how to do this.
I've read a boat-load of PDF's, but none really shows me how to
approach this problem (or perhaps I just don't 'get it' :)

Can someone perhaps push me in the right direction? I know this
probably can be solved much easier and quicker with other tools, but
out of curiosity I'd still like to know how this is accomplished in
Query/400 :)


The Query/400 report writer does not support the capability for what are often called _running totals_; there is no ability to summarize or perform calculations using the data in prior row(s). For that reason alone, deferring to other tooling is probably the best. Considering that the Query/400 feature had been effectively shelved long ago and long deprecated [with SQL interfaces being recommended as the alternative], there is little value in the /exercise/ being attempted. Finally, given that the Query/400 is an interactive feature with no definitional source /language/, describing a query is not succinct; rendering the Query Definition (QRYDFN) as the keystrokes to define or as a Printed Definition are both far less desirable than using the SQL.

Setting up the given with the SQL:

create table dbd /* DayByDay */
( "DATE" DATE
, "SYMBOL" CHAR(3)
, "VALUE" DEC
)
;

insert into dbd values
( '01/01/2015' , 'AAA' , 50 )
, ( '01/01/2015' , 'BBB' , 40 )
, ( '01/01/2015' , 'CCC' , 20 )
, ( '01/02/2015' , 'AAA' , 60 )
, ( '01/02/2015' , 'BBB' , 35 )
, ( '01/02/2015' , 'CCC' , 25 )
, ( '01/03/2015' , 'AAA' , 40 )
, ( '01/03/2015' , 'BBB' , 25 )
, ( '01/03/2015' , 'CCC' , 23 )
;

In effect, the following SQL could be mimicked using the Query/400 [aka: Query for i5/OS or Query for IBM i]. A first Query Definition would use the Output File feature to generate a physical output file with the data instead of the VIEW. A second Query Definition would use that previously created output file to perform the effectively equivalent join using "2=Matched records with primary file" along with the effectively equivalent expressions\column-list and ordering, as the SELECT that follows the VIEW definition:

create view dbdp /* DayByDayPrev */ as
( select a.*, DATE("DATE" - 1 DAYS) as PREV_DAY
from dbd as a
)
;

select
p."DATE", p."SYMBOL", p."VALUE"
, ABS( d."VALUE" - p."VALUE" ) as DAYS_DIFF
from dbdp p
left outer join dbdp d
on p.PREV_DAY = d."DATE"
and p."SYMBOL" = d."SYMBOL"
order by p."SYMBOL", p."DATE"

Note: The Query/400 feature does not have the ABSolute value function, but for reporting to display or printer, the Report Column Formatting enables Numeric Editing capabilities to present results as effectively unsigned.


As an Amazon Associate we earn from qualifying purchases.

This thread ...


Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.