在EBSForm查找界面点"Find"之后都发生了什么?
我一直对form 都感觉比较困惑, 特别是form 里面的trigger, 像PRE-QUERY, POST-QUERY 一直都弄不清情况. 这个trigger 是什么时候触发的呢? 看名字就是在QUERY 之前或之后触发的. 那么QUERY 什么呢? 搞不清楚. 今天就看下代码, 弄明白点了 find 之后做了什么事
我一直对form 都感觉比较困惑, 特别是form 里面的trigger, 像PRE-QUERY, POST-QUERY 一直都弄不清情况. 这个trigger 是什么时候触发的呢? 看名字就是在QUERY 之前或之后触发的. 那么QUERY 什么呢? 搞不清楚.
今天就看下代码, 弄明白点了 "find" 之后做了什么事情, 那些数据库里面的值怎么到form 界面上去的.
我们知道, 每一个form 上的数据块都是绑定一个table 或者 view 的. 通常会绑定view. 像下面那样:
vcu1REVNX09SREVSX1YsIMi7uvOw0XZpZXcgwO/D5rXE19a2ztK70ru21NOm09rK/b7dv+m1xNfWts4sINXi0fmx4NLr1MvQ0LXEyrG68iwg1Npmb3JtIL3nw+ayy7Wlyc8gdmlldyAtJmd0OyBxdWVyeSBieSAtJmd0OyBydW4sIL7Nv8nS1NaxvdPX9rLp0a+1xLav1/csINTaZm9ybSC958Pmyc++zbvhz9TKvrP2yv2+3b/itcS8x8K8LjwvcD4KPHA+ICAgICDV4sDvvs3X9sHL0ru0zlFVRVJZILXEtq/X9ywgsunRr8r9vt2/4iwgyLu687DRvMfCvLXEJiMyMDU0MDvM7rW9ttTTprXEZmllbGQgwO/D5silLjwvcD4KPHA+ICAgICC1q8rH1eLR+bXEwt+8rcrHvPK1pbXELCDDu9PQsOy3qNOmuLZFQlMguLTU07XE0rXO8cLfvK0uINLytMvU2sq1vMq1xNf2t6jW0CwgsqLDu9PQ08PV4tH5vPK1pdaxvdO1xLe9yr0uIM7Sw8fIpb+0RUJTIMDvw+a1xGZvcm0sIMr9vt2/4snPtcTX1rbOus12aWV3IMDvw+a1xNfWts68uLr1w7vT0LbU06a52M+1LiAmIzIwMjg0O7r1ysfBvbj2srvP4LnYway1xLarzvcsINa7ysfD+9fWutzP8S48L3A+CjxwPiAgICAg1eLR+df2tcS94bn7vs3Kx7y4uvXL+dPQtcTQ0M6qtrzSqtfUvLrQtLT6wuvKtc/WLiCyu8Tcz/HJz8PmxMfR+bXjz8Ky6dGvLCDIu7rzy/nT0LXEJiMyMDU0MDvX1Lavz9TKvtTavefD5snPwcsuINPJ09rIscnZyv2+3b/i0+u958Pm19a2zrXEudjBqiwgvLTKubLp0a/By8r9vt2/4iwg0rLSqsrWtq+w0SYjMjA1NDA7uLTWxrj4vefD5snPtcTX1rbOLjwvcD4KPHA+ICAgICDO0sPH0tRQTyBSZWNlaXB0cyC958PmzqrA/Swgv7S/tLXjz8ImcXVvdDtmaW5kJnF1b3Q7ILa81/bBy8TE0KnKwsfpLjwvcD4KPHA+MS4gytfPyM6qwcu88ruvzsrM4iwgztLDx9XiwO/Wu7+8wsdSQ1ZSQ0VSQy5mbWIg1eK49mZvcm0g1rvT0MG9uPbK/b7dv+kgYSkgRmluZCAgIGIpUkNWX1RSQU5TQUNUSU9OPC9wPgo8cD7U2kZpbmQgvefD5snPzO7QtLrDsunRr8z1vP668ywgtePSu8/CJnF1b3Q7ZmluZCZxdW90Oywg1eLKsbvhs/a3oldIRU4tQlVUVE9OLVBSRVNTRUQg1eK49nRyaWdnZXIuINTa1eK49nRyaWdnZXIgwO/D5s/ItffTw0FQUF9TVEFOREFSRC5BUFBfVkFMSURBVEUgKFJFQ09SRF9TQ09QRSkg1/bR6dakLCDIu7rztffTw8HLRklORF9CVVRUT05fQ09ERSDV4rj2t723qC4gPC9wPgo8cD7U2tXiuPa3vbeowO/D5iwgtffTw8HLUkNWX0ZJTkRfQy5GSU5EX0JVVFRPTig="WHEN-BUTTON-PRESSED','FIND','RCV_TRANSACTION') 这个过程.
这时在RCVCOFND.pld 里面定义的一个过程. 这个文件是一个比较底层的文件, Receipts form 从这个from 上继承了很多, 也调用里面的方法.
这个方法里面有3 个参数, 第一个是trigger 名. 第二个是find block name, 第三个是navigation block name. 那么调用这个过程会去到RCV_TRANSACTION 这个数据块, 然后做查询, 用下面的代码来实现:
go_block(navigation block name);
do_key('EXECUTE_QUERY');
2. 那么这时焦点就会跑到RCV_TRANSACTION 这个块上去, 然后做查询. 查询什么呢? 就是查询这个数据块所绑定的view.
在做查询之前, 我们要在RCV_TRANSACTION 这个数据块下面找到了PRE-QUERY 和 POST-QUERY 这两个trigger. 这两个是干嘛的呢? 就是在做QUERY 之前给查询做一些准备工作, 和查询结束之后进行一些后续工作. PRE-QUERY 只在查询之前执行一次, 但是POST-QUERY 要在查询之后触发多次. 查询到多少条记录就出发多少次.
3. 现在来看PRE-QUERY 里面做了什么.
先是调用了这个过程: analyze_search_criteria(l_rcv_view, l_dest_query_pos, l_src_type); 看名字能看出来是在做什么... 分析查询条件. 这3 个参数属性都是OUT. 在这个过程里面确定了查询使用的view: l_rcv_view 是那个. 比如说, 如果我们做的是一个组织间转移 inter org transfer, 那么使用的view 就是RCV_ENTER_RECEIPTS_INTERNAL_V; 如果是ASN 接收的话, 使用的view 是RCV_ENTER_RECEIPTS_ASN_V; 使用哪个view 做查询就是在这个过程里面决定的. 决定标准是根据"Find" form 界面上填入的查询条件. l_dest_query_pos 意思是使用的查询方式, 有"from" 和 "where" 两种取值可能. l_src_type 就是source type, 可能是INTERNAL, LCM, CUSTOMER, VENDOR, ALL 等等;
我们这里考虑l_dest_query_pos = where 的情况.
这里面会用下面这个过程APP_QUERY.append(block_name, clause) 把 clause 加到前面block_name 后面, 作为查询条件.
4. 就这样通过判断find form 里面填入的值, 给查询的数据块加入一个一个条件. 比如, 如果FIND.SOURCE_TYPE 的值是VENDOR, 加上的查询条件就是: (RCV_ENTER_RECEIPTS_V.SOURCE_TYPE_CODE = ''VENDOR'' OR RCV_ENTER_RECEIPTS_V.SOURCE_TYPE_CODE = ''ASN''). 诸如此类.
5. PRE-QUERY 还做了一件事, 就是把find 界面上的值copy 给RCV_TRANSACTION 对应的字段. 但是这些不是作为查询条件来的.
6. 就这样在PRE-QUERY 里面确定了查询使用哪个view, 并且确定了查询条件. 然后就是做查询的动作. 查询是从前面的RCV_ENTER_RECEIPTS_INTERNAL_V 和RCV_TRANSACTION 绑定的view RCV_ENTER_RECEIPTS_V 两个view 里面查出结果来. 当查询结束后, 就会执行POST-QUERY 这个trigger.
7. 之前我们说过, 由于RCV_TRANSACTION 这个数据块上的字段和view 里面的字段是没有绑定关系的, 因此查询出来的结果并不会自动赋值给界面上的字段. 需要在POST-QUERY 里面手动赋值. 所以这个trigger 主要就是做的赋值的工作. 这个里面有大量的代码, 格式很单一:
if (criteria ) then select a into b from table where .. copy (b , 'RCV_TRANSACTION.field');
也就是根据某个条件从数据库查出某个值, 赋值给数据库的字段. 所以这个里面出现了大量select 语句和copy 语句.
8. 在POST-QUERY 里面也调用了非常多的数据库过程, 这些过程写在 pls 文件中. 这里没有去深究这许多过程有哪些功能, 但能从调用的结果上看出来, 这里面是做了一些逻辑判断和计算的. 例如v_secondary_quantity := inv_convert.inv_um_convert
9. 另外在这个trigger 的最后会set 字段的属性, 例如set_item_property: item_is_valid, 就是让字段验证属性为真.
10. 到这里为止, query 的动作就做完了, 通过PRE-QUERY 设定查询条件, POST-QUERY 给界面字段赋值. 要注意的是, 如果查询出来有两条记录的话, 那么POST-QUERY 会执行两次. 为啥要执行两次呢? 因为界面上两条记录的字段是不一样的, 需要根据不同的条件赋值, 比如两条记录的id 不一样, 就要用这个id 分别查出某个字段的值在赋值.
11. 到这里为止, 上面的RCV_FIND_C.FIND_BUTTON('WHEN-BUTTON-PRESSED','FIND','RCV_TRANSACTION') 这个过程就执行完了. 在此之后又执行了一下过程, 但是已经更查询的关系不大了, 主要是跳到某个窗口, 设置属性等等. 至此, WHEN-BUTTON-PRESSED 这个trigger 就全部执行完毕了. 查询的结果就已经在界面上显示出来了.
12. 在焦点跳入RCV_TRANSACTION 数据块的时候, 又会出发WHEN-NEW-RECORD-INSTANCE 等等trigger, 但这是后事了, 这里就不讨论了;
总结: 这样的做法显得非常复杂而且需要写很多代码, 但是优点也是比较明显的, 这对于所有的字段都有比较精确的控制. 这对于实现复杂的业务逻辑是必须的.
代码中有许多built-in 的代码, 可以在form builder 里面找看看是怎么用的. 帮助很大.
注: 这是我看着代码写出来的, 如果里面有错误的地方, 希望大家能够指出来, 共同进步.

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











