質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

3回答

4692閲覧

SQLのデータの書き換えをid指定してテキストボックスの値を用いて書き換えたい

ppy

総合スコア8

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2016/08/09 17:55

編集2016/08/10 06:31

お菓子の在庫管理を行うためのシステムを作っています
最終的に達成したいことはJavaScriptで読み込んでいる以下の様なSQL


お店 情報 商品 在庫 増減
新宿 セール品 チョコ 20 (テキストボックス) 反映(ボタン)
新宿 新商品 アメ 30 (テキストボックス) 反映(ボタン)
渋谷 新商品 ラムネ 40 (テキストボックス) 反映(ボタン)


においてリスト上で数値をテキストボックスへ入力して、ボタン押下で在庫の数に増減を反映させることです。
読み込むSQLのIDに関連付けて、数値を反映させようと試みているのですが、うまく指定できていないためか数値の増減の反映先がずれてしまいます。

また現在、このリストに対して、商品名や新商品などで検索を行うことができ、出力する情報を限定することが出来るのですが、それによっても指定先がずれてしまいます。
行ごとに情報を固定し、出力のされ方などに左右されずに増減をリストの在庫数に反映させたいと考えています。

上記リストは複数のcsvファイルを結合したものを読み込んでいます。結合に使ったファイルはそれぞれ以下の通りです。
###CSVファイル
[STOCK] [ITEM]
ID ITEM SHOP ZAIKO ID EVENT SYOUHIN
1 1 1 20 1 1 チョコ
2 2 1 30 2 2 アメ
3 2 2 40 3 2 ラムネ

[EVENT] [SHOP]
ID TEXT ID NAME
1 セール品 1 新宿
2 新商品 2 渋谷
3 限定品

(増減管理用のcsvとして)
[TRANS]
ID STOCK NUM ZAIKO
1 1 20
2 2 30
3 3 40

また、HTML及びそれに関連づいたJavaScriptは以下の通りです。
###HTML

<div class ="formgroup"> <label> 商品</label> <input name="foo" type="text"> <table> <thead> <tr> <th>店舗</th> <th>情報</th> <th>商品</th> <th>在庫</th> <th>増減</th> </tr> </thead> <tbody id="tbody"></tbody> </table>

###JavaScript

//sqlの結合 var sql = ' SELECT*FROM stock JOIN shop ON shop.id = stock.shop JOIN item ON item.id = stock.item JOIN event ON event.id = item.event WHERE item.syouhin LIKE? '; //リスト内の検索 var foo = $.url().param('foo')||''; $('input[name="foo"]').val(foo) var lobs = alasql(sql,[foo+'%']) //csvの出力 var tbody = $('#tbody'); for(var i=0, i<lobs.length; i++){ var lob =lobs[i] //行をクリックするとそのidに対応した詳細ページに移動します詳細ページは割愛しています。 var tr = $('<tr data-href = "data.html?id=' + lob.stock.id + '"></tr>'); tr.append('<td>' + lob.shop.name + '</td>'); tr.append('<td>' + lob.event.text + '</td>'); tr.append('<td>' + lob.item.syouhin + '</td>'); tr.append('<td>' + lob.stock.zaiko + '</td>'); tr.append('<td input type=number name=number id=update></td>'); //各行にidに紐づいた形で反映させるボタンを作りたいのですが、コードがあやふやです。 tr.append('<td><button type=submit></button>保存</td> '); //増減反映 $('#update').on('click', function() { var num = parseInt($('input[name="number"]').val()); alasql('UPDATE stock SET zaiko = ? WHERE id = ?', [ zaiko + num, lob.stock.id ]); var trans_id = alasql('SELECT MAX(id) + 1 as id FROM trans')[0].id; alasql('INSERT INTO trans VALUES(?,?,?,?)', [ trans_id, lob.stock.id, num, zaiko + num ]); }); //行をクリックすると詳細ページへ移行させる $('tbody >tr').css('cursor','pointer').on('click',function(){ window.location = $(this).attr('data-href') })

開発環境は
OSはWindowsで、eclipseを用いています。
使用言語はmysql、javascript、JQueryを扱っています。
phpやajaxは使用できません。

開発経験が浅く、学び始めたばかりで伝わらないことも多くあるかと思いますが、助言の方よろしくおねがいいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

いくつか気になった点を書いていきます。

  • mySql と書いているが AlaSql なのでは。

tr.append('<td input type=number name=number id=update></td>');
について、

  • tdの内容が空なのでクリックできないのでは。

tdの中に文字を配置するか、ボタンを配置してそのクリックイベントを拾う形の方がいいでしょう。
ただし現状クリックできていて困っていないなら無視してもらって平気です。

  • updateをidとしているが、これでは id=update な要素が複数出現する

同一idの要素はHTML内に1つにする必要があります。
classにupdateとしておいて".update"で拾う方が良いでしょう。

  • どのstock.idか残していない

