Page 2 of 4
Re: xBrowse & SQLRDD
Posted:
Thu Oct 06, 2011 3:11 pm
by nageswaragunupudi
If you are using the latest XBrowse, for SQLRDD, we are using RecNo() and DbGoTo() functions only both for bBookMark and bKeyNo().
We are not using OrdKeyNo().
We expect SQLRDD to be perfectly reliable with RecNo() and GoTo() functions even if used in quick succession many times.
Re: xBrowse & SQLRDD
Posted:
Thu Oct 06, 2011 3:25 pm
by PeterHarmes
But doesnt that mean that the browse must be in recno() order?
I might be reading the select method wrong, but doesnt it skip(-1) if the recno() of the second record selected with the shift is less than the 1st?
Re: xBrowse & SQLRDD
Posted:
Thu Oct 06, 2011 3:48 pm
by PeterHarmes
I've modified the select routine, but this only works if the index is indexed on a unique key:
See the section where nOperation == 3
- Code: Select all Expand view
METHOD Select( nOperation ) CLASS TXBrowse
local uBook, uCurRow, uOldRow, uTemp
local aTemp
local nAt, nLen
local lRefresh
Local cStIndexKey := ""
Local cEndIndexKey := ""
if .not. ::lMultiSelect // ::nMarqueeStyle != MARQSTYLE_HIGHLROWMS .and. ::nMarqueeStyle != MARQSTYLE_HIGHLWIN7
return nil
endif
DEFAULT nOperation := 1
do case
case nOperation == 0 // delete all
if Len( ::aSelected ) == 1 .and. Eval( ::bBookMark ) == ::aSelected[ 1 ]
lRefresh := .f.
else
lRefresh := .t.
endif
::aSelected := {}
if ! Empty( ::nSaveMarq )
::nMarqueeStyle := ::nSaveMarq
::nSaveMarq := nil
endif
if lRefresh
// ::lRefreshOnlyData := .t.
::GetDC()
::Super:Refresh( .t. ) // ::Paint()
::ReleaseDC()
endif
case nOperation == 1 .or. ( Len( ::aSelected ) == 0 .and. nOperation != 4 )// Add current
uBook := Eval( ::bBookMark )
nAt := Ascan( ::aSelected, uBook )
if nAt == 0
Aadd( ::aSelected, uBook )
::DrawLine( .t. )
endif
case nOperation == 2 // Swap key (Ctrl+LClick)
uBook := Eval( ::bBookMark )
nAt := Ascan( ::aSelected, uBook )
if nAt > 0
::DrawLine( .f. )
::aSelected[ nAt ] := Atail( ::aSelected )
Asize( ::aSelected, Len( ::aSelected ) - 1 )
else
Aadd( ::aSelected, Eval( ::bBookMark ))
::DrawLine( .t. )
endif
case nOperation == 3 // Shift & lclick
cEndIndexKey := &( ( ::cAlias )->(IndexKey()) )
uBook := Eval( ::bBookMark )
uCurRow := ::KeyNo()
Eval( ::bBookMark, Atail( ::aSelected ) )
uOldRow := ::KeyNo()
cStIndexKey := &( ( ::cAlias )->(IndexKey()) )
if uOldRow != uCurRow
::aSelected := { Atail( ::aSelected ) }
if IF( ( ::cAlias )->( RddName() ) == "SQLRDD", cEndIndexKey > cStIndexKey, uCurRow > uOldRow)
CursorWait()
do while ( uTemp := Eval( ::bBookMark ) ) != uBook .and. ! ::Eof()
If Ascan( ::aSelected, uTemp ) == 0
Aadd( ::aSelected, uTemp )
Endif
::Skip( 1 ) // Eval( ::bSkip, 1 )
enddo
CursorArrow()
else
CursorWait()
do while ( uTemp := Eval( ::bBookMark ) ) != uBook .and. ! ::Bof()
If Ascan( ::aSelected, uTemp ) == 0
Aadd( ::aSelected, uTemp )
endif
::Skip( -1 ) // Eval( ::bSkip, -1 )
enddo
CursorArrow()
endif
Aadd( ::aSelected, uBook )
Eval( ::bBookMark, uBook )
// ::lRefreshOnlyData := .t.
::GetDC()
::Paint()
::ReleaseDC()
else
Eval( ::bBookMark, uBook )
endif
case nOperation == 4 // Select all
uBook := Eval( ::bBookMark )
::aSelected := Array( ::KeyCount() )
nAt := 1
nLen := ::nLen
aTemp := ::aSelected
CursorWait()
Eval( ::bGotop )
do while nAt <= nLen //.and. !Eval( ::bEof )
aTemp[ nAt++ ] := Eval( ::bBookMark )
::Skip( 1 ) //Eval( ::bSkip, 1 )
enddo
Eval( ::bBookMark, uBook )
CursorArrow()
// ::lRefreshOnlyData := .t.
::GetDC()
::Paint()
::ReleaseDC()
case nOperation == 5 // Swap key (Shift + GoDown or GoUp)
uCurRow := ::KeyNo()
nAt := Ascan( ::aSelected, uCurRow )
uBook := Eval( ::bBookMark )
if nAt == 1 .and. len( ::aSelected ) == 1
return nil
elseif nAt == 0
Aadd( ::aSelected, uBook )
::DrawLine( .t. )
else
if nAt != len( ::aSelected )
Asize( ::aSelected, Len( ::aSelected ) - 1 )
::Refresh()
endif
endif
end case
return nil
Re: xBrowse & SQLRDD
Posted:
Thu Oct 06, 2011 3:57 pm
by nageswaragunupudi
Eval( oBrw:bBookMark ) returns the RecNo()
Eval( oBrw:bBookMark, n ) executes( DBGOTO( n ), RECNO() )
But doesnt that mean that the browse must be in recno() order?
Yes.
Any problem?
Re: xBrowse & SQLRDD
Posted:
Fri Oct 07, 2011 8:02 am
by PeterHarmes
I would say that was a pretty big problem wouldnt you?
Re: xBrowse & SQLRDD
Posted:
Fri Oct 07, 2011 8:31 am
by nageswaragunupudi
XBrowse needs to know the following:
What are the functions for:
1. GoTop
2. GoBottom
3. Skip n Rows
4. What is the function to know the row number in natural order
( this is normally RecNo() in RDDs )
5. What is the function which xBrowse can use to go to the row number in natural order.
( This is normally DBGOTO( n ) )
6. If you can order the rows in any other other than the natural order:-
(a) What is the function to know the serial number of the row in that order? ( in many RDD;s this OrdKeyNo() )
and
(b) What is the function XBrowse can use to position to a partiual serial number in an ordered table. ( in many RDDs this is OrdKeyGoTo( n ) )
7. What is the function to know the total number of records?
Now, if you let me know what are the functions SQLRDD provides for 6(a) and 6(b) then we can make the codeblocks when the table is not in natural order.
Re: xBrowse & SQLRDD
Posted:
Fri Oct 07, 2011 8:45 am
by PeterHarmes
This is the problem I think, those functions are not available under SQLRDD.
The changes you have made in the recent version for SQLRDD are nearly perfect so I think they can stay in xBrowse, it's just the part where it checks if the second click is higher or lower in the list is the problem. The only work around I can see is the change I made a few posts earlier. This would suit my needs as I would ensure that my index contain unique keys.
I think we cant go any further without OrdKeyNo() functions, so I dont mind making those minor changes I made in the earlier post each time I update FW, unless other SQLRDD users require these changes and maybe we can incorporate it in somehow?
What do you think?
Best regards,
Pete
(Thank you for your time in looking at this problem - we have always told our SQL customers that shift selecting was not possible and they have accepted this, so the work you have done and the change I made will be appreciated by our users)
Re: xBrowse & SQLRDD
Posted:
Fri Oct 07, 2011 9:15 am
by nageswaragunupudi
Still I don't like you to give up. I agree I do not about SQLRDD but if you look around you may find the answers.
Re: xBrowse & SQLRDD
Posted:
Fri Oct 07, 2011 9:26 am
by PeterHarmes
I can remember seeing on the SQLRDD forum someone asking if these functions were available and was told that it would be impossible make these work - I may ask the question again to see if they've had an idea how to implement this.
For me, it's not giving up, shift & select now works with SQLRDD in an xbrowse in my application (selfish I know)
I will let you know if I get any reply from xHarbour about the functions.
Thanks
Pete
Re: xBrowse & SQLRDD
Posted:
Fri Oct 07, 2011 10:02 am
by Enrico Maria Giordano
Using ADO, OrdKey() can be replaced by oRs:AbsolutePosition and OrdKeyGoTo( n ) by oRs:AbsolutePosition = n.
I don't know if it can be of any help.
EMG
Re: xBrowse & SQLRDD
Posted:
Fri Oct 07, 2011 10:05 am
by PeterHarmes
I have posted a message so lets see if xHarbour.com are helpfull!
Re: xBrowse & SQLRDD
Posted:
Fri Oct 07, 2011 4:57 pm
by nageswaragunupudi
Enrico Maria Giordano wrote:Using ADO, OrdKey() can be replaced by oRs:AbsolutePosition and OrdKeyGoTo( n ) by oRs:AbsolutePosition = n.
I don't know if it can be of any help.
EMG
You are right. That is how XBrowse's SetAdo() works.
But I think SQLRDD does not use ADO. Instead it uses the native libraries of the respective RDMS.
I also do not *think* SQLRDD does sorting of any datasets/recordsets in memory, like ADO does. Instead I *guess* it may be reading from the source again with appropriate "ORDER BY <sortcolumn>" clause. I may be wrong. But if my guess is correct, the table view should always be in the order or RecNo().
Re: xBrowse & SQLRDD
Posted:
Sat Oct 08, 2011 9:18 pm
by Blessed
Hi
I try "bBookMark" and is not stable, when I browse the list items I repeat, my customers complain that the application is confusing, I'm just excuses, I hope that at some point has a solution.
- Code: Select all Expand view
oxBrw:bKeyNo = oxBrw:bBookMark
In fact, I followed the post by Peter both here and in xHarbour.
On both sides are said to be 100% compatible and is not so, what I see is that they are solid products that are complementary and should work more closely is this type of case.
I think everyone benefits: FWH, SQLRDD of xHarbour.com, like us who buy your products.
Regards
Re: xBrowse & SQLRDD
Posted:
Mon Oct 10, 2011 8:25 am
by PeterHarmes
Unfortunately, I've found more problems - If I browse a SQL table that i've put a scope on, the browse displays the first record at the bottom of the browse and looks like there are 2 selected records. If I page up/page down, the browse resets and looks good. If i then move the mouse cursor outside of the browse, the browse corrupts again (first record at the bottom of the browse).
I never had these problems with the previous version of xbrowse I used (10.06)
Any ideas where I can start to look to see where this problem has come from?
Regards,
Pete
Re: xBrowse & SQLRDD
Posted:
Mon Oct 10, 2011 8:34 am
by PeterHarmes
If I comment out the SQLRDD section of the SETRDD method, it fixes the duplicate record problem I reported in my last post, however if I move my mouse outside of the browse, the current selected record jumps to the top of the browse.
I can confirm that this is a SQLRDD only problem, I ran the same code on a DBF and it works fine. So it seems as if there is a section of the code that needs commenting out for SQLRDD???
*UPDATE*
I think the problem is the MouseLeave Method, If I make the following changes, it seems to work:
- Code: Select all Expand view
METHOD MouseLeave( nRow, nCol, nFlags ) CLASS TXBrowse
::lPressed = .f.
if ( ::cAlias )->( RddName() ) <> "SQLRDD"
::Refresh()
endif
return nil
I'm going to try and get the shift key selection workig with SQLRDD and I will post my solution (if it works)