Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Building a dynamic SelectCmd in CursorAdapters
Message
 
General information
Forum:
Visual FoxPro
Category:
The Mere Mortals Framework
Environment versions
Visual FoxPro:
VFP 8 SP1
OS:
Windows XP SP2
Miscellaneous
Thread ID:
00998068
Message ID:
00998148
Views:
16
Ok, I made it work. And I really like this now. The only small problem I found that in biz object requery() it doesn't respect CursorUseSchema property.

The other problem is that sometimes I'm getting error message when I use dbf('ca_QuickSearch') that temp file doesn't exist. I vaguely recall a discussion about it here. Can somebody please tell me, in which cases I may get this message?

Here is my code for lurkers:
*---------------------- Location Section ------------------------
*   Library: 	Aquicksearchbiz.vcx
*   Class: 		Quicksearchobject
*   Method: 	Populatecursor()
*----------------------- Usage Section --------------------------
*)  Description:
*)

*   Scope:      Public
*   Parameters:
*$  Usage:
*$
*   Returns:
*--------------------- Maintenance Section ----------------------
*   Change Log:
*       CREATED 	01/05/2005 - NN
*		MODIFIED    *-- CHANGE - NN - January 19, 2005 - 12:46:46
**      -- CHANGE - NN - February 01, 2005 - 15:13:16
*-- CHANGE - NN - February 09, 2005 - 11:47:23
**-- CHANGE - NN - March 22, 2005 - 11:40:58
*----------------------------------------------------------------
LPARAMETERS tcClientAcctNum, tcLast, ;
	tcFirstName, tcMiddle, tcAreaCode, tcExchange, tcFour, ;
	tcSSN, tcPolicyNumber, tcMedicaidNumber

LOCAL loSelect, loDE, loCursor, lcSelectCMDFilter, lcBaseSelectCMD, lcCountSelectCMD, loCursorAdapter

loDE = this.GetDataEnvironment() 
loCursor = m.loDE.GetCursorObject("ca_QuickSearch")
loCursorAdapter = loCursor.oCursorAdapter

lcSelectCMDFilter = ""
#define VFP_NEWLINE CHR(13) + CHR(10)

TEXT TO lcBaseSelectCMD NOSHOW PRETEXT 2
	SELECT Trans.ctrans_pk AS ctrans_pk, ;
		Trans.cclient_account_number, ;
		Patients.ddob, ;
		Trans.tadmit_date AS dos, ;
		PADR(NVL(ALLTRIM(Names.cl_name)+", ", "") + NVL(ALLTRIM(Names.cf_name)+" ", "") + NVL(Names.cm_initial, ""), 50) AS cpatient_name, ;
		Product_lines.cproduct_line, ;
		Trans.cCommissioned_Owner as cUserID,  ;
             IIF(ISNULL(Trans.cResolution_Codes_fk) OR cResolution_Codes_Fk=="", ;
             VisC.cCode_Description, VisCo.cCode_Description) as cStatus ;
		FROM mmviscollect!patients INNER ;
		JOIN mmviscollect!trans ;
				ON Patients.cpatients_pk = Trans.cpatients_fk INNER ;
		JOIN mmviscollect!product_lines ;
				ON Product_lines.cproduct_lines_pk = Trans.cproduct_lines_fk INNER ;
		JOIN mmviscollect!names ;
				ON Patients.cpatients_pk = Names.cpointer_fk ;
		LEFT JOIN mmVisCollect!VisCodes VisC ON Trans.cStatus_codes_fk = VisC.cVisCodes_pk ;
		LEFT JOIN mmVisCollect!VisCodes VisCo ON Trans.cResolution_codes_fk = VisCo.cVisCodes_pk
endtext 

#define FILTER_PREFIX IIF(EMPTY(m.lcSelectCMDFilter),"", m.lcSelectCMDFilter + " AND ")

WITH THIS
    .lRepeatRequery = .f. 
*	loSelect = .SelectAlias()

	.EmptySearchResult() && Always start with the empty result set		        

