Re:SALOON & VBA

しばらくは、過去BBSの倉庫、および
作成した EXCEL VBA の置き場(公開)として

Entry Point List

2018-08-29 20:52:12 | Weblog
当ブログは、非活発です。(2009年より)
しかし、過去ログの閲覧が今尚あり驚いております。
ので、折角の御訪問を感謝し、以下にエントリーポイントをまとめます。

閲覧頂いている主な記事(入口)

Re:SALLON BBSの倉庫として
 あるドラマのファンサイトの掲示板(SALOON)のログ再録

EXCEL VBA と PL/SQL の保管庫として
 休職中(求職中)の課題の成果の掲示

塚原将という詩人

写真日記 

夢日記

スタートレック視聴日誌草稿

コメントは、受け付けております(Welcome)が、
掲載は許可制で(承認されるまでコメントは反映されません。)
滅多にない(ほぼない)ことなので、気づかずに反応は遅れます。
あしからず。
Comment (1)

Re:SALLON BBSの倉庫として

2018-08-29 20:50:29 | Saloon


2001年の4月末から、2005年の正月ぐらいまで
とあるアメリカのドラマのファンサイトの掲示板を設けておりました。
2005年頃、ブログ、SNSとメディアも変遷し
すでに掲示板は、時代遅れになりつつありました。
実際、掲示板開設末期はスパムという書き込みが大半を占め(削除が管理の実態という有様で)
私自身もmixiの方の書き込みが多くなり、
その後掲示板はアクセスせず放置の状態で
気づいたら、掲示板も運営会社の機能閉鎖で亡失してしまいました。

多くの方々に書き込んでいただいたものですし、
私自身、一時期は本当に熱心に運営(?)しておりましたので、
もう、記事が追加されることはありませんが、こうして過去ログをブログに貼り付けて
再録することにしました。
gooブログの機能として、投稿日時は変更可能なので当時の日付で・・・

関係された方が少しでも「懐かしいなぁ~」と思っていただけたら嬉しいかなと・・・ということで。

SALOON先頭記事は、↓

http://blog.goo.ne.jp/frontflug/c/292f46256d280983031d40995165f09d/73

掲示板の記録なので、時系列で先頭が、一番奥です。
逆に(後ろから下から)読んでいかないと流れがつかめません、スミマセン

SALOONは、全部で74ページあります。
(アドレスの最期の/73 の数字"73"がページの -1 を示しています。)

最期のページ(このページ)と、
1ページ前↓
http://blog.goo.ne.jp/frontflug/c/292f46256d280983031d40995165f09d/1
は、書き写すのに疲れてしまって(飽きてしまってともいう)
コメントを集積して転載しているので、量が多いです。すみません。
※最初は、書き込みごとに記事を分けていたので、レスが開かないとみれない場合があります。

2002/1/1
2003/1/1 を含むページ
2004/1/1 を含むページ
2005/1/1 を含むページ

初めてここに辿り着かれて、
ああ、懐かしい
そして何か言いたいという奇特なお方は、

西部二人組普及促進委員会 トピック
http://mixi.jp/list_bbs.pl?id=110964&type=bbs
に是非お越しください。

ここにコメントされても、滅多に見に来ませんので(ほったらかし状態です)気づくのが遅れます。
悪しからず!
Comments (2)

EXCEL VBA と PL/SQL、Javascript の保管庫として

2018-08-29 20:48:22 | EXCEL VBA
休職中(無職期間で求職中)の学習結果を掲載します。(2014年5~6月、2016年2~7月、2018年5月)
そして、稀に追加・更新しています。

※この一覧の投稿日付は、カテゴリーの先頭に記事が来るように、都度更新しています。

休職中に、掲載することを目的に、学習してたという言い方が正しいかも知れませんね。
日々の張りというところでしょうか?目に見えない成果だとグダグタになってしまいます。

何かをなす余裕もないのですが、かといって何もしないでは長すぎる日々ですので。
もしこれが少しでも誰かの参考になれば、甲斐があるというものです。

EXCEL VBAの諸先達各位のサンプルサイトを参考にして作成しているので、
どこかでみたなというソースになっているかも知れません。

説明もロクにつけて無くて、参考にして頂くにもそもそもある程度の知識が必要で
多分、誰の勉強にはならない(陳腐に見えるかも)とも思うのですが、
サンプルサイトのツールよりは、実際寄りで(その分汎用性は低い)
こういうのもありかもと誰かの可能性(ヒント)を広げられる一助(キッカケ)になれば・・・
と(完成度は低いですが)。
同行の志を求めております。(勿論、無職者であることが条件ではありませんので、どうか)
よろしければコメント下さい。

注)ソースの修正は、コメントで入れてたりしています(本記事の差し替えでなく)

画像一覧の画像表示(EXCEL VBA)
スポットライト画像コピーマクロ(EXCEL VBA)
壁紙にカレンダー(EXCEL VBA)

Node.js/Oracle版 読書履歴管理システム①
Node.js版 読書履歴管理システム①
HTA版 読書履歴管理システム①

VBA 汎用SQL実行ツール Ver.2
VBA 汎用SQL実行ツール
VBA ORACLE一括登録ツール

ACCESS版 SQL実行(EXCEL VBA)

ORACLE 簡易検索ツール(EXCEL VBA)…前半
ORACLE 簡易検索ツール(EXCEL VBA)…後半

ACCESS 簡易検索ツール(EXCEL VBA)…前半
ACCESS 簡易検索ツール(EXCEL VBA)…後半

ORACLE テーブル一覧表作成(EXCEL VBA)

ORACLE 全角チェッカー(EXCEL VBA)

全シートのテキスト出力マクロ(EXCEL VBA)

テキスト分割マクロ(EXCEL VBA)

不要名前定義の削除マクロ(EXCEL VBA)

セル幅高さの調整マクロ(EXCEL VBA)

UTF8 CSVファイルの変換マクロ(EXCEL VBA)
ORACLE DB(UTF8) から EXCELダウンロード

EXCEL VBA 文字コード表作成
HTA版   文字コード表作成

ORACLE 住所分解コード化ツール(EXCEL VBA)…前半
ORACLE 住所分解コード化ツール(EXCEL VBA)…後半

ACCESS 住所分解コード化ツール(EXCEL VBA)…前半
ACCESS 住所分解コード化ツール(EXCEL VBA)…後半

ORACLE 住所分解コード化ツール(PL/SQL)

ORACLE 住所分解コード化ツール(PL/SQL)の分割

ORACLE 住所分解コード化ツール(EXCEL VBA)…分割PL/SQLの呼び出し

ORACLE 住所分解コード化ツール(PL/SQL)のパッケージ化

HTA版 住所分解コード化ツール
HTA版 住所分解コード化ツール CSV入力版
HTA版 住所分解コード化ツール CSV入力EXCEL出力版

Excel VBA 簡易版 住所分解コード化ツール …HTA版EXCEL出力と同じロジック
AccessVBA 簡易版 住所分解コード化ツール …↑EXCEL VBAと同じロジック

ORACLE 住所マスタを作成する(PL/SQL)

ORACLE 郵便番号を更新する(PL/SQL)

ORACLE 郵便番号更新を分割する(PL/SQL)

ORACLE 郵便番号更新を高速化する(PL/SQL)

ORACEL 郵便番号更新を高速化する(EXCEL VBA)

ORACLE 住所マスタを登録する(PL/SQL(郵便番号は除く))

ORACLE 住所マスタを作成する(ストアドプロシージャ)…前半
ORACLE 住所マスタを作成する(ストアドプロシージャ)…後半

ORACLE 住所分解コード化処理の高速化

【番外】
Java版 Oracle⇒CSV(SQL実行)ツール

JavaScript版 Oracle⇒Web & CSV ツール
JavaScript版 Oracle SQL ツール 改良版
JavaScript版 EXCEL VBA起動 ←コメントで、HTA版に改造したものも投稿
HTA版 Oracle TABLE展開ツール

VBScript版 Oracle⇒CSVツール

HTA + Javascript 問合せ票管理
HTA + Javascript 問合せ票管理 Ver.2
HTA + Javascript 問合せ票管理 Ver.3

HTA + Javascript レストラン予約システム①(マスタ編)
HTA + Javascript レストラン予約システム②(予約編)
HTA + Javascript レストラン予約システム③(予約編)のjQuery 化の修正(部分)

HTA + Javascript レストラン予約システム④(合体版)

HTA + Javascript 歯科医院予約システム


【お願い】
住所マスタ作成系の処理を参考にされて、気付かれた不具合、改善可能箇所のご指導等
ありましたら、コメント頂けると嬉しいです。
叩かれ弱いですが、建設的、好意的な意見には尊重(尊敬)いたします。
コード化ツールで京都の通名とか、番地の漢数字表記、合地番地、番地のような方書など
未対応の部分の多いのは、今後の課題です。
ヒントを頂けたり一緒に考えていただけるとすごく嬉しいです。
Comment

画像一覧の画像表示(EXCEL VBA)

2018-08-26 11:52:57 | EXCEL VBA
スポットライト画像コピーマクロの蛇足です。

一覧を表示しているので、
ファイル名を選択すると、横に画像が出てくるというのはどうかな
ということで、余分を付け足しました。



まさに、蛇足です。
フォルダに落としているのだから、
エクスプローラで、大きいアイコンで見ればいいだけのこと
大きな画像がちゃんと見たかったら、そこでダブルクリックすればいいし・・・

まあ、この技は、他に何かあったときの
転用のための備忘録です。(LoadPicture関数)

シート上に、ユーザーフォーム(Image1)を張り付けて
↓「¥」は、小文字に書き換えてください。

■ワークシートのモジュールで
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 If Target.Column <> 2 Then Exit Sub
 Dim y As Integer: y = Target.Row
 Dim x As Integer: x = Target.Column
 If Cells(y, x).Value <> "" Then
  If InStr(Cells(y, x).Value, "jpg") <> 0 Then
   Call Image1_Load(Cells(y, x).Value)
  End If
 End If
End Sub

Sub Image1_Load(imgFile As String)
 Image1.BorderStyle = fmBorderStyleNone '枠無し
 Image1.PictureSizeMode = fmPictureSizeModeZoom '画像の縦横比は保って表示
 
 Dim MyPath As String
 If Cells(4, 2).Value = "" Then
  MyPath = ThisWorkbook.Path & "¥" & imgFile
 Else
  MyPath = Cells(4, 2).Value & "¥" & imgFile
 End If
 
 If Dir(MyPath) = "" Then
  Image1.Picture = LoadPicture("")
 Else
  Image1.Picture = LoadPicture(MyPath)
  Image1.Width = 400
  Image1.Height = 225
 End If
End Sub

■スポットライト画像コピーマクロ(再掲)←最終形
Option Explicit

Private Declare Function GdiplusStartup Lib "gdiplus" ( _
                    ByRef token As Long, _
                    ByRef inputBuf As GdiplusStartupInput, _
                    ByVal outputBuf As Long) As Long
Private Declare Sub GdiplusShutdown Lib "gdiplus" ( _
                    ByVal token As Long)
Private Declare Function GdipLoadImageFromFile Lib "gdiplus" ( _
                    ByVal FileName As Long, _
                    ByRef image As Long) As Long
Private Declare Function GdipGetImageDimension Lib "gdiplus" ( _
                    ByVal image As Long, _
                    ByRef Width As Single, _
                    ByRef Height As Single) As Long
Private Type GdiplusStartupInput
  GdiplusVersion As Long
  DebugEventCallback As Long
  SuppressBackgroundThread As Long
  SuppressExternalCodecs As Long
End Type

Sub GetSpotLightImg()
 Dim buf As String
 Dim cnt As Long
 Dim newName As String
 
' 参照設定が必要(Windows Script Host Object Model)
 Dim oNetwork As New IWshRuntimeLibrary.WshNetwork
 Dim UsrId As String
 UsrId = oNetwork.UserName
 
 Dim Leng As Long
 If Cells(2, 2).Value = "" Then
  Leng = 450
 Else
  Leng = Cells(2, 2).Value
 End If
 
 Dim FromYmd As Date
 If IsDate(Cells(3, 2).Value) Then
  FromYmd = Cells(3, 2).Value
 Else
  FromYmd = "2016/01/01"
 End If
 
 Dim Path As String
 Path = "C:\Users\" & UsrId & "\AppData\Local\" _
 & "Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets\"
 
 Dim MyPath As String
 If Cells(4, 2).Value = "" Then
  MyPath = ThisWorkbook.Path & "¥"
 Else
  MyPath = Cells(4, 2).Value & "¥"
 End If
 
 If Cells(6, 1).Value <> "" Then
  Cells(6, 1).Select
  Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
  Selection.ClearContents
  Cells(5, 1).Select
 End If
 
 buf = Dir(Path & "*.*")
 cnt = 5
 Do While buf <> ""
  If FileLen(Path & buf) >= Leng * 1000 Then
   If FileDateTime(Path & buf) > FromYmd Then
    If isYoko(Path & buf) Then
     cnt = cnt + 1
     newName = Right(buf, 10) + ".jpg"
     FileCopy Path & buf, MyPath & newName
     Cells(cnt, 1) = cnt - 5
     Cells(cnt, 2) = newName
     Cells(cnt, 3) = FileDateTime(Path & buf)
     Cells(cnt, 4) = FileLen(Path & buf)
    End If
   End If
  End If
  buf = Dir()
 Loop
 Shell "C:\Windows\Explorer.exe " & MyPath, vbNormalFocus
End Sub

Function isYoko(ByVal sImageFilePath As String) As Boolean
 Dim uGdiStartupInput As GdiplusStartupInput
 Dim nGdiToken As Long
 Dim nStatus As Long
 Dim hImage As Long
 isYoko = False
 Dim x, y As Single
 x = 0: y = 0
 uGdiStartupInput.GdiplusVersion = 1
 nStatus = GdiplusStartup(nGdiToken, uGdiStartupInput, 0&)
 If nStatus = 0 Then
  nStatus = GdipLoadImageFromFile(ByVal StrPtr(sImageFilePath), hImage)
  If nStatus = 0 Then
   nStatus = GdipGetImageDimension(hImage, x, y)
   If nStatus = 0 And x > y Then
    isYoko = True
   End If
  End If
  Call GdiplusShutdown(nGdiToken)
 End If
End Function
Comment

スポットライト画像コピーマクロ

2018-08-25 14:03:04 | EXCEL VBA
Win10 のログイン画面に、画像が表示されているが



あれを「スポットライト機能」というらしい。ロック画面とも・・・
↑気に入りましたか?とたまに訊いてくるやつ。

気に入ったら、ログイン画面だけでなく、
壁紙にしたいと思うと、→画像で取り込みたい。

ネットを検索すると、あの画像の格納場所やら
表示方法やら、教えてくれる。

また、「SpotBright」というダウンロードアプリもあるらしい。
まあ、それを使うのが一番簡単だけど、・・・

Excel VBA を使えば出来ないことはないかな・・・と

↓以下、作ってみました。



格納先のフォルダは、指定しないといけない。(カレントでいいなら省略可能)
ファイルサイズは、以上数値を選択できるようにした。
ファイル名が、暗号的に長いので、末尾10文字にした。

で、いつものようにVBAソースを張り付けて投稿したら

お客様のリクエストはNTTレゾナントのセキュリティポリシーにより拒否されました。

The Request was rejected by our security policy.


[Go Back]」
と出て拒否られる。

プログラムソースの投稿は、出来ないということなんやろか?
危険なキーワードがあるんやろか?
ネットで拾ってきたソースの寄せ集めなんじゃが・・・
ので、折角なので画像で↓




やれやれ・・・(トホホ)あんまり、意味ないなぁ~画像では・・・(利用しずらい)
※gooブログ10数年使って、来たのになぁ~
追伸、コメントに、ダメな部分を除いて再投稿しました。

さて、ソースの方も、残念な点はあり↓
作成年月で、絞り込みたかったけど、日付の取り込みがうまくいかず断念。

また、縦長か横長か、選択できるようにもしたかったけど、
画像を取り込まないと、難しいようなので、これも断念。
Comments (4)

JAVA使いへの道④

2018-08-18 18:31:09 | Java
JAVA使いへの道③での予告通り
今回は(って連載記事めいてきたけど)、更新機能の実装をしました。

なので、画面イメージはありません。
画面の見た目は全然変更なしなので・・・
でも、背後では更新機能のためにいろいろ変えてはいますよ。

今回苦労したのは、日本語コード(文字化け)とnull値の扱い(画面とSQLで、NULLが違う)ですね。
ソースを見ると、そんなもん、って感じですが、
ここまで来るのに、えんやこら(異常終了→デバッグ→ネット検索)でどっこいしょ。

正規の学習方法なし
のネット学習なので、そこは辛いところです。(モザイク、拾い喰い、体系的でない)

で、以下↓

■/workspace/BOOKLOG/WebContent/BookUpdJSP.jsp
<%@ page import="java.sql.*, BOOKLOG.DbAccess"
  contentType="text/html; charset=UTF-8" %>