残してなくてもできなくはないですが、このtd(ボタンに変えたならボタン)にdata-idなどの属性をつけて、lob.stock.idを残しておくとやりやすいと思います。
設定したdata-idは clickのfunctionの中で $(this).attr('data-id') で拾えるかと思います。

投稿2016/08/09 23:17

flied_onion

総合スコア2604

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ppy

2016/08/10 04:20

回答ありがとうございます。 すみません。alasqlでした。訂正します。 早速以下のようにコーディングしてCSV出力のところへ付け加えました。 tr.append('<td input type=number  name=number ></td>'); tr.append('<td data-id=' + lob.stock.id + '><button type=submit class=update>保存</button></td>'); $('tbody > td').on('click',function(){ $(this).attr('data-id') }) ボタンを押すと入力数値で在庫数を増減させたいのですがうまく動きません。 id指定からclass指定にすると、数値増減ができなくなる。(ボタンが反応しない。) id指定だと出力している行数の最大値がidの値になってしまう。上記なら3行なのでid=3。 デバッグしてみると、data-idはそれぞれのidの値を持っているようなんですが、コーディングがおかしいのでしょうか?
flied_onion

2016/08/10 12:25

click functionの中に $(this).attr('data-id') しかないようですが、変数に入れるなどして利用してください。 data-idを通じて値をとれるだけですので、それを使う処理は別途書く必要があります(もともと updateクリックのfunctionで stock.idがわからないことに困っていたと思ってたので)
guest

0

alasqlから出力されたものが手元に無いため、検証していませんが、組むならこういう感じかなと思います。(lobsをJSON.stringify()したものを追記いただければもう少し具体的な検証が出来ると思います)

JavaScript

1var tbody = $( '#tbody' ); 2for (var i = 0, i < lobs.length; i++) { 3 var lob = lobs[i] 4 5 var tr = $('<tr data-href = "data.html?id=' + lob.stock.id + '"></tr>'); 6 tr.append('<td>' + lob.shop.name + '</td>'); 7 tr.append('<td>' + lob.event.text + '</td>'); 8 tr.append('<td>' + lob.item.syouhin + '</td>'); 9 tr.append('<td>' + lob.stock.zaiko + '</td>'); 10 tr.append('<td><input type=number name="number"></td>'); 11 tr.append('<td><button data-id="' + lob.stock.id + '" data-zaiko="' + lob.stock.zaiko + '">保存</button></td> '); 12 tbody.append( tr ); 13} 14tbody.on( 'click', 'tr, button', function( e ) { // 追加された要素にも対応できる書き方 15 //console.log(e.currentTarget, e.target); 16 if ( e.target.tagName.toLowerCase() === 'input' ) { 17 // input要素を編集するときにページ移動してしまわないようにしている 18 e.stopPropagation(); 19 return; 20 } 21 if ( e.target.tagName.toLowerCase() === 'button' ) { // ボタンを押すときの処理 22 e.stopPropagation(); 23 var button = $( e.target ); 24 var tr = button.parents( 'tr' ); 25 var num = parseInt( tr.find( 'input[name="number"]' ).val(), 10 ); 26 var id = button.attr( 'data-id' ); 27 var zaiko = parseInt( button.attr( 'data-zaiko' ), 10 ); 28 29 console.log( 'bt:', zaiko + num, id ); 30 31 alasql('UPDATE stock SET zaiko = ? WHERE id = ?', [zaiko + num, id]); 32 var trans_id = alasql('SELECT MAX(id) + 1 as id FROM trans')[0].id; 33 alasql('INSERT INTO trans VALUES(?,?,?,?)', [trans_id, id, num, zaiko + num]); 34 } 35 // クリックイベントは伝播するのでそれを拾う。 36 if ( e.currentTarget.tagName.toLowerCase() === 'tr' ) { 37 console.log( 'tr:', $( this ).attr( 'data-href' ) ); 38 window.location = $( this ).attr( 'data-href' ); 39 } 40} );

投稿2016/08/11 12:44

kei344

総合スコア69400

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

JavaScrptでSQLを取り扱うのはブラウザから容易にクエリを書き換えることができるためとっても危険なのですが……。

それはさておき、
質問者さんのような事態を回避する方法として、
多いのはデータ取得時に主キー(更新時に利用するキー)も合わせて取得しておき、
隠しフィールド(hidden)などに各行データ毎の在庫IDを保存しておき、
更新時にその更新キーを用いて更新する方法が簡単かと思います。

###追記
見慣れないコードがあるなと調べてみたら、
MySQLでなくAlasqlというものを利用してるですね。

冒頭の危険云々の件はスルーしてください、すみません^^;

投稿2016/08/09 23:24

編集2016/08/09 23:42
Panzer_vor

総合スコア1636

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ppy

2016/08/15 00:16

すみません、自分がmysqlとalasqlを混同していたのが原因です。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問