HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0816
イナウサsqleleについて7解決


イナウサ

リンク

2017/8/16(Wed) 15:54:47|NO.80974

data_baceとういテーブルにID,B,Cというカラムがあります。
そこから変数Aに最も近い数[カラムB]の値とそれの[カラムC]の値を抽出し「B= / C= 」
のような感じで表示したい。ある程度書いてみたのですがエラーが出ます。
問題点を見つけていただけるとありがたいです。

#include "sqlele.hsp" ; データベースファイル「sample.db」を開く (ファイルが無ければ作成されます) sql_open "data_bace.db" ;「MemoTable」テーブルを作成 (すでにテーブルがあれば作成されません) sql_q "CREATE TABLE IF NOT EXISTS data_bace (ID INTEGER PRIMARY KEY, B, C)" A=100 sql_q "SELECT [C] , [B] FROM [data_bace] WHERE abs([B] - " + A + ")= (SELECT min(abs([B] - " + A + ")) FROM [data_baceX]) ORDER BY [B] ;" cls 4:pos 0,0:color 255,255,255:mes "B = " + sql_v("B") + " / C = " + sql_v("C")+""
お願いします



この記事に返信する


strongest

リンク

2017/8/18(Fri) 09:17:03|NO.80997

11行目のSQL構文が間違っています。

・カラム名やテーブル名は [ ] で囲まずに、シングルクオーテーションあるいは
ダブルクオーテーションで囲んでください(通常は囲む必要もありません)。

・data_baceXというテーブルが存在しないのに参照しています。

したかったことをSQLで書くと、以下のようになります。

sql_q "SELECT b,c FROM data_bace ORDER BY abs(b-"+A+") ASC LIMIT 1"



イナウサ

リンク

2017/8/19(Sat) 12:46:37|NO.81009

このような感じでしょうか?しかしオーバーフローとエラーが出ます。

#include "sqlele.hsp" ; データベースファイル「sample.db」を開く (ファイルが無ければ作成されます) sql_open "data_bace.db" ;「MemoTable」テーブルを作成 (すでにテーブルがあれば作成されません) sql_q "CREATE TABLE IF NOT EXISTS data_bace (ID INTEGER PRIMARY KEY, B, C)" A=100 sql_q "SELECT B,C FROM data_bace ORDER BY abs(B-"+A+") ASC LIMIT 1" cls 4:pos 0,0:color 255,255,255:mes "B = " + sql_v("B") + " / C = " + sql_v("C")+""



strongest

リンク

2017/8/20(Sun) 17:58:36|NO.81023

データが存在しないのに sql_v を実行すれば、エラーが発生します。
乱数をセットしたテーブルを元に実行するよう改造したものが以下になります。

#include "sqlele.hsp" ; データベースファイル「sample.db」を開く (ファイルが無ければ作成されます) sql_open "data_bace.db" ;「MemoTable」テーブルを作成 (すでにテーブルがあれば作成されません) sql_q "drop table if exists data_bace" sql_q "CREATE TABLE IF NOT EXISTS data_bace (ID INTEGER PRIMARY KEY AUTOINCREMENT, B, C)" sql_q "begin" repeat 1000 sql_q "insert into data_bace(B,C) values("+str(rnd(256))+","+str(rnd(256))+")" loop sql_q "commit" A=100 sql_q "SELECT B,C FROM data_bace ORDER BY abs(B-"+A+") ASC LIMIT 1" cls 4:pos 0,0:color 255,255,255:mes "B = " + sql_v("B") + " / C = " + sql_v("C")+""

あと、細かい点ですが、database であって databace ではありません。
英語を用いるなら正しく用いるクセをつけましょう。



イナウサ

リンク

2017/8/22(Tue) 17:44:25|NO.81061

追加質問です。すみません

sql_q "UPDATE data_base SET "+C+"=100 [WHERE "+B+"=200];"
の文を上の制作して頂いたスクリプトに付け足すのですがどこが間違っていますか?



さか

リンク

2017/8/22(Tue) 21:15:11|NO.81066

CやBの値のカラムがdata_baseにあるなら文法的には間違っていないと思いますが。
エラーになるとしたら"[WHERE "+B+"=200]"の[]が不要じゃないですか?
あとはCやBの値のカラムの型がtextとしたら'200'としないとエラーになるかな。
あとwhereがないので全件更新してしまいますよ。

プログラムでいちいちSQL文のエラーを探すのは手間なのでSQLツールを使うことを
お勧めします。
ツールで動くことを確認してからプログラムに反映する方が効率良いです。

SQLツールとしては色々ありますが自分はa5m2を使用してます。
https://matome.naver.jp/odai/2140298484453601401
http://a5m2.mmatsubara.com/



さか

リンク

2017/8/22(Tue) 21:16:41|NO.81067

あー、すみせん、whereありますね。(^^;



イナウサ

リンク

2017/8/23(Wed) 00:49:14|NO.81074

さかさんがおっしゃった通り

sql_q "UPDATE data_base SET C=100 WHERE B='200';"
で、できました



ONION software Copyright 1997-2023(c) All rights reserved.