<%
// 内容: データベースにアクセスする
// DbAccess のインスタンスを生成する
DbAccess db = new DbAccess();
// データベースへのアクセス
db.open();
//読書履歴を取得
String id13 = request.getParameter("isbn");
String sql = "SELECT booklog.*,to_char(GetDate,'YYYY-MM-DD') GDATE,"
      + "to_char(IssueDate,'YYYY-MM-DD') IDATE,"
      + "to_char(ReadDate,'YYYY-MM-DD') RDATE FROM booklog"
      + " Where ISBN13 = '" + id13 + "'";
ResultSet rs = db.getResultSet(sql);
//取得された結果に対しての処理
String id10   = null;
String title  = null;
String author  = null;
String publi  = null;
String gdate  = null;
String stat   = null;
String genr   = null;
String idate  = null;
String rdate  = null;
String tosyokan = null;
String gaiyo  = null;
String kanso  = null;
String imgFile = null;
String selHTML1 = null;
String selHTML2 = null;
String imgHTML = null;
int nedan = 0;
int syoyu = 0;
if (rs.next()) {
id10   = rs.getString("ISBN10");   if (id10  == null){ id10 = ""; }
title  = rs.getString("BookName");
author  = rs.getString("Author");   if (author == null){ author = ""; }
publi  = rs.getString("Publisher");  if (publi == null){ publi = ""; }
gdate  = rs.getString("GDATE");    if (gdate == null){ gdate = ""; }
stat   = rs.getString("State");
genr   = rs.getString("Genre");    if (genr  == null){ genr = ""; }
idate  = rs.getString("IDATE");    if (idate == null){ idate = ""; }
rdate  = rs.getString("RDATE");    if (rdate == null){ rdate = ""; }
nedan  = rs.getInt("Purchase");
syoyu  = rs.getInt("Ownership");
tosyokan = rs.getString("Library");   if (kanso == null){ kanso = ""; }
gaiyo  = rs.getString("Overview");  if (gaiyo == null){ gaiyo = ""; }
kanso  = rs.getString("Impressions"); if (kanso == null){ kanso = ""; }
imgFile = rs.getString("CoverImg");
// SELBOXの設定
if (stat.equals("未読")) {
  selHTML1 = "<option value='未読' selected>未読</option>"
      + "<option value='読書中'>読書中</option>"
      + "<option value='読了'>読了</option>";
} else if (stat.equals("読書中")) {
  selHTML1 = "<option value='未読'>未読</option>"
      + "<option value='読書中' selected>読書中</option>"
      + "<option value='読了'>読了</option>";
} else {
  selHTML1 = "<option value='未読'>未読</option>"
      + "<option value='読書中'>読書中</option>"
      + "<option value='読了' selected>読了</option>";
}
if (syoyu == 1) {
  selHTML2 = "<option value='1' selected>購入</option>"
      + "<option value='0'>非購入</option>";
} else {
  selHTML2 = "<option value='1'>購入</option>"
      + "<option value='0' selected>非購入</option>";
}
// 画像の設定
if (imgFile == null){
  imgFile = "";
} else {
  imgHTML = "<img width='250' src='C:/Users/TestUser/Pictures/BOOKLOG/" + imgFile + "'>";
}
}
// データベースへのコネクションを閉じる
db.close();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>読 書 履 歴 更 新</title>
<style>
 body{
  background-color:#80ff80;
  background:linear-gradient(to right, #00008B, #8080FF);
  font-family: "メイリオ";
  font-size:11pt;
 }
 input {border:none; height:23px; }
 input.minText { width:100px; }
 input.mdlText { width:410px; }
 input.bigText { width:680px; }
 select {border:none; }
 textarea {border:none; }
</style>
<script type="text/javascript">
 <!--
  function check(){
   if (document.formU.action.value == "DEL") {
    var msg = "削除してもいいですか?";
   } else {
    var msg = "更新してもいいですか?";
   }
   if (window.confirm(msg)){          // 確認ダイアログを表示
    return true; // 「OK」時は送信を実行
   } else {     // 「キャンセル」時の処理
    window.alert('キャンセルされました');  // 警告ダイアログを表示
    return false; // 送信を中止
   }
  };
 // -->
</script>
</head>
<body link="red" vlink="red" alink="red">
<form name="formU" method="post" action="updateLog.jsp" onSubmit="return check()">
 <input type="button" value="一覧に戻る" onClick="location.href='./BookLogJSP.jsp'">
 <button type="submit" name="action" value="UPD">更新する</button>
 <button type="submit" name="action" value="DEL">削除する</button>
<table border="0" bgcolor="#00008B">
 <tr valign="top">
  <td>
  <table border="2" align="center" bordercolor="#00008B" cellspacing="2" cellpadding="2" align="left" style="margin:20px 0px;" bgcolor="#00008B">
   <tr bgcolor="#FFFFFF" bordercolor="#00008B">
   <td bgcolor="#E8FFE0" style="font-size:11pt"><b>ISBN-13</b><font size="1" color="#FF3366">※</font></td>
   <td align="center"><b><%= id13 %></b><input type="hidden" name="id13" VALUE="<%= id13 %>"></td>
   <td bgcolor="#E8FFE0"><a href="https://www.amazon.co.jp/dp/<%= id10 %>" target="_blank">ISBN-10</a></td>
   <td> <input name="id10" type="text" value="<%= id10 %>" onchange='check2(this);' class="minText"></td>
   <td bgcolor="#E8FFE0">状  況</td>
   <td> <select name="stat"><%= selHTML1 %></select></td>
   <td bgcolor="#DDFFEE">画  像</td>
   <td align="left"> <input name="imgFile" type="text" value="<%= imgFile %>"></td></tr>
   <tr bgcolor="#FFFFFF">
   <td bgcolor="#E8FFE0">書  名<font size="1" color="#FF3366">※</font></td>
   <td colspan="5"> <input name="title" type="text" value="<%= title %>" class="bigText"></td>
   <td rowspan="8" colspan="2" align="center"><%= imgHTML %></td></tr>
   <tr bgcolor="#FFFFFF">
   <td bgcolor="#E8FFE0">著  者</td>
   <td colspan="3"> <input name="author" type="text" value="<%= author %>" class="mdlText"></td>
   <td bgcolor="#E8FFE0">ジャンル</td>
   <td align="left"> <input name="genr" type="text" value="<%= genr %>"></td></tr>
   <tr bgcolor="#FFFFFF">
   <td bgcolor="#E8FFE0">出 版 社</td>
   <td colspan="5"> <input name="publi" type="text" value="<%= publi %>" class="bigText"></td></tr>
   <tr bgcolor="#FFFFFF">
   <td bgcolor="#EEFFDD">発 行 日</td>
   <td> <input name="idate" value="<%= idate %>" class="minText"></td>
   <td bgcolor="#E8FFE0">入 手 日</td>
   <td> <input name="gdate" value="<%= gdate %>" class="minText"></td>
   <td bgcolor="#EEFFDD">読 了 日</td>
   <td> <input name="rdate" value="<%= rdate %>" class="minText"></td></tr>
   <tr bgcolor="#FFFFFF">
   <td bgcolor="#DFDFFF">概  要</td>
   <td colspan="5"> <input name="gaiyo" type="text" value="<%= gaiyo %>" class="bigText"></td></tr>
   <tr bgcolor="#FFFFFF">
   <td bgcolor="#DFDFFF">感  想</td>
   <td colspan="5" align="center"><textarea name="kanso" cols="85" rows="12"><%= kanso %></textarea></td></tr>
   <tr bgcolor="#FFFFFF">
   <td bgcolor="#E8FFE0">図 書 館</td>
   <td align="left"> <input name="tosyokan" type="text" value="<%= tosyokan %>"></td>
   <td bgcolor="#E8FFE0">所  有</td>
   <td> <select name="syoyu"><%= selHTML2 %></select></td>
   <td bgcolor="#EEFFDD">購入金額</td>
   <td> \ <input name="nedan" value="<%= nedan %>" class="minText">-</td>
   </tr>
  </table>
  </td>
 </tr>
</table>
</form>
</body>
</html>

で、更新処理のエンジン部分が以下↓
JSP で作成しましたが、本来は、Java Servletで実装すべきなのかも・・・と思いつつ
(だって、初心者なので、同じように書きたい・・・!)

■C:\workspace\BOOKLOG\WebContentupdateLog.jsp
<%@ page import="java.sql.*, BOOKLOG.DbAccess"
  contentType="text/html; charset=UTF-8" %>
<%
// 内容: データを更新・削除する
// DbAccess のインスタンスを生成する
DbAccess db = new DbAccess();
// データベースへのアクセス
db.open();
// エンコードの指定
request.setCharacterEncoding("utf-8");
// 入力された引数を取得する
String id13   = request.getParameter("id13");
String id10   = request.getParameter("id10");
String title  = request.getParameter("title");
String author  = request.getParameter("author");
String publi  = request.getParameter("publi");
String gdate  = request.getParameter("gdate");
String stat   = request.getParameter("stat");
String genr   = request.getParameter("genr");
String idate  = request.getParameter("idate");
String rdate  = request.getParameter("rdate");
String tosyokan = request.getParameter("tosyokan");
String gaiyo  = request.getParameter("gaiyo");
String kanso  = request.getParameter("kanso");
String imgFile = request.getParameter("imgFile");
String syoyu  = request.getParameter("shoyu");
int nedan = 0;
if (! request.getParameter("nedan").isEmpty()) {
 nedan = Integer.parseInt(request.getParameter("nedan"));
}
// 読書履歴を更新
String sql = "";
if (request.getParameter("action").equals("DEL")) {
 sql = "DELETE Booklog Where ISBN13 = '" + id13 + "'";
} else {
 sql = "UPDATE booklog SET BookName = '" + title + "'";
 sql += ",ISBN10 = '"   + id10  + "'";
 sql += ",Author = '"   + author + "'";
 sql += ",Publisher = '"  + publi + "'";
 sql += ",Genre = '"    + genr  + "'";
 sql += ",Purchase = "   + nedan;
 sql += ",Library = '"   + tosyokan + "'";
 sql += ",Overview = '"  + gaiyo  + "'";
 sql += ",Impressions = '" + kanso  + "'";
 sql += ",State = '"    + stat   + "'";
 sql += ",CoverImg = '"  + imgFile + "'";
 sql += ",Ownership = "  + syoyu;
 if ((idate == "") || (idate == null)) {
  sql += ",IssueDate = NULL";
 } else {
  sql += ",IssueDate = to_date('" + idate + "','YYYY-MM-DD')";
 }
 if ((gdate == "") || (gdate == null)) {
  sql += ",GetDate = NULL";
 } else {
  sql += ",GetDate = to_date('"  + gdate + "','YYYY-MM-DD')";
 }
 if ((rdate == "") || (rdate == null)) {
  sql += ",ReadDate = NULL";
 } else {
  sql += ",ReadDate = to_date('" + rdate + "','YYYY-MM-DD')";
 }
 sql += " Where ISBN13 = '" + id13 + "'";
}
  db.execute(sql);
// データベースへのコネクションを閉じる
db.close();
// 一覧画面にリダイレクト
response.sendRedirect( "BookLogJSP.jsp" );
%>

★おまけ
DATA BASEは、ORACLE 12C ですが、
これが、プラガブル・データベースという厄介(? 本当は便利)なもの
OACLE のサービスは重いので、いつもは、停止しておいて
使う時だけ、サービス起動しています。
ついでに、プラガブル・データベースをオープン
で、↓以下のバッチファイルで、起動

■ORCLSTART.bat
@echo off
echo Oracleサービスを開始します
pause
net start OracleServiceORCL
net start OracleOraDB12Home1TNSListener
net start OracleOraDB12Home1MTSRecoveryService
net start OracleVssWriterORCL
echo Oracleサービスを開始しました
echo.
echo プラガブル・データベースを起動します
pause
set CONN=sys/oracle as sysdba
(
echo alter pluggable database PDBORCL open;
echo quit;
) | sqlplus %CONN%
Comment

JAVA使いへの道③

2018-08-15 20:05:07 | Java
JAVA使いへの道②で、一覧画面を出すところまで行きましたが、
今回は、一覧画面にリンクを張って、
ISBN-13をクリックすると、
更新画面を表示するところまで、行きました。

更新画面といっても、まだ、更新は出来ません。
表示するだけです。

特に、難しいところはありませんでしたが、
null の表示だけ、迷いました。
全項目、同じように「null」という表示をしたくないのですが、
全部(項目ごとに)、IF で確認して、""と置き換えるというダサさ(ダサ過ぎるでしょうが…)
フレームワークを使えば、やってくれるのかもしれませんが・・・

さて、
次の課題は、更新が出来るように・・・です。(次の休みに・・・)

■一覧画面


■更新画面



■\workspace\BOOKLOG\WebContent\BookLogJSP.jsp --------------------
import java.sql.Connection;
<%@ page import="java.sql.*, BOOKLOG.DbAccess"
  contentType="text/html; charset=UTF-8" %>
<%
// 内容: データベースにアクセスする

// DbAccess のインスタンスを生成する
DbAccess db = new DbAccess();

// データベースへのアクセス
db.open();

//読書履歴を取得
int pCnt = 0;
if (request.getParameter("page")!=null) {
  pCnt = Integer.parseInt(request.getParameter("page"));
}
String sql = "select * from(select rownum as row_id,ISBN13,BookName,Author";
sql += ",nvl(to_char(GetDate,'YY-MM-DD'),' ') GDATE,State from BOOKLOG order by GETDATE desc)";
sql += " where row_id between " + Integer.toString(pCnt * 10 + 1);
sql += " and " + Integer.toString(pCnt * 10 + 10);
ResultSet rs = db.getResultSet(sql);

//読書履歴一覧表示用のテーブル
String tableHTML = "<table border=0 bgcolor=\"FFFFFF\" style=\"margin:10px 20px;\">";
tableHTML += "<tr bgcolor=\"CCCCFF\">"
+ "<td colspan=3><b> 読 書 履 歴 管 理</b></td>"
+ "<td colspan=2 align=center>新規追加</a></td></tr>";
tableHTML += "<tr bgcolor=\"000080\" align=center>"
+ "<td><font color=\"white\">ISBN13</font></td>"
+ "<td><font color=\"white\">書名</font></td>"
+ "<td><font color=\"white\">著者</font></td>"
+ "<td><font color=\"white\">入手日</font></td>"
+ "<td><font color=\"white\">状態</font></td></tr>";
//取得された各結果に対しての処理
int lineCnt = 0;
while(rs.next()) {
lineCnt++;
String id = rs.getString("ISBN13");    // ISBN13を取得
String title = rs.getString("BookName"); // 書名を取得
String author = rs.getString("Author");  // 著者を取得
String gdate = rs.getString("GDATE");   // 入手日を取得
String stat = rs.getString("State");   // 状態を取得
// テーブル用HTMLを作成
tableHTML += "<tr bgcolor=\"E0F1FF\"><td>"
      + "<a href='http://localhost:8080/BOOKLOG/BookUpdJSP.jsp?isbn="
      + id + "'>" + id + "</a></td>" + "<td>" + title + "</td><td>"
      + author + "</td><td>" + gdate + "</td><td>" + stat + "</td></tr>";
}
tableHTML += "</table>";
String pagelink = "<font color=\"black\">";
if (pCnt > 0) {
pagelink += "・<a href='http://localhost:8080/BOOKLOG/BookLogJSP.jsp?page=";
pagelink += Integer.toString(pCnt - 1) + "'><PREV</a>";
}
if (lineCnt > 9) {
pagelink += "・<a href='http://localhost:8080/BOOKLOG/BookLogJSP.jsp?page=";
pagelink += Integer.toString(pCnt + 1) + "'>NEXT></a>";
}
pagelink += "・</font>";

// データベースへのコネクションを閉じる
db.close();
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>読 書 履 歴 管 理</title>
<style>
 body{
  background-color:#80ff80;
  background:linear-gradient(to right, #00008B, #8080FF);
  font-family: "メイリオ";
  font-size:13pt;
 }
</style>
</head>
<body link="red" vlink="red" alink="red">
<p>
<%= tableHTML %>
</p>
<p align=center><span style="background-color:black">
<%= pagelink %>
</span></p>
</body>
</html>

■\workspace\BOOKLOG\WebContent\BookUpdJSP.jsp --------------------
<%@ page import="java.sql.*, BOOKLOG.DbAccess"
  contentType="text/html; charset=UTF-8" %>
<%
// 内容: データベースにアクセスする

// DbAccess のインスタンスを生成する
DbAccess db = new DbAccess();

// データベースへのアクセス
db.open();

//読書履歴を取得
String id13 = request.getParameter("isbn");
String sql = "SELECT booklog.*,to_char(GetDate,'YYYY-MM-DD') GDATE,"
      + "to_char(IssueDate,'YYYY-MM-DD') IDATE,"
      + "to_char(ReadDate,'YYYY-MM-DD') RDATE FROM booklog"
      + " Where ISBN13 = '" + id13 + "'";
ResultSet rs = db.getResultSet(sql);

//取得された結果に対しての処理
String id10   = null;
String title  = null;
String author  = null;
String publi  = null;
String gdate  = null;
String stat   = null;
String genr   = null;
String idate  = null;
String rdate  = null;
String tosyokan = null;
String gaiyo  = null;
String kanso  = null;
String imgFile = null;
String selHTML1 = null;
String selHTML2 = null;
String imgHTML = null;
int nedan = 0;
int syoyu = 0;

if (rs.next()) {
id10   = rs.getString("ISBN10");   if (id10  == null){ id10 = ""; }
title  = rs.getString("BookName");
author  = rs.getString("Author");   if (author == null){ author = ""; }
publi  = rs.getString("Publisher");  if (publi == null){ publi = ""; }
gdate  = rs.getString("GDATE");    if (gdate == null){ gdate = ""; }
stat   = rs.getString("State");
genr   = rs.getString("Genre");    if (genr  == null){ genr = ""; }
idate  = rs.getString("IDATE");    if (idate == null){ idate = ""; }
rdate  = rs.getString("RDATE");    if (rdate == null){ rdate = ""; }
nedan  = rs.getInt("Purchase");
syoyu  = rs.getInt("Ownership");
tosyokan = rs.getString("Library");   if (kanso == null){ kanso = ""; }
gaiyo  = rs.getString("Overview");  if (gaiyo == null){ gaiyo = ""; }
kanso  = rs.getString("Impressions"); if (kanso == null){ kanso = ""; }
imgFile = rs.getString("CoverImg");

// SELBOXの設定
if (stat.equals("未読")) {
  selHTML1 = "<option value='未読' selected>未読</option>"
      + "<option value='読書中'>読書中</option>"
      + "<option value='読了'>読了</option>";
} else if (stat.equals("読書中")) {
  selHTML1 = "<option value='未読'>未読</option>"
      + "<option value='読書中' selected>読書中</option>"
      + "<option value='読了'>読了</option>";
} else {
  selHTML1 = "<option value='未読'>未読</option>"
      + "<option value='読書中'>読書中</option>"
      + "<option value='読了' selected>読了</option>";
}
if (syoyu == 1) {
  selHTML2 = "<option value=true selected>購入</option>"
      + "<option value=false>非購入</option>";
} else {
  selHTML2 = "<option value=true>購入</option>"
      + "<option value=false selected>非購入</option>";
}

// 画像の設定
if (imgFile == null){
  imgFile = "";
} else {
  imgHTML = "<img width='250' src='C:/Users/TestUser/Pictures/BOOKLOG/" + imgFile + "'>";
}
}

// データベースへのコネクションを閉じる
db.close();
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>読 書 履 歴 更 新</title>
<style>
 body{
  background-color:#80ff80;
  background:linear-gradient(to right, #00008B, #8080FF);
  font-family: "メイリオ";
  font-size:11pt;
 }
 input {border:none; height:23px; }
 input.minText { width:100px; }
 input.mdlText { width:410px; }
 input.bigText { width:680px; }
 select {border:none; }
 textarea {border:none; }
</style>
</head>
<body link="red" vlink="red" alink="red">
<form method="post" onSubmit="return check()">
<input type="button" value="一覧に戻る" onClick="location.href='http://localhost:8080/BOOKLOG/BookLogJSP.jsp'">
 <button type="submit" value="UPD" name="action">更新する</button>
 <button type="submit" value="DEL" name="action">削除する</button>
<table border="0" bgcolor="#00008B">
 <tr valign="top">
  <td>
  <table border="2" align="center" bordercolor="#00008B" cellspacing="2" cellpadding="2" align="left" style="margin:20px 0px;" bgcolor="#00008B">
   <tr bgcolor="#FFFFFF" bordercolor="#00008B">
   <td bgcolor="#E8FFE0" style="font-size:11pt"><b>ISBN-13</b><font size="1" color="#FF3366">※</font></td>
   <td align="center"><b><%= id13 %></b><input type="hidden" name="honno" VALUE="<%= id13 %>"></td>
   <td bgcolor="#E8FFE0"><a href="https://www.amazon.co.jp/dp/<%= id10 %>" target="_blank">ISBN-10</a></td>
   <td> <input id="amazonno" name="amazonno" type="text" value="<%= id10 %>" onchange='check2(this);' class="minText"></td>
   <td bgcolor="#E8FFE0">状  況</td>
   <td> <select name="jyokyo"><%= selHTML1 %></select></td>
   <td bgcolor="#DDFFEE">画  像</td>
   <td align="left"> <input id="gazoufile" name="gazoufile" type="text" value="<%= imgFile %>"></td></tr>
   <tr bgcolor="#FFFFFF">
   <td bgcolor="#E8FFE0">書  名<font size="1" color="#FF3366">※</font></td>
   <td colspan="5"> <input id="honmei" name="honmei" type="text" value="<%= title %>" class="bigText"></td>
   <td rowspan="8" colspan="2" align="center"><%= imgHTML %></td></tr>
   <tr bgcolor="#FFFFFF">
   <td bgcolor="#E8FFE0">著  者</td>
   <td colspan="3"> <input id="sakusya" name="sakusya" type="text" value="<%= author %>" class="mdlText"></td>
   <td bgcolor="#E8FFE0">ジャンル</td>
   <td align="left"> <input id="bunrui" name="bunrui" type="text" value="<%= genr %>"></td></tr>
   <tr bgcolor="#FFFFFF">
   <td bgcolor="#E8FFE0">出 版 社</td>
   <td colspan="5"> <input id="honya" name="honya" type="text" value="<%= publi %>" class="bigText"></td></tr>
   <tr bgcolor="#FFFFFF">
   <td bgcolor="#EEFFDD">発 行 日</td>
   <td> <input id="hakkoubi" name="hakkoubi" value="<%= idate %>" class="minText"></td>
   <td bgcolor="#E8FFE0">入 手 日</td>
   <td> <input id="iritebi" name="iritebi" value="<%= gdate %>" class="minText"></td>
   <td bgcolor="#EEFFDD">読 了 日</td>
   <td> <input id="yondahi" name="yondahi" value="<%= rdate %>" class="minText"></td></tr>
   <tr bgcolor="#FFFFFF">
   <td bgcolor="#DFDFFF">概  要</td>
   <td colspan="5"> <input id="gaiyou" name="gaiyou" type="text" value="<%= gaiyo %>" class="bigText"></td></tr>
   <tr bgcolor="#FFFFFF">
   <td bgcolor="#DFDFFF">感  想</td>
   <td colspan="5" align="center"><textarea name="kansou" cols="85" rows="12"><%= kanso %></textarea></td></tr>
   <tr bgcolor="#FFFFFF">
   <td bgcolor="#E8FFE0">図 書 館</td>
   <td align="left"> <input id="tosyokan" name="tosyokan" type="text" value="<%= tosyokan %>"></td>
   <td bgcolor="#E8FFE0">所  有</td>
   <td> <select name="shoyuu"><%= selHTML2 %></select></td>
   <td bgcolor="#EEFFDD">購入金額</td>
   <td> \ <input id="hondai" name="hondai" value="<%= nedan %>" class="minText">-</td>
   </tr>
  </table>
  </td>
 </tr>
</table>
</form>
</body>
</html>
Comment

JAVA使いへの道②

2018-08-11 22:13:41 | Java
その後、JSPの解説ページを波乗りしていたら
何だか簡単に出来そうなので、沖へと漕ぎ出しました。無謀。

で、参考にしたのは、

@IT アイティメディアの
Tomcatを使う「JSPプログラミング」(10):データベースと連携する
というページ。
ほぼ、そのまま参考、というか借用というか

こんどは、JavaとJSPで2種類
■\workspace\BOOKLOG\src\BOOKLOG\DbAccess.java
package BOOKLOG;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class DbAccess {
  private String driver;
  private String url;
  private String user;
  private String password;
  private Connection connection;
  private Statement statement;
  private ResultSet resultset;
  /**
   * コンストラクタ
   * @param driver ドライバー
   * @param url URL
   * @param user ユーザー名
   * @param password パスワード
   */
  public DbAccess(String driver, String url, String user, String password) {
    this.driver = driver;
    this.url = url;
    this.user = user;
    this.password = password;
  }
  /**
   * 引数なしのコンストラクタ
   * 既定値を使用する
   */
  public DbAccess() {
    driver = "oracle.jdbc.driver.OracleDriver";
    url = "jdbc:oracle:thin:@//localhost:1521/PDBORCL";
    user = "TESTUSER";
    password = "TESTPWD";
  }
  /**
   * データベースへの接続を行う
   */
  public synchronized void open() throws Exception {
    Class.forName(driver);
    connection = DriverManager.getConnection(url, user, password);
    statement = connection.createStatement();
  }
  /**
   * SQL 文を実行した結果の ResultSet を返す
   * @param sql SQL 文
   */
  public ResultSet getResultSet(String sql) throws Exception {
    if ( statement.execute(sql) ) {
      return statement.getResultSet();
    }
    return null;
  }
  /**
   * SQL 文の実行
   * @param sql SQL 文
   */
  public void execute(String sql) throws Exception {
    statement.execute(sql);
  }
  /**
   * データベースへのコネクションのクローズ
   */
  public synchronized void close() throws Exception {
    if ( resultset != null ) resultset.close();
    if ( statement != null ) statement.close();
    if ( connection != null ) connection.close();
  }
}

■\workspace\BOOKLOG\WebContent\BookLogJSP.jsp
<%@ page import="java.sql.*, BOOKLOG.DbAccess"
  contentType="text/html; charset=UTF-8" %>
<%
// 内容: データベースにアクセスする
// DBAccess のインスタンスを生成する
DbAccess db = new DbAccess();
// データベースへのアクセス
db.open();
// 読書履歴を取得
ResultSet rs = db.getResultSet("select ISBN13,BookName,Author from BOOKLOG");
// 読書履歴一覧表示用のテーブル
String tableHTML = "<table border=1>";
tableHTML += "<tr bgcolor=\"000080\"><td><font color=\"white\">ISBN13</font></td>"
  + "<td><font color=\"white\">書名</font></td>"
  + "<td><font color=\"white\">著者</font></td>";
// 取得された各結果に対しての処理
while(rs.next()) {
  String id = rs.getString("ISBN13");    // ISBN13を取得
  String title = rs.getString("BookName"); // 書名を取得
  String author = rs.getString("Author");  // 著者を取得
  // テーブル用HTMLを作成
  tableHTML += "<tr><td align=\"right\">" + id + "</td>"
       + "<td>" + title + "</td><td>" + author + "</td></tr>";
}
tableHTML += "</table>";
// データベースへのコネクションを閉じる
db.close();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>読 書 履 歴 管 理</title>
</head>
<body>
<p>
<%= tableHTML %>
</p>
</body>
</html>

たったこれだけ、簡単じゃん
と思ったところが・・・

実行してみると

java.lang.ClassNotFoundException

とエラーが出る。延々出る。全部英語だし、訳わからん。
ネットでまたまた延々、検索して、見つけた答えが、
JDBCドライバの置いてる位置が違うぞい・・というもの
JSPの方のフォルダのlib配下にないと読めん
ということらしい、言われてみればそうだけど・・・そんなん気付かんわ

で、それが解決したら今度は

Unsupported major.minor version 51.0

またまた、出ましたよ違うエラーが・・・(ガーン)
こっちも、ネットで延々、検索して
Javaのバージョンが古いわ、ぼけ
ということらしい・・・

Java7 にしてもダメ
じゃあ、Java8は・・・
やっぱりダメじゃん

と諦めかけたのだけど

TOMCATも、VERSIONが表示されていて
こっちも、Java8相当のやつに変えたら

↓出ました、出ました。やっとです。
(バージョンが古いだけでなく、不一致でも、出るエラー?かも・・・)



サーバは、TOMCATなので
http://localhost:8080/BOOKLOG/BookLogJSP.jsp
をURLに入れて
IEでも表示できました。やれやれ

表示も簡素だし、リンクも全然ないけど、まあ、それは次の課題(来週?)
Comment

JAVA使いへの道①

2018-08-11 12:04:57 | Java
世間は夏休みである。
やれ、海外旅行だ、やれ、海だ、レジャーだと浮かれている日本人の
なんと多いことか・・・

とはいうものの、単身赴任で、特に休みではないですが、
帰省せず、土曜日にアパートに籠っていると(猛暑なので外出しない)
とにかく暇で暇で仕方がない。(無趣味で吝嗇)
で、折角、仕事でJAVAを使うことになったこともあり(初心者)
Node.jsで作った「読書履歴管理システム」を
JAVAで動かしてみようかと思い立った。

まず、最初は、バッチで、ORACLE DBのデータ検索ができるところまで
(WEB化への道のりは遥かである。)
JAVA使いへの道その第一歩…「への道」と書くと、「ドラゴンへの道」が思い出される。(世代?)

↓参考にしたのは、
■大人になったら肺呼吸
2015/7/8 Eclipseで作るJavaからOracleに接続するサンプルプログラムCommentsAdd Star

↑このページは、プログラミングの調べもので検索すると、しょっちゅう(頻繁に)ヒットします。
キモ(世の中の趨勢)を掴んでいるんだろうな・・・
きっと、ページのアクセス数は、膨大だろうな・・・
と想像してしまいます。何はともあれ感謝。
老人になったら人工呼吸?

で、例に従って、物まねでプロジェクトを作成し



↓以下のソースを作成しました。(ほぼそのまま、DB名を変えただけ)

■\workspace\OracleApp\src\DataAccess.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DataAccess {

  public static void main(String[] args) {
    DataAccess dataAccess = new DataAccess();

    try {
      dataAccess.selectOracle();

    }  catch (Exception e) {
      e.printStackTrace();
    }
  }


public void selectOracle() throws Exception {

  // ユーザー名
  String user = "TESTUSER";
  // パスワード
  String pass = "TESTPWD";
  // サーバー
  String servername = "localhost";
  // SID
  String servicename = "PDBORCL";

  Connection conn = null;
  Statement stmt = null;
  ResultSet rset = null;

  try {
    // JDBCドライバクラスのロード
    Class.forName("oracle.jdbc.driver.OracleDriver");

    // Connectionの作成
    conn = DriverManager.getConnection("jdbc:oracle:thin:@//" + servername + ":1521/" + servicename, user, pass);
    
    // Statementの作成
    stmt = conn.createStatement();

    // Resultsetの作成
    rset = stmt.executeQuery("select ISBN13, BookName, Author from BOOKLOG order by ISBN13 desc");

    // 取得したデータを出力する
    while (rset.next()) {
      System.out.print(rset.getString("ISBN13") + ",");
      System.out.print(rset.getString("BookName") + ",");
      System.out.print(rset.getString("Author"));
      System.out.println();
    }

    } catch (ClassNotFoundException e) {
     throw e;
    } catch (SQLException e) {
     throw e;
    } catch (Throwable e) {
     throw e;
    } finally {
     try {
       /* クローズ処理 */
       if (rset != null) {
         rset.close();
         rset = null;
       }
       if (stmt != null) {
         stmt.close();
         stmt = null;
       }
       if (conn != null) {
         conn.close();
         conn = null;
       }
     } catch (Throwable e) {
       // nop
     }
    }
  }
}

そして、仰せに従って、
ビルドパスにJDBCドライバを追加。



僕の環境では、ojdbc7.jarでありました。
これで、ビルドし、実行すると、↓



リスナーはそんなSIDは知らないぞとORACLEに怒られます。

ははあん、例の12C のプラガブル・データベース(PDB)の仕業ですね。
12C にしたので、苦労させられます(サンプルが少ない)。
で、ネットで探し回って(数時間)、上記のソースにあるように

conn = DriverManager.getConnection("jdbc:oracle:thin:@//" + servername + ":1521/" + servicename, user, pass);

と、サービスネームでの接続設定に変更して、やっと通りました。
元のは、肺呼吸さんのページにある通りSIDで接続。

まだ、コンソールに文字列をずらずらと表示するだけですが・・・
これだけでも、ハードルは高い。

今日は、ここまで(WEB化までは途方もない道のりです。)
Comment

Node.js/Oracle版 読書履歴管理システム

2018-07-23 22:10:57 | Node.js
MySQL版を、Oracle版に書き直してみました。

oracledbパッケージのインストールは

npm install oracledb --save

で、出来るのですが、そこまでが超大変でした。

PCが壊れて、Windows10PCに変えてから、Oracleなしになっていたのを
Node.js + Oracle を試したくて、Oracle 12Cをインストール(前は11G? 10G?)
そして、Node.jsの方は、何故かネットに、Oracle接続関連の記事が超少ない
また、パッケージの使い方も、なんか、MySQLと全然違うし、
動くようになったのが奇跡のようです。

■一覧画面


■登録画面


■更新画面


ただ、Oracleは、コネクションプーリングするんだぞ、出来るぞ、常識だぞ
と書いてあるものの・・・、果たしてどうしたら(コーディングしたら)、それが実現ものやら
さっぱりわからず、相変わらず、どの画面でも、コネクトし直すつくりのままです。
出来る人は、「何もわかっていない」「こいつバカ?」と呆れられるでしょうけど
まあ、動くようになったので、上げる(掲載する)ことにしました。(いいじゃんバカで、フンだ)
Node.jsの仕組みは理解していなくても(出来なくても)、動くものは見様見真似で作れるの見本です。
やらかしている恥ずかしいソースなんだろうなあ(わからんけど)

※以下、ソースのHTMLのタグの< > は、全角に変換してペーストしています。
 また、インデントの為、半角スペース2文字を全角スペース1文字に変換しています。


■app.js ============================================
let createError = require('http-errors');
let express = require('express');
let bodyParser = require('body-parser');
let path = require('path');
let cookieParser = require('cookie-parser');
let logger = require('morgan');
//★1 用意したbooklog.jsをロード
let booklogRouter = require('./routes/booklog');
let addbookRouter = require('./routes/addbook');
let updbookRouter = require('./routes/updbook');
let bookinsRouter = require('./routes/bookins');
let bookupdRouter = require('./routes/bookupd');
let app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
//★2 booklog.jsが実行されるアドレスを指定する。
app.use('/booklog', booklogRouter);
app.use('/addbook', addbookRouter);
app.use('/updbook', updbookRouter);
app.use('/bookins', bookinsRouter);
app.use('/bookupd', bookupdRouter);
// catch 404 and forward to error handler
app.use((req, res, next) => {
 next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
 // set locals, only providing error in development
 res.locals.message = err.message;
 res.locals.error = req.app.get('env') === 'development' ? err : {};
 // render the error page
 res.status(err.status || 500);
 res.render('error');
});
module.exports = app;


■routes/booklog.js =================================
//★1 Expressのライブラリをロード
let express = require('express');
//★2 Routerオブジェクトの作成
let router = express.Router();
/* GET tell page. */
//★3 GETされた時のルート情報を登録する
router.get('/', function(req, res, next) {
  let oracledb = require('oracledb');
  oracledb.getConnection(
   {
     user     : 'TESTUSER',
     password   : 'TESTPWD',
     connectString : 'localhost/PDBORCL'
   },(err, conn) => {
     if (err) {
       console.error(err.message);
       return;
     }
     var query = "SELECT ISBN13,BookName,Author,to_char(GetDate,'YY-MM-DD') GDATE,State FROM booklog ORDER BY GetDate DESC,ReadDate DESC";
     conn.execute(query,(err, result) => {
       if (err) {
        console.error(err.message);
        return;
       }
       res.render('booklog', { books : result.rows });
     });
   });
});
//★5 exportsにrouterを設定
module.exports = router;


■routes/addbook.js =================================
//★1 Expressのライブラリをロード
let express = require('express');
//★2 Routerオブジェクトの作成
let router = express.Router();
/* GET tell page. */
//★3 GETされた時のルート情報を登録する
router.get('/',(req, res, next) => {
  let hiduke=new Date();
  let today = hiduke.getFullYear() + "-" + ("0"+(hiduke.getMonth() + 1)).slice(-2) + "-" + ("0"+hiduke.getDate()).slice(-2);
//★4 テンプレートファイルのレンダリング
  res.render('addbook',{ today: today });
});
//★5 exportsにrouterを設定
module.exports = router;


■routes/bookins.js =================================
//★1 Expressのライブラリをロード
let express = require('express');
//★2 Routerオブジェクトの作成
let router = express.Router();
let bodyParser = require('body-parser');
let app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
//★3 POSTで受け取る(formのmethodがpostなので)
router.post('/',(req, res) => {
  res.setHeader('Content-Type', 'text/plain');
  // INSERT処理
  let query = "INSERT INTO booklog VALUES ('";
  query += req.body.honban  + "','";
  query += req.body.amazonno + "','";
  query += req.body.honmei  + "','";
  query += req.body.sakusya  + "','";
  query += req.body.honya   + "','";
  query += req.body.bunrui  + "',";
  if (req.body.hakkoubi == "") {
   query += "NULL,";
  } else {
   query += "to_date('" + req.body.hakkoubi + "','YYYY-MM-DD'),";
  }
  if (req.body.iritebi == "") {
   query += "NULL,";
  } else {
   query += "to_date('" + req.body.iritebi + "','YYYY-MM-DD'),";
  }
  if (req.body.yondahi == "") {
   query += "NULL,";
  } else {
   query += "to_date('" + req.body.yondahi + "','YYYY-MM-DD'),";
  }
  query += req.body.shoyuu  + ",";
  query += req.body.hondai  + ",'";
  query += req.body.tosyokan + "','";
  query += req.body.gaiyou  + "','";
  query += req.body.kansou  + "','";
  query += req.body.jyokyo  + "','";
  query += req.body.gazoufile + "')";
  let oracledb = require('oracledb');
  oracledb.getConnection(
   {
     user     : 'TESTUSER',
     password   : 'TESTPWD',
     connectString : 'localhost/PDBORCL'
   },(err, conn) => {
     if (err) {
       console.error(err.message);
       return;
     }
     conn.execute(query,(err, result) => {
       if (err) {
        console.error(err.message);
        return;
       }
       try {
        // COMMIT
        conn.commit();
       } catch(e) {
        console.error(e.message);
       }
       //★4 トップページにリダイレクト
       res.redirect('/booklog');
     });
   });
});
//★5 exportsにrouterを設定
module.exports = router;


■views/booklog.ejs =================================
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>読書履歴</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/i18n/jquery.ui.datepicker-ja.min.js"></script>
<link type="text/css" rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/overcast/jquery-ui.min.css" />
<script type="text/javascript">
 var page = 0;
 $(function() {
  var max = 10; // 1ページ単位の表示数
  function draw() {
   $('#page').html(page + 1);
   $('tr').hide();
   $('tr:lt(4),tr:gt(' + (page * max + 3) + '):lt(' + max + ')').show();
  }
  $('#prev').click(function() {
   if (page > 0) {
    page--;
    draw();
   }
  });
  $('#next').click(function() {
   if (page < ($('tr').size() - 4) / max - 1) {
    page++;
    draw();
   }
  });
  draw();
 });
</script>
<style>
 body{
  background-color:#80ff80;
  background:linear-gradient(to right, #008b00, #80f80f);
  font-family: "メイリオ";
  font-size:13pt;
 }
</style>
</head>
<body>
 <table border="0" bgcolor="#FFFFFF" align="center" valign="center" width="95%" height="95%">
  <tr valign="top">
  <td>
   <table width="95%" border="0" align="center" valign="center"
    cellspacing="2" cellpadding="2" align="left" style="margin:20px 0px;">
   <tr>
    <td height="1px" width="155px"> </td>
    <td height="1px"> </td>
    <td height="1px"> </td>
    <td height="1px" width="120px"> </td>
    <td height="1px" width="55px"> </td>
   </tr>
   <tr class="genrestr" bgcolor="#CCCCFF">
    <td colspan="3">
    <div style="float:left;"><b> 読 書 履 歴 管 理</b></div>
    <div style="text-align:center;"><span id="prev"><span id="page"></span><Prev</span> <span id="next">Next></span></div></td>
    <td colspan="2" align="center"><a href="http://localhost:3000/addbook">新規追加</a>
    </td>
   </tr>
   <tr align=center bgcolor="#CCCCFF">
    <th>ISBN-13</th>
    <th>書 名</th>
    <th>著 者</th>
    <th>入手日</th>
    <th>状 況</th>
   </tr>
   <% books.forEach(function(bookItem) { %>
    <tr bgcolor=#E0F1FF>
    <td align=center><a href="http://localhost:3000/updbook/<%= bookItem[0] %>">
     <%= bookItem[0] %></a></td>
    <td><%= bookItem[1] %></td>
    <td><%= bookItem[2] %></td>
    <td align=center><%= bookItem[3] %></td>
    <td align=center><%= bookItem[4] %></td>
    </tr>
   <% }); %>
   </table>
  </td>
  </tr>
 </table>
</body>
</html>


■views/addbook.ejs =================================
//★1 Expressのライブラリをロード
let express = require('express');
//★2 Routerオブジェクトの作成
let router = express.Router();
/* GET tell page. */
//★3 GETされた時のルート情報を登録する
router.get('/',(req, res, next) => {
  let hiduke=new Date();
  let today = hiduke.getFullYear() + "-" + ("0"+(hiduke.getMonth() + 1)).slice(-2) + "-" + ("0"+hiduke.getDate()).slice(-2);
//★4 テンプレートファイルのレンダリング
  res.render('addbook',{ today: today });
});
//★5 exportsにrouterを設定
module.exports = router;


※更新画面のソースは、Node.js/Oracle版 読書履歴管理システム② に続く
Comment

Node.js/Oracle版 読書履歴管理システム②

2018-07-23 22:10:56 | Node.js
Node.js/Oracle版 読書履歴管理システムからの続き

■routes/updbook.js =================================
//★1 Expressのライブラリをロード
let express = require('express');
//★2 Routerオブジェクトの作成
let router = express.Router();
/* GET tell page. */
//★3 GETされた時のルート情報を登録する
router.get('/:id', function(req, res, next) {
  let IsbnNo = req.params.id;
  let oracledb = require('oracledb');
  oracledb.getConnection(
   {
     user     : 'TESTUSER',
     password   : 'TESTPWD',
     connectString : 'localhost/PDBORCL'
   },(err, conn) => {
     if (err) {
       console.error(err.message);
       return;
     }
   let query = "SELECT booklog.*,to_char(GetDate,'YYYY-MM-DD') GDATE,"
   query += "to_char(IssueDate,'YYYY-MM-DD') IDATE,"
   query += "to_char(ReadDate,'YYYY-MM-DD') RDATE FROM booklog";
   query += " Where ISBN13 = '" + IsbnNo + "'";
     conn.execute(query,(err, result) => {
       if (err) {
        console.error(err.message);
        console.log(query);
        return;
       }
       res.render('updbook', { books : result.rows });
     });
   });
});
//★5 exportsにrouterを設定
module.exports = router;


■routes/bookupd.js =================================
//★1 Expressのライブラリをロード
let express = require('express');
//★2 Routerオブジェクトの作成
let router = express.Router();
let bodyParser = require('body-parser');
let app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
//★3 POSTで受け取る(formのmethodがpostなので)
router.post('/',(req, res) => {
  res.setHeader('Content-Type', 'text/plain');
  let oracledb = require('oracledb');
  oracledb.getConnection(
   {
     user     : 'TESTUSER',
     password   : 'TESTPWD',
     connectString : 'localhost/PDBORCL'
   },(err, conn) => {
     if (err) {
       console.error(err.message);
       return;
     }
     let query = "";
     if (req.body.action == "DEL") {
       // DELETE処理
       query = "DELETE FROM booklog ";
     } else {
       // UPDATE処理
       query = "UPDATE booklog SET ";
       query += "ISBN10 = '"  + req.body.amazonno + "',";
       query += "BookName = '" + req.body.honmei  + "',";
       query += "Author = '"  + req.body.sakusya  + "',";
       query += "Publisher = '" + req.body.honya   + "',";
       query += "Genre = '"   + req.body.bunrui  + "',";
       if (req.body.hakkoubi == "") {
        query += "IssueDate = NULL,";
       } else {
        query += "IssueDate = to_date('" + req.body.hakkoubi + "','YYYY-MM-DD'),";
       }
       if (req.body.iritebi == "") {
        query += "GetDate = NULL,";
       } else {
        query += "GetDate = to_date('" + req.body.iritebi  + "','YYYY-MM-DD'),";
       }
       if (req.body.yondahi == "") {
        query += "ReadDate = NULL,";
       } else {
        query += "ReadDate = to_date('" + req.body.yondahi + "','YYYY-MM-DD'),";
       }
       if (req.body.shoyuu == "true") {
        query += "Ownership = 1,";
       } else {
        query += "Ownership = 0,";
       }
       query += "Purchase   = " + req.body.hondai  + ",";
       query += "Library    = '" + req.body.tosyokan + "',";
       query += "Overview   = '" + req.body.gaiyou  + "',";
       query += "Impressions  = '" + req.body.kansou  + "',";
       query += "State     = '" + req.body.jyokyo  + "',";
       query += "CoverImg   = '" + req.body.gazoufile + "'";
     }
     query += " WHERE ISBN13 = '" + req.body.honno + "'";
     conn.execute(query,(err, result) => {
       if (err) {
        console.error(err.message);
        console.log(query);
        return;
       }
       try {
        // COMMIT
        conn.commit();
       } catch(e) {
        console.error(e.message);
       }
       //★4 トップページにリダイレクト
       res.redirect('/booklog');
     })
   })
});
//★5 exportsにrouterを設定
module.exports = router;


■views/updbook.ejs =================================
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>読書履歴更新</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/i18n/jquery.ui.datepicker-ja.min.js"></script>
<link type="text/css" rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/overcast/jquery-ui.min.css" />
<script>
$(function() {
 var userAgent = window.navigator.userAgent.toLowerCase();
 if(userAgent.indexOf('msie') != -1 ||
   userAgent.indexOf('trident') != -1 ||
   userAgent.indexOf('edge') != -1) {
  $('#hakkoubi').datepicker({ dateFormat: 'yy-mm-dd' });
  $('#iritebi').datepicker({ dateFormat: 'yy-mm-dd' });
  $('#yondahi').datepicker({ dateFormat: 'yy-mm-dd' });
 }
});
</script>
<style>
 body{
  width :1120px ;
  background-color:#008b00;
  background:linear-gradient(to right, #008b00, #80ff80);
  font-family: "メイリオ";
  font-size:12pt;
 }
 .valueCstr{color:"#000077";font-size:12pt;font-style:normal;text-align="center";}
 .ministr {color:"#000077";font-size:8pt ;font-style:normal;}
 .inpstr1 {color:"#000077";font-size:11pt;font-style:normal;text-align="center";width:105px;border:none;font-family:"メイリオ";ime-mode: inactive;}
 .inpstr1D {color:"#000077";font-size:11pt;font-style:normal;text-align="center";width:140px;border:none;font-family:"メイリオ";ime-mode: inactive;}
 .inpstr1L {color:"#000077";font-size:12pt;font-style:normal;text-align="left"; width:155px;border:none;font-family:"メイリオ";ime-mode: inactive;}
 .inpstr1R {color:"#000077";font-size:12pt;font-style:normal;          width:70px ;border:none;font-family:"メイリオ";ime-mode: inactive;}
 .inpstr1A {color:"#000077";font-size:12pt;font-style:normal;text-align="left"; width:140px;border:none;font-family:"メイリオ";ime-mode: active;}
 .inpstr2 {color:"#000077";font-size:12pt;font-style:normal;text-align="left"; width:360px;border:none;font-family:"メイリオ";ime-mode: active;}
 .inpstr3 {color:"#000077";font-size:12pt;font-style:normal;text-align="left"; width:620px;border:none;font-family:"メイリオ";ime-mode: active;}
 .inpstr4 {color:"#000077";font-size:12pt;font-style:normal;text-align="left"; width:620px;border:none;font-family:"HGゴシックM";ime-mode: active;}
 .inpbox  {color:"#000077";font-size:11pt;font-style:normal;text-align="left";       border:none;font-family:"HGゴシックM";}
 .selbox  {color:"#000077";font-size:12pt;font-style:normal;text-align="center";width:80px ;border:none;font-family:"メイリオ";}
 A:    {text-decoration: none }
 A:link  {color:"#000077"}
 A:active {color:steelblue}
 A:visited {color:"#000077"}
 A:hover  {color:steelblue}
</style>
<script type="text/javascript">
 <!--
  function check(){
   if (document.formU.action.value == "DEL") {
    var msg = "削除してもいいですか?";
   } else {
    var msg = "更新してもいいですか?";
   }
   if (window.confirm(msg)){          // 確認ダイアログを表示
    return true; // 「OK」時は送信を実行
   } else {     // 「キャンセル」時の処理
    window.alert('キャンセルされました');  // 警告ダイアログを表示
    return false; // 送信を中止
   }
  };
  function check2(elm) { 
   if (/4000000000/.test(elm.value)) {
     elm.setCustomValidity('その番号は使えません');
   } else {
     elm.setCustomValidity('');
   }
  };
 // -->
</script>
</head>
<body>
<% var bookItem = books[0]; %>
<form name="formU" method="post" action="/bookupd" onSubmit="return check()">
  <input type="button" value="一覧に戻る" onClick="location.href='http://localhost:3000/booklog'" style="width: 8%; padding: 6px;">
  <button type="submit" value="UPD" name="action" style="width: 8%; padding: 6px;">更新する</button>
  <button type="submit" value="DEL" name="action" style="width: 8%; padding: 6px;">削除する</button>
 <p>
 <table border="0" bgcolor="#008b00" align="center" valign="center" width="98%" height="95%">
  <tr valign="top">
  <td>
   <table width="98%" border="2" align="center" valign="center" bordercolor="#008b00"
    cellspacing="2" cellpadding="2" align="left" style="margin:20px 0px;" bgcolor="#008b00">
   <tr height="15px" bgcolor="#FFFFFF" bordercolor="#008b00">
    <td bgcolor="#E8FFE0" width="10%" align="center" style="font-size:11pt"><b>ISBN-13<font size="1" color="#FF3366">※</b></font></td>
    <td align="center"><b><%= bookItem[0] %></b>
     <input type="hidden" name="honno" VALUE="<%= bookItem[0] %>">
    </td>
    <td bgcolor="#E8FFE0" width="9%" align="center"><a href="https://www.amazon.co.jp/dp/<%= bookItem[1] %>" target="_blank">ISBN-10</a><font size="1" color="#FF3366"></td>
    <td width="14%"> <input id="amazonno" name="amazonno" type="text" class="inpstr1" value="<%= bookItem[1] %>" pattern="\d{10}" title="数字10桁" onchange='check2(this);' /></td>
    <td bgcolor="#E8FFE0" width="9%" align="center">状  況</td>
    <td> <select name="jyokyo" class="selbox">
    <% if (bookItem[14] === '未読') { %>
     <option value="未読" selected>未読</option>
     <option value="読書中">読書中</option>
     <option value="読了">読了</option>
    <% } else if (bookItem[14] === '読書中') { %>
     <option value="未読">未読</option>
     <option value="読書中" selected>読書中</option>
     <option value="読了">読了</option>
    <% } else { %>
     <option value="未読">未読</option>
     <option value="読書中">読書中</option>
     <option value="読了" selected>読了</option>
    <% } %>
     </select></td>
    <td bgcolor="#DDFFEE" width="10%" align="center">画  像</td>
    <td align="left" width="18%"> <input id="gazoufile" name="gazoufile" type="text" class="inpstr1L" value="<%= bookItem[15] %>"></td></tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#E8FFE0" align="center">書  名<font size="1" color="#FF3366">※</b></td>
    <td colspan="5" align="left"> <input id="honmei" name="honmei" type="text" class="inpstr3" value="<%= bookItem[2] %>" required></td>
    <td rowspan="8" colspan="2" align="center">
    <% if (bookItem[15] !== "") { %>
     <img width="250" src="../images/<%= bookItem[15] %>">
    <% } %>
    </td></tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#E8FFE0" align="center">著  者</td>
    <td colspan="3" align="left"> <input id="sakusya" name="sakusya" type="text" class="inpstr2" value="<%= bookItem[3] %>"></td>
    <td bgcolor="#E8FFE0" align="center">ジャンル</td>
    <td align="left"> <input id="bunrui" name="bunrui"type="text" class="inpstr1A" value="<%= bookItem[5] %>"></td></tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#E8FFE0" align="center">出 版 社</td>
    <td colspan="5" align="left"> <input id="honya" name="honya" type="text" class="inpstr3" value="<%= bookItem[4] %>"></td></tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#EEFFDD" align="center">発 行 日</td>
    <td align="center"> <input id="hakkoubi" name="hakkoubi" type="date" class="inpstr1D" value="<%= bookItem[17] %>" pattern="\d{4}-\d{2}-\d{2}" title="YYYY-MM-DD"></td>
    <td bgcolor="#E8FFE0" align="center">入 手 日</td>
    <td align="center"> <input id="iritebi" name="iritebi" type="date" class="inpstr1D" value="<%= bookItem[16] %>" pattern="\d{4}-\d{2}-\d{2}" title="YYYY-MM-DD"></td>
    <td bgcolor="#EEFFDD" align="center">読 了 日</td>
    <td align="center"> <input id="yondahi" name="yondahi" type="date" class="inpstr1D" value="<%= bookItem[18] %>" pattern="\d{4}-\d{2}-\d{2}" title="YYYY-MM-DD"></td></tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#DFDFFF" align="center">概  要</td>
    <td colspan="5" align="left"> <input id="gaiyou" name="gaiyou" type="text" class="inpstr3" value="<%= bookItem[12] %>"></td></tr>
   <tr bgcolor="#FFFFFF">
    <td bgcolor="#DFDFFF" align="center">感  想</td>
    <td colspan="5" align="center">
    <textarea name="kansou" cols="85" rows="12" class="inpbox"><%= bookItem[13] %></textarea></td></tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#E8FFE0" align="center">図 書 館</td>
    <td align="left"> <input id="tosyokan" name="tosyokan" type="text" class="inpstr1A" value="<%= bookItem[11] %>"></td>
    <td bgcolor="#E8FFE0" align="center">所  有</td>
    <td> <select name="shoyuu" class="selbox">
    <% if (bookItem[9] === 1) { %>
      <option value=true selected>購入</option>
      <option value=false>非購入</option>
    <% } else { %>
      <option value=true>購入</option>
      <option value=false selected>非購入</option>
    <% } %>
      </select></td>
    <td bgcolor="#EEFFDD" align="center">購入金額</td>
    <td align="left"> \ <input id="hondai" name="hondai" type="number" class="inpstr1R" value="<%= bookItem[10] %>" style="text-align: right;">-</td>
   </tr>
   </table>
  </td>
  </tr>
  <tr>
  <td align="right">
   <font class="ministr"><font color="#FF3366">※</font><font color="#FFFFFF">の項目は入力必須項目です。</font>
  </td>
  </tr>
 </table>
</form>
</body>
</html>
Comment

Node.js版 読書履歴管理システム

2018-05-19 13:25:18 | Node.js
失業中の自己学習として(暇を持て余すので)
以前から気になっていた「Node.js」という
サーバーサイドのJavaScriptを試してます。



今までやって来たHTAも便利は便利なのですが、
厭くまでローカルの仕組み(プライベート)。
WEBの様で、WEBの勉強には今一つということでの「Node.js」です。
HTAよりは、ネットでの関連情報は多く(というか膨大)ヒットします。
HTAだと、このブログでもさえも、関連ワードさえ、何か入れれば検索エンジンでヒットしてしまいますが、
「Node.js」は、記事数が膨大なのでそんなことはありません。ありえない。
(この記事だと「Node.js版 読書履歴管理システム」としても出て来ないかも・・・)
HTAは趣味の範疇ですが、「Node.js」はちゃんと仕事になりえます。(僕には回って来ませんが…)
財団のページもあります。
https://nodejs.org/ja/

で、ネットで一週間ぐらい、あちこち見て歩いて
HTA版 読書履歴管理システムを移植してみました。
フレームワークは、ネットで盛んに喧伝されているEXPRESS
テンプレートエンジンは、EJS、
そしてDBは、得意のACCESSとの接続例(サンプル)がないので、止む無くMySQLにしました。
ちなみにブラウザは、IE11 限定です(Edgeでは上手く表示できないので断念しました。)
インストール(無料)のやり方は、他のサイト(Qiita等)を参考にして
悪戦苦闘しました。(その通りにやっているつもり(思い込み)なのに、うまく行かない等多々あり)
CSSの外部ファイル化も失敗(何んか読めません。で、ejsの中に書きました。)

書籍等のちゃんと体系化された情報をもとにせず、
まあネット検索で、つまみ食い的な理解度で(内容理解せずモノマネでコーディング)、
取りあえず、動くようにと、それで理解学習につなげようということで
一週間の素人で、バグ、非効率、理解不足は否めないものの
じゃあ、僕がそれを発展させてみようという人が現れること(たらいいな)を期待して
以下に掲載したいと思います。ダメな例として
でもこれだけのソースで、そこそこ動くものが出来るのが驚きです。ハイ!

※環境構築は面倒ですが、使い勝手のご意見や、
こうすれば、もっとよくなるよ的な猫煽て的アドバイスは大歓迎します。
(というか、コメント貰ったことほぼないブログですが・・・)
「無駄なことをするな」的、高所からの見下した切り捨てのコメントはご容赦下さい。

■一覧画面


■登録画面


■更新画面


※以下、ソースのHTMLのタグの< > は、全角に変換してペーストしています。
 また、インデントの為、半角スペース2文字を全角スペース1文字に変換しています。
※app.useの辺りは、理解せずに(意味分からず)サンプルのモノマネで書いてます。
※バグも含有してます。(念のため、お断り)
※完璧でないとダメという質ではなく、TRY & GO の性格です。

※課題
 簡単なエラーチェックしか入っていません。
 入力値が、適正でないと簡単に異常終了することもあります。
 ただ、console.logを書けば、簡単にトレース出来るので超便利です。
 Edge では、画像がでなかったり、幅がずれたりします。
 ↑直してくれる方がいれば、有難いですが・・・
 CSSが上手く効かない部分もあり、見栄えはこれでも随分苦労しました。

■テーブルの作成(CREATE TABLE) ============================
create table BOOKLOG(
ISBN13   varchar(13) NOT NULL,
ISBN10   varchar(10),
BookName  varchar(50) NOT NULL,
Author   varchar(25),
Publisher  varchar(25),
Genre    varchar(25),
IssueDate  date    ,
GetDate   date    ,
ReadDate  date    ,
Ownership  tinyint(1) ,
Purchase  int(11)  ,
Library   varchar(25),
Overview  varchar(255),
Impressions text    ,
State    varchar(10),
CoverImg  varchar(25),
PRIMARY KEY (ISBN13)
);

■app.js ========================================
var createError = require('http-errors');
var express = require('express');
var bodyParser = require('body-parser');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

// var indexRouter  = require('./routes/index');
// var usersRouter  = require('./routes/users');
//★1 用意したbooklog.jsをロード
var booklogRouter = require('./routes/booklog');
var addbookRouter = require('./routes/addbook');
var updbookRouter = require('./routes/updbook');
var bookinsRouter = require('./routes/bookins');
var bookupdRouter = require('./routes/bookupd');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// app.use('/', indexRouter);
// app.use('/users', usersRouter);
//★2 booklog.jsが実行されるアドレスを指定する。
app.use('/booklog', booklogRouter);
app.use('/addbook', addbookRouter);
app.use('/updbook', updbookRouter);
app.use('/bookins', bookinsRouter);
app.use('/bookupd', bookupdRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
 next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
 // set locals, only providing error in development
 res.locals.message = err.message;
 res.locals.error = req.app.get('env') === 'development' ? err : {};

 // render the error page
 res.status(err.status || 500);
 res.render('error');
});

module.exports = app;

■routes/booklog.js =================================
//★1 Expressのライブラリをロード
var express = require('express');
//★2 Routerオブジェクトの作成
var router = express.Router();

var mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'TestUser',
  password: 'TestUserPW',
  database: 'testdb'
});

/* GET tell page. */
//★3 GETされた時のルート情報を登録する
router.get('/', function(req, res, next) {
  var query = 'SELECT *,DATE_FORMAT(GetDate,"%Y-%m-%d") AS GDATE FROM testdb.booklog ORDER BY GetDate DESC,ReadDate DESC';
  connection.query(query, function (err, rows, fields) {
   if (err) { console.log('err: ' + err); }
   if (rows.length >= 0) {
   //★4 テンプレートファイルのレンダリング
     res.render('booklog', { books: rows });
   } else {
   // render not found page
     res.status(404).json({"status_code":404, "status_message": "Not found"});
   }
  });
});
//★5 exportsにrouterを設定
module.exports = router;

■routes/addbook.js =================================
//★1 Expressのライブラリをロード
var express = require('express');
//★2 Routerオブジェクトの作成
var router = express.Router();

/* GET tell page. */
//★3 GETされた時のルート情報を登録する
router.get('/', function(req, res, next) {
  var hiduke=new Date();
  var today = hiduke.getFullYear() + "-" + ("0"+(hiduke.getMonth() + 1)).slice(-2) + "-" + ("0"+hiduke.getDate()).slice(-2);
//★4 テンプレートファイルのレンダリング
  res.render('addbook',{ today: today });
});
//★5 exportsにrouterを設定
module.exports = router;

■routes/bookins.js =================================
//★1 Expressのライブラリをロード
var express = require('express');
//★2 Routerオブジェクトの作成
var router = express.Router();

var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

var mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'TestUser',
  password: 'TestUserPW',
  database: 'testdb'
});

