Page 1 of 1

Request : function GetSerialCol()

PostPosted: Sun Sep 24, 2023 9:20 pm
by Jimmy
hi,

in c:\fwh\source\function\pgsuport.prg we have
Code: Select all  Expand view
#ifdef UNUSEDFUNCS
STATIC function GetSerialCol

can you please "enable" it

i need it for PostgreSQL PRIMARY KEY of Table made by Alaska
Code: Select all  Expand view
cQuery += " CONSTRAINT " + cTable + "_pkey PRIMARY KEY (__record)"

it will use
Code: Select all  Expand view
     // use nextval() for Sequence !
      cIns += "nextval('" + cTable + "___record_seq')" + ","

to "increment" FIELD "__record" when INSERT new Record

Re: Request : function GetSerialCol()

PostPosted: Mon Sep 25, 2023 4:24 am
by nageswaragunupudi
You may comment out #ifdef and #endif in your copy and test.

Re: Request : function GetSerialCol()

PostPosted: Mon Sep 25, 2023 1:01 pm
by Jimmy
hi,
nageswaragunupudi wrote:You may comment out #ifdef and #endif in your copy and test.

i do have include Copy of PGSUPORT.PRG and it work like i need

p.s. have also include copy of METHOD SavePQQ() CLASS TDataRow to work with GetSerialCol()
as currval() is NOT the right Way (for Alaska Concept) i have to re-write CODE for APPEND a new Record in Table

Re: Request : function GetSerialCol()

PostPosted: Tue Sep 26, 2023 3:59 am
by nageswaragunupudi
If you want to change the logic of the method SavePQQ(), please do this way.
Code: Select all  Expand view
oRec := TDataRow():New( oRs, [lAppend] )
oRec:bSave := { |oRec| MySavePQQ( oRec ) }
oRec:Edit()


Please copy the method SavePQQ() to a separate function "MySavePQQ( oRec )" in your program and make the changes you need. This codeblock may return .t. if saved or .f. if not.

Re: Request : function GetSerialCol()

PostPosted: Tue Sep 26, 2023 6:40 am
by Jimmy
hi,

thx for Answer
nageswaragunupudi wrote:Please copy the method SavePQQ() to a separate function "MySavePQQ( oRec )" in your program and make the changes you need.


i can use your Sample with XBROWSE and :bLDblClick for "save"
ok, i will try that Way

---

instead of XBROWSER i have try
Code: Select all  Expand view
  oRs := oPGU:Query( "select * from " + cTable )
*   XBROWSER oRs TITLE cTable AUTOSORT FASTEDIT

   @ nBhight,  2 XBROWSE oBrw SIZE nWidth - 20, nHeight - 90 PIXEL OF oWnd ;
           RECORDSET oRs AUTOSORT FASTEDIT ;
           AUTOCOLS ;
           CELL LINES NOBORDER UPDATE ;
           FONT oFontDefault COLOR BFcolor, BGcolor

   oBrw:bLDblClick := { || MyTDataRow( oRs, .T. ) }

   oBrw:CreateFromCode()


Code: Select all  Expand view
PROCEDURE MyTDataRow( oRs, lAppend )
LOCAL oRec
DEFAULT lAppend := .F.

   oRec := TDataRow():New( oRs, lAppend )
   oRec:bSave :=  { |oRec| MySavePQQ( oRec ) }
   oRec:Edit()
RETURN

i got Dialog with "edit" Control but all are empty ... :shock:
i have try
Code: Select all  Expand view
     oBrw:bLDblClick := { |oRec| MyTDataRow( oRec, .T. ) }