* Exact vs not exact match is only relevant to names and Client_Account_Number
	IF .lExactMatch
		lcSelectCMDFilter = IIF(EMPTY(m.tcClientAcctNum),m.lcSelectCMDFilter, FILTER_PREFIX + [Trans.cClient_Account_Number == '] + m.tcClientAcctNum + ['])
		lcSelectCMDFilter = IIF(EMPTY(m.tcLast),m.lcSelectCMDFilter,FILTER_PREFIX + [Names.cl_name == '] + m.tcLast + ['])
		lcSelectCMDFilter = IIF(EMPTY(m.tcFirstName),m.lcSelectCMDFilter,FILTER_PREFIX + [Names.cf_name == '] + m.tcFirstName + ['])
		lcSelectCMDFilter = IIF(EMPTY(m.tcMiddle),m.lcSelectCMDFilter,FILTER_PREFIX + [Names.cm_initial == '] + m.tcMiddle + ['])
	ELSE
		lcSelectCMDFilter = IIF(EMPTY(m.tcClientAcctNum),m.lcSelectCMDFilter,FILTER_PREFIX + [Trans.cClient_Account_Number LIKE '] + m.tcClientAcctNum + [%'])
		lcSelectCMDFilter = IIF(EMPTY(m.tcLast),m.lcSelectCMDFilter,FILTER_PREFIX + [Names.cl_name LIKE '] + m.tcLast + [%'])
		lcSelectCMDFilter = IIF(EMPTY(m.tcFirstName),m.lcSelectCMDFilter,FILTER_PREFIX + [Names.cf_name LIKE '] + m.tcFirstName + [%'])
		lcSelectCMDFilter = IIF(EMPTY(m.tcMiddle),m.lcSelectCMDFilter,FILTER_PREFIX + [Names.cm_initial = '] + m.tcMiddle + ['])
	ENDIF
    
    lcSelectCMDFilter = IIF(EMPTY(m.tcAreaCode),m.lcSelectCMDFilter,FILTER_PREFIX + [Phones.cArea_Code = '] + m.tcAreaCode + ['])
    lcSelectCMDFilter = IIF(EMPTY(m.tcExchange),m.lcSelectCMDFilter,FILTER_PREFIX + [Phones.cExchange + Phones.cLast_Four = '] + m.tcExchange + m.tcFour + ['])    
    lcSelectCMDFilter = IIF(EMPTY(m.tcSSN),m.lcSelectCMDFilter,FILTER_PREFIX + [Patients.cSSN LIKE '] + m.tcSSN + [%'])
	lcSelectCMDFilter = IIF(EMPTY(m.tcPolicyNumber),m.lcSelectCMDFilter,FILTER_PREFIX + [Insurances.cPolicy_Number LIKE '] + m.tcPolicyNumber + [%'])
    lcSelectCMDFilter = IIF(EMPTY(m.tcMedicaidNumber),m.lcSelectCMDFilter, ;
    					FILTER_PREFIX + [(Insurances.cPolicy_Number LIKE '] + ;
                        m.tcMedicaidNumber + ;
                        [%' OR Insurances.cCaid_Number LIKE '] + m.tcMedicaidNumber + [%')]) 
    
    IF "Phones." $ lcSelectCMDFilter
    	lcBaseSelectCMD = m.lcBaseSelectCMD + [INNER JOIN mmVisCollect!Phones ON Patients.cpatients_pk = Phones.cpointer_fk]
    ENDIF
    
    IF "Insurances." $ lcSelectCMDFilter
    	lcBaseSelectCMD = m.lcBaseSelectCMD + [INNER JOIN mmVisCollect!Insurances ON Patients.cpatients_pk = Insurances.cpatients_fk]
    ENDIF
    
	lcBaseSelectCMD = STRTRAN(STRTRAN(m.lcBaseSelectCMD,";",[]), VFP_NEWLINE, [])
	lcCountSelectCMD = [SELECT count(*) as cntRecs] + SUBSTR(m.lcBaseSelectCMD, AT(" FROM ", m.lcBaseSelectCMD))
    
    ** These commands should change CursorAdapter's SelectCMD	
	loCursorAdapter.cBaseSelectCmd = m.lcCountSelectCMD
	loCursorAdapter.cSelectCmdFilter = m.lcSelectCMDFilter 

    LOCAL lnRequeryResult 

	lnRequeryResult = .REQUERY(.t., "ca_QuickSearch") 
    * I found, that requery returns -3 if interrupted - this is not documented in the Help
    
    DO WHILE .lRepeatRequery = .t. and m.lnRequeryResult <> REQUERY_SUCCESS && the user tried to stop it 
        lnRequeryResult = .REQUERY(.t., "ca_QuickSearch")      
       .lRepeatRequery = .f.
    ENDDO     
    
    ** What if requery returns 0 - it means some problems with the view 
    
	LOCAL lnReccount
	IF VARTYPE(m.plStop) = "L" AND m.plStop = .T.
		lnReccount = 0
	ELSE
		lnReccount = ca_QuickSearch.cntRecs		loCursorAdapter.cBaseSelectCmd = m.lcBaseSelectCMD
		IF m.lnReccount <= .nMaxRecordsToDisplay		   
			lnReccount = .CreateFinalResult()
		ENDIF
	ENDIF
ENDWITH

RETURN m.lnReccount
>Hi everybody,
>
>We're using local views in our application. However, I'd like to try using Cursor Adapters instead. So, yesterday I downloaded Mark McCasland's CA Builder for VFP8, created my class based on _cabase. My question is: how should I invoke "requery" of the business object? And how should I change the SelectCmd of the cursor? Yesterday I coded like this (haven't tried it yet):
>
>
>loDE = this.GetDataEnvironment()
>loCursor = m.loDE.GetCursorObject("ca_QuickSearch")
>
>Am I right? Could you please show me some examples of changing SelectCmd and requery biz object, because I could not find specific samples for Cursor Adapter in the Dev. Guide.
>
>Thanks a lot in advance.
If it's not broken, fix it until it is.


My Blog
Previous
Reply
Map
View

Click here to load this message in the networking platform