そこで「自力ディスティンクト」を作ってみた。ディスティンクトで得られるユニークなフィールドの配列を、データベース側のセットに実現することでセレクションを作る。このモジュールを呼び出すとIDがユニークな配列が返されると同時に、その配列の元になるカレントセレクションが用意される。呼び出し元ではユニークフィールド以外のフィールドの値はSelection to arrayで簡単に持ってこれる。セットを使っているので高速に動く。
//元セットにレコードがなくなるまで繰り返す
USE SET($setOrg)
$numOfRecs:=Records in selection([JOURNAL])
FIRST RECORD([JOURNAL])
$ac_id:=$keyFldPtr->
While ($numOfRecs>0)
//結果セットを日付でクエリして、なければ追加、
USE SET($setName)
QUERY SELECTION([JOURNAL];$keyFldPtr->=$ac_id)
If (Records in selection([JOURNAL])=0)
//DB全体をクエリして最初のレコードを取得して、セットに追加
QUERY([JOURNAL];$keyFldPtr->=$ac_id)
FIRST RECORD([JOURNAL])
ADD TO SET([JOURNAL];$setName)
End if
//元のセットを日付でクエリして、元のセットからのぞく
USE SET($setOrg)
QUERY SELECTION([JOURNAL];$keyFldPtr->=$ac_id)
For ($i;1;Records in selection([JOURNAL]))
GOTO SELECTED RECORD([JOURNAL];$i)
REMOVE FROM SET([JOURNAL];$setOrg)
End for
//リデュースされた元セットの最初のレコードを取得
USE SET($setOrg)
$numOfRecs:=Records in selection([JOURNAL])
FIRST RECORD([JOURNAL])
$ac_id:=$keyFldPtr->
End while
CLEAR SET($setOrg)
//転送
USE SET($setName)
CLEAR SET($setName)
SELECTION TO ARRAY($keyFldPtr->;$outIDAryPtr->)
//カレントセレクションがあるので、呼び出し元ではお好みのフィールドの値をSELECTION TO ARRAYで取得できる
READ ONLY([JOURNAL]) ALL RECORDS([JOURNAL])<;br> JO_Distinct_byAC_ID (->[JOURNAL]JO_D_AC_ID;->$aryAC_ID) SELECTION TO ARRAY([JOURNAL]JO_D_AC_CODE;$aryAC_CODE) // SELECTION TO ARRAY(…
C_LONGINT($1;$tr_id) $tr_id::=$1 C_OBJECT($2;$objTR) $objTR:=$2 C_TEXT($0;$numOfRecs) READ ONLY([TRADEMARK]) QUERY([TRADEMARK];[TRADEMARK]TR_ID=$tr_id) $numOfRecs:=Records in selection([TRADEMARK]) If ($numOfRecs=1) //オブジェクトで値を返す $objTR.bikou:=[TRADEMARK]TR_BIKOU End if $0:=$numOfRecs
//PL01_SetContorolsValues ・・・ //新規追加モードの場合、削除ボタンは非表示にする C_TEXT($mode) $mode:= vPL01_varMode_get if ($mode=“add”) OBJECT SET VISIBLE(*;”vPL01_btnDelete”;False) end if ・・・