but this give me "Enter : 1-line-edit" ... :(

what do i miss :?:

Re: Request : function GetSerialCol()

PostPosted: Tue Sep 26, 2023 12:13 pm
by nageswaragunupudi
Advise to write the code in these lines:
Code: Select all  Expand view
DEFINE BUTTONBAR oBar OF oWnd SIZE 80,32

@ 50,20 XBROWSE oBrw SIZE -20,-20 PIXEL OF oWnd ;
   DATASOURCE oRs AUTOCOLS AUTOSORT ;
   CELL LINES NOBORDER FASTEDIT
   
WITH OBJECT oBrw
   :nEditTypes := EDIT_GET
   :bDataRow   := < |brw,cFieldList,lNew|
         local oRec  := TDataRow():New( oRs, cFieldList, lNew )
         oRec:bSave  := { |oRec| MySavePQQ( oRec ) }
         return oRec
         >
   :CreateFromCode()
END

DEFINE BUTTON OF oBar PROMPT "AddNew" ACTION oBrw:EditSourc( .t. )
DEFINE BUTTON OF oBar PROMPT "Edit"   ACTION oBrw:EditSource()

ACTIVATE WINDOW oWnd

//----------------------------------------------------------------------------//

function MySavePQQ( Self )

   local lAppend  := ( ::RecNo == 0 )
   local oQry  := ::uSource
   local aModi := ::aModiData
   local aKey  := {}
   local aSave := {}
   local cSeq, nCurVal
   local n, v, nFld, cSql, uVal, cWhere, nRows, nRow
   local lRefresh    := .f.

   for n := 1 to Len( ::aStructPG )
      if ::aStructPG[ n, 10 ] == "PRI" .and. ;
         oQry:TableName == ::aStructPG[ n, 7 ]
         if cSeq == nil .and. ::aStructPG[ n, 2 ] == '+'
            cSeq     := ::aStructPG[ n, 9 ]
         endif
         if ValType( ::aData[ n, 2 ] ) == 'C'
            AAdd( aKey, { n, ::aStructPG[ n, 8 ], TRIM( ::aOrg[ n, 2 ] ), TRIM( ::aData[ n, 2 ] ) } )
         else
            AAdd( aKey, { n, ::aStructPG[ n, 8 ], ::aOrg[ n, 2 ], ::aData[ n, 2 ] } )
         endif
      endif
   next

   if Empty( aKey )
      return .t.
   endif

   for n := 1 to Len ( ::aModiData )
      nFld     := ::aModiData[ n, 3 ]
      uVal     := ::aModiData[ n, 2 ]
      if ValType( uVal ) == 'C'
         uVal  := Trim( uVal )
      endif
      AAdd( aSave, { ::aStructPG[ nFld, 8 ], uVal } )
   next

   if Empty( aSave )
      return .t.
   endif

   if lAppend
      cSql  := "INSERT INTO " + oQry:Schema + "." + oQry:TableName + " ( "
      cSql  += FW_ArrayAsList( ArrTranspose( aSave )[ 1 ] )
      cSql  += " ) VALUES "
      cSql  += FW_ValToSQL( ArrTranspose( aSave )[ 2 ], nil, "PG" )
   else
      cSql  := "UPDATE " + oQry:Schema + "." + oQry:TableName
      for n := 1 to Len( aSave )
         if n == 1
            cSql  += " SET "
         else
            cSql  += ", "
         endif
         cSql  += aSave[ n, 1 ] + " = " + FW_ValToSQL( aSave[ n, 2 ],, "PG" )
      next

      for n := 1 to Len( aKey )
         if n == 1
            cSql  += " WHERE "
         else
            cSql  += " AND "
         endif
         cSql  += aKey[ n, 2 ] + " = "  + FW_ValToSQL( aKey[ n, 3 ] )
      next
   endif

   FWPG_Execute( oQry, cSql )
   if lAppend .and. !Empty( cSeq )
      nCurVal  := FWPG_Execute( oQry, "SELECT currval( '" + cSeq + "' )" )[ 1, 1 ]
   endif
   oQry:Refresh()
   // Reposition record
   if lAppend
      n     := aKey[ 1, 1 ]
      if !Empty( nCurVal )
         v  := nCurVal
      else
         v  := aKey[ 1, 4 ]
      endif
      oQry:GoTo( oQry:LastRec() )
      FWPG_GoToKeyVal( oQry, n, v )
      lRefresh := .t.
   else
      n     := aKey[ 1, 1 ]
      v     := aKey[ 1, 4 ]
      if ! ( oQry:FieldGet( n ) == v )
         FWPG_GoToKeyVal( oQry, n, v )
         lRefresh := .t.
      endif
   endif

   ::ReadPQQ( nil, .f., .t. )
   if ::oBrw != nil
      if lRefresh
         ::oBrw:Refresh()
      else
         ::oBrw:RefreshCurrent()
      endif
   endif

return .t.

//----------------------------------------------------------------------------//
 

Make your changes in the function MySavePQQ()

Re: Request : function GetSerialCol()

PostPosted: Wed Sep 27, 2023 4:15 am
by Jimmy
hi,

thx for your Advice

"where" can i read more about Construction like this :?:

---

i mean : what if People have a Accident and can not help any more ...
special XBROWSE are so "big" so it is almost impossible to "understand" all the CODE when have no Help File

Re: Request : function GetSerialCol()

PostPosted: Wed Sep 27, 2023 7:46 am
by Jimmy
hi,

thx for Answer.

i have use the CODE and got Data from Controls :)
but when try to "save" i got Error
Error description: Error BASE/42 Scope violation (protected): TDATAROW:READPQQ

Image

Question : how to "disable" those 5 Button on left Side of "edit" ( which make no Sense when "edit" ) :?:

---

but CODE still does not work as it does not "recognize" PRIMARY KEY made by Xbase++ Concept
Image

when use Alaska PgDBE PRIMARY KEY, which point to "internal" FIELD __record, never can be 0
this why i need function GetSerialCol() which work right with Alaska Concept

p.s. not sure if we need :READPQQ() as Bro:Refresh() will show right Result

---

i wonder about "self" as Parameter ... never saw it before, GREAT :)

---

Code: Select all  Expand view
  :nEditTypes := EDIT_GET

have no Effect in Sample (can edit but does not save)

Question : how can i redirect Dblclick to "edit" :?:

have try
Code: Select all  Expand view
   :bLDblClick := :EditSource()

but it gave me Error

----

when press Button "add new" it crash
Error description: Error BASE/1004 Message not found: TXBROWSE:EDITSOURC

Stack Calls
===========
Called from: .\source\function\HARBOUR.PRG => _CLSSETERROR( 247 )
Called from: .\XBROWSE.PRG => TXBROWSE:EDITSOURC( 11840 )
Called from: .\FWPGU.PRG => (b)SHOWTABLE( 1167 )


---

will continue to work on it ...

Re: Request : function GetSerialCol()

PostPosted: Wed Sep 27, 2023 3:50 pm
by Jimmy
hi

i can add new Record, it was a Typo :roll:

---

i can use bLDblClick when NOT set nEditTypes
Code: Select all  Expand view
*      :nEditTypes := EDIT_GET
      :bLDblClick := { || oBrw:EditSource() }

it must before :bDataRow := Codeblock