Making "returning" give back the SERIAL

Bastiaan Olij bastiaan at basenlily.me
Sun Jan 28 17:49:25 EST 2018


Hey Das,

You need to skip the column for the default to work, so

-----
Insert into customers (
  Cust_FirstName, Cust_LastName, .....
) values (
  @[$cinst.Cust_FirstName], @[$cinst.Cust_LastName], ....
) returning "Cust_ID";
-----

Assuming you have put the next_val function as the default value for the
column.

Then in Omnis I have a table class called tBaseSQL, I use this as the
$superclass for all my table classes.

I have a function called tBaseSQL.$primarykey which looks something like
this:
-----
set reference lvSchema as $schemas.$findname($cinst.$sqlclassname)
if lvSchema
  set reference lvColumn as lvSchema.$objs.$first()
  while lvColumn
    if lvColumn.$primarykey
      ;; found our primary key
      quit method lvColumn.$name
    end if

    set reference lvColumn as lvSchema.$objs.$next(lvColumn)
  end while
end if

;; I guess we didn't find it
quit method ''
-----

Now I create my own tBaseSQL.$insert like so:
-----
calculate lvPrimaryKey as $cinst.$primarykey
if lvPrimaryKey = ''
  ;; Call $sqlerror just like Omnis does when there is an error
  do $cinst.$sqlerror(kTableInsertError, -1, 'No primary key set')
  return kFalse
end if

;; Tell omnis not to include the primary key in our insert statement
calculate $cinst.$cols.[lvPrimaryKey].$excludefrominsert as kTrue

;; Now let Omnis build the SQL query we want
calculate lvSQL as con('Insert into ',$cinst.$servertablename,'
',$cinst.$insertnames('$cinst'),' returning ',lvPrimaryKey)

;; And execute
if not($cinst.$statementobject.$execdirect(lvSQL))
  do $cinst.$sqlerror(kTableInsertError,
$cinst.$statementobject.$errorcode, $cinst.$statementobject.$errortext)
  return kFalse
end if

;; And fetch our new primary key (lvList is an undefined list!!)
Do $cinst.$statementobject.$fetch(lvList, kFetchAll)
if lvList.$linecount=0
  do $cinst.$sqlerror(kTableInsertError, -1, 'Couldn''t retrieve primary
key value')
  return kFalse
end if
calculate $cinst.[lvPrimaryKey] as lvList.1.C1

;; We did it!
return kTrue
-----

I do far more in both $insert and $update but this is a good starting point.
Also adding an $sqlerror method to tBaseSQL gives you a nice central
place to do error handling as all build in table class functions call
this method when an error is given. I follow the same design pattern up
above.

Forgive any typos I made :)

Cheer,

Bas


On 29/1/18 9:23 am, Das Goravani wrote:
> Omnis doesn’t like this statement
>
> INSERT INTO customers VALUES (DEFAULT,@[$cinst.Cust_FirstName],@[$cinst.Cust_LastName],@[$cinst.Cust_eMail],@[$cinst.Cust_Phone],@[$cinst.Cust_Address1],@[$cinst.Cust_Address2],@[$cinst.Cust_City],@[$cinst.Cust_State],@[$cinst.Cust_Zip],@[$cinst.Cust_BalOwed],@[$cinst.Cust_BizName])  returning “Cust_ID"
>
> Can you see anything wrong with it
>
> Note it contains a call to DEFAULT the first field, and a RETURNING clause at the end for the name of that field
>
> I have double and rechecked that I have a serial generator running and have set the default for that column to the serial generator
>
> The above should work but it’s not and I’m frustrated
> _____________________________________________________________
> Manage your list subscriptions at http://lists.omnis-dev.com


-- 
Kindest Regards,

Bastiaan Olij
e-mail: bastiaan at basenlily.me
web: http://www.basenlily.me
Skype: Mux213
http://www.linkedin.com/in/bastiaanolij




More information about the omnisdev-en mailing list