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