Solved

Query-Of-Queries question about trying to UPDATE

Posted on 2004-04-05
8
539 Views
Last Modified: 2013-12-24
OK, I have a query that gathers data from my AS400, as follows:

**************************************************
SELECT
      ORDBILJ.ORODR## as OrderNumber,
      ORDBILJ.ORCONS as CustCode,
      CUSTMAST.CUNAME as CustName,
      LOAD.DIUNIT as Unitnum,
      ORDBILJ.ORSTAT as Status,
      (#TODAY# - ORADDT) as DaysOutstanding,
      ORDBILJ.ORBAMT as RatedRev,
      ORDBILJ.ORESTR as Estimated,
      ORDBILJ.ORMILE as TarrifMiles,
      (ORDBILJ.ORESTR - ORDBILJ.ORESTR) as RateStatus
FROM
      ORDBILJ INNER JOIN CUSTMAST ON ORDBILJ.ORCUST = CUSTMAST.CUCODE
      INNER JOIN LOAD ON ORDBILJ.ORODR## = LOAD.DIODR##
WHERE
      ORSTAT IN ('E', 'D')
      AND ORINV = '       '
      AND LOAD.DIDISP = '01'
      AND ORDBILJ.ORSEQ = ' '
      AND ORDBILJ.ORODR## NOT LIKE 'D%'
      AND ORDBILJ.ORODR## NOT LIKE 'R%'
********************************************************

Now here is what is tricky.  You see my column name I am creating called 'RatedStatus'?  I need to set this (inside the query results) to be either Default, Rated, or Estimated, based on the valued in the RatedRev and Estimated values.  Here is what I am trying to do:


********************************************************
<cfquery name="UpdateRecords" dbtype="query">
UPDATE
      GetData
SET
      RateStatus = 'RATED'
WHERE
      RatedRev <> 0
      AND Estimared <> 0
</cfquery>
********************************************************

Of course, ColdFusion does not like doing an UPDATE statement inside a Query-of-queries.  I need to know a way I can update the value inside the result set, without having to write to a temp table, to a file, or anything like that.  Does anyone have any idea's???
0
Comment
Question by:JUSTICE
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
8 Comments
 
LVL 5

Expert Comment

by:Seth_Bienek
ID: 10761308
What database platform are you on?  Oracle or DB2?

The most efficient approach will likely be to include this logic in your original query using the appropriate database-specific conditional code.

Take Care,

Seth
0
 
LVL 35

Expert Comment

by:mrichmon
ID: 10761447
I see that you are setting RateStatus initially to ORDBILJ.ORESTR - ORDBILJ.ORESTR  

Won't this just give you 0 for all results?

Also what is the logic behind doing an update query as a query of queries?

Cold Fusion does not support INSERT DELETE or UPDATE on query of queries.

If you explain the logic perhaps we can come up with an alternative for you
0
 
LVL 9

Accepted Solution

by:
shooksm earned 500 total points
ID: 10761625
You can do a SQL update on a query object.  But you can use some of the query functions to manipulate the data inside of a query.  So you could use the QuerySetCell function:

<cfloop query="GetData">
     <cfif GetData.RatedRev NEQ 0 AND GetData.Estimated NEQ 0>
          <cfset QuerySetCell(GetData, "RateStatus", "RATED", GetData.CurrentRow)>
     </cfif>
</cfloop>

My other suggestion would be to see if AS400 SQL supports the ANSI SQL CASE statement.  Then you could do something like this with your rated field:

SELECT
     ORDBILJ.ORODR## as OrderNumber,
     ORDBILJ.ORCONS as CustCode,
     CUSTMAST.CUNAME as CustName,
     LOAD.DIUNIT as Unitnum,
     ORDBILJ.ORSTAT as Status,
     (#TODAY# - ORADDT) as DaysOutstanding,
     ORDBILJ.ORBAMT as RatedRev,
     ORDBILJ.ORESTR as Estimated,
     ORDBILJ.ORMILE as TarrifMiles,
     CASE WHEN ORDBILJ.ORBAMT <> 0 AND ORDBILJ.ORESTR <> 0 THEN 'RATED' ELSE 'NOT RATED' END as RateStatus
FROM
     ORDBILJ INNER JOIN CUSTMAST ON ORDBILJ.ORCUST = CUSTMAST.CUCODE
     INNER JOIN LOAD ON ORDBILJ.ORODR## = LOAD.DIODR##
WHERE
     ORSTAT IN ('E', 'D')
     AND ORINV = '       '
     AND LOAD.DIDISP = '01'
     AND ORDBILJ.ORSEQ = ' '
     AND ORDBILJ.ORODR## NOT LIKE 'D%'
     AND ORDBILJ.ORODR## NOT LIKE 'R%'

CASE statements allow for multiple WHEN statements so you can create several different outcomes for your RateStatus column.

Hope this helps.
0
Migrating Your Company's PCs

To keep pace with competitors, businesses must keep employees productive, and that means providing them with the latest technology. This document provides the tips and tricks you need to help you migrate an outdated PC fleet to new desktops, laptops, and tablets.

 
LVL 9

Expert Comment

by:shooksm
ID: 10761631
Oops.  First sentence should read "You can NOT do and update on a query object."
0
 
LVL 35

Expert Comment

by:mrichmon
ID: 10761656
shooksm showed one example of an alternative method like I was talking about.

Or there are ways to set the query cells at a later point if you don't know at the DB query time what the value should be.

As I mentioned if you explain your logic we can come up with a solution that will suit your needs since the UPDATE QofQ's is not an option.

0
 
LVL 9

Expert Comment

by:shooksm
ID: 10762179
Actually, my first example is of how to use the QuerySetCell function to change the value of a cell after the initial query.  The second example is how to do it using strictly SQL.
0
 
LVL 10

Expert Comment

by:Mause
ID: 10764626
a cfquery returns an array so you can set the value as shooksm said width QuerySetCell or directly in the array width

<cfset GetData.RateStatus[GetData.CurrentRow] = 'RATED'>

hope this helps
Mause
0
 
LVL 1

Author Comment

by:JUSTICE
ID: 10764971
Shooksm,

Both your examples will do what I needed them too!  

Thank you very much for the help everyone!!

The reason I was trying to get the data correct inside the query was that I need to further perform query-of-queries after the fact, and I dont want to have to go to my DB again and again.  I have to determine a total dollar value based on daysoutstanding, as well as by RATED, Default ,etc. status totals.  

Again, thanks everyone for your help!
0

Featured Post

Back Up Your Microsoft Windows Server®

Back up all your Microsoft Windows Server – on-premises, in remote locations, in private and hybrid clouds. Your entire Windows Server will be backed up in one easy step with patented, block-level disk imaging. We achieve RTOs (recovery time objectives) as low as 15 seconds.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Application launch issue with Apache Tomcat 5 69
Firewall Speed Issue 6 72
wordpress email form 23 85
move expression web site to a new server 13 73
Have you ever sent email via ColdFusion and thought of tracking this mail to capture the exact date and time when the message was opened ?  If yes, then this article is for you ! First we need a table user_email with columns user_id , email , sub…
Introduction This article explores the design of a cache system that can improve the performance of a web site or web application.  The assumption is that the web site has many more “read” operations than “write” operations (this is commonly the ca…
Nobody understands Phishing better than an anti-spam company. That’s why we are providing Phishing Awareness Training to our customers. According to a report by Verizon, only 3% of targeted users report malicious emails to management. With compan…
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question