` Printed Icetips Article

Icetips Article



SQL Related Articles: Using same file structure to retrieve multiple fields
2002-07-07 -- Dan Pressnell
 
Newsgroups: TopSpeed.Products.Drivers

One of the inconveniences of using SQL in Clarion programs has been the file
or view structure that you have to use.  The common advice is to create a
dummy table on the server, so that table's structure can hold results.

But look at this structure.  As long as you have a table named "customer"
and it has a column named "customername", it will work fine for using
embedded SQL:

========================
tfile file, driver('odbc'), name('customer'), owner(glo:owner)
record  record
f1        cstring(256), name('customername')
f2        cstring(256), name('customername')
f3        cstring(256), name('customername')
f4        cstring(256), name('customername')
f5        cstring(256), name('customername')
f6        cstring(256), name('customername')
f7        cstring(256), name('customername')
f8        cstring(256), name('customername')
f9        cstring(256), name('customername')
f10       cstring(256), name('customername')
        end
      end

=======================
When Clarion "opens" that file, it validates that there is a table named
"customer" with a columned named "customername".  If you have such a table,
then you are ready to go.

Now you've got a generic file structure that you can use to return up to 10
columns with any embedded sql.  And you haven't had to grovel and embarass
yourself by asking your DBA to add a blank dummy table to the database.

Now for some code to use it:

=============================
myqueue queue
customername    string(60)
customerbalance decimal(20,2)
customerid      decimal(20)
        end
  code
  open(tfile)
  if error()
    stop(error())
  end
  tfile{prop:sql} = 'select customername,customerid,customerbalance' &|
    ' from customer order by customername'
  if error()
    stop(error() & fileerror())
  end
  loop
    next(tfile)
    if error() then break.
    myqueue.customername = tfile.f1
    myqueue.customerid = tfile.f2
    myqueue.customerbalance = tfile.f3
    add(myqueue)
  end

========================

That code fills the queue with the result set form the SQL.  The SQL can
contain joins, where, order by, sums, counts, etc.  It's very easy to do
when you do it this way.

Oh, and yeah.... it's FAST FAST FAST FAST FAST.

And it works with MSSQL drivers, and I'm sure it works with other Clarion
file drivers, like Oracle, etc.

Later I'll show how to wrap all that up with something like this:

myqueue    queue
Customername    string(40), name('customer.customername')
Balance               decimal(20,2), name('sum(account.balance)')
                  end

    code
    QueryFromQueue(MyQueue, 'from customer,account' &|
            ' where account.customerid = customer.customerid' &|
            ' group by customer.customername')

Now none of this is template based, so I know many people will consider it
utterly worthless.  But for those Clarion programmers who actually program,
it can be very useful.  For those of you who have to have a template to
write anything, grow up, stop being babies, getting all your nourishment
from the bottle, and become programmers.  Clarion is only as successful as
the abilities and desire of its programming community.  I've found that the
reason so many companies are turning away from Clarion is that the
PROGRAMMERS give Clarion a bad name.  STOP IT!  I'm tired of potential
customers thinking Clarion sucks because they've seen Clarion programs that
suck!

Dan



Printed November 21, 2024, 7:33 am
This article has been viewed/printed 35219 times.
Google search has resulted in 65 hits on this article since January 25, 2004.