PowerBuilderに関する疑問点  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ★ データウィンドウのモードを変更したい 例 次のステートメントは、現行のステータスが NewModified! の場合、dw_rpt の主バッファの行 5 のステータスを DataModified! に設定します。 dwItemStatus l_status l_status = dw_rpt.GetItemStatus(5, 0, Primary!) IF l_status = NewModified! THEN dw_rpt.SetItemStatus(5, 0, Primary!, DataModified!) END IF ★ モードの種類 NotModified! 行またはカラムの情報は、取得されてから変更されていません。 DataModified! カラムまたは行内のカラムの情報は、取得されてから変更されています。 New! 行が新しく作成されましたが、まだそのカラムに対して値が指定されていません (行だけのステータス)。 NewModified! 行が新しく作成され、カラムに対して値が割り当てられています。 ★ 画面から入力した年月日を、PBのdatetime型にしたい。 datetime l_date l_date = datetime(f_cmpb0120_01(em_1.text,"MM/DD/YYYY")) ★ substr()を使いたい mid(p_str_date,7,4) ★ ラジオボタンをAグループとBグループにグルーピングしたい ラジオボタンを作成した後、 Control の GroupBox を使ってグルーピングする。 選択されているかどうかの判定は、crick event で記憶しておく。 ★ 検索結果で、1行目にフォーカスが当たってしまう 対策 RetrieveEnd で dw_1.selectrow(1,false) // を入れておく。 ★ チェックボックスから入力された結果は何を見るのか レ点があれば、cbx_1.checked = true ★ ドロップダウンデータウィンドウの作り方 例 w_icpb0580_01 (dw_2) → d_icpb0580_012 → d_icpb0580_013 w_icpb0580_01 (dw_2) のトリガーイベントスクリプト dw_2.settransobject(sqlca) // これで検索してくれる dw_2.insertrow(0) // これがミソ d_icpb0580_012 データウィンドウの作成で、Externalで作成、EditでDropDownがd_icpb0580_013 d_icpb0580_013 DB検索用のデータウィンドウ ★ dw_1から、さらに別のデータウィンドウに引数を渡したい 例 w_mcpb0900_02 dw_2の中の項目'picking_zone'に接続しているdwにWHSを渡す例 DataWindowChild dw_2child rtncode = dw_2.GetChild('picking_zone', dw_2child) dw_2child.SetTransObject(SQLCA) dw_2child.Retrieve(g_warehouse_cd) dw_2.settransobject(sqlca) dw_2.Reset() dw_2.insertRow(0) ★ dw_1.settransobject(sqlca) が必要な場合を知りたい dw_1.retrieve(i_ddreturn) // リトリーブする時 ★ データウィンドウの行を反転させる。 エラーのある行をリバース表示する。 dw_1.selectrow(l_row,true) もとに戻すときは、 dw_1.selectrow(l_row,false) ★文字が3桁あるかどうかの判定方法 例 l_wk = trim(dw_1.getitemstring(row,"data")) if len(l_wk) <> 3 then // error ★PFキーの扱い 画面で、PFキーが押されたら、ボタンをクリックしたのと同じイベントを 発生させる。 例 UNLOAD : PF6 -------- 画面スクリプト ue_f6_key イベント --------------- if cb_unload.enabled = true and cb_unload.visible = true then cb_unload.TriggerEvent(Clicked!) end if ★ デバグ画面で、ワークエリアの内容を出す窓が消えてしまった 処置 Debug → Options → Layout → 初期値または、SaveAs ★該当データが3件あるのに、表示は2件しかでない。 原因 external の場合 dw_1.insertrow(0) が必要 ★自分でデータウィンドウにデータを表示したい場合の例 dw_1.insertrow(0) dw_1.setitem(dw_1.rowcount(),"remain_qty",l_wk_qty)  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ★画面消去の方法 データウィンドウは、 dw_1.reset() 各項目は、sle_3.text = "" ★ページ単位の表示で、NextPageに移る時 dw_1.scrollnextpage() ★トリガーの発生のさせかた 例 sle_3 の データを入力した時と同じイベント発生 : sle_3.TriggerEvent ( modified! ) ★行の追加で、次の例の違いはなにか? dw_1.insertrow(0) 後ろにに一行ついか dw_1.insertrow(1) 1行目の前に一行追加 ★画面に出た内容をFilteringしたり、SORTして、再編集する。 スクリプトで次のように書く 例 icpb0080 string l_f_string l_f_string = "not(isnull(group))" dw_1.setfilter(l_f_string) dw_1.filter() // その後 検索項目(group)で sort する場合 dw_1.setsort("group") dw_1.sort() ★ g_company_code がセットされていないが、どのようにテストするの? テストのアプリケーションのスクリプトに、次のように記述。 g_company_code = "AAA" // test open(mizutani_menu) ★ selectrow() の意味と使い方 DataWindow 内の行の選択 (ハイライト表示) または選択の解除 例 dw_1.selectrow(i_row,false) ★ 行の削除 dw_1.deleterow(i_row) ★ 次のスクリプトは何をするの? 継承元のスクリプトに入っているので、自分でコーディング不要。 if f_cmpb0060_01("D",dw_1,st_message) = 1 then commit; else rollback; end if  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ データベースの更新。引数"D"は、削除の場合。 // argument:string mode update=U deletion=D addition=I // datawindow dw_name datawindow name // statictext st_name output message area // return :int result ★データウィンドウの中の項目がエラー判定のとき、 そこを修正するまで他へ行かないようにしたい。 答え return 1 ★ 入力が無い判定の例 if isnull(dw_2.getitemstring(1,"payment_term")) = true or trim(dw_2.getitemstring(1,"payment_term")) = "" then ★スクリプトで、繰り返しの例 long n, l_crow, l_count i_row = dw_1.rowcount() l_crow = dw_1.getrow() n = 1 for l_count = n to i_row step 1 if l_crow <> l_count then l_val1 = dw_1.getitemstring(l_count,i_column) end if next ★ ボタンを押せなくする。ボタンの文字を薄くする。 cb_update.enabled = false ★PBの機能で、画面に入力されたデータをDBに反映させる方法 データウィンドウを変更する画面のタイトルメニュー Rows → Update Properties → Allow Updates をチェックする Key Columns と、 右の Use Update をチェックする。 テーブル、検索キー、更新項目を選ぶ ★色 // PO line Part No. Display Color and Protect Control */ l_color = 12632256 /* Silver = 0xC0C0C0 */ l_default_color = 16777215 /* White = 0xFFFFFF */ dw_2.Modify("payment_term.Background.Color ='12632256'") //gray ★ 変更したのがPart_NOの時、というイベントをとる例 choose case dw_1.getcolumnname() case "part_no" l_part_no = data end choose ★データウィンドウ内の特定項目を見えるようにしたりする 例 dw_1.Object.emp_status.Visible = 0 dw_1.Modify("emp_status.Visible=0") ★ 入力できなくする例(項目名:Currency) データウィンドウの場合 dw_2.object.currency.protect = 1 一般の項目の場合 sle_3.enabled = false ★editchanged itemchanged 違いは? EditChanged : キーボード入力が行われる度に発生 ItemChanged : 〔dw〕修正された後で、フォーカスを失うとき ★エラーメッセージで、Yes/Noの入力をさせたい f_cmpb0030_01("C",l_msg_str) この結果が、押したボタンにより、1か2がくる。 ★入力位置を制御したい。 特定の所に設定する。フォーカスを当てる。 objectname.SetFocus ( ) 例:sle_5.setfocus() ★DBコネクトは、どの時点でいれるのか? SPを呼ぶ前には必要。 Declereの前か、Openの前か、直前はどっちか? → Declare の後ろでも良い。Openの前が直前になる。 ★別のデータウィンドウの指定の行と列の所に特定のデータをセットしたい dw_1.setitem(1,"po_no", dw_2.getitemstring(3."e_po_no")) dw_1.setitem(1,"po_no","ABC00000") ★データウィンドウの指定行カラムのデータを採る l_manifest_type = dw_2.getitemstring(1,"manifest_type") ★リトリーブして、表示行の次に空行を入れて、カーソルセットしたい retreiveend のスクリプトに、次のようにいれる。 i_row = dw_1.rowcount() + 1 ← 読めた行数に1行追加 dw_1.scrolltorow(i_row) ← 指定行に移動 dw_1.setfocus() ← そこをフォーカスする ★指定の場所にカーソルをセットしたい dw_1.setcolumn("po_no") // 項目名で指定する場合 もし、指定しないと、一番左にいく ★入力可能なようにする。 TABの設定。0以外の数字。データウィンドウ。 空行をいれる。→ dw_1.insertrow(0) ★日付時刻の扱い例 date mdldate time mdltime mdldate = today() //to get todays date mdltime = now() // to get current time この日時は、パソコンのものだが、サーバーと違う場合がある。 それでも、これで良い。問題があれば、PCを直すという方針。 infomixDB PB 画面表示 MM/DD/YYYY YYYY/MM/DD MM/DD/YYYY date型 <--- f_cmpb0120_01(in,"MM/DD/YYYY") select date into :date ---> "MM/DD/YYYY " (注意:後ろにスペースがある) expect_arriv_date ★ ヌルの判定 if wk = "" or isnull(wk) = true then ... ★カーソル移動して、項目を変更した時、そのデータを取りたい。 データウィンドウの場合、itemchangedイベントを使う。 itemchangedのスクリプトの引数が、rowやdataがある。 その、dataに、変更後の値が入っている。 スクリプトの例 ↓ messagebox("test","row[" + data + "]",exclamation!) ★表示されるデータウィンドウの項目で、入力可能な所と出来ない所がある。 入力できるのは、TABを設定してあるところ。 TABの設定中は、TABの数字しか入力できない。(注意) ★エラーメッセージを出す所定の方法 例 st_message.text = "Process has been cancelled" ★ポップアップウインドウのように最初は見えないようにしたい オープンイベントで、スクリプトに次のように記述。 dw_3.visible = false ★デバグで、最初に出す画面はどのように定義するの? アプリケーションのオープンイベントのスクリプトに記述 open(w_test_1) ★数値を文字に変える方法、関数などないか? sle_10.text = string(i_mani_no,"#########0") sle_10.text = string(i_mani_no,"###,###,##0.00") 文字を数字は、Long ( string ) 日付にしたい時は、date("Jan 1, 1998" や "1999/12/31") ☆画面入力が、MM/DD/YYYYのとき、Date型にしたい場合は、次の例 r_date = f_cmpb0120_01(in_char_date,"MM/DD/YYYY") ★クリックイベントで、次の命令の意味は何? if row = dw_1.rowcount() then [説明] クリックされて選ばれた行が、データウィンドウに表示された 全行数と同じか? ________ デバクでの問題  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ★editchangedイベントは、当該項目を変更しはじめた時発生する。 そのため、その時点でその項目を採取すると、変更前の値が取られる。 変更した後イベントを発生させたいなら、itemchanged losefocus は、データウインドウから出た時発生。 同一データ ★ディスコネクトせずに終了しているかどうか調査する UNIXで状況を見る コマンドの例 (PCQ079は自分の端末名) onstat -g ses -r 2 | grep PCQ079 ★w_test_02という画面が、どうしても出ない。 自分の実行ライブラリの中のどこかに、それと同じ名前の画面が あって、それがエラー状態かも知れない。 →自分のライブラリを一時的に先頭に持っていってテストランしてみる。 →ライブラリリストを順番に見ていって、同名のがあるか探す。 ★デバガの使い方 編集中のファイルを全てセーブする。つまり、コンパイル済にする。 デバクアイコンを押す。 SelectScriptアイコンを押して、ウィンドウをクリックする。 当該ウィンドウに関係するスクリプトが出るので、表示させて ダブルクリック ★PO_NOという文字列で記述してある所を探したい。 ???.pbl の検索対象ファイルを反転しておいて、 Entry → Serch ★DataWindow Error Database transaction information not available. Call SetTrans or SetTransObject function. → セットトランを呼べといっているので、直前に書く dw_3.settransobject(sqlca) dw_3.retrieve(l_po_no) 知識 ディスコネクトするとトランもなくなる。 ★データウィンドウに検索項目を追加表示する方法 Objects → Column Detail のところで左クリックして、項目選択する。 ★ 繰り返し表示のある行を選択して、そのデータを使いたい。 カーソルのある行の項目を使いたいとき。 clickイベントのスクリプトで、以下のようにする。 i_po_no = dw_1.getitemnumber(row,"po_no") [説明] dw_1のデータウィンドウで、ROWは、現在行という意味。 "po_no"は、その列名。