//★3 POSTで受け取る(formのmethodがpostなので)
router.post('/', function(req, res) {
  res.setHeader('Content-Type', 'text/plain');
  // INSERT処理
  var query = 'INSERT INTO testdb.booklog VALUES ("';
  query += req.body.honban  + '","';
  query += req.body.amazonno + '","';
  query += req.body.honmei  + '","';
  query += req.body.sakusya  + '","';
  query += req.body.honya   + '","';
  query += req.body.bunrui  + '",';
  if (req.body.hakkoubi == "") {
   query += 'NULL,';
  } else {
   query += '"' + req.body.hakkoubi + '",';
  }
  if (req.body.iritebi == "") {
   query += 'NULL,';
  } else {
   query += '"' + req.body.iritebi + '",';
  }
  if (req.body.yondahi == "") {
   query += 'NULL,';
  } else {
   query += '"' + req.body.yondahi + '",';
  }
  query += req.body.shoyuu  + ',';
  query += req.body.hondai  + ',"';
  query += req.body.tosyokan + '","';
  query += req.body.gaiyou  + '","';
  query += req.body.kansou  + '","';
  query += req.body.jyokyo  + '","';
  query += req.body.gazoufile + '")';
  console.log(query);

  connection.query(query, function(err, result){
   if (err) { console.log('err: ' + err); }
   //★4 トップページにリダイレクト
   res.redirect('/booklog');
  });
});

