好問題,這兩個在 dBASE 2019 / rowset 裡「看起來都像是定位用」,但本質完全不同。我用你平常寫程式會遇到的情境來講,會比較好記 👍


一句話先記住

  • rowno:目前「畫面 / 游標」在第幾列(位置號碼

  • .bookmark:目前這一筆資料的「身分證」(唯一識別,不怕移動


rowno 是什麼?

👉 Rowset 游標目前停在哪一列

特性

  • 整數 (1,2,3…)

  • 代表「第幾列」

  • 會變動

  • 排序、filter、insert、delete 強烈相關

什麼時候會變?

• setFilter()
• setOrder()
• delete()
• insert()
• requery()

範例

? form.rowset.rowno // 目前在第幾列

⚠️ 風險

n = rs.rowno
rs.delete()
rs.rowno = n // ❌ 可能已經不是原來那筆了

.bookmark 是什麼?

👉 這一筆資料在 rowset 裡的唯一定位符

特性

  • Variant / 不可讀的值

  • 每一筆都唯一

  • 資料排序或 rowno 改變也不會影響

  • 專門用來「回到原本那一筆」

範例

b = rs.bookmark // 記住這一筆

之後不管怎麼排序、過濾:

rs.bookmark = b // ✅ 精準回到原筆

直接對照表(重點)

項目 rowno bookmark
類型 整數 Variant
是否唯一 ❌ 否 ✅ 是
排序後有效
Filter 後有效
delete / insert ❌ 易錯 ✅ 安全
適合用途 顯示列號 精準定位

實務上怎麼用(你很可能會用到)

❌ 不建議

n = rs.rowno
rs.setOrder("單號")
rs.rowno = n // 很可能跳錯筆

✅ 正確作法

b = rs.bookmark
rs.setOrder("單號")
rs.bookmark = b

Grid / 多選時的重點(你之前有問過)

a = grid.selected() // 回傳的是 bookmark 陣列

因為:

  • rowno 在多選時根本不可靠

  • bookmark 才能保證你處理的是正確資料


什麼情況用哪個?

用 rowno

✔ 顯示「第幾筆」
✔ 快速移動(上一筆 / 下一筆)

用 bookmark

✔ 記住使用者選的資料
✔ 排序 / filter 前後保持定位
✔ delete / update 前後回到原筆


小結(給你一句工程師級記憶法)

rowno 是「位置」,bookmark 是「身分」
位置會變,身分不會。

個人頭像照片

By 伍 芳左

MIS, ERP Pro...

發佈留言