Dollar,

As Dan has already suggested, all of things that you want to do can be done 
using the Variable ListView.
Sometimes when we are starting out we try to use a control that is 
inappropriate for the task at hand.
A Variable ListView has the ability to drag and drop, select multiple rows 
and sort by individual columns

Additionally the following PROPERTY's are beneficial in accomplishing your 
task.

MULTISELECT
TOPITEM
CURRENTSORT
MAKECLICK andITEMINDEX (useful for items moving up and down the list.

Good luck,

Jan


-----Original Message-----

From: dollar atabx <[email protected]>

To: [email protected] (RBASE-L Mailing List)

Date: Thu, 8 Dec 2011 13:38:09 +0700

Subject: [RBASE-L] - Refresh DB Grid and, Use mouse to drag a row to a 
different position



Hello,
My name is Pramote Padprom. I am now being trained at the Centre for 
Vocational Building Technology, Thailand.
I was assigned to work with R:Base, and would like to ask the following:

     Sortorder is a COLUMN in Components TABLE. It is used to sort the data 
for a Report so it is easy to detect and easy to understand.

I created a form to allow users to change the order of rows using Sortorder. 
 The data type is Integer. I want it to sort the data in the form of "ORDER 
BY Sortorder ASC" The Form contains a DB Grid with buttons:  Button "move 
up" and Button "move down," Button "Save" and Button "Close".        When 
the user selects a row that s/he wants in DB Grid and presses “Move up” 
the value of Sortorder will reduce by 1 (the row will move up 1 row), but if 
you press the button “Move down” the value of Sortorder increases by 1 
(row will move down 1 row).

Values come from the Table Components.  But to prevent errors,   I created a 
temporary table from the table Components designed to be used with the Form. 
 When you press the Save button it compares the Components and Temporary 
table. Sortorder changes are then made to the Components table.       I 
could use advice on the following problems:

    - Can not Refresh DB Grid (order by Sortorder ASC).
    - Can not use the mouse to drag a row to a different position (different 
sort order).
    - I need a Function or EEP, so as not to have to repeatedly click select 
rows on the DB Grid.  I need the value for the current row without having to 
click on it.  Now (with Method 1 below), when the button “Move Up” is 
pressed, SortOrder is reduced and the row moves up in DB Grid.  When the 
button “Move Up” is pressed a second time, SortOrder increases and the 
row moves back down to it’s original position.  I think I need a way 
(property) to get the value of the “current” row without selecting it by 
clicking.

                   
I've been searching for Rbase-L topics that relate to DB Grid Refresh and 
RestoreOrder but I cannot find anything that helps yet.
 
Below is EEP code for 2 methods to do this.  The first method works but it 
is not elegant.  The second method is elegant but does not work.


 -- Create Temp table 
 -- start here:  This is the EEP on Entry into Form (Form Start)
PROPERTY TABLE Test_Components CLOSE
SET ERROR MESSAGE 2038 OFF
DROP TABLE  Test_Components
SET ERROR MESSAGE 2038 ON

Create Temp Table  Test_components (Componentno Int,Engname Text 70,Thainame 
Text 70, +
Descriptioneng Text 50,Descriptionthai Text 50,Comptypeno Numeric ,Uniteng 
Text 10,Unitqty Real, +
Comppurchaseuniten Text 25,Cost Real,Source Text 50,Density Real,Sortorder 
Int)

Insert Into Test_components Select 
Componentno,Engname,Thainame,Descriptioneng,Descriptionthai, +
Comptypeno,Uniteng,Unitqty,Comppurchaseuniten,Cost,Source,Density,Sortorder 
+
>From Components +
Order By Sortorder

PROPERTY TABLE Test_Components OPEN
RETURN
--end here

Method: 1 Sorting of data succeeds..
--code on form of button 'Move up' 
--start here
SET SORT ON
SET ERROR MESSAGE 2059 OFF
SET VAR vSortOr1 INTEGER = sortorder IN components WHERE 
&RBTI_DBGRID_COLUMN=.RBTI_FORM_COLVALUE

SET VAR vSortOr2 INTEGER = (.vSortOr1 -1)
IF (vSortOr1 IS NULL OR vSortOr1=1) THEN
  PAUSE 2 USING 'Select the row that sortorder > 1' CAPTION 'ERROR ' ICON 
SERIOUS
  GOTO Done
ELSE
  UPDATE test_components SET sortorder = 0 WHERE sortorder =.vSortOr1

  UPDATE test_components SET Sortorder = .Vsortor1  WHERE Sortorder =  
.vSortOr2
  UPDATE test_components SET Sortorder =.vSortOr2   WHERE Sortorder = 0
  PROJECT Ooh FROM test_components  USING * ORDER BY sortorder ASC

  PROPERTY table Ooh OPEN
  PROPERTY TABLE test_components close
  DROP TABLE test_components
  PROJECT test_components FROM Ooh USING * ORDER BY sortorder ASC
  PROPERTY table Ooh close
  DROP TABLE Ooh

  PROPERTY TABLE test_components OPEN
  ENDIF
SET ERROR MESSAGE 2059 ON
SET VAR vSortxt =(CTXT(vSortOr2 -1))
SET VAR vValues = ('JUMP'&.vSortxt)
PROPERTY TABLE test_components .vValues
LABEL Done

CLEAR VAR vSortOr1,vSortOr2,vSortxt ,vValues
RETURN
--end here 

Method 2 Fails.
--start here
SET SORT ON
SET ERROR MESSAGE 2059 OFF
SET VAR vSortOr1 INTEGER = sortorder IN components WHERE 
&RBTI_DBGRID_COLUMN=.RBTI_FORM_COLVALUE

SET VAR vSortOr2 INTEGER = (.vSortOr1 -1)
IF (vSortOr1 IS NULL OR vSortOr1=1) THEN
  PAUSE 2 USING 'Select the row that sortorder > 1' CAPTION 'ERROR ' ICON 
SERIOUS
  GOTO Done
ELSE
  UPDATE test_components SET sortorder = 0 WHERE sortorder =.vSortOr1

  UPDATE test_components SET Sortorder = .Vsortor1  WHERE Sortorder =  
.vSortOr2
  UPDATE test_components SET Sortorder =.vSortOr2   WHERE Sortorder = 0
  PROPERTY table test_components 'restoreorderby'
  PROPERTY RBASE_FORM set_focus 'true'

  PROPERTY RBASE_FORM refreshlist 'TRUE'
  PROPERTY TABLE test_components 'DUPLICATE'
  PROPERTY table test_components 'REFRESHLIST'
  PROPERTY DBgrd_comp refreshlist 'TRUE'
  ENDIF

RETURN
--end here

Do you have a suggestion for a way to do this is that is better and more 
elegant?
Thank you for taking the time to provide guidance, and knowledge more ...
*I'm using R:Base 7.6 for windows

Thank you very much.
Pramote Padprom, Centre for Vocational Building Technology, Thailand

Reply via email to