On 26-Dec-2013 14:59 -0800, Hoteltravelfundotcom wrote:
I have been unable to duplicate this query.
So we should infer "this query" is a Query/400 Query Definition
(*QRYDFN) object type. And the desire "to duplicate" is with regard to
effecting the /conversion/ implied in the subject. And that the desired
/conversion/ is into an SQL SELECT, per the final comment quoted below.
Because of course, to /duplicate/ a *QRYDFN object is just either of
CRTDUPOBJ or option 3=Copy in the Work With Queries (WRKQRY) feature.
Describing a manner in which one might effect /conversion/ from the
QRYDFN to the SQL, requires knowing almost the full QRYDFN rather than
merely some subset of information one has chosen to share about the QRYDFN.
It uses 5 files it matches from the order history file to customer,
and shipping, invoice history and address files.
OHENT# EQ ADENT#
OHSFX# EQ ADSFX#
OHORD# EQ IDORD#
OHENT# EQ ACENT#
OHSFX# EQ ACSSF#
has some record selects and sorting, no problems so far. Does totals
on qty shipped and $shipped.
Some attributes for /sorting/ and possibly selection, capabilities
that are available to the Query/400, are not directly available to the
SQL. Generated rows, from join types that require the capability, are
effected by producing the NULL value for an SQL query. But as I recall,
the Query/400 generates default values for generated rows. Presumably
we can infer that the JOIN, WHERE, and ORDER BY have been verified as
satisfactory for /detail/ reporting using the SQL SELECT [without any
aggregation]; i.e. the detail result sets are identical betwixt.? The
chosen Collating Sequence and the chosen Processing Options (with regard
to the chosen collating sequence) are relevant with regard to the
possibility of the SQL SELECT to mimic the Query/400. Presumably we can
infer the collation for selection and ordering is not an issue per
verified consistency from the Sort Sequence (SRTSEQ) of the SQL request;
again, that the result set is verified to be identical betwixt the
detail [non-summarized] QRYDFN and the SQL SELECT result sets.?
Knowing the result-sets of the non-aggregate queries are identical,
i.e. the SQL and the non-SQL queries, implies that any knowledge of the
JOIN, ORDER, and WHERE is unnecessary.
Does break levels on 9 fields. this is the part I cannot translate.
then puts the data to a temp file.
There is no direct equivalent in the SQL, to Report Breaks of the
Query/400. The Grouping feature of the SQL produces grouped rows
[versus being a reporting feature] typically with aggregates, else it is
just a DISTINCT query against grouped columns. The Report Breaks
feature of the Query/400 is effectively just a reporting feature; albeit
actually producing rows, though not necessarily grouped rows, when using
effectively the RUNQRY OUTFORM(*SUMMARY) OUTTYPE(*OUTFILE). However,
although Breaks and Groups are inherently different, they often are used
for effectively equivalent results. The implication of the use of an
output file for the QRYDFN reporting suggests the probability of
/summary-only/ processing, so we can presume there is no need to include
reporting for both detail and summary data in the same SQL SELECT. If
the sequence of the fields for the /Select Sort Fields/ of the QRYDFN
reporting, matches the sequence of the fields as defined for /Report
Breaks/ for the QRYDFN reporting, then the SQL grouping with columns
specified in the same order will most closely match the /breaking/ of
that data. But then a big question remains, whether the breaks are
differing levels, or are they the same level, or some combination? It's
quite difficult to know what is the Query Definition, without seeing the
printed definition; i.e. simply saying "break levels on 9 fields" is
As Vern mentioned, the Analyze Query Definition (ANZQRY) and the
Retrieve QM Query (RTVQMQRY) and the Retrieve QM Form (RTVQMFORM) may be
of some assistance first in determining what will not make the
conversion from the *QRYDFN object into the *QMQRY and *QMFORM object
types. Then against which respectively, Create QM Query (CRTQMQRY) and
Create QM Form (CRTQMFORM) can be issued, as an attempt to make some
attempt at a possible equivalent SQL-implemented query request that can
be run via the Start QM Query (STRQMQRY) CL request. But only if the
reported limitations are not show-stoppers, though I believe they will
be. And the analyze feature is effective only for the query, not the
report form. However the Start QM (STRQM) Cl request can start an
interactive query and form utility, and then used to build a form that
matches a modified version of the source SQL SELECT statement for QMQRY.
That might be a better approach. I am not sure, but there may be a
limit of six break levels with the QM report writer; i.e. Usage
specification in the Edit Column Formatting seems limited from
BREAK1-BREAK6. Yet, I do not recall any support for summary-only, if
even any capability to include summary results to a database output
file; i.e. the QMQRY separation of query and report writing is even more
explicit than the QRYDFN, so that /reporting/ feature carried by QRYDFN
into its summary-only OUTFILE capability is likely unique to that utility.
I am not getting the same number of records no matter what. am sure
the issue is how to code this Break in SQL.
Only grouping can be coded in the SQL, not breaks; i.e. there is no
capability to "code this Break in SQL." Thus already, we have a good
reason why they might not match. Again, that is because /Breaks/ are a
reporting feature, and the SQL is not a reporting tool; although some
reporting tools that implement with the SQL, may provide a /Break/
feature; e.g. QMQRY. Aggregates come from grouped data sets in the SQL
SELECT whereas aggregates will come from /breaks-in-prior-data/ in the
The Query/400 produces a summary\aggregate row for each /break-level/
for changes in the data across the [nine] fields selected for /break/
processing. The SQL produces a summary\aggregate row for each /group/
using an implied ordering for the determination of a grouped value and
the SQL enables further selection on a HAVING clause. The QRYDFN can
specify different ordering for detecting breaks, than what is implied
for detecting groups in the SQL, and can even have unpredictable
ordering. Given identical collation and selection, with a
grouping-field replacing each break-field at a unique level, there will
be at least one fewer row via the SQL than the Query/400 OutFile because
the latter always includes an overall summary row. For each column in
the grouping list prior to the last named [a QRYDFN implies /columns/ vs
/expressions/ will be used, because its expressions are, unlike with the
SQL, defined previously as columns using the query /Define Result
Fields/ capability], no aggregate rows will be produced for those
sub-groups when using the simple GROUP BY clause. However when the WITH
ROLLUP is coded [or an equivalent using either GROUP BY ROLLUP or GROUP
BY GROUPING SETS using the multiple grouping-sets], subgroups can also
generate a summary row [with the NULL value for the columns not being
grouped]. Because the option to /suppress summaries/ in the /Report
Breaks/ of a QRYDFN will not impact the output file results [i.e. all
summary rows will be produced for OUTFORM(*SUMMARY) OUTTYPE(*OUTFILE)
irrespective the /suppress/ setting], the use of ROLLUP is easiest...
*if* the output of the QRYDFN is effectively identical to that type of
SQL SELECT query. The overall summary row where BREAKLVL='0' is the
equivalent to the empty grouping-set for which the aggregate would be
effectively identical, irrespective of ordering.
As an effect of the SQL query SELECT vs that of a report writer, the
grouping-sets result set may be sufficient to mimic a summary-only
QRYDFN run with an Output Type (OUTTYPE) of *OUTFILE. However assigning
a break-level to each row is not as straightforward, if mimicking that
effect of the QRYDFN is also required.