Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
tsuyoshi
Partner - Creator
Partner - Creator

大容量のQVWをバイナリーで読んで、中身のレコードを絞って小さくしたい

具体データやQVWを提示せず恐縮なのですが、また教えてください。

ある①QVWを作っておりユーザ解放しています。但しこのQVWの中身のデータが
数億件あり非常に重くなっています。今回新型コロナによる在宅勤務の絡みで
新規のユーザが検索で利用することに急遽決まりました。

但しこの新規のユーザは一般ユーザであるため中身のデータはせいぜい1000件
くらいのものだけ検索出来ればよく、その範囲も予めわかっています。

①QVWはスクリプトを修正して再ロードするにもデータが多すぎて丸1日かかり
ます。ですので②QVWを新たに作成して Binary ①QVWでデータコピーして
residentで対象を絞り 不要なロードデータを捨てたいのですが
resident loadはほとんど使ったことがなく Whereなど併用して現在のテーブル
を絞り込めるこのなのでしょうか?

Ctrl+T の現在のテーブルイメージ

TABLE1─┐        ┌─ TABLE3
      $2 SYN TABLE  
TABLE2─┘ ユーザ名   └─ TABLE4

上記のユーザ名を絞り込めれば、各TABLEが全てコンパクトになる

以上、宜しくお願い致します

1 Solution

Accepted Solutions
kentaroWakamatsu
Creator II
Creator II

なお、ファイル内で絞ったデータだけ残して保存するだけであれば、最初に記載した

   [ファイル] - [データ削除] - [現在の除外値を削除]

を実行後、別ファイル名で保存すれば大丈夫ですよ。

ただこの場合は、別ファイルで保存したファイルも、リロードしてしまうと元に戻ってしまいますが。

View solution in original post

17 Replies
kentaroWakamatsu
Creator II
Creator II

上記件ですが、テーブル構成は同じで、単純に「ユーザー名」のみを絞りたいという事ですか?

それとも、テーブルも必要テーブルのみに絞り込んだ方が良いですか?

tsuyoshi
Partner - Creator
Partner - Creator
Author

テーブルや画面はまったく同じでいいんです

見る必要のないユーザを全部削除してしまいたい(それによって他のTABLEにもキーでつながっているものを減らしたい)という意図です

よろしくお願いします

 

kentaroWakamatsu
Creator II
Creator II

記載されていたテーブル構成ように、全てのテーブルにWHERE条件となる「ユーザー名」が存在する場合は、添付ファイルのような方法で簡単に出来ますが、そうでない場合は、テーブル名に応じて絞り込み方法が変わってくるので、それらを指示するような台帳が別途必要になってきます。

ここでは頂いたテーブルレイアウトの場合に対応する方法について、以下に流れを記載しておきます。

 

1.「①.qvw」は、全てのデータが存在する、元となるファイルです。

2.「①.qvw」を開いて、絞り込みたい「ユーザー名」でファイルを保存し、ユーザー用ファイルを用意します。

  ここでは例として、「USER2.qvw」として保存します。

  これでファイル内のオブジェクトは、ユーザー用ファイルにそのまま残ります。

3.「ロードスクリプトの編集」を開き、「Main」タブのスクリプトをコメントアウトし、「USER別」タブのスクリプトを有効にし、リロードします。

 

以上で、USER2のデータだけになります。

 

その他の方法として、Tuyoshiさんの方で、手動で絞り込んでファイルを都度渡すのであれば、リストボックスで該当者の「ユーザー名」だけ選択した状態で、

 [ファイル] - [データ削除] - [現在の除外値を削除]

を行う事で、選択した「ユーザー名」の除外値にあたるデータは削除されますので、削除後保存してお渡しすると良いかと思います。

kentaroWakamatsu
Creator II
Creator II

スクリプトで不明点があれば、記載下さい。

tsuyoshi
Partner - Creator
Partner - Creator
Author

有難うございます。頑張ってみさせて頂きます!!!(^^)/

tsuyoshi
Partner - Creator
Partner - Creator
Author

ロードスクリプトを見て、ちんぷんかんぷん?のまま、指示されているとおり

①.qvwを開いて User1だけを選択し その状態で USER2.qvwという別名で保管。

②USER2.qvwを開いて、ロードスクリプトのコメントアウトを解除してリロード
 なんと User1だけのデータになりました

手品のようでびっくりしています 何故こういう動作が出来るのか?ちんぷんかんぷんです

Binary ①.qvw;

FOR i = 0 to NoOfTables()-1
テーブルリスト:
LOAD TableName($(i)) as テーブル名
AutoGenerate(1);
NEXT

再読込テーブル:
LOAD Concat(chr(39)&テーブル名&chr(39),',') as 再読込テーブルリスト
Resident テーブルリスト;
DROP Table テーブルリスト;

LET V_TableList = Peek('再読込テーブルリスト',0,'再読込テーブル');
DROP Table 再読込テーブル;

LET V_User = SubField(DocumentName(),'.',1);

FOR Each V_TableName in $(V_TableList)
LET V_TableName2 = '$(V_TableName)'&'_再読込';
NoConcatenate
$(V_TableName2):
LOAD *
Resident $(V_TableName)
Where ユーザ名='$(V_User)';
NEXT

DROP Tables $(V_TableList);



何故 私が選択したUser1以外、削除されるのでしょうか? 

すみません 解説をお願いできれば幸いです

kentaroWakamatsu
Creator II
Creator II

選択したUSER1ではなく、ファイル名のUSER2が残っていませんか?

tsuyoshi
Partner - Creator
Partner - Creator
Author

? あ、ほんとだ、自分がUSER1を選択した状態で USER2.qvwとして別名保管した
そのDocumentName  のUSER2 が残ってました

自分が選んだ選択ユーザと思ったら、違いました・・・

大容量のQVWを開いて、そこから絞り込みたいデータだけ選択した状態で 別名保管し
それを別のQVWからバイナリーロードすると 絞ったデータだけのテーブルになるのかと
一瞬びっくりしましたが そんなわけはないですよね

お時間ありましたらロードスクリプトの解説をしていただけますと助かります 特に中盤以降

kentaroWakamatsu
Creator II
Creator II

「USER別」タブのスクリプト内に、説明差し込みました。

一度コメントアウトして、処理1から順に開放しながら、説明と一緒に、出来たテーブル、値を確認てもらうと理解しやすいと思います。