Print Page | Close Window

CXTPReportRecords::Move doubt

Printed From: Codejock Forums
Category: Codejock Products
Forum Name: Report Control
Forum Description: Topics Related to Codejock Report Control
URL: http://forum.codejock.com/forum_posts.asp?TID=13113
Printed Date: 24 February 2025 at 11:15am
Software Version: Web Wiz Forums 12.04 - http://www.webwizforums.com


Topic: CXTPReportRecords::Move doubt
Posted By: znakeeye
Subject: CXTPReportRecords::Move doubt
Date Posted: 08 January 2009 at 9:49am

XTP 12.1.1

CXTPReportSelectedRows* pSelectedRows = m_wndReport.GetSelectedRows();
if (pSelectedRows && pSelectedRows->GetCount() == 1)
{
    pDropRecords->Add(pSelectedRows->GetAt(0)->GetRecord());
    m_wndReport.GetRecords()->Move(pSelectedRows->GetAt(0)->GetIndex() + 1, pDropRecords);

    m_wndReport.Populate();

}
 
GetIndex+1 moves the item to its current position. GetIndex+2 does what I want (moving it down one row), but that makes no sense! Am I doing anything wrong?


-------------
PokerMemento - http://www.pokermemento.com/



Replies:
Posted By: mdoubson
Date Posted: 08 January 2009 at 6:37pm

try diff way: index from Record not from Row

CXTPReportSelectedRows* pSelectedRows = GetReportCtrl().GetSelectedRows();

if (pSelectedRows && pSelectedRows->GetCount() == 1)

{

CXTPReportRecords* pDropRecords = new CXTPReportRecords(TRUE);

CXTPReportRow* pRow = pSelectedRows->GetAt(0);

CXTPReportRecord* pRec = pRow->GetRecord();

int iNd = pRow->GetIndex();

int ind = pRec->GetIndex();

pDropRecords->Add(pRec);

//GetReportCtrl().GetRecords()->Move(iNd + 1, pDropRecords);

GetReportCtrl().GetRecords()->Move(ind + 1, pDropRecords);

GetReportCtrl().Populate();

delete pDropRecords;

}



Posted By: znakeeye
Date Posted: 09 January 2009 at 7:18am
No, same problem!

-------------
PokerMemento - http://www.pokermemento.com/


Posted By: mdoubson
Date Posted: 09 January 2009 at 11:41am

Need some clarifications from you - Do you have report structure like main in ReportSample - where there is parent-childs rows? In such case you can only move child records and only in given child range. But in general I am right proposing use Record index - not Rows



Posted By: mdoubson
Date Posted: 09 January 2009 at 11:10pm
What do you expect to see in ReportView after Move operation? Sometimes nothing happened because even you change index of some record in record array, the logic of ReportView rows structure and hierarchy can keep selected row in same visual position or index increase can produce position decrease. Agree?


Posted By: znakeeye
Date Posted: 12 January 2009 at 7:33am
Row 1
Row 2
Row 3
Row 4
 
Now I want to swap "Row 3" and "Row 2". With XTP 12.1.1 this can be achieved by moving "Row 2" down two steps or moving "Row 3" up two steps. Note that I sometimes want to perform this operation with multiple rows.
 
CXTPReportRecord* pRecord = pSelectedRows->GetAt(0)->GetRecord();
pDropRecords->Add(pRecord);
m_wndReport.GetRecords()->Move(pRecord->GetIndex() + 2, pDropRecords);
 
That does the trick, but it's not logical! Is there a better way?


-------------
PokerMemento - http://www.pokermemento.com/


Posted By: mdoubson
Date Posted: 12 January 2009 at 9:38am
Look in the source
void CXTPReportRecords::Move(int nIndex, CXTPReportRecords* pRecords)