C# で Array.IndexOf 関数を使用して、配列内の要素のインデックスを検索します。C# プログラムでは、配列内の要素のインデックスを検索する必要がある場合、Array.IndexOf 関数を使用できます。 Array.IndexOf 関数は、指定された配列範囲内で指定された要素を検索し、最初に出現した要素のインデックスを返します。要素が見つからない場合は、-1 が返されます。以下は、Array.IndexOf 関数を使用して配列内の要素を検索する方法を示すサンプル コードです。

iPhone で「探す」をオフにするとどうなりますか? 「iPhone を探す」は、紛失または盗難に遭ったデバイスを見つけるのに役立ちます。 「iPhone を探す」を有効にすると、地図上でデバイスの位置を追跡したり、サウンドを鳴らしたり、デバイスを見つけやすくしたりできます。 Find My には、他人が iPhone を使用できないようにするためのアクティベーション ロックも含まれています。 「iPhone を探す」をオフにすると、これらの機能がすべて失われるため、紛失した Apple デバイスの回復が困難になる場合があります。 「iPhone を探す」は非常に便利ですが、携帯電話を販売、寄付、下取りに出したり、バッテリー交換やその他のサービスに送ったりする場合は、この機能を無効にする必要があります。これにより、誰もあなたに関する情報にアクセスできなくなります