//★5 exportsにrouterを設定
module.exports = router;

■views/booklog.ejs =================================
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>読書履歴</title>
<style>
 body{
  background-color:#8080ff;
  background:linear-gradient(to right, #00008b, #8080ff);
  font-family: "メイリオ";
 }
</style>
</head>
<body>
 <table border="0" bgcolor="#FFFFFF" align="center" valign="center" width="95%" height="95%">
  <tr valign="top">
  <td>
   <table width="95%" border="0" align="center" valign="center"
    cellspacing="2" cellpadding="2" align="left" style="margin:20px 0px;">
   <tr>
    <td height="1px" width="20%"> </td>
    <td height="1px" width="35%"> </td>
    <td height="1px" width="20%"> </td>
    <td height="1px" width="15%"> </td>
    <td height="1px" width="10%"> </td>
   </tr>
   <tr class="genrestr" bgcolor="#CCCCFF">
    <td colspan="3"><b> 読 書 履 歴 管 理</b></td>
    <td colspan="2" align="center"><a href="http://localhost:3000/addbook">新規追加</a></td>
   </tr>
   <tr align=center bgcolor="#CCCCFF">
    <td>ISBN-13</td>
    <td>書 名</td>
    <td>著 者</td>
    <td>入手日</td>
    <td>状 況</td>
   </tr>
   <% books.forEach(function(bookItem) { %>
    <tr bgcolor=#E0F1FF>
    <td align=center><a href="http://localhost:3000/updbook/<%= bookItem.ISBN13 %>">
     <%= bookItem.ISBN13 %></a></td>
    <td><%= bookItem.BookName %></td>
    <td><%= bookItem.Author %></td>
    <td align=center><%= bookItem.GDATE %></td>
    <td align=center><%= bookItem.State %></td>
    </tr>
   <% }); %>
   </table>
  </td>
  </tr>
 </table>
</body>
</html>

■views/addbook.ejs =================================
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>読書履歴追加</title>
<style>
 body{
  width :1100px ;
  background-color:#00008b;
  background:linear-gradient(to right, #00008b, #8080ff);
  font-family: "メイリオ";
 }
 .valueCstr{color:"#000077";font-size:12pt;font-style:normal;text-align=center;}
 .ministr {color:"#000077";font-size:8pt;font-style:normal;}
 .inpstr1 {color:"#000077";font-size:12pt;font-style:normal;text-align=center;width:155px;border:none;font-family:"メイリオ"; .inpstr1A {color:"#000077";font-size:12pt;font-style:normal;text-align=left; width:195px;border:none;font-family:"メイリオ";ime-mode: inactive;}
 .inpstr1R {color:"#000077";font-size:12pt;font-style:normal;         width:70px;border:none;font-family:"メイリオ";ime-mode: inactive;}
.inpstr1A {color:"#000077";font-size:12pt;font-style:normal;text-align=left; width:195px;border:none;font-family:"メイリオ";ime-mode: active;}
 .inpstr2 {color:"#000077";font-size:12pt;font-style:normal;text-align=left; width:320px;border:none;font-family:"メイリオ";ime-mode: active;}
 .inpstr4 {color:"#000077";font-size:12pt;font-style:normal;text-align=left; width:820px;border:none;font-family:"HGゴシックM";ime-mode: active;}
 .inpbox  {color:"#000077";font-size:11pt;font-style:normal;text-align=left;       border:none;font-family:"HGゴシックM";}
 .selbox  {color:"#000077";font-size:12pt;font-style:normal;text-align=center;width:80px;border:none;font-family:"メイリオ";}
 A:    {text-decoration: none }
 A:link  {color:"#000077"}
 A:active {color:steelblue}
 A:visited {color:"#000077"}
 A:hover  {color:steelblue}
</style>
<script type="text/javascript">
 <!--
  // http://www.html5.jp/tag/elements/forms-constraints.html
  function check1(elm) { 
   if (/9784000000000/.test(elm.value)) {
     elm.setCustomValidity('その番号は使えません');
   } else {
     elm.setCustomValidity('');
   }
  };
  function check2(elm) { 
   if (/4000000000/.test(elm.value)) {
     elm.setCustomValidity('その番号は使えません');
   } else {
     elm.setCustomValidity('');
   }
  };
 // -->
</script>
</head>
<body>
<form name="formA" method="post" action="/bookins">
  <input type="button" value="一覧に戻る" onClick="location.href='http://localhost:3000/booklog'" style="width: 8%; padding: 6px;">
  <input type="submit" value="登録する" style="width: 8%; padding: 6px;">
 <p>
 <table border="0" bgcolor="#00008b" align="center" valign="center" width="98%" height="95%>
  <tr valign="top">
  <td>
   <table width="98%" border="2" align="center" valign="center" bordercolor="#00008b"
    cellspacing="2" cellpadding="2" align="left" style="margin:20px 0px;" bgcolor="#00008b">
   <tr height="15px" bgcolor="#FFFFFF" bordercolor="#00008b">
    <td bgcolor="#E8E0FF" width="10%" align="center"><b>ISBN-13<font size="1" color="#FF3366">※</b></font></td>
    <td width="25%"> <input id="honban" name="honban" type="text" placeholder="9784000000000" class="inpstr1" required pattern="\d{13}" title="数字13桁" onchange='check1(this);' /></td>
    <td bgcolor="#E8E0FF" width="10%" align="center"><a href="https://www.amazon.co.jp/" target="_blank">ISBN-10</a><font size="1" color="#FF3366"></td>
    <td width="25%"> <input id="amazonno" name="amazonno" type="text" placeholder="4000000000" class="inpstr1" pattern="\d{10}" title="数字10桁" onchange='check2(this);' />
    <span class="error" aria-live="polite"></span></td>
    <td bgcolor="#E8E0FF" width="10%" align="center">状  況</td>
    <td> <select name="jyokyo" class="selbox">
    <option value="未読" selected>未読</option><option value="読書中">読書中</option><option value="読了">読了</option></select></td>
   </tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#E8E0FF" align="center">書  名<font size="1" color="#FF3366">※</b></td>
    <td colspan="5" align="left"> <input id="honmei" name="honmei" type="text" class="inpstr4" required></td>
   </tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#E8E0FF" align="center">著  者</td>
    <td colspan="3" align="left"> <input id="sakusya" name="sakusya" type="text" class="inpstr2"></td>
    <td bgcolor="#E8E0FF" align="center">ジャンル</td>
    <td align="left"> <input id="bunrui" name="bunrui" type="text" class="inpstr1A"></td>
   </tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#E8E0FF" align="center">出 版 社</td>
    <td colspan="3" align="left"> <input id="honya" name="honya" type="text" class="inpstr2"></td>
    <td bgcolor="#DDEEFF" align="center">画  像</td>
    <td align="left"> <input id="gazoufile" name="gazoufile" type="text" class="inpstr1"></td>
   </tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#EEDDFF" align="center">発 行 日</td>
    <td> <input id="hakkoubi" name="hakkoubi" type="date" class="inpstr1" value="<%= today %>" pattern="\d{4}-\d{2}-\d{2}" title="YYYY-MM-DD"></td>
    <td bgcolor="#E8E0FF" align="center">入 手 日</td>
    <td> <input id="iritebi" name="iritebi" type="date" class="inpstr1" value="<%= today %>" pattern="\d{4}-\d{2}-\d{2}" title="YYYY-MM-DD"></td>
    <td bgcolor="#EEDDFF" align="center">読 了 日</td>
    <td> <input id="yondahi" name="yondahi" type="date" class="inpstr1" value="<%= today %>" pattern="\d{4}-\d{2}-\d{2}" title="YYYY-MM-DD"></td>
   </tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#DFDFFF" align="center">概  要</td>
    <td colspan="5" align="left"> <input id="gaiyou" name="gaiyou" type="text" class="inpstr4"></td>
   </tr>
   <tr bgcolor="#FFFFFF">
    <td bgcolor="#DFDFFF" align="center">感  想</td>
    <td colspan="5" align="center">
    <textarea name="kansou" cols="122" rows="10" class="inpbox"></textarea></td>
   </tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#E8E0FF" align="center">所  有</td>
    <td> <select name="shoyuu" class="selbox">
    <option value="1" selected>購入</option><option value="0">非購入</option></select></td>
    <td bgcolor="#EEDDFF" align="center">購入金額</td>
    <td align="left"> \ <input id="hondai" name="hondai" type="number" class="inpstr1R" value=0 style="text-align: right;">-</td>
    <td bgcolor="#E8E0FF" align="center">図 書 館</td>
    <td align="left"> <input id="tosyokan" name="tosyokan" type="text" class="inpstr1A"></td>
   </tr>
   </table>
  </td>
  </tr>
  <tr>
  <td align="right">
   <font class="ministr"><font color="#FF3366">※</font><font color="#FFFFFF">の項目は入力必須項目です。</font>
  </td>
  </tr>
 </table>
</form>
</body>
</html>

※更新画面のソースは、Node.js版 読書履歴管理システム② に続く
Comments (9)

Node.js版 読書履歴管理システム②

2018-05-19 13:24:58 | Node.js
Node.js版 読書履歴管理システムからの続き

一応、更新・削除が確認できた(更新できた)ので、続きを掲載します。

■更新画面


※未だ、全然ですが、
ちょっとしたエラーチェックとalertダイアログ、そして
ボタンを押したときのConfirmダイアログを出してみました。
モノマネで意味分からず入れてます(なので、ソースの癖はバラバラ、モザイク)
まあ、ここまで出来たので、いいかな・・・と
入れたチェックは、日付の形式チェックと金額の数字チェック…簡単には落ちないように
あとは、ISBNコードの桁数チェックですかね。HTML5の勉強になりました。
★気付かれるかとは思いますが、「メイリオ」好きっす!


■routes/updbook.js ==========================
//★1 Expressのライブラリをロード
var express = require('express');
//★2 Routerオブジェクトの作成
var router = express.Router();

var mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'TestUser',
  password: 'TestUserPW',
  database: 'testdb'
});

/* GET tell page. */
//★3 GETされた時のルート情報を登録する
router.get('/:id', function(req, res, next) {
  var IsbnNo = req.params.id;
  var query = 'SELECT *,DATE_FORMAT(GetDate,"%Y-%m-%d") AS GDATE,'
  query += 'DATE_FORMAT(IssueDate,"%Y-%m-%d") AS IDATE,'
  query += 'DATE_FORMAT(ReadDate,"%Y-%m-%d") AS RDATE FROM testdb.booklog';
  query += ' Where ISBN13 = "' + IsbnNo + '"';
  connection.query(query, function (err, rows, fields) {
   if (err) { console.log('err: ' + err); }
   if (rows.length == 1) {
   //★4 テンプレートファイルのレンダリング
     res.render('updbook', { books: rows });
   } else {
   // render not found page
     res.status(404).json({"status_code":404, "status_message": "Not found"});
   }
  });
});
//★5 exportsにrouterを設定
module.exports = router;

■routes/bookupd.js =================================
//★1 Expressのライブラリをロード
var express = require('express');
//★2 Routerオブジェクトの作成
var router = express.Router();

var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

var mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'TestUser',
  password: 'TestUserPW',
  database: 'testdb'
});

