Curl Global Community
ローカルストレージのデータを取得する方法 - Printable Version

+- Curl Global Community (https://communities.curl.com)
+-- Forum: Discussions (https://communities.curl.com/forumdisplay.php?fid=1)
+--- Forum: General Curl questions (https://communities.curl.com/forumdisplay.php?fid=2)
+--- Thread: ローカルストレージのデータを取得する方法 (/showthread.php?tid=1349)



ローカルストレージのデータを取得する方法 - chiba - 04-27-2016

ローカルストレージにテーブルを作成し、データを格納したのですが、
ローカルストレージから格納したデータの1項目を取得してTextFlowBoxに表示させたいのですが、
データの取得及び表示方法が分かりません。
どの様に取得すれば良いのか教えて下さい。
よろしくお願いします。



RE: ローカルストレージのデータを取得する方法 - hmino - 04-27-2016

ローカルストレージから1レコード取得してそのレコードの1項目を取得する方法ということでしょうか?
以下のサンプルを参考にしました。
http://developers.curlap.com/re-reference/57-caede/783-caede-device.html


上記サンプルの以下のコードの部分がレコード取得する部分です。
以下のSQLでは全件取得していますが、1件取得するにはSQLで対象レコードを
特定する必要がありますね。
以下のサンプルだとrowsに取得したデータが複数件入ってくる状態ですので
ループ処理で1レコードづつ処理しています。
rという変数(実態はRdbRow)に1レコード分のデータが入っていますので、その中の項目を
取得する場合は「get-int」や「get-String」を使用して対象項目のデータを取得しています。
詳しくはRdbRowsクラスのヘルプドキュメントを見てください。

def rows = {storage.execute-query "SELECT * FROM TEST"}
{for r in rows do
{output
{format
"RDB test col1=%s col2=%s",
{r.get-int "COL1"},
{r.get-String "COL2"}
}
}
}
{storage.execute-update "DROP TABLE IF EXISTS TEST"}
{popup-message "Please see the console log."}


これで回答になっていますかね?


RE: ローカルストレージのデータを取得する方法 - chiba - 04-27-2016

ご回答頂いた方法でRDBの項目は取得出来そうなのですが、
取得した後にrに格納された値をTextFlowBoxに表示させる際はどの様にすれば良いでしょうか。
今は下記の様に記述しましたが、「'r'は認識されません」となってしまいます。
def rows = {storage.execute-query "SELECT * FROM TEST"}
{for r in rows do
{output
{format
"RDB test col1=%s col2=%s",
{r.get-int "COL1"},
{r.get-String "COL2"}
}
}
}
field private lbl-kojoname:TextFlowBox
set self.lbl-kojoname={self.fond-graphic-by-name "lbl-kojoname"} asa TextFlowBox
{self.lbl-kojoname.clear}
{self.lbl-kojoname.add
r
}
よろしくお願いします。



RE: ローカルストレージのデータを取得する方法 - dice256 - 04-27-2016

サンプルはスクリプト的な書き方をされているので読み取りにくいですが、
r はrows (型{Array-of RdbRow})を for文で回して取り出した RdbRow型の変数でスコープがfor文内なので
「認識されません」とエラーになっていると思います。

他の言語に慣れている方向けに書くとこんな感じになるかと思います。

Code:
field private lbl-kojoname:TextFlowBox
    set self.lbl-kojoname= {self.fond-graphic-by-name "lbl-kojoname"} asa TextFlowBox
    
    || SQL(select)を実行
    def rows:{Array-of RdbRow} = {storage.execute-query "SELECT * FROM TEST"}
    
    || execute-querynの結果のRdbRow配列の先頭(0番目)を取り出す
    def index:int = 0
    def (r:RdbRow, found?:bool) = {rows.get-if-exists index}
    
    {if found? then
        || RdbRowよりカラム"COL1"、"COL2"の値を取得
        def col1-value:int = {r.get-int "COL1"}
        def col2-value:String = {r.get-String "COL2"}
        || 取り出した値より文字列を生成
        def out-string:String =
            {format
                "RDB test col1=%d col2=%s",
                col1-value,
                col2-value
            }
        || TextFlowBoxの文字列を入れ替え
        {self.lbl-kojoname.clear}
        {self.lbl-kojoname.add
            out-string
        }
    }

ちなみに[code] [/code]で囲むとソースコードにインデントがつかえます(括弧は半角文字で)


RE: ローカルストレージのデータを取得する方法 - chiba - 04-27-2016

ご回答ありがとうございます。
ただ、ご回答いただいた内容で処理を実行するとTextFlowBoxには「RDB PARAMETERTABLE」と出力されてしまいます。
実際には各工場区分(1or2or3or4or5)の数字が出力されるようにしたいです。
前後のコードも下記に記載しますので、誤っている記述があればご指摘願います。
{self.cmd_config.add-event-handler
{on Action do
{initialize-db}
def datas = {read-rows-from-db}
let parameter0:String = ""

{if self.s-chi.value==true then
set parameter0 = "1"
elseif self.s-let.value == true then
set parameter0 = "3"
elseif self.s-maf.value==true then
set parameter0 = "5"
elseif self.s-suz.value==true then
set parameter0 = "2"
else
set parameter0 = "4"
}
def rowdata = {edit-rows-to-db
||rowdata = self.rowdata,
name = "kojo-kbn",
parameter1 = parameter0,
parameter2 = "",
parameter3 = "",
parameter4 = "",
parameter5 = "",
memo = "工場区分"
}
|| ローカルストレージからデータを取得する
def con={StorageConnection.open "ukeirekensadb"}
def storage=con.storage asa RdbStorage
|| SQL(select)を実行
def rows:{Array-of RdbRow} = {storage.execute-query "SELECT * FROM PARAMETERTABLE"}

|| execute-querynの結果のRdbRow配列の先頭(0番目)を取り出す
def index:int = 0
def (r:RdbRow, found?:bool) = {rows.get-if-exists index}
{if found? then
|| RdbRowよりカラム"COL1"の値を取得
def col1-value:String = {r.get-String "PARAMETER1"}
|| 取り出した値より文字列を生成
def out-string:String =
{format
"RDB PARAMETERTABLE PARAMETER1=%s",
col1-value
}
|| TextFlowBoxの文字列を入れ替え
{self.lbl-kojoname.clear}
{self.lbl-kojoname.add
out-string
}
}
}
}



RE: ローカルストレージのデータを取得する方法 - dice256 - 04-27-2016

>TextFlowBoxには「RDB PARAMETERTABLE」と出力されてしまいます。

コードを拝見した限りでは、値が取れていなくても少なくとも「RDB PARAMETERTABLE PARAMETER1=」と
表示されるはずなのですが、表示幅が足りていなかったりしないでしょうか?

表示の問題ではなく、RdbRow の get-Stringメソッドで値が取れていない場合はデバッグが必要そうなので、
まずは、下記の処理で取得した値を出力して取れているか見てはいかがでしょうか。
(Curlなら {dump}、Caedeなら{popup-message}が簡単?)

1. RdbStorage.execute-queryで取得したrowsの件数
→この件数が0の場合、登録処理やテーブル名に誤りがないか見直すとよいかも

出力のコード例: {popup-message {String rows.size}}

2. RdbRow.get-Stringで取得した文字列
→空文字が取れた場合は指定しているカラム名の誤りなどの可能性?





RE: ローカルストレージのデータを取得する方法 - chiba - 04-28-2016

ご回答ありがとうございます。
教えていただいたデバッグ方法でデバッグしたところ、out-stringの値は「RDB PARAMETERTABLE PARAMETER1=1」
等区分の値が正常に取れていました。
col1-valueの値に「1」等の区分がセットされていましたので、TextFlowBoxに区分を書き込む記述を下記のように変更したところ、正常に区分をTextFlowBoxに表示させることが出来ました。
|| TextFlowBoxの文字列を入れ替え
{self.lbl-kojoname.clear}
{self.lbl-kojoname.add
col1-value
}
大変勉強になりました。これで解決いたしました。
ご教授ありがとうございました。