{

ASSERT(pRecords->m_bArray == TRUE);

if (nIndex > GetCount())

nIndex = GetCount();

int nRecordsCount = (int)pRecords->GetCount(), i;

for (i = 0; i < nRecordsCount; i++)

{

CXTPReportRecord* pRecord = pRecords->GetAt(i);

int nRecordIndex = pRecord->GetIndex();

if (pRecord->m_pRecords != this)

continue;

ASSERT(pRecord && GetAt(nRecordIndex) == pRecord);

m_arrRecords.RemoveAt(nRecordIndex);

if (nRecordIndex < nIndex)

{

nIndex--;

}

for (int j = i + 1; j < nRecordsCount; j++)

{

pRecord = pRecords->GetAt(j);

if (pRecord->m_pRecords != this)

continue;

if (pRecord->GetIndex() > nRecordIndex)

{

pRecord->m_nIndex--;

}

}

}

for (i = 0; i < nRecordsCount; i++)

{

CXTPReportRecord* pRecord = pRecords->GetAt(i);

if (pRecord->m_pRecords != this)

continue;

m_arrRecords.InsertAt(nIndex, pRecord);

nIndex++;

}

UpdateIndexes();

}

void CXTPReportRecords::UpdateIndexes(int nStart /*= 0*/)

{

for (int i = nStart; i < GetCount(); i++)

GetAt(i)->m_nIndex = i;

}



Posted By: znakeeye
Date Posted: 13 January 2009 at 2:42am
I've looked at it, and understand what happens. What I'm asking for here, is how to do this the "right" way. Should I stick to my "+2" solution?
 
Many thanks for your help!


-------------
PokerMemento - http://www.pokermemento.com/


Posted By: mdoubson
Date Posted: 13 January 2009 at 8:33am
In flat mode - no group, no parent-child records - u can use move and trust it - I give you a source so u understand how it works. In non-flat mode - no - as logic is more complicated. I also already talked about it. ReportSample is a good example as it use groups and you can see relations between rec place and row pace is not simple


Posted By: znakeeye
Date Posted: 13 January 2009 at 11:20am
Thanks for the clear explanation. I understand groups need some more logic for this operation.

-------------
PokerMemento - http://www.pokermemento.com/


Posted By: mgampi
Date Posted: 28 May 2009 at 5:53pm
Originally posted by mdoubson mdoubson wrote:

try diff way: index from Record not from Row

CXTPReportSelectedRows* pSelectedRows = GetReportCtrl().GetSelectedRows();

if (pSelectedRows && pSelectedRows->GetCount() == 1)

{

CXTPReportRecords* pDropRecords = new CXTPReportRecords(TRUE);

CXTPReportRow* pRow = pSelectedRows->GetAt(0);

CXTPReportRecord* pRec = pRow->GetRecord();

int iNd = pRow->GetIndex();

int ind = pRec->GetIndex();

pDropRecords->Add(pRec);

//GetReportCtrl().GetRecords()->Move(iNd + 1, pDropRecords);

GetReportCtrl().GetRecords()->Move(ind + 1, pDropRecords);

GetReportCtrl().Populate();

delete pDropRecords;

}


Hi;
I tried this solution and I have to concede a point to znakeeye, There's definitely a bug inside the CXTPReportRecords::Move() function. Moving a record up one position works with calling Move(currentIndex-1, records), but calling Move(currentIndex+1, records) has no effect! Only calling Move(currentIndex+2 moves the row down by one position!
Taking a closer look at the source code brings up that the
if (nRecordIndex < nIndex)
{
     nIndex--;
}

needs a redesign.

I believe the code should be changed to
if (nRecordIndex < nIndex-1)
{
     nIndex--;
}


otherwise moving a row/record by an offset of +1 down never works and offsets greater +1 moves the record to the position offset-1.

BTW I have a simple flat report control, no grouping, no children only a few plain records...


-------------
Martin

Product: Xtreme Toolkit v 22.1.0, new Projects v 24.0.0
Platform: Windows 10 v 22H2 (64bit)
Language: VC++ 2022


Posted By: znakeeye
Date Posted: 29 May 2009 at 11:03am

If you fix this, please do not forget to mention it in the release notes. Otherwise I won't see the change until my users start complaining a year later :P



-------------
PokerMemento - http://www.pokermemento.com/