ハードドライブのシリアル番号と MAC アドレスは、コンピュータ ハードウェアの重要な識別子であり、コンピュータ システムの管理と保守に非常に役立ちます。この記事では、ハードディスクのシリアル番号とMACアドレスを確認する方法を紹介します。 1. ハードドライブのシリアル番号を見つける ハードドライブのシリアル番号は、ハードドライブの製造元がハードドライブを識別および追跡するために使用する一意の識別子です。オペレーティング システムが異なると、ハード ドライブのシリアル番号を見つける方法が若干異なります。 Windows: コマンド プロンプトを開き (スタート メニューで「cmd」を検索)、次のコマンドを入力して Enter キーを押します: wmicdisk

Apple の Find My アプリを使用すると、iPhone またはその他のデバイスの位置を特定して、紛失したり忘れられたりするのを防ぐことができます。 Find My はデバイスを追跡するのに便利なツールですが、プライバシーの問題が心配な場合、バッテリーを消耗したくない場合、またはその他の理由で無効にすることもできます。幸いなことに、iPhone で「探す」をオフにする方法はいくつかあり、この記事ですべて説明します。 iPhoneで「探す」をオフにする方法【4つの方法】 iPhoneで「探す」をオフにする方法は4つあります。方法 1 を使用して検索をオフにした場合は、検索を無効にするデバイスからこれを行うことができます。方法 2、3、4 を続行するには、「電話を探す」をオフにする iPhone の電源をオフにするか、

