Login
`
Templates, Tools and Utilities
|
||
Icetips Article
Back to article list
Search Articles
Add Comment
Printer friendly
Direct link
SQL Related Articles: Generic procedure to process SQL 2004-09-11 -- Shankarj Newsgroups: softvelocity.clarion.databasedrivers
EDITOR NOTE: There is a lot of code in this article and it may not format and align properly.
I normally have a dummy table defined for this and a common procedure to
process all prop:sql statements.
Dummy Table : ACQTBL with 24 CSTRING(256) fields - to be opened in the Frame
Prototype :
SQLQuery FUNCTION(STRING, <*QUEUE>, <*?>, <*?>, <*?>, <*?>, <*?>,
<*?>, <*?>, <*?>, <*?>, <*?>, <*?>, <*?>, <*?>, <*?>, <*?>, <*?>, <*?>, <*?>,
<*?>, <*?>, <*?>, <*?>, <*?>, <*?>),BYTE,PROC !Execute SQL Statement
Procedure (Global) :
SQLQuery PROCEDURE (INP:Query, OUT:RQ, OUT:C01, OUT:C02, OUT:C03,
OUT:C04, OUT:C05, OUT:C06, OUT:C07, OUT:C08, OUT:C09, OUT:C10, OUT:C11,
OUT:C12, OUT:C13, OUT:C14, OUT:C15, OUT:C16, OUT:C17, OUT:C18, OUT:C19,
OUT:C20, OUT:C21, OUT:C22, OUT:C23, OUT:C24) ! Declare Procedure
QueryView VIEW(ACQTBL)
PROJECT(C01)
PROJECT(C02)
PROJECT(C03)
PROJECT(C04)
PROJECT(C05)
PROJECT(C06)
PROJECT(C07)
PROJECT(C08)
PROJECT(C09)
PROJECT(C10)
PROJECT(C11)
PROJECT(C12)
PROJECT(C13)
PROJECT(C14)
PROJECT(C15)
PROJECT(C16)
PROJECT(C17)
PROJECT(C18)
PROJECT(C19)
PROJECT(C20)
PROJECT(C21)
PROJECT(C22)
PROJECT(C23)
PROJECT(C24)
END
ExecOK BYTE(0)
ResultQ &QUEUE
Recs ULONG(0)
QString CSTRING(8192) ! 8K Limit ???
NoRetVal BYTE(0) ! NO Return Values (True/False)
BindVars BYTE(0) ! Binded Variables Exist (True/False)
BindVarQ QUEUE ! Binded Variables
No BYTE ! No
Name STRING(18) ! Name
END
CODE
ExecOK = False
FREE(BindVarQ) ; BindVars = False ; NoRetVal = False
IF (OMITTED(2) AND OMITTED(3) AND OMITTED(4)) THEN NoRetVal = True.
! No Return Values - Possible an UPDATE/DELETE statement
IF NOT OMITTED(2) THEN ResultQ &= OUT:RQ.
! If Result Queue Exists - Reference Queue
IF INP:Query = ''
BEEP ; MESSAGE('Missing Query Statement')
ELSE
!~! Parse Query String for EMBEDDED Variables to be BOUND
IF INSTRING('CALL ',UPPER(INP:Query),1,1)
! Check if Stored Procedure is Called
QString = CLIP(INP:Query)
S# = 0 ; L# = LEN(CLIP(QString))
LOOP C# = 1 TO L#
IF S# AND INLIST(QString[C#],',',' ',')')
! End of Binded Variable
BindVarQ.No = RECORDS(BindVarQ) + 1
BindVarQ.Name = QString[(S#+1) : (C#-1)]
IF NOT OMITTED(2+BindVarQ.No)
! Bound Variables MUST be at the Beginning of OUTPUT Variables
EXECUTE BindVarQ.No
BIND(CLIP(BindVarQ.Name),OUT:C01)
BIND(CLIP(BindVarQ.Name),OUT:C02)
BIND(CLIP(BindVarQ.Name),OUT:C03)
BIND(CLIP(BindVarQ.Name),OUT:C04)
BIND(CLIP(BindVarQ.Name),OUT:C05)
BIND(CLIP(BindVarQ.Name),OUT:C06)
BIND(CLIP(BindVarQ.Name),OUT:C07)
BIND(CLIP(BindVarQ.Name),OUT:C08)
BIND(CLIP(BindVarQ.Name),OUT:C09)
BIND(CLIP(BindVarQ.Name),OUT:C10)
BIND(CLIP(BindVarQ.Name),OUT:C11)
BIND(CLIP(BindVarQ.Name),OUT:C12)
BIND(CLIP(BindVarQ.Name),OUT:C13)
BIND(CLIP(BindVarQ.Name),OUT:C14)
BIND(CLIP(BindVarQ.Name),OUT:C15)
BIND(CLIP(BindVarQ.Name),OUT:C16)
BIND(CLIP(BindVarQ.Name),OUT:C17)
BIND(CLIP(BindVarQ.Name),OUT:C18)
BIND(CLIP(BindVarQ.Name),OUT:C19)
BIND(CLIP(BindVarQ.Name),OUT:C20)
BIND(CLIP(BindVarQ.Name),OUT:C21)
BIND(CLIP(BindVarQ.Name),OUT:C22)
BIND(CLIP(BindVarQ.Name),OUT:C23)
BIND(CLIP(BindVarQ.Name),OUT:C24)
END
END
ADD(BindVarQ,+BindVarQ.No)
IF ERRORCODE()
BEEP
MESSAGE('BindVarQ : ' & ERROR())
BREAK
END
S# = 0
END
IF QString[C#] = '&'
! Start of Bound Variable
IF S#
BEEP
MESSAGE('Improper Use of BINDED Variables')
BREAK
ELSE
S# = C#
END
END
END
BindVars = RECORDS(BindVarQ)
END
!~! Assume FILE is Open
Access:ACQTBL.Open()
IF ERRORCODE()
MESSAGE('Error : ' & ERROR() & ' [' & ERRORCODE() &|
']|' & 'File Error: ' & FILEERROR() &|
' [' & FILEERRORCODE() & ']','OPEN TABLE')
ELSE
OPEN(QueryView)
IF ERRORCODE() = 90
IF FILEERRORCODE()
MESSAGE('Error : ' & ERROR() & ' [' & ERRORCODE() &|
']|' & 'File Error : ' & FILEERROR() &|
' [' & FILEERRORCODE() & ']','OPEN VIEW')
END
ELSIF ERRORCODE()
MESSAGE('Error : ' & ERROR() & ' [' & ERRORCODE() &|
']|' & 'File : ' & ERRORFILE(),'OPEN VIEW')
ELSE
QueryView{PROP:SQL} = CLIP(INP:Query)
!~!*TEMP*
ErrCode# = ERRORCODE()
IF ERRORCODE() = 90 AND FILEERRORCODE() = 37000
ErrCode# = 0
END
!~!*TEMP*
!~! IF ERRORCODE() = 90
IF ErrCode# = 90
IF FILEERRORCODE()
MESSAGE('Error : ' & ERROR() & ' [' & ERRORCODE() &|
']|' & 'File Error : ' & FILEERROR() &|
' [' & FILEERRORCODE() & ']|' &|
CLIP(INP:Query),'EXECUTE QUERY')
END
ELSIF ErrCode#
MESSAGE('Error : ' & ERROR() & ' [' & ERRORCODE() &|
']|' & 'File: ' & ERRORFILE() & '|' &|
CLIP(INP:Query),'EXECUTE QUERY')
ELSE
IF BindVars OR NoRetVal
ExecOK = True
ELSE
Recs = 0
LOOP
NEXT(QueryView) ! Retrieve Records
Recs += 1
IF NOT ERRORCODE()
ExecOK = True
IF NOT OMITTED(2) THEN CLEAR(ResultQ). ! Clear Result Queue Buffer
IF NOT OMITTED(3) THEN OUT:C01 = AQRY:C01.
IF NOT OMITTED(4) THEN OUT:C02 = AQRY:C02.
IF NOT OMITTED(5) THEN OUT:C03 = AQRY:C03.
IF NOT OMITTED(6) THEN OUT:C04 = AQRY:C04.
IF NOT OMITTED(7) THEN OUT:C05 = AQRY:C05.
IF NOT OMITTED(8) THEN OUT:C06 = AQRY:C06.
IF NOT OMITTED(9) THEN OUT:C07 = AQRY:C07.
IF NOT OMITTED(10) THEN OUT:C08 = AQRY:C08.
IF NOT OMITTED(11) THEN OUT:C09 = AQRY:C09.
IF NOT OMITTED(12) THEN OUT:C10 = AQRY:C10.
IF NOT OMITTED(13) THEN OUT:C11 = AQRY:C11.
IF NOT OMITTED(14) THEN OUT:C12 = AQRY:C12.
IF NOT OMITTED(15) THEN OUT:C13 = AQRY:C13.
IF NOT OMITTED(16) THEN OUT:C14 = AQRY:C14.
IF NOT OMITTED(17) THEN OUT:C15 = AQRY:C15.
IF NOT OMITTED(18) THEN OUT:C16 = AQRY:C16.
IF NOT OMITTED(19) THEN OUT:C17 = AQRY:C17.
IF NOT OMITTED(20) THEN OUT:C18 = AQRY:C18.
IF NOT OMITTED(21) THEN OUT:C19 = AQRY:C19.
IF NOT OMITTED(22) THEN OUT:C20 = AQRY:C20.
IF NOT OMITTED(23) THEN OUT:C21 = AQRY:C21.
IF NOT OMITTED(24) THEN OUT:C22 = AQRY:C22.
IF NOT OMITTED(25) THEN OUT:C23 = AQRY:C23.
IF NOT OMITTED(26) THEN OUT:C24 = AQRY:C24.
IF NOT OMITTED(2) ! Result Queue
ADD(ResultQ)
IF ERRORCODE()
MESSAGE('Error : ' & ERROR() &|
' [' & ERRORCODE() & ']','ADD TO QUEUE')
END
END
ELSE
IF OMITTED(2) ! NO Result Queue
IF ERRORCODE() <> 33
IF ERRORCODE() = 90
CASE FILEERRORCODE()
OF ''
! Ignore NO File Error
OF '24000'
! Ignore Cursor State Error -
! Statement Executes BUT Error Returned
OF 'S1010'
! Ignore Function Sequencing Error -
! Statement Executes BUT Error Returned
ELSE
MESSAGE('Error : ' & ERROR() &|
' [' & ERRORCODE() & ']|' & 'File Error : ' &|
FILEERROR() & ' [' & FILEERRORCODE() &|
']','NEXT VIEW')
END
ELSE
MESSAGE('Error : ' & ERROR() & ' [' &|
ERRORCODE() & ']|' &|
'File : ' & ERRORFILE(),'NEXT VIEW')
END
END
ELSE
BREAK
END
END
IF OMITTED(2) THEN BREAK. ! NO Result Queue
END
END
END
END
END
END
CLOSE(QueryView)
! CLOSE(ACQTBL)
Access:ACQTBL.Close()
IF BindVars
LOOP C# = 1 TO BindVars
GET(BindVarQ, C#)
IF BindVarQ.Name THEN UNBIND(CLIP(BindVarQ.Name)).
END
END
FREE(BindVarQ)
IF NOT OMITTED(2) THEN ResultQ &= NULL.
RETURN ExecOK
Usage :
1) SQLQuery('SELECT Code, Name FROM ACLDGR ORDER BY Code', LedgerQ, LQ:Code, LQ:Name)
-- loads a queue
2) IF SQLQuery('SELECT YrNo, Name FROM ACYEAR WHERE YrNo = ' & APLD:YrNo, ,
AFYR:YrNo, AFYR:Name) .....
-- normal query
3) SQLQuery('SELECT GETDATE()', , ServerDateNTime)
Dt1# = DEFORMAT(ServerDateNTime[01:10],@D10-)
Tm1# = DEFORMAT(ServerDateNTime[12:19],@T04)
-- what you want to do
HTH
On Fri, Sep 10 2004 3:10 pm, "Shaun Mumford"
Today is November 24, 2024, 6:21 am This article has been viewed 35517 times. Google search has resulted in 344 hits on this article since January 25, 2004.
|
|