You may use Mr. Carlos' function IncCount() with suitable modifications.
Alernatively, I prefer a function using a different approach.
function seq_nextval( cName )
oCn:Execute( "UPDATE sequences SET seq_value = LAST_INSERT_ID( seq_value + 1 )" + ;
" WHERE seq_name = '" + cName + "';" + ;
"SELECT LAST_INSERT_ID()" )
return oCn:aNext[ 1, 1, 1 ]
where the table `sequences` maintains sequential ids for different tables.
This function also is network-safe (multi-user).
This is a small example using this function to maintain `id` of table `test_seq`.
#include "fivewin.ch"
static oCn
//----------------------------------------------------------------------------//
function Main()
local oRs, nID
SET DATE ITALIAN
SET CENTURY ON
SET TIME FORMAT TO "HH:MM:SS"
oCn := FW_DemoDB()
// oCn:DropTable( "test_seq" )
// oCn:DropTable( "sequences" )
CheckTables()
XBROWSER oCn:test_seq FASTEDIT
oCn:Close()
return nil
//----------------------------------------------------------------------------//
function test_seq_rsedit( oRec )
local oDlg, oFont
if oRec:RecNo == 0 // new record
oRec:id := seq_nextval( "test_seq" )
endif
DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-14
DEFINE DIALOG oDlg SIZE 400,240 PIXEL TRUEPIXEL FONT oFont ;
TITLE If( oRec:RecNo == 0, "NEW", "EDIT" )
oDlg:bInit := <||
@ 40, 30 SAY "ID :" GET oRec:ID SIZE 100,24 PIXEL PICTURE "999999" READONLY
@ 70, 30 SAY "Name :" GET oRec:Name SIZE 300,24 PIXEL
@ 100, 30 SAY "City :" GET oRec:City SIZE 300,24 PIXEL
return nil
>
@ 160, 30 BTNBMP PROMPT "SAVE" SIZE 100,40 PIXEL OF oDlg FLAT ;
ACTION ( oRec:Save(), oDlg:End() )
@ 160,270 BTNBMP PROMPT "CANCEL" SIZE 100,40 PIXEL OF oDlg FLAT ;
ACTION ( oDlg:End() )
ACTIVATE DIALOG oDlg CENTERED ON PAINT oDlg:Box( 20, 10, 150, 390 )
RELEASE FONT oFont
return nil
//----------------------------------------------------------------------------//
function CheckTables()
local nID
if !oCn:TableExists( "test_seq" )
oCn:CreateTable( "test_seq", { { "id", "N", 6, 0, "PRI" }, ;
{ "name", "C", 40, 0 }, ;
{ "city", "C", 40, 0 }, ;
{ "upddt","=", 8, 0 } } )
endif
nID := oCn:QueryResult( "SELECT MAX( id ) FROM test_seq" )
if !oCn:TableExists( "sequences" )
oCn:CreateTable( "sequences", { { "seq_name", "C", 64, 0, "PRI" }, ;
{ "seq_value", "N", 6, 0 } } )
oCn:Insert( "sequences", "seq_name,seq_value", { "test_seq", nID } )
endif
return nil
//----------------------------------------------------------------------------//
function seq_nextval( cName )
oCn:Execute( "UPDATE sequences SET seq_value = LAST_INSERT_ID( seq_value + 1 )" + ;
" WHERE seq_name = '" + cName + "';" + ;
"SELECT LAST_INSERT_ID()" )
return oCn:aNext[ 1, 1, 1 ]
//----------------------------------------------------------------------------//
You may copy this code to \fwh\samples folder and use buildh.bat or buildx.bat to build and run.
Note: The names "sequence" and "nextval()" are adapted from Oracle with the same functionality.