PHP の glob() 関数は、ファイルまたはディレクトリを検索するために使用され、強力なファイル操作関数です。指定されたパターン一致に基づいてファイルまたはディレクトリのパスを返すことができます。 glob() 関数の構文は次のとおりです。 glob(pattern, flags) ここで、 pattern は照合するパターン文字列を表し、*.txt (.txt で終わるファイルの照合) などのワイルドカード式にすることができます。特定のファイルパス。 flags は、関数を制御するために使用されるオプションのパラメータです。

コンピュータのハードドライブのシリアル番号を確認する方法 コンピュータ技術の発展に伴い、コンピュータのハードドライブは私たちの生活に欠かせないものになりました。重要なファイルを保存する場合でも、オペレーティング システムやソフトウェアをインストールする場合でも、それを完了するにはハードディスクに依存する必要があります。ハード ドライブのシリアル番号など、コンピューターのハード ドライブに関するいくつかの基本情報を理解すると、コンピューター システムをより適切に管理および保守するのに役立ちます。では、コンピューターのハードドライブのシリアル番号を確認するにはどうすればよいでしょうか?この記事では、いくつかの一般的な方法を紹介します。方法 1: Windows システムに付属のコマンド ライン ツールを使用する Windows システム

このペースの速い時代において、OPPO Find X7 はその画像処理能力を利用して、人生のあらゆる美しい瞬間を味わうことができます。雄大な山、川、湖、海、温かい家族の集まり、街での出会いや驚きなど、あらゆる場面を「比類のない」画質で記録できます。 Find Itのカメラデコデザインは外観から見ても一目瞭然で高級感があります。基本的なハードウェア構成をはじめ、内部もユニークです。 FindX7 は以前の状態を維持します

Python でハッシュ ルックアップ アルゴリズムを記述するにはどうすればよいですか?ハッシュ検索アルゴリズムとも呼ばれるハッシュ検索アルゴリズムは、ハッシュ テーブルに基づくデータ検索方法です。ハッシュ検索アルゴリズムは、線形検索や二分検索などの従来の検索アルゴリズムと比較して、検索効率が高くなります。 Python では、辞書を使用してハッシュ テーブルを実装し、ハッシュ ルックアップを実装できます。ハッシュ検索アルゴリズムの基本的な考え方は、検索対象のキーワードをハッシュ関数を通じてインデックス値に変換し、そのインデックス値に基づいてハッシュ テーブル内を検索することです。
