/* UPDATE FROM via PP rule. */ PROCEDURE Main() LOCAL aStruct FErase( "mas.dbf" ) FErase( "del.dbf" ) /* Master: id, total. Initially totals are zero. */ aStruct := { ; { "ID", "N", 4, 0 }, ; { "NAME", "C", 8, 0 }, ; { "TOTAL", "N", 8, 2 } } dbCreate( "mas.dbf", aStruct ) USE mas.dbf NEW EXCLUSIVE ALIAS mas dbAppend() ; FieldPut(1, 1) ; FieldPut(2, "Alice") ; FieldPut(3, 0) dbAppend() ; FieldPut(1, 2) ; FieldPut(2, "Bob") ; FieldPut(3, 0) dbAppend() ; FieldPut(1, 3) ; FieldPut(2, "Carol") ; FieldPut(3, 0) dbCommit() dbCloseArea() /* Delta: same id, amount to apply. Sorted by id. */ aStruct := { ; { "ID", "N", 4, 0 }, ; { "AMT", "N", 8, 2 } } dbCreate( "del.dbf", aStruct ) USE del.dbf NEW EXCLUSIVE ALIAS del dbAppend() ; FieldPut(1, 1) ; FieldPut(2, 100) dbAppend() ; FieldPut(1, 2) ; FieldPut(2, 200) dbAppend() ; FieldPut(1, 3) ; FieldPut(2, 300) dbCommit() dbCloseArea() /* Re-open both, sorted on id. */ USE mas.dbf NEW EXCLUSIVE ALIAS mas USE del.dbf NEW EXCLUSIVE ALIAS del SELECT mas ? "--- before UPDATE FROM ---" dbGoTop() DO WHILE !Eof() ? " ", FieldGet(1), AllTrim(FieldGet(2)), FieldGet(3) dbSkip() ENDDO ? "" ? "--- UPDATE FROM del ON id REPLACE total WITH del->amt ---" dbGoTop() UPDATE FROM del ON id REPLACE total WITH del->amt ? "" ? "--- after UPDATE FROM ---" dbGoTop() DO WHILE !Eof() ? " ", FieldGet(1), AllTrim(FieldGet(2)), FieldGet(3) dbSkip() ENDDO ? "(expect: 1 Alice 100, 2 Bob 200, 3 Carol 300)" SELECT del dbCloseArea() SELECT mas dbCloseArea() FErase( "mas.dbf" ) FErase( "del.dbf" ) ? "DONE" RETURN