Posted By: mdoubson
Date Posted: 29 May 2009 at 11:31am
Hi, I am ready to work on this problem today but before I like you try today's version of static app with all core modifications:
https://forum.codejock.com/uploads/DemoVersion/ReportSampleSatic.rar - https://forum.codejock.com/uploads/DemoVersion/ReportSampleSatic.rar
 
I can drag and drop any row in any position and it works properly. This is the only place where function Move() used:
 
file XTPReportControl.cpp line 4618

GetRecords()->Move(nInsert, pDropRecords);

Please confirm it with your testing

 



-------------
Mark Doubson, Ph.D.


Posted By: mdoubson
Date Posted: 29 May 2009 at 1:16pm
this is a test I run in app as testfunction call from menu after you select row:

CXTPReportControl& wndReport = GetReportCtrl();

CXTPReportRecords* pDropRecords = new CXTPReportRecords(TRUE);

pDropRecords->Add(wndReport.GetRecords()->GetAt(1));

//pDropRecords->Add(wndReport.GetRecords()->GetAt(2));

CXTPReportSelectedRows* pSelectedRows = wndReport.GetSelectedRows();

if (pSelectedRows && pSelectedRows->GetCount() == 1)

{

int index = pSelectedRows->GetAt(0)->GetIndex();

CString s; s.Format(_T("Selected record index = %d"), index);

AfxMessageBox(s);

pDropRecords->Add(pSelectedRows->GetAt(0)->GetRecord());

wndReport.GetRecords()->Move(index + 1, pDropRecords);

wndReport.Populate();

}

CMDTARGET_RELEASE(pDropRecords);

and this is snapshots:
 


-------------
Mark Doubson, Ph.D.


Posted By: znakeeye
Date Posted: 30 May 2009 at 5:30am
Have no time to test it at the moment. However, the simpliest test is as follows:
 
Programmatically move ONE record ONE step downwards:
Move(currentIndex+1, ...);


-------------
PokerMemento - http://www.pokermemento.com/


Posted By: mdoubson
Date Posted: 02 June 2009 at 2:43pm
It was a bug (even 2 bugs) - this is updated code already SVNed:
 
https://forum.codejock.com/uploads/DemoVersion/ReportSampleStatic.rar - https://forum.codejock.com/uploads/DemoVersion/ReportSampleStatic.rar  
 
try menu : Test FindRecordItem (don't be confused by menu text - it just dev test) - this call will move selected row's record down on 1:
Move(index + 1,....)
 
if not enough record to make such move - index will adjust to move all selection to the end of report

void CXTPReportRecords::Move(int nIndex, CXTPReportRecords* pRecords)

{

if (pRecords->m_bArray)

{

if (nIndex < 0)

nIndex = 0;

if (nIndex >= GetCount())

nIndex = GetCount() - 1;

int nRecordsCount = (int) pRecords->GetCount(), i;

if (nIndex >= GetCount() - nRecordsCount)

nIndex = GetCount() - nRecordsCount;

for (i = 0; i < nRecordsCount; i++)

{

CXTPReportRecord* pRecord = pRecords->GetAt(i);

if (pRecord)

{

int nRecordIndex = pRecord->GetIndex();

if (pRecord->m_pRecords != this)

continue;

if (GetAt(nRecordIndex) == pRecord)

{

m_arrRecords.RemoveAt(nRecordIndex);

for (int j = i + 1; j < nRecordsCount; j++)

{

pRecord = pRecords->GetAt(j);

if (pRecord->m_pRecords != this)

continue;

if (pRecord->GetIndex() > nRecordIndex)

pRecord->m_nIndex--;

}

}

}

}

for (i = 0; i < nRecordsCount; i++)

{

CXTPReportRecord* pRecord = pRecords->GetAt(i);

if (pRecord)

{

if (pRecord->m_pRecords != this)

continue;

m_arrRecords.InsertAt(nIndex, pRecord);

nIndex++;

}

}

UpdateIndexes();

}

}



-------------
Mark Doubson, Ph.D.



Print Page | Close Window

Forum Software by Web Wiz Forums® version 12.04 - http://www.webwizforums.com
Copyright ©2001-2021 Web Wiz Ltd. - https://www.webwiz.net