//★3 POSTで受け取る(formのmethodがpostなので)
router.post('/', function(req, res) {
  res.setHeader('Content-Type', 'text/plain');
  if (req.body.action == "DEL") {
   // DELETE処理
   var query = 'DELETE FROM testdb.booklog ';
  } else {
   // UPDATE処理
   var query = 'UPDATE testdb.booklog SET ';
   query += 'ISBN10 = "'  + req.body.amazonno + '",';
   query += 'BookName = "' + req.body.honmei  + '",';
   query += 'Author = "'  + req.body.sakusya  + '",';
   query += 'Publisher = "' + req.body.honya   + '",';
   query += 'Genre = "'   + req.body.bunrui  + '",';
   if (req.body.hakkoubi == "") {
     query += 'IssueDate = NULL,';
   } else {
     query += 'IssueDate = "' + req.body.hakkoubi + '",';
   }
   if (req.body.iritebi == "") {
     query += 'GetDate = NULL,';
   } else {
     query += 'GetDate = "' + req.body.iritebi  + '",';
   }
   if (req.body.yondahi == "") {
     query += 'ReadDate = NULL,';
   } else {
     query += 'ReadDate = "' + req.body.yondahi + '",';
   }
   query += 'Ownership = '  + req.body.shoyuu  + ',';
   query += 'Purchase = '   + req.body.hondai  + ',';
   query += 'Library = "'   + req.body.tosyokan + '",';
   query += 'Overview = "'  + req.body.gaiyou  + '",';
   query += 'Impressions = "' + req.body.kansou  + '",';
   query += 'State = "' + req.body.jyokyo     + '",';
   query += 'CoverImg = "' + req.body.gazoufile  + '" ';
  }
  query += 'WHERE ISBN13 = "' + req.body.honno + '"';
// console.log(query);

  connection.query(query, function(err, result){
   if (err) { console.log('err: ' + err); }
   //★4 トップページにリダイレクト
   res.redirect('/booklog');
  });
});

//★5 exportsにrouterを設定
module.exports = router;

■views/updbook.ejs ===============================
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>読書履歴更新</title>
<style>
 body{
  width :1100px ;
  background-color:#00008b;
  background:linear-gradient(to right, #00008b, #8080ff);
  font-family: "メイリオ";
 }
 .valueCstr{color:"#000077";font-size:12pt;font-style:normal;text-align="center";}
 .ministr {color:"#000077";font-size:8pt ;font-style:normal;}
 .inpstr1 {color:"#000077";font-size:12pt;font-style:normal;text-align="center";width:125px;border:none;font-family:"メイリオ";ime-mode: inactive;}
 .inpstr1L {color:"#000077";font-size:12pt;font-style:normal;text-align="left"; width:155px;border:none;font-family:"メイリオ";ime-mode: inactive;}
 .inpstr1R {color:"#000077";font-size:12pt;font-style:normal;          width:70px ;border:none;font-family:"メイリオ";ime-mode: inactive;}
.inpstr1A {color:"#000077";font-size:12pt;font-style:normal;text-align="left"; width:150px;border:none;font-family:"メイリオ";ime-mode: active;}
 .inpstr2 {color:"#000077";font-size:12pt;font-style:normal;text-align="left"; width:360px;border:none;font-family:"メイリオ";ime-mode: active;}
 .inpstr3 {color:"#000077";font-size:12pt;font-style:normal;text-align="left"; width:620px;border:none;font-family:"メイリオ";ime-mode: active;}
 .inpstr4 {color:"#000077";font-size:12pt;font-style:normal;text-align="left"; width:620px;border:none;font-family:"HGゴシックM";ime-mode: active;}
 .inpbox  {color:"#000077";font-size:11pt;font-style:normal;text-align="left";       border:none;font-family:"HGゴシックM";}
 .selbox  {color:"#000077";font-size:12pt;font-style:normal;text-align="center";width:80px ;border:none;font-family:"メイリオ";}
 A:    {text-decoration: none }
 A:link  {color:"#000077"}
 A:active {color:steelblue}
 A:visited {color:"#000077"}
 A:hover  {color:steelblue}
</style>
<script type="text/javascript">
 <!--
  function check(){
   if (document.formU.action.value == "DEL") {
    var msg = "削除してもいいですか?";
   } else {
    var msg = "更新してもいいですか?";
   }
   if (window.confirm(msg)){          // 確認ダイアログを表示
    return true; // 「OK」時は送信を実行
   } else {     // 「キャンセル」時の処理
    window.alert('キャンセルされました');  // 警告ダイアログを表示
    return false; // 送信を中止
   }
  };
  function check2(elm) { 
   if (/4000000000/.test(elm.value)) {
     elm.setCustomValidity('その番号は使えません');
   } else {
     elm.setCustomValidity('');
   }
  };
 // -->
</script>
</head>
<body>
<% var bookItem = books[0]; %>
<form name="formU" method="post" action="/bookupd" onSubmit="return check()">
  <input type="button" value="一覧に戻る" onClick="location.href='http://localhost:3000/booklog'" style="width: 8%; padding: 6px;">
  <button type="submit" value="UPD" name="action" style="width: 8%; padding: 6px;">更新する</button>
  <button type="submit" value="DEL" name="action" style="width: 8%; padding: 6px;">削除する</button>
 <p>
 <table border="0" bgcolor="#00008b" align="center" valign="center" width="98%" height="95%">
  <tr valign="top">
  <td>
   <table width="98%" border="2" align="center" valign="center" bordercolor="#00008b"
    cellspacing="2" cellpadding="2" align="left" style="margin:20px 0px;" bgcolor="#00008b">
   <tr height="15px" bgcolor="#FFFFFF" bordercolor="#00008b">
    <td bgcolor="#E8E0FF" width="12%" align="center"><b>ISBN-13<font size="1" color="#FF3366">※</b></font></td>
    <td align="center"><b><%= bookItem.ISBN13 %></b>
     <input type="hidden" name="honno" VALUE="<%= bookItem.ISBN13 %>">
    </td>
    <td bgcolor="#E8E0FF" width="10%" align="center"><a href="https://www.amazon.co.jp/dp/<%= bookItem.ISBN10 %>" target="_blank">ISBN-10</a><font size="1" color="#FF3366"></td>
    <td> <input id="amazonno" name="amazonno" type="text" class="inpstr1" value="<%= bookItem.ISBN10 %>" pattern="\d{10}" title="数字10桁" onchange='check2(this);' /></td>
    <td bgcolor="#E8E0FF" width="10%" align="center">状  況</td>
    <td> <select name="jyokyo" class="selbox">
    <% if (bookItem.State === '未読') { %>
     <option value="未読" selected>未読</option>
     <option value="読書中">読書中</option>
     <option value="読了">読了</option>
    <% } else if (bookItem.State === '読書中') { %>
     <option value="未読">未読</option>
     <option value="読書中" selected>読書中</option>
     <option value="読了">読了</option>
    <% } else { %>
     <option value="未読">未読</option>
     <option value="読書中">読書中</option>
     <option value="読了" selected>読了</option>
    <% } %>
     </select></td>
    <td bgcolor="#DDEEFF" width="10%" align="center">画  像</td>
    <td align="left" width="22%"> <input id="gazoufile" name="gazoufile" type="text" class="inpstr1L" value="<%= bookItem.CoverImg %>"></td></tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#E8E0FF" align="center">書  名<font size="1" color="#FF3366">※</b></td>
    <td colspan="5" align="left"> <input id="honmei" name="honmei" type="text" class="inpstr3" value="<%= bookItem.BookName %>" required></td>
    <td rowspan="8" colspan="2" align="center">
    <% if (bookItem.CoverImg !== "") { %>
     <img width="250" src="F:/exapp/public/images/<%= bookItem.CoverImg %>">
    <% } %>
    </td></tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#E8E0FF" align="center">著  者</td>
    <td colspan="3" align="left"> <input id="sakusya" name="sakusya" type="text" class="inpstr2" value="<%= bookItem.Author %>"></td>
    <td bgcolor="#E8E0FF" align="center">ジャンル</td>
    <td align="left"> <input id="bunrui" name="bunrui" type="text" class="inpstr1A" value="<%= bookItem.Genre %>"></td></tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#E8E0FF" align="center">出 版 社</td>
    <td colspan="5" align="left"> <input id="honya" name="honya" type="text" class="inpstr3" value="<%= bookItem.Publisher %>"></td></tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#EEDDFF" align="center">発 行 日</td>
    <td> <input id="hakkoubi" name="hakkoubi" type="date" class="inpstr1" value="<%= bookItem.IDATE %>" pattern="\d{4}-\d{2}-\d{2}" title="YYYY-MM-DD"></td>
    <td bgcolor="#E8E0FF" align="center">入 手 日</td>
    <td> <input id="iritebi" name="iritebi" type="date" class="inpstr1" value="<%= bookItem.GDATE %>" pattern="\d{4}-\d{2}-\d{2}" title="YYYY-MM-DD"></td>
    <td bgcolor="#EEDDFF" align="center">読 了 日</td>
    <td> <input id="yondahi" name="yondahi" type="date" class="inpstr1" value="<%= bookItem.RDATE %>" pattern="\d{4}-\d{2}-\d{2}" title="YYYY-MM-DD"></td></tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#DFDFFF" align="center">概  要</td>
    <td colspan="5" align="left"> <input id="gaiyou" name="gaiyou" type="text" class="inpstr3" value="<%= bookItem.Overview %>"></td></tr>
   <tr bgcolor="#FFFFFF">
    <td bgcolor="#DFDFFF" align="center">感  想</td>
    <td colspan="5" align="center">
    <textarea name="kansou" cols="85" rows="12" class="inpbox"><%= bookItem.Impressions %></textarea></td></tr>
   <tr height="15px" bgcolor="#FFFFFF">
    <td bgcolor="#E8E0FF" align="center">図 書 館</td>
    <td align="left"> <input id="tosyokan" name="tosyokan" type="text" class="inpstr1A" value="<%= bookItem.Library %>"></td>
    <td bgcolor="#E8E0FF" align="center">所  有</td>
    <td> <select name="shoyuu" class="selbox">
    <% if (bookItem.Ownership === 1) { %>
      <option value=true selected>購入</option>
      <option value=false>非購入</option>
    <% } else { %>
      <option value=true>購入</option>
      <option value=false selected>非購入</option>
    <% } %>
      </select></td>
    <td bgcolor="#EEDDFF" align="center">購入金額</td>
    <td align="left"> \ <input id="hondai" name="hondai" type="number" class="inpstr1R" value="<%= bookItem.Purchase %>" style="text-align: right;">-</td>
   </tr>
   </table>
  </td>
  </tr>
  <tr>
  <td align="right">
   <font class="ministr"><font color="#FF3366">※</font><font color="#FFFFFF">の項目は入力必須項目です。</font>
  </td>
  </tr>
 </table>
</form>
</body>
</html>
Comment

HTA版 読書履歴管理システム

2018-05-01 12:02:01 | EXCEL VBA
またまた、求職中(つまりは失業中)となりました。
なので、新しい仕組みをリハビリ(ITセンスのブラッシュアップ)がてらに・・・。

「ソーシャルライブラリ」という蔵書・書籍管理のソーシャルゲームがあって
結構な期間、利用させてもらっていたのですが、
何故か、不能(予告も何もなく、停止)となり、
登録も500冊ほどはあっと思うけど、その履歴情報が失われました。
きっと、止むにやまれぬご事情がおありとは思うものの、
予告があれば退避したのですが・・・(予兆はありましたが・・・)

で、暇だし、自分で作ってみるかというのが、このシステムです。

使い方(例によって、不親切な説明です)
①.BOOKLOG というフォルダを作る(フォルダ名は実は何でもいい)
②.以下のテキスト形式のファイルを作り、ソースを張り付ける。
 ※全角のスペースは、半角のスペース2つに置換する(但し、行の頭の部分)
 ・BOOKLOG.hta
 ・Make_BOOKLOG.hta
 ・BOOKLOG.css
 ・BOOKLOG.js

③.Make_BOOKLOG.hta をクリックして、mdbにテーブルを作成する。


④.BOOKLOG.hta をクリックして使う。


 ※桁数が、こなれていなくて、無駄の多い画面になってます。
 ※まだ、テストが不十分で、バグが多々あります。
 ↓以下、HTMLタグが、字化けするので、半角の< > を全角の< >に置換して掲載しています。

【BOOKLOG.hta】---------------------------------------------
<html>
<head>
<hta:application navigable="yes" scroll="auto">
</hta:application>
<script src="BOOKLOG.js" type="text/javascript"></script>
<link href="BOOKLOG.css" type="text/css" rel="stylesheet">
<title>読書履歴</title>
</head>
<body bgcolor="#CCCCCC">
<div id="Body" class="documentBody">
<script>
 func_Init()
</script>
</div>
</body>
</html>

【Make_BOOKLOG.hta】----------------------------------------
<html>
<head>
<meta http-equiv="Content-Type"    content="text/html; charset=Shift_JIS" />
<meta http-equiv="Content-Language"  content="ja" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<HTA:APPLICATION />
<title>BOOKLOG MDB作成</title>
<link rel="stylesheet" type="text/css" href="BOOKLOG.css" />
<script type="text/javascript" >

var DBBOOLEAN    = 1;
var DBINTEGER    = 3;
var DBLONG     = 4;
var DBCURRENCY   = 5;
var DBDATE     = 8;
var DBTEXT     = 10;
var DBMEMO     = 12;
var DBAUTOINCRFIELD = 16;
var DBOPENTABLE   = 1;
var dbpath     = "BOOKLOG.mdb";

//データベース生成
function makemdb(){
 var shell = new ActiveXObject("WScript.Shell");
 shell   = null;

 var dbe  = new ActiveXObject("DAO.DBEngine.36");
 var dbws = dbe.Workspaces(0);
 var db  = dbws.CreateDatabase(dbpath,";LANGID=0x411;CP=932;COUNTRY=0");
 db.Close();
 dbws.Close();
 dbe = null;
 alert("カレントフォルダに BOOKLOG.mdb を作成しました");
 document.getElementById("mdb").innerHTML = "カレントフォルダに BOOKLOG.mdb を作成しました";
}

//テーブル作成
function maketable(){
 var shell = new ActiveXObject("WScript.Shell");
 shell   = null;

 var dbe  = new ActiveXObject("DAO.DBEngine.36");
 var dbws  = dbe.Workspaces(0);
 var db   = dbws.OpenDatabase(dbpath);

 // T_BOOKLOG
 var tbdef = db.CreateTableDef("T_BOOKLOG");
 var field = new Array(16);
 field[0] = tbdef.CreateField("ISBN-13" ,DBTEXT, 13);
 field[1] = tbdef.CreateField("ISBN-10" ,DBTEXT, 10); field[1].AllowZeroLength = true; field[1].Required = false;
 field[2] = tbdef.Createfield("書名"   ,DBTEXT, 50);
 field[3] = tbdef.Createfield("著者"   ,DBTEXT, 25); field[3].AllowZeroLength = true; field[3].Required = false;
 field[4] = tbdef.Createfield("出版社"  ,DBTEXT, 25); field[4].AllowZeroLength = true; field[4].Required = false;
 field[5] = tbdef.Createfield("ジャンル" ,DBTEXT, 25); field[5].AllowZeroLength = true; field[5].Required = false;
 field[6] = tbdef.Createfield("発行日"  ,DBDATE);
 field[7] = tbdef.Createfield("入手日"  ,DBDATE);
 field[8] = tbdef.Createfield("読了日"  ,DBDATE);
 field[9] = tbdef.Createfield("所有"   ,DBBOOLEAN);
 field[10] = tbdef.CreateField("購入金額" ,DBCURRENCY);
 field[11] = tbdef.CreateField("図書館"  ,DBTEXT, 25); field[11].AllowZeroLength = true; field[11].Required = false;
 field[12] = tbdef.Createfield("概要"   ,DBTEXT,255); field[12].AllowZeroLength = true; field[12].Required = false;
 field[13] = tbdef.Createfield("感想"   ,DBMEMO);   field[13].AllowZeroLength = true; field[13].Required = false;
 field[14] = tbdef.CreateField("状況"   ,DBTEXT, 10); field[14].AllowZeroLength = true; field[14].Required = false;
 field[15] = tbdef.Createfield("画像"   ,DBTEXT, 25); field[15].AllowZeroLength = true; field[15].Required = false;
 for(var i=0;i < 16;i++){
  tbdef.Fields.Append(field[i]);
 }
 db.TableDefs.Append(tbdef);

 var Idx   = tbdef.CreateIndex("PrimaryKey");
 Idx.Primary = true;
 Idx.Unique = true;
 var IdxF1  = Idx.CreateField("ISBN-13");
 Idx.Fields.Append(IdxF1);
 tbdef.Indexes.Append(Idx);

 var Idx2   = tbdef.CreateIndex("書名と著者");
 Idx2.Primary = false;
 Idx2.Unique = true;
 var Idx2F1  = Idx2.CreateField("書名");
 var Idx2F2  = Idx2.CreateField("著者");
 Idx2.Fields.Append(Idx2F1);
 Idx2.Fields.Append(Idx2F2);
 tbdef.Indexes.Append(Idx2);

 db.Close();  db  = null;
 dbws.Close(); dbws = null;
 dbe = null;
 alert("BOOKLOG.mdb に、T_BOOKLOG を作成しました");
 document.getElementById("tbl").innerHTML = "BOOKLOG.mdb に、T_BOOKLOG を作成しました";
}
function go_BOOKLOG(){
 var shell = new ActiveXObject("WScript.Shell");
 shell.Run("BOOKLOG.hta");
}
function kakunin(){
 ret = prompt("任意ページのURLを入力", "http://www.yahoo.co.jp/");
 if (ret != null){
  window.open(ret, "new");
 }
}
</script>
</head>
<body><basefont face="HGゴシックM">
<link href="BOOKLOG.ccs" type="text/css" rel="stylesheet"">

 <div id="mdb"><input type="button" value="MDB生成"   onClick="makemdb()"   style="WIDTH:100px"></div><br>
 <div id="tbl"><input type="button" value="テーブル作成"  onclick="maketable()"  style="WIDTH:100px"></div><br>
 <div id="mon"><input type="button" value="読書履歴の入力" onclick="go_BOOKLOG()"  style="WIDTH:100px"></div><br>
 <div id="nni"><input type="button" value="任意ページへ"  onClick="kakunin()"   style="WIDTH:100px"></div><br>
 <div id="cls"><input type="button" value="閉 じ る"   onClick="window.close()" style="WIDTH:100px"></div>

<script type="text/javascript" >
 window.resizeTo(660,330);
</script>
</body>
</html>

【BOOKLOG.css】---------------------------------------------
body {
 background:-ms-liner-gradient(to bottom, #898682, #1e1d1b);
 background-color: #3CB371;
 color: #ffffff;
 font-family: "メイリオ";
}
.valuestr {color:"#000077";font-size:10pt;font-style:normal;font-family:"メイリオ";}
.valueCstr{color:"#000077";font-size:10pt;font-style:normal;text-align="center";}
.ministr {color:"#000077";font-size:8pt;font-style:normal;}
.inpstr1 {color:"#000077";font-size:10pt;font-style:normal;text-align="center";width:140px;border:none;font-family:"HGゴシックM";}
.inpstr1L {color:"#000077";font-size:10pt;font-style:normal;text-align="left"; width:150px;border:none;font-family:"HGゴシックM";}
.inpstr1R {color:"#000077";font-size:10pt;font-style:normal;text-align="right"; width:50px;border:none;font-family:"HGゴシックM";}
.inpstr2 {color:"#000077";font-size:10pt;font-style:normal;text-align="left"; width:320px;border:none;font-family:"HGゴシックM";}
.inpstr2S {color:"#000077";font-size:10pt;font-style:normal;text-align="left"; width:250px;border:none;font-family:"HGゴシックM";}
.inpstr3 {color:"#000077";font-size:10pt;font-style:normal;text-align="left"; width:440px;border:none;font-family:"HGゴシックM";}
.inpstr4 {color:"#000077";font-size:10pt;font-style:normal;text-align="left"; width:820px;border:none;font-family:"HGゴシックM";}
.inpbox  {color:"#000077";font-size:10pt;font-style:normal;text-align="left";       border:none;font-family:"HGゴシックM";}
.selbox  {color:"#000077";font-size:10pt;font-style:normal;text-align="center";width:80px;border:none;font-family:"HGゴシックM";}
.indexstr {color:"#FFFFFF";font-size:10pt;font-weight:bold;font-style:normal;text-align="center";}
.recstr  {color:"darkviolet"; font-size:10pt;font-style:normal;text-align="center";}
A:    {text-decoration: none }
A:link  {color:"#000077"}
A:active {color:steelblue}
A:visited {color:"#000077"}
A:hover  {color:steelblue}
DIV.documentBody{Height:0px; Width:100%;overflow:auto;}

【BOOKLOG.js】①--------------------------------------------
var num13 = "";
// var mdb = "F:/BOOKLOG/BOOKLOG.mdb";
var mdb = "BOOKLOG.mdb";
function func_Init() {
var tmp = "";
tmp = location.search;
if (tmp == "") {
  setList();
} else {
  var bodyPtn = tmp.slice(1,4);
  if (bodyPtn == "UPD") {
   window.resizeTo(1130,600);
   tmp = tmp.slice(4);
   updPage(tmp);
  } else if (bodyPtn == "INS") {
   window.resizeTo(1130,600);
   insPage();
  } else {
   num13 = tmp.slice(4);
   setList(num13);
  }
}
}
function go_UpdRec(num13) {
 location.href = "BOOKLOG.hta?UPD" + num13;
}
function go_NewRec() {
 location.href = "BOOKLOG.hta?INS";
}
function go_MainPage() {
 location.href = "BOOKLOG.hta?LST";
}
function setList(num13) {
 if (num13 == "1234567890123") { num13 = ""; }
 var cn  = new ActiveXObject("ADODB.Connection");
 cn.Open(" Driver={Microsoft Access Driver (*.mdb)};DBQ=" + mdb);
  var mySql = "SELECT * FROM T_BOOKLOG";
 try {
   var rs = cn.Execute(mySql);
 } catch (e) {
  cn.Close;
  document.write('対象テーブル検索不能' + (e.number & 0xFFFF) + " " + e.message + " " + mySql);
  alert("対象テーブル検索不能" + e);
  return ;
 }
 if (rs.EOF){ insPage(); }
 var strDoc = ' <br>';
 strDoc += '<table border="0" bgcolor="#FFFFFF" align="center" valign="center" width="95%" height="95%">';
 strDoc += '<tr valign="top"><td> <br>';
 strDoc += '<table width="92%" border="0" align="center" valign="abscenter" cellspacing="2" cellpadding="2" class="valuestr" align="left">';
 strDoc += '<tr><td height="1px" width="150px"> </td>';
 strDoc += '<td height="1px" width="350px"> </td>';
 strDoc += '<td height="1px" width="80px" > </td>';
 strDoc += '<td height="1px" width="80px" > </td>';
 strDoc += '<td height="1px" width="40px" > </td></tr>';
 strDoc += '<tr><tr class="genrestr" bgcolor="#CCCCFF"><td colspan="3"><b> 読 書 履 歴 管 理</b>';
 strDoc += '</td><td colspan="2" align="center"><a href="#" onClick="go_NewRec()">新規追加</a></td></tr>';
 document.clear();
 mySql = "SELECT [ISBN-13],[書名],[著者],format([入手日],'YYYY/MM/DD'),[状況] FROM T_BOOKLOG ORDER BY [入手日] DESC";
 try {
   var rs = cn.Execute(mySql);
 } catch (e) {
  cn.Close;
  document.write("対象テーブル検索不能" + (e.number & 0xFFFF) + " " + e.message + " " + mySql);
  alert("対象テーブル検索不能");
  return;
 }
 var strYMD = "";
 strDoc  += '<tr class="indexstr" bgcolor="#CCCCFF"><td>ISBN</td><td>書 名</td><td>著 者</td><td>入手日</a></td><td>状 況</td></tr>'
 while (!rs.EOF){
  strDoc += '<tr bgcolor=#E0F1FF><td align=center>';
  strDoc += '<a href="#" onClick=go_UpdRec("' + rs(0).value + '")>' + rs(0).value + '</a></td>';
  strYMD = rs(3).value;
  if (strYMD < '2000/01/01') { strYMD = ""; }
  strDoc += '<td>' + rs(1).value + '</td><td align=center wight="50">' + rs(2).value + '</td>';
  strDoc += '<td align=center>' + strYMD + '</td>';
  strDoc += '<td class=recstr align=middle>' + rs(4).value + '</td></tr>';
  rs.MoveNext();
 }
 strDoc += '</td></tr></table>';
 document.write(strDoc);
 rs.Close();
 cn.Close();
 rs = null;
 cn = null;
}

※文字数制限を超えるので、以下は、HTA版 読書履歴管理システム②に続きます。
Comment

HTA版 読書履歴管理システム②

2018-05-01 12:01:50 | EXCEL VBA
HTA版 読書履歴管理システム①からの続き
【BOOKLOG.js】②--------------------------------------------
function updPage(uIsbn) {
 num13 = uIsbn;
 var mySql = "SELECT format([入手日],'YYYY/MM/DD'),"
          + "format([発行日],'YYYY/MM/DD'),"
          + "format([読了日],'YYYY/MM/DD'),*"
      + " FROM T_BOOKLOG WHERE [ISBN-13] = '" + num13 + "'";
 var cn = new ActiveXObject("ADODB.Connection");
 cn.Open(" Driver={Microsoft Access Driver (*.mdb)};DBQ=" + mdb);
 try {
  var rs = cn.Execute(mySql);
 } catch (e) {
  cn.Close;
  document.write('対象レコード検索不能' + (e.number & 0xFFFF) + " " + e.message + " " + mySql);
  alert("対象レコード検索不能");
  return;
 }
 num13 = rs(3).value;
 var strDoc = '<form><input type="button" value="一覧に戻る" onClick="go_MainPage()" style="width: 8%; padding: 6px;"> ';
 strDoc += '<input type="button" value="更新する" onClick="updRec(' + num13 + ')" style="width: 8%; padding: 6px;"> '
 strDoc += '<input type="button" value="削除する" onClick="delRec(' + num13 + ')" style="width: 8%; padding: 6px;">'
 strDoc += '</form><p><table bgcolor="#FFFFFF" width="95%" height="90%" align="center"><td valign="top"><br><br>';
 strDoc += '<table bgcolor="#FFFFFF" width="92%" height="80%" align="center" border="1" cellspacing="0" cellpadding="0" class="valueCstr">';
 var tmp = "";
 var arr = [];
 var str = "";
 if (!rs.EOF){
  strDoc += '<tr height="15px">';
  strDoc += '<td bgcolor="#E8E0FF" width="12%"><b>ISBN-13<font size="1" color="#FF3366">※</b></font></td><td><b>';
  strDoc += num13 + '</b></td><td bgcolor="#E8E0FF" width="10%"><a href="https://www.amazon.co.jp/';
  if (rs(4).value != null) { strDoc += 'dp/' + rs(4).value; }
  strDoc += '" target="_blank">ISBN-10</a><font size="1" color="#FF3366"></td>';
  strDoc += '<td><input id="amazonno" type="text" class="inpstr1" value="';
  strDoc += rs(4).value + '"></td><td bgcolor="#E8E0FF" width="10%">状  況</td><td><select name="jyokyo" class="selbox">';
  switch (rs(17).value) {
   case "読書中":
     strDoc += '<option value="未読">未読</option><option value="読書中" selected>読書中</option><option value="読了">読了</option>';
     break;
   case "読了":
     strDoc += '<option value="未読">未読</option><option value="読書中">読書中</option><option value="読了" selected>読了</option>';
     break;
   default:
     strDoc += '<option value="未読" selected>未読</option><option value="読書中">読書中</option><option value="読了">読了</option>';
  }
  strDoc += '</select></td><td bgcolor="#DDEEFF" width="10%">画  像</td><td align="left">';
  strDoc += ' <input id="gazoufile" type="text" class="inpstr1L" value="';
  strDoc += rs(18).value + '"></td></tr>';

  strDoc += '<tr height="15px"><td bgcolor="#E8E0FF">書  名<font size="1" color="#FF3366">※</b></td>';
  strDoc += '<td colspan="5" align="left"> <input id="honmei" type="text" class="inpstr3" value="';
  strDoc += rs(5).value + '"></td><td rowspan="8" colspan="2"><img src="IMAGE/' + rs(18).value + '" align="center" width="200" ></td></tr>';
  
  strDoc += '<tr height="15px"><td bgcolor="#E8E0FF">著  者</td><td  colspan="3" align="left">';
  strDoc += ' <input id="sakusya" type="text" class="inpstr2" value="';
  strDoc += rs(6).value + '"></td><td bgcolor="#E8E0FF">ジャンル</td><td align="left"> <input id="bunrui" type="text" class="inpstr1" value="';
  strDoc += rs(8).value + '"></td></tr>';
  
  strDoc += '<tr height="15px"><td bgcolor="#E8E0FF">出 版 社</td><td colspan="5" align="left">';
  strDoc += ' <input id="honya" type="text" class="inpstr3" value="';
  strDoc += rs(7).value + '"></td></tr>';

  strDoc += '<tr height="15px"><td bgcolor="#EEDDFF">発 行 日</td><td><input id="hakkoubi" type="date" class="inpstr1" value="';
  strDoc += rs(1).value + '"></td><td bgcolor="#E8E0FF">入 手 日</td><td><input id="iritebi" type="date" class="inpstr1" value="';
  strDoc += rs(0).value + '"></td><td bgcolor="#EEDDFF">読 了 日</td><td><input id="yondahi" type="date" class="inpstr1" value="';
  strDoc += rs(2).value + '"></td></tr>';

  strDoc += '<tr height="15px"><td bgcolor="#DFDFFF">概  要</td><td colspan="5" align="left">';
  strDoc += ' <input id="gaiyou" type="text" class="inpstr3" value="';
  strDoc += rs(15).value + '"></td></tr>';

  strDoc += '<tr><td bgcolor="#DFDFFF">感  想</td><td colspan="5" align="center">';
  strDoc += '<textarea name="kansou" cols="80" rows="12" class="inpbox">';
  strDoc += rs(16).value + '</textarea></td></tr>';

  strDoc += '<tr height="15px"><td bgcolor="#E8E0FF">所  有</td><td><select name="shoyuu" class="selbox">';
  if (rs(12).value == true) {
    strDoc += '<option value=true selected>購入</option><option value=false>非購入</option>';
  } else {
    strDoc += '<option value=true>購入</option><option value=false selected>非購入</option>';
  }
  strDoc += '</select></td><td bgcolor="#EEDDFF">購入金額</td><td align="left"> <input id="hondai" type="text" class="inpstr1R" value="';
  strDoc += rs(13).value + '"></td></td><td bgcolor="#E8E0FF">図 書 館</td><td align="left">';
  strDoc += ' <input id="tosyokan" type="text" class="inpstr1" value="';
  strDoc += rs(14).value + '"></td></tr></tr></table>';

  strDoc += '<tr><td align="right"><font class="ministr"><font color="#FF3366">※</font>の項目は入力必須項目です。<br> </font></td></tr></table>';
 }
 strDoc = strDoc.replace(/null/g,"");
 document.write(strDoc);
 rs.Close();
 cn.Close();
 rs = null;
 cn = null;
}
function insPage() {
 num13 = "9784000000000";
 num10 = "1234567890";
 var strDoc = '<form><input type="button" value="一覧に戻る" onClick="go_MainPage()" style="width: 8%; padding: 6px;">';
 strDoc += ' <input type="button" value="登録する" onClick="insRec()" style="width: 8%; padding: 6px;">';
 strDoc += '</form><p><table bgcolor="#FFFFFF" width="95%" height="90%" align="center"><td valign="top"><br><br>';
 strDoc += '<table bgcolor="#FFFFFF" width="92%" height="80%" align="center" border="1" cellspacing="1" cellpadding="0" class="valueCstr">';

 strDoc += '<tr height="15px">';
 strDoc += '<td bgcolor="#E8E0FF" width="12%"><b>ISBN-13<font size="1" color="#FF3366">※</b></font></td><td width="25%"><input id="honban" type="text" value="' + num13 + '" class="inpstr1"></td>';
 strDoc += '<td bgcolor="#E8E0FF" width="11%"><a href="https://www.amazon.co.jp/" target="_blank">ISBN-10</a><font size="1" color="#FF3366"></td><td width="25%"><input id="amazonno" type="text" value="' + num10 + '" class="inpstr1"></td>';
 strDoc += '<td bgcolor="#E8E0FF" width="11%">状  況</td><td><select name="jyokyo" class="selbox">';
 strDoc += '<option value="未読" selected>未読</option><option value="読書中">読書中</option><option value="読了">読了</option></select></td>';

 strDoc += '</tr><tr height="15px">';
 strDoc += '<td bgcolor="#E8E0FF">書  名<font size="1" color="#FF3366">※</b></td><td colspan="5" align="left"> <input id="honmei" type="text" class="inpstr4"></td>';

 strDoc += '</tr><tr height="15px">';
 strDoc += '<td bgcolor="#E8E0FF">著  者</td><td colspan="3" align="left"> <input id="sakusya" type="text" class="inpstr2"></td>';
 strDoc += '<td bgcolor="#E8E0FF">ジャンル</td><td align="left"> <input id="bunrui" type="text" class="inpstr1"></td>';

 strDoc += '</tr><tr height="15px">';
 strDoc += '<td bgcolor="#E8E0FF">出 版 社</td><td colspan="3" align="left"> <input id="honya" type="text" class="inpstr2"></td>';
 strDoc += '<td bgcolor="#DDEEFF">画  像</td><td align="left"> <input id="gazoufile" type="text" class="inpstr1"></td>';

 strDoc += '</tr><tr height="15px">';
 strDoc += '<td bgcolor="#EEDDFF">発 行 日</td><td><input id="hakkoubi" type="date" class="inpstr1"></td>';
 strDoc += '<td bgcolor="#E8E0FF">入 手 日</td><td><input id="iritebi" type="date" class="inpstr1"></td>';
 strDoc += '<td bgcolor="#EEDDFF">読 了 日</td><td><input id="yondahi" type="date" class="inpstr1"></td>';

 strDoc += '</tr><tr height="15px">';
 strDoc += '<td bgcolor="#DFDFFF">概  要</td><td colspan="5" align="left"> <input id="gaiyou" type="text" class="inpstr4"></td>';

 strDoc += '</tr><tr>';
 strDoc += '<td bgcolor="#DFDFFF">感  想</td><td colspan="5" align="right"><textarea name="kansou" cols="118" rows="10" class="inpbox"></textarea></td>';

 strDoc += '</tr><tr height="15px">';
 strDoc += '<td bgcolor="#E8E0FF">所  有</td><td><select name="shoyuu" class="selbox">';
 strDoc += '<option value="1" selected>購入</option><option value="0">非購入</option></select></td>';
 strDoc += '<td bgcolor="#EEDDFF">購入金額</td><td align="left"> <input id="hondai" type="text" class="inpstr1R" value=0></td>';
 strDoc += '<td bgcolor="#E8E0FF">図 書 館</td><td align="left"> <input id="tosyokan" type="text" class="inpstr1"></td>';

 strDoc += '</tr></table></td></tr><tr><td align="right">';
 strDoc += '<font class="ministr"><font color="#FF3366">※</font>の項目は入力必須項目です。<br> </font></td></tr></table>';
 strDoc = strDoc.replace(/null/g,"");
 document.write(strDoc);
 var now = new Date();
 document.getElementById('hakkoubi').value = toLocaleString(now);
 document.getElementById('iritebi').value = toLocaleString(now);
 document.getElementById('yondahi').value = toLocaleString(now);
 var element = document.getElementById("honban");
 element.focus();
}
function updRec(num13) {
 var cn  = new ActiveXObject("ADODB.Connection");
 if (num13 == "") { alert("ISBNコードは、必須入力項目です!"); return; }
 cn.Open(" Driver={Microsoft Access Driver (*.mdb)};DBQ=" + mdb);
 var mySql = "UPDATE T_BOOKLOG SET ";
 var tmp  = "";
 var num10 = document.getElementById('amazonno').value;
 if (num10 == "") { mySql += "[ISBN-10] = null"; } else { mySql += "[ISBN-10] = '" + num10 + "'"; }
 tmp = document.getElementById('honmei').value; mySql += ",[書名] = '"        + tmp + "'";
 if (tmp == "") { alert("書名は、必須入力項目です!"); return; }
 tmp = document.getElementById('sakusya').value;
 if (tmp == "") { mySql += ",[著者] = null"; }   else { mySql += ",[著者] = '"   + tmp + "'"; }
 tmp = document.getElementById('honya').value;
 if (tmp == "") { mySql += ",[出版社] = null"; }  else { mySql += ",[出版社] = '"  + tmp + "'"; }
 tmp = document.getElementById('bunrui').value;
 if (tmp == "") { mySql += ",[ジャンル] = null"; } else { mySql += ",[ジャンル] = '" + tmp + "'"; }
 tmp = document.getElementById('hakkoubi').value;
 if (tmp == "") { mySql += ",[発行日] = null"; }  else { mySql += ",[発行日] = '"  + tmp + "'"; }
 tmp = document.getElementById('iritebi').value;
 if (tmp == "") { mySql += ",[入手日] = null"; }  else { mySql += ",[入手日] = '"  + tmp + "'"; }
 tmp = document.getElementById('yondahi').value;
 if (tmp == "") { mySql += ",[読了日] = null"; }  else { mySql += ",[読了日] = '"  + tmp + "'"; }
 tmp = document.getElementById('shoyuu').value;
 if (tmp == "") { mySql += ",[所有] = null"; }   else { mySql += ",[所有] = "   + tmp; }
 tmp = document.getElementById('hondai').value;
 if (tmp == "") { mySql += ",[購入金額] = null"; } else { mySql += ",[購入金額] = " + tmp; }
 tmp = document.getElementById('tosyokan').value;
 if (tmp == "") { mySql += ",[図書館] = null"; }  else { mySql += ",[図書館] = '"  + tmp + "'"; }
 tmp = document.getElementById('gaiyou').value;
 if (tmp == "") { mySql += ",[概要] = null"; }   else { mySql += ",[概要] = '"   + tmp + "'"; }
 tmp = document.getElementById('kansou').value;
 if (tmp == "") { mySql += ",[感想] = null"; }   else { mySql += ",[感想] = '"   + tmp + "'"; }
 tmp = document.getElementById('jyokyo').value;
 if (tmp == "") { mySql += ",[状況] = null"; }   else { mySql += ",[状況] = '"   + tmp + "'"; }
 tmp = document.getElementById('gazoufile').value;
 if (tmp == "") { mySql += ",[画像] = null"; }   else { mySql += ",[画像] = '"   + tmp + "'"; }
 mySql += " WHERE [ISBN-13] = '" + num13 + "'";
 try {
  var rs = cn.Execute(mySql);
  alert("対象レコード更新完了");
 } catch (e) {
  cn.Close;
  alert("対象レコード更新失敗 " + (e.number & 0xFFFF) + " " + e.message + " " + mySql);
  return;
 }
 cn.Close();
 rs = null;
 cn = null;
 location.href = "BOOKLOG.hta?LST" + num13 ;
}
function insRec() {
 var cn  = new ActiveXObject("ADODB.Connection");
 cn.Open(" Driver={Microsoft Access Driver (*.mdb)};DBQ=" + mdb);
 var mySql = "INSERT INTO T_BOOKLOG([ISBN-13],[ISBN-10],[書名],[著者],[出版社],[ジャンル],";
 mySql += "[発行日],[入手日],[読了日],[所有],[購入金額],[図書館],[概要],[感想],[状況],[画像])";
 mySql += " VALUES(";
 num13 = document.getElementById('honban'). value; mySql += "'" + num13 + "'";
 num10 = document.getElementById('amazonno').value; mySql += ",'" + num10 + "'";
 var tmp = "";
 tmp = document.getElementById('honmei').value; mySql += ",'" + tmp + "'";
 if (tmp == "") { alert("書名は、必須入力項目です!"); return; }
 tmp = document.getElementById('sakusya').value;
 if (tmp == "") { mySql += ",null"; } else  { mySql += ",'" + tmp + "'"; }
 tmp = document.getElementById('honya').value;
 if (tmp == "") { mySql += ",null"; } else  { mySql += ",'" + tmp + "'"; }
 tmp = document.getElementById('bunrui').value;
 if (tmp == "") { mySql += ",null"; } else  { mySql += ",'" + tmp + "'"; }
 tmp = document.getElementById('hakkoubi').value;
 if (tmp == "") { mySql += ",null"; } else  { mySql += ",'" + tmp + "'"; }
 tmp = document.getElementById('iritebi').value;
 if (tmp == "") { mySql += ",null"; } else  { mySql += ",'" + tmp + "'"; }
 tmp = document.getElementById('yondahi').value;
 if (tmp == "") { mySql += ",null"; } else  { mySql += ",'" + tmp + "'"; }
 tmp = document.getElementById('shoyuu').value;
 if (tmp == "1") { mySql += ",true"; } else  { mySql += ",false"; }
 tmp = document.getElementById('hondai').value;
 if (tmp == "") { mySql += ",null"; } else  { mySql += "," + tmp; }
 tmp = document.getElementById('tosyokan').value;
 if (tmp == "") { mySql += ",null"; } else  { mySql += ",'" + tmp + "'"; }
 tmp = document.getElementById('gaiyou').value;
 if (tmp == "") { mySql += ",null"; } else  { mySql += ",'" + tmp + "'"; }
 tmp = document.getElementById('kansou').value;
 if (tmp == "") { mySql += ",null"; } else  { mySql += ",'" + tmp + "'"; }
 tmp = document.getElementById('jyokyo').value;
 if (tmp == "") { mySql += ",null"; } else  { mySql += ",'" + tmp + "'"; }
 tmp = document.getElementById('gazoufile').value;
 if (tmp == "") { mySql += ",null)"; } else  { mySql += ",'" + tmp + "')"; }
 try {
  var rs  = cn.Execute(mySql);
  alert("対象レコード登録完了");
 } catch (e) {
  cn.Close;
  alert("対象レコード登録失敗 " + (e.number & 0xFFFF) + " " + e.message + " " + mySql);
  return;
 }
 cn.Close();
 rs = null;
 cn = null;
 location.href = "BOOKLOG.hta?LST" + num13 ;
}
function delRec(num13) {
 var cn  = new ActiveXObject("ADODB.Connection");
 if (num13 == "") { alert("ISBNコードは、必須入力項目です!"); return; }
 var rs = confirm('本当に削除しますか?');
 if( rs ) {
 } else {
  alert("削除キャンセルしました!");
  return;
 }
 cn.Open(" Driver={Microsoft Access Driver (*.mdb)};DBQ=" + mdb);
 var mySql = "DELETE FROM T_BOOKLOG WHERE [ISBN-13] = '" + num13 + "'";
 try {
  var rs = cn.Execute(mySql);
  alert("対象レコード削除完了");
 } catch (e) {
  cn.Close;
  alert("対象レコード削除失敗 " + (e.number & 0xFFFF) + " " + e.message + " " + mySql);
  return;
 }
 cn.Close();
 rs = null;
 cn = null;
 location.href = "BOOKLOG.hta?LST" + num13 ;
}
function toLocaleString( date ) {
  return [
    date.getFullYear(),
    date.getMonth() + 1,
    date.getDate()
    ].join( '/' );
}
Comment