2013年3月13日水曜日

最終課題(独自DBの作成)

実際に業務で使う(かもしれない)DBを想定し,独自のDBを作成して下さい.

まずは,どの業種向けの,どのような種類のDBなのかを考えてください.
そして,作成するDBの方向性が決まったら,まずはExcelを用いてDBの原型となる表を作成します.
表が作成出来たら正規化を行い,(リレーションを考えながら)複数の表に分割します.
後はACCESS上でテーブル~クエリ~フォーム・レポートを順番に作成していきます.

テーブル構成・クエリについては,Excelで作業している段階である程度確定しますが
フォーム・レポートについては,実際の業務の現場でどのように使われるかを想像しながら
作り込む事になりますので,皆さんの腕の見せ所です.

例)
・小売店向けの販売管理DB
→単なる集計表ではなく,消費税増税対応とすることで,使い勝手の良いDBとする.

・自分専用勤怠管理DB
→出席管理DBの応用版.勤怠の情報から,利用可能有給日数を表示.

・年賀状送付先管理DB
→毎年年末になると頭が痛い,年賀状の宛名書き.DBを使うことで常に最新の住所情報を使用.

2013年3月12日火曜日

追加課題(3/12)

追加課題1
「Q空き状況一覧」クエリに宿泊税(*1)込み金額を表示せよ.

宿泊税込み金額
宿泊税込み金額: IIf([基本料金]>=15000, [基本料金]+200, IIf([基本料金]>=10000, [基本料金]+100, [基本料金]))


追加課題2
「Q空き状況一覧」クエリにサービス料(*2),消費税(*3)込み金額を表示せよ.

宿泊税
宿泊税: IIf([基本料金]>=15000, 200, IIf([基本料金]>=10000, 100, 0))

サービス料
サービス料:[基本料金]*0.1

消費税
消費税:[基本料金]*0.05

税込金額
税込金額:[基本料金]+[宿泊税]+[サービス料]+[消費税]


(*1)本来宿泊税は東京都限定だが,今回は全国で一律に導入されているとする.宿泊税は宿泊料10,000円未満は0円,宿泊料10,000円以上15,000円未満は100円,15,000円以上は200円である.

(*2)サービス料は宿泊料の1割とする.

(*3)消費税は5%とする.


追加課題3
「F予約登録」フォーム,「R空き状況一覧」レポートに,税込金額を表示せよ.

2013年3月6日水曜日

追加課題(3/6)

消費税増税に対応出来るようにせよ.
=Int([本体価格]*0.05)
=IIf([売上日]>="2014/04/01", Int([本体価格]*0.08), Int([本体価格]*0.05))

2013年3月5日火曜日

追加課題(3/5)

P139-165 メインサブフォーム
現状では「F売上明細」中の消費税計算が5%固定になっているが,消費税率が8%,10%に増税された場合,DBとしてどのような対応が考えられるのか?
みなさん自身の判断で,増税対応を行ってください.


1.時期が来たら使用するDB自体を切り替える(切り替え後のDBは消費税率が8%,もしくは10%)
1-1.消費税率が切り替わるまでは現状のDBを使用し,消費税率が切り替わったら消費税率の計算部分の数字を0.05から0.08に書き換えたDBに変更する.
=Int([合計金額]*0.05)
=Int([合計金額]*0.08)

2.DB内で動的に消費税率を切り替えるようにする
2-1.IIf等の関数を用いてその場で適切な消費税を計算

「F売上明細」(サブフォーム)側では売上日が分からず,適用する消費税率が決められないので,「F売上伝票」(メインフォーム)側で消費税率を計算する.
=IIf([売上日]>="2014/04/01", "増税後", "増税前")
=IIf([売上日]>="2014/04/01", Int([売上明細].[Form]![合計金額]*0.08), Int([売上明細].[Form]![合計金額]*0.05))
2-2.時期による消費税率の違いを記した「T消費税率」のようなテーブルを新規に作成し,消費税計算を行う際は都度参照する.
「T消費税率」テーブルを新規で作成し,売上日を用いて「T消費税率」テーブル中の適用する消費税率を選択肢,税率計算で利用する.

2013年2月21日木曜日

追加課題(2/21)

出席日数から出席率を自動的に計算するアクセスのDBを作成する.

1.Excelにて,資料を参考に,DBの設計を行う.

2.Excel上で用意した複数の「テーブル」を,アクセス上に作成
アクセスファイルはこちら

3.必要な項目を表示・計算するような「クエリ」を作成

4.日々の入力作業・確認作業が簡単に行えるような,使いやすい「フォーム」を作成

各テーブル,クエリ,フォーム,レポートについては,こちらのファイル(ver.2)を参照のこと.

必要出席数の算出は,こちらのファイル(ver.3)を参照のこと.

レポート画面まで含めたサンプルは,こちらのファイル(ver.5).


当日分出欠入力フォーム,今後一週間のスケジュールレポートを含めた最終的なサンプルは,こちらのファイル(ver.6).

2013年2月20日水曜日

追加課題(2/20)

P269
総合問題2 追加課題
1.「Q受注リスト」に「税込金額」フィールドを追加せよ.
ただし,税率は一律5%とする.
税込金額: [金額]*(1.05)


2.軽減税率導入に対応出来るようにせよ.
ただし,軽減税率は8%,それ以外の税率は10%とする.
今回の商品分類の中では,食料品(ハム,フルーツ,菓子,缶詰,茶,ジュース)のみ軽減税率の対象とする.

2-1.「T分類リスト」に「税率」フィールドを追加.

2-2.「Q受注リスト」の「税込金額」フィールドで,2-1で追加した税率を使って,税込金額を計算.
税込金額: [金額]*(1+[税率]/100)


3.受注日により,自動的に税率を変更できるようにせよ.
3-1.まずは受注日によって処理を分岐し,表示するメッセージを切り替える.
受注日判定:IIf(
 Format([受注日],"yyyy/mm/dd")>="2015/10/01",
 "2015/10/1以降",
 "2015/10/1以前"
)

3-2.メッセージが思った通りに表示できたら,メッセージの部分を税込金額の計算式に置き換える.
税込金額(受注日考慮):IIf(
 Format([受注日],"yyyy/mm/dd")>="2015/10/01",
 [金額]*(1+[税率]/100),
 [金額]*(1+5/100)
)

2013年2月8日金曜日

追加課題(2/8)

今後消費税が以下のように変化すると仮定する.
標準税率軽減税率
現在5%-
2014/04/01 - 8%-
2015/10/110%8%
※軽減税率は,食料品等生活必需品等が対象となるようです.


1.税抜金額を表示
税抜金額: [単価]*[数量]


2.標準税率の場合の税込金額を表示
標準税率税込金額: [単価]*[数量]*1.05


3.軽減税率の場合の税込金額を表示
軽減税率税込金額: [単価]*[数量]*1.08


4.税率種別の表示
税率種別: IIf(
 [税率]='軽減',
 "軽減税率",
 "標準税率"
)


5.税率種別毎に税込金額を表示
税込金額: IIf(
 [税率]='軽減',
 [単価]*[数量]*1.05,
 [単価]*[数量]*1.08
)


6.リレーションを結んでいないテーブルのデータを参照
税率種別(標準): DLookUp(
 "[T消費税率].[消費税率]",
 "T消費税率",
 "[ID] = '3'"
)
税率種別(軽減): DLookUp(
 "[T消費税率(軽減)].[消費税率]",
 "T消費税率(軽減)",
 "[ID] = '3'"
)


7.2015/10/1以降の消費税率を,税率フィールドの項目により自動的に判別し表示
税込金額: IIf(
 [税率]='軽減',
 DLookUp("[T消費税率(軽減)].[消費税率]","T消費税率(軽減)","[ID] = '3'"),
 DLookUp("[T消費税率].[消費税率]","T消費税率","[ID] = '3'")
)


8.売上日が2014/4/1以降か判別する
売上日判別1: IIf(
 Format([売上日],"yyyy/mm/dd")>="2014/04/01",
 "2014/4/1以降",
 "2014/4/1以前"
)


9.売上日が2015/10/1以降の場合も判別する
売上日判別2: IIf(
 Format([売上日],"yyyy/mm/dd")>="2014/04/01",
 IIf(
  Format([売上日],"yyyy/mm/dd")>="2015/10/01",
  "2015/10/1以降",
  "2014/4/1~2015/9/30"
 ),
 "2014/4/1以前"
)


10.売上日・商品毎に適用される税率を表示
適用税率1: IIf(
 Format([売上日],"yyyy/mm/dd")>="2014/04/01",
 IIf(
  Format([売上日],"yyyy/mm/dd")>="2015/10/01",
  IIF(
   [税率]="軽減",
   "8%",
   "10%"
  ),
  "8%"
 ),
 "5%"
)


11.売上日・商品毎に適用される税率をテーブルから引っ張ってきて表示
(テーブルから税率を引っ張ってくることによって,急な税率変更にも対応出来るようにする)
適用税率2: IIf(
 Format([売上日],"yyyy/mm/dd")>="2014/04/01",
 IIf(
  Format([売上日],"yyyy/mm/dd")>="2015/10/01",
  IIF([税率]="軽減",
   DLookUp("[T消費税率(軽減)].[消費税率]","T消費税率(軽減)","[ID] = '3'"),
   DLookUp("[T消費税率].[消費税率]","T消費税率","[ID] = '3'")
  ),
  IIF([税率]="軽減",
   DLookUp("[T消費税率(軽減)].[消費税率]","T消費税率(軽減)","[ID] = '2'"),
   DLookUp("[T消費税率].[消費税率]","T消費税率","[ID] = '2'")
  )
 ),
 IIF([税率]="軽減",
  DLookUp("[T消費税率(軽減)].[消費税率]","T消費税率(軽減)","[ID] = '1'"),
  DLookUp("[T消費税率].[消費税率]","T消費税率","[ID] = '1'")
 )
)


12.売上日・商品毎に税率を適用し,実際の税込金額を表示
税込金額(売上日考慮): IIf(
 Format([売上日],"yyyy/mm/dd")>="2014/04/01",
 IIf(
  Format([売上日],"yyyy/mm/dd")>="2015/10/01",
  IIF([税率]="軽減",
   [単価]*[数量]*0.01*(100+DLookUp("[T消費税率(軽減)].[消費税率]","T消費税率(軽減)","[ID] = '3'")),
   [単価]*[数量]*0.01*(100+DLookUp("[T消費税率].[消費税率]","T消費税率","[ID] = '3'"))
  ),
  IIF([税率]="軽減",
   [単価]*[数量]*0.01*(100+DLookUp("[T消費税率(軽減)].[消費税率]","T消費税率(軽減)","[ID] = '2'")),
   [単価]*[数量]*0.01*(100+DLookUp("[T消費税率].[消費税率]","T消費税率","[ID] = '2'"))
  )
 ),
 IIF([税率]="軽減",
  [単価]*[数量]*0.01*(100+DLookUp("[T消費税率(軽減)].[消費税率]","T消費税率(軽減)","[ID] = '1'")),
  [単価]*[数量]*0.01*(100+DLookUp("[T消費税率].[消費税率]","T消費税率","[ID] = '1'"))
 )
)

2013年1月29日火曜日

追加課題(1/29)

月別販売データモジュール内の新規シート関数において,
月の入力で1~12以外の入力があった場合,
処理を中断するようにせよ.

→tuki変数の値が1~12の範囲内か否か?

Sub 新規シート()
    Dim tuki As String
    ActiveSheet.Copy after:=ActiveSheet
    Range("C6:D15,F6:F15,J6:J15").Select
    Selection.ClearContents
    Range("A1").Select
    tuki = InputBox("月を半角の数字で入力してください", "新規シート作成")
    If tuki = "" Then
        Application.DisplayAlerts = False
        ActiveSheet.Delete
        Application.DisplayAlerts = True
    Else
        If tuki < 0 Or tuki > 12 Then
            MsgBox "月は1~12の範囲で入力してください"
            Application.DisplayAlerts = False
            ActiveSheet.Delete
            Application.DisplayAlerts = True
        Else
            On Error Resume Next
            ActiveSheet.Name = tuki & "月度"
            If Err.Number = 1004 Then
                MsgBox "シート名が重複します"
                Application.DisplayAlerts = False
                ActiveSheet.Delete
                Application.DisplayAlerts = True
            End If
        End If
    End If
End Sub

2013年1月23日水曜日

追加課題(1/23)

シート「6月度」(販売一覧)の販売データを入力するプログラムにおいて,キャンセルボタンを押すことで処理を中断できるようにせよ.
Sub 入力()
    Dim hiduke As String
    ActiveWindow.NewWindow
    ActiveWindow.NewWindow
    Windows.Arrange ArrangeStyle:=xlTiled
    Windows("第6章.xlsm:2").Activate
    Sheets("得意先リスト").Select
    Windows("第6章.xlsm:1").Activate
    Sheets("商品リスト").Select
    Windows("第6章.xlsm:3").Activate
    If Range("C6").Value = "" Then
        Range("C6").Select
    Else
        Range("C5").Select
        Selection.End(xlDown).Select
        ActiveCell.Offset(1, 0).Select
    End If
    Do While ActiveCell.Offset(0, -1).Value <> ""
        
        hiduke = InputBox("日付を入力してください" & Chr(13) & "日付入力を終了する場合にはキャンセルボタンを押してください", , , 200, 200)
        If hiduke = "" Then
            MsgBox "入力をキャンセルします(1)"
            Exit Do
        Else
            ActiveCell.FormulaR1C1 = hiduke
            ActiveCell.Offset(O, 1).Range("A1").Select
                
            hiduke = InputBox("得意先コードを入力してください", , , 200, 200)
            If hiduke = "" Then
                MsgBox "入力をキャンセルします(2)"
                Exit Do
            Else
                ActiveCell.FormulaR1C1 = hiduke
                ActiveCell.Offset(O, 2).Range("A1").Select


                hiduke = InputBox("商品コードを入力してください", , , 200, 200)
                If hiduke = "" Then
                    MsgBox "入力をキャンセルします(3)"
                    Exit Do
                Else
                    ActiveCell.FormulaR1C1 = hiduke
                    ActiveCell.Offset(O, 4).Range("A1").Select

                    hiduke = InputBox("数量を入力してください", , , 200, 200)
                    If hiduke = "" Then
                        MsgBox "入力をキャンセルします(4)"
                        Exit Do
                    Else
                        ActiveCell.FormulaR1C1 = hiduke
                        ActiveCell.Offset(1, -7).Range("A1").Select
                    End If
                End If
            End If
        End If
    Loop
    Windows("第6章.xlsm:2").Activate
    ActiveWindow.Close
    Windows("第6章.xlsm:1").Activate
    ActiveWindow.Close
    ActiveWindow.WindowState = xlMaximized
End Sub

2013年1月16日水曜日

追加課題(1/16)

シート「商品リスト」において,商品を追加する際に使用する対話的なプログラムを作成せよ.
方針:InputBox関数を利用.追加課題(12/28)を参考に,商品リストの最終行に移動し,そこから入力を開始.入力したセルの周囲に罫線を引く.

1.商品リストの最終行左端に移動
Sub 商品追加()
    Range("B5").Select
    Do While Not (ActiveCell.Value = "")
        ActiveCell.Offset(1, 0).Select
    Loop
End Sub

2.InputBoxを実行し,ユーザーが入力した商品コードを受け取る
Dim syouhinCode As String
syouhinCode = InputBox("商品コードを入力してください", "商品追加", , 100, 100)

3.商品コードをセルに書き込む
ActiveCell.Value = syouhinCode

4.セルの周囲に罫線を引く
ActiveCell.BorderAround ColorIndex:=1

5.一つ右のセルに移動
ActiveCell.Offset(0, 1).Select

(2~5を繰り返す)

6.完成!
6-1.素直に繰り返した場合
Sub 商品追加()
    '表の最終行に移動
    Range("B5").Select
    Do While Not (ActiveCell.Value = "")
        ActiveCell.Offset(1, 0).Select
    Loop
    '商品コードを入力
    Dim syouhinCode As String
    syouhinCode = InputBox("商品コードを入力してください", "商品追加", , 100, 100)
    ActiveCell.Value = syouhinCode
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '商品名を入力
    syouhinCode = InputBox("商品名を入力してください", "商品追加", , 100, 100)
    ActiveCell.Value = syouhinCode
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '色を入力
    syouhinCode = InputBox("色を入力してください", "商品追加", , 100, 100)
    ActiveCell.Value = syouhinCode
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '単価を入力
    syouhinCode = InputBox("単価を入力してください", "商品追加", , 100, 100)
    ActiveCell.Value = syouhinCode
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '輸入国を入力
    syouhinCode = InputBox("輸入国を入力してください", "商品追加", , 100, 100)
    ActiveCell.Value = syouhinCode
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '入荷状況を入力
    syouhinCode = InputBox("入荷状況を入力してください", "商品追加", , 100, 100)
    ActiveCell.Value = syouhinCode
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
End Sub

6-2.データの受付を最初に行い,まとめて書き込みを行う場合
Sub 商品追加()
    '表の最終行に移動
    Range("B5").Select
    Do While Not (ActiveCell.Value = "")
        ActiveCell.Offset(1, 0).Select
    Loop
    
    '商品コードを受付
    Dim syouhinCode As String
    syouhinCode = InputBox("商品コードを入力してください", "商品追加", , 100, 100)
    '商品名を受付
    Dim syouhinName As String
    syouhinName = InputBox("商品名を入力してください", "商品追加", , 100, 100)
    '色を受付
    Dim syouhinColor As String
    syouhinColor = InputBox("色を入力してください", "商品追加", , 100, 100)
    '単価を受付
    Dim syouhinTanka As String
    syouhinTanka = InputBox("単価を入力してください", "商品追加", , 100, 100)
    '輸入国を受付
    Dim syouhinYunyuu As String
    syouhinYunyuu = InputBox("輸入国を入力してください", "商品追加", , 100, 100)
    '入荷状況を受付
    Dim syouhinNyuuka As String
    syouhinNyuuka = InputBox("入荷状況を入力してください", "商品追加", , 100, 100)
    
    '商品コードを書込
    ActiveCell.Value = syouhinCode
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '商品名を書込
    ActiveCell.Value = syouhinName
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '色を書込
    ActiveCell.Value = syouhinColor
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '単価を書込
    ActiveCell.Value = syouhinTanka
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '輸入国を書込
    ActiveCell.Value = syouhinYunyuu
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '入荷状況を書込
    ActiveCell.Value = syouhinNyuuka
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
End Sub

6-3.二次元配列を用いてデータを格納した場合
Sub 商品追加()
    '表の最終行に移動
    Range("B5").Select
    Do While Not (ActiveCell.Value = "")
        ActiveCell.Offset(1, 0).Select
    Loop
    
    Dim shouhin(5, 1) As String
    shouhin(0, 0) = ""
    shouhin(0, 1) = "商品コード"
    shouhin(1, 0) = ""
    shouhin(1, 1) = "商品名"
    shouhin(2, 0) = ""
    shouhin(2, 1) = "色"
    shouhin(3, 0) = ""
    shouhin(3, 1) = "単価"
    shouhin(4, 0) = ""
    shouhin(4, 1) = "輸入国"
    shouhin(5, 0) = ""
    shouhin(5, 1) = "入荷状況"
    
    '商品コードを受付
    shouhin(0, 0) = InputBox("商品コードを入力してください", "商品追加", , 100, 100)
    '商品名を受付
    shouhin(1, 0) = InputBox("商品名を入力してください", "商品追加", , 100, 100)
    '色を受付
    shouhin(2, 0) = InputBox("色を入力してください", "商品追加", , 100, 100)
    '単価を受付
    shouhin(3, 0) = InputBox("単価を入力してください", "商品追加", , 100, 100)
    '輸入国を受付
    shouhin(4, 0) = InputBox("輸入国を入力してください", "商品追加", , 100, 100)
    '入荷状況を受付
    shouhin(5, 0) = InputBox("入荷状況を入力してください", "商品追加", , 100, 100)
    
    '商品コードを書込
    ActiveCell.Value = shouhin(0, 0)
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '商品名を書込
    ActiveCell.Value = shouhin(1, 0)
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '色を書込
    ActiveCell.Value = shouhin(2, 0)
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '単価を書込
    ActiveCell.Value = shouhin(3, 0)
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '輸入国を書込
    ActiveCell.Value = shouhin(4, 0)
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
    '入荷状況を書込
    ActiveCell.Value = shouhin(5, 0)
    ActiveCell.BorderAround ColorIndex:=1
    ActiveCell.Offset(0, 1).Select
End Sub

6-4.プログラム内の同じ処理を行う部分をまとめた場合
Sub 商品追加()
    '表の最終行に移動
    Range("B5").Select
    Do While Not (ActiveCell.Value = "")
        ActiveCell.Offset(1, 0).Select
    Loop
    
    Dim shouhin(5, 1) As String
    shouhin(0, 0) = ""
    shouhin(0, 1) = "商品コード"
    shouhin(1, 0) = ""
    shouhin(1, 1) = "商品名"
    shouhin(2, 0) = ""
    shouhin(2, 1) = "色"
    shouhin(3, 0) = ""
    shouhin(3, 1) = "単価"
    shouhin(4, 0) = ""
    shouhin(4, 1) = "輸入国"
    shouhin(5, 0) = ""
    shouhin(5, 1) = "入荷状況"

    'データの受取
    Dim i As Integer
    For i = 0 To 5
        shouhin(i, 0) = InputBox(shouhin(i, 1) + "を入力してください", "商品追加", , 100, 100)
    Next i
    
    'データの書込
    Dim j As Integer
    For j = 0 To 5
        ActiveCell.Value = shouhin(j, 0)
        ActiveCell.BorderAround ColorIndex:=1
        ActiveCell.Offset(0, 1).Select
    Next j
End Sub

6-5.ループを1つにまとめた場合
Sub 商品追加()
    '表の最終行に移動
    Range("B5").Select
    Do While Not (ActiveCell.Value = "")
        ActiveCell.Offset(1, 0).Select
    Loop
    
    Dim shouhin(5, 1) As String
    shouhin(0, 0) = ""
    shouhin(0, 1) = "商品コード"
    shouhin(1, 0) = ""
    shouhin(1, 1) = "商品名"
    shouhin(2, 0) = ""
    shouhin(2, 1) = "色"
    shouhin(3, 0) = ""
    shouhin(3, 1) = "単価"
    shouhin(4, 0) = ""
    shouhin(4, 1) = "輸入国"
    shouhin(5, 0) = ""
    shouhin(5, 1) = "入荷状況"

    Dim i As Integer
    For i = 0 To 5
        shouhin(i, 0) = InputBox(shouhin(i, 1) + "を入力してください", "商品追加", , 100, 100)
        ActiveCell.Value = shouhin(i, 0)
        ActiveCell.BorderAround ColorIndex:=1
        ActiveCell.Offset(0, 1).Select
    Next i
End Sub

追加課題(1/15)

色検索プログラムをIf文のみで実装せよ.
(P168 MsgBox関数の戻り値参照)
Sub 色検索()
    Dim iro As Integer
    iro = MsgBox("ワインの色は赤ですか?", vbYesNo)
    If iro = 6 Then
        Range("B5").Select
        Selection.AutoFilter 3, "赤"
    Else
        iro = MsgBox("ワインの色は白ですか?", vbYesNo)
        If iro = 6 Then
            Range("B5").Select
            Selection.AutoFilter 3, "白"
        Else
            iro = MsgBox("ワインの色はロゼですか?", vbYesNo)
            If iro = 6 Then
                Range("B5").Select
                Selection.AutoFilter 3, "ロゼ"
            Else
                MsgBox "選択が間違っています" & Chr(13) & _
                "赤、白、ロゼの中から選択してください", vbOKOnly + vbExclamation
            End If
        End If
    End If
End Sub


輸入国検索プログラムもIf文のみで実装せよ.
Sub 輸入国検索()
    Dim kuni As Integer
    kuni = MsgBox("輸入国はイタリアですか?", vbYesNo)
    If kuni = 6 Then
        Range("B5").Select
        Selection.AutoFilter 5, "イタリア"
    Else
        kuni = MsgBox("輸入国はフランスですか?", vbYesNo)
        If kuni = 6 Then
            Range("B5").Select
            Selection.AutoFilter 5, "フランス"
        Else
            MsgBox "入力が間違っています" & Chr(13) & _
        "イタリア,フランスのいずれかを入力してください", vbOKOnly + vbExclamation
        End If
    End If
End Sub

2012年12月28日金曜日

追加課題(12/28)

追加課題
見出し1見出し2見出し3見出し4見出し5
内容11内容12内容13内容14内容15
内容21内容22内容23内容24内容25
内容31内容32内容33内容34内容35
内容41内容42内容43内容44内容45
内容51内容52内容53内容54内容55

既存のエクセル内の表に対して
 A.一番上の行を見出し行と見なし,黒背景白文字ボールドセンタリングを行う
 B.2行目以下について,偶数行と奇数行で背景色を交互に塗り分け
を実現
ここで,実装するべき機能は
 1.選択されたセルを開始位置として,そこから表が続く限り処理を繰り返す
   (表が終われば処理終了)
 2.1つめのif文で1行目か否かを判別し,1行目ならばAの処理を実行
 3.2つめのif文で2行目移行と判別できたら,その行が奇数行か偶数行か判別
  3-1.奇数行だった場合,少し薄めの色で背景を塗る
 3-2.偶数行だった場合,奇数行よりも少し濃いめの色で背景を塗る
です.


1.横方向に移動し,セルの内容を表示するプログラム
Sub ironuri1()
    Do While Not (ActiveCell.Value = "")
        MsgBox ActiveCell.Value
        ActiveCell.Offset(0, 1).Select
    Loop
End Sub
2.縦方向に移動し,セルの内容を表示するプログラム
Sub ironuri2()
    Do While Not (ActiveCell.Value = "")
        MsgBox ActiveCell.Value
        ActiveCell.Offset(1, 0).Select
    Loop
End Sub
3.横方向に移動し,セルの内容を表示するプログラム
  +行末までたどり着いたら自動的に改行
Sub ironuri3()
    Do While Not (ActiveCell.Value = "")
        MsgBox ActiveCell.Value
        ActiveCell.Offset(0, 1).Select
    Loop
    ActiveCell.Offset(1, 0).Select
End Sub
4.横方向に移動し,セルの内容を表示するプログラム
  +行末までたどり着いたら自動的に改行
  +表の左端まで移動
Sub ironuri4()
    Do While Not (ActiveCell.Value = "")
        MsgBox ActiveCell.Value
        ActiveCell.Offset(0, 1).Select
    Loop
    ActiveCell.Offset(1, -5).Select
End Sub
5.横方向に移動し,セルの内容を表示するプログラム
  +行末までたどり着いたら自動的に改行
  +「任意の大きさの」表の左端まで移動
Sub ironuri5()
    Dim i As Integer
    i = 1
    Do While Not (ActiveCell.Value = "")
        MsgBox ActiveCell.Value
        ActiveCell.Offset(0, 1).Select
        i = i + 1
    Loop
    ActiveCell.Offset(1, (-i + 1)).Select
End Sub
6.横方向に移動し,セルの内容を表示するプログラム
  +行末までたどり着いたら自動的に改行
  +「任意の大きさの」表の左端まで移動
  +移動後の行に対しても同様の処理を行う
  =任意の表の各セル全範囲を移動し,セルの内容を表示するプログラム
Sub ironuri6()
    Do While Not (ActiveCell.Value = "")
        Dim i As Integer
        i = 1
        Do While Not (ActiveCell.Value = "")
            MsgBox ActiveCell.Value
            ActiveCell.Offset(0, 1).Select
            i = i + 1
        Loop
        ActiveCell.Offset(0, (-i + 1)).Select
        ActiveCell.Offset(1, 0).Select
    Loop
End Sub
7.任意の表の各セル全範囲を移動し,セルの内容を表示するプログラム
  +行数把握
Sub ironuri7()
    Dim j As Integer
    j = 1
    Do While Not (ActiveCell.Value = "")
        Dim i As Integer
        i = 1
        Do While Not (ActiveCell.Value = "")
            MsgBox ActiveCell.Value & ", " & j & "行目"
            ActiveCell.Offset(0, 1).Select
            i = i + 1
        Loop
        ActiveCell.Offset(0, (-i + 1)).Select
        ActiveCell.Offset(1, 0).Select
        j = j + 1
    Loop
End Sub
8.任意の表の各セル全範囲を移動し,セルの内容を表示するプログラム
  +行数把握
  +1行目とその他の行で処理分岐
Sub ironuri8()
    Dim j As Integer
    j = 1
    Do While Not (ActiveCell.Value = "")
        Dim i As Integer
        i = 1
        Do While Not (ActiveCell.Value = "")
            If j = 1 Then
                MsgBox ActiveCell.Value & ", " & j & "行目(見出し行です)"
            Else
                MsgBox ActiveCell.Value & ", " & j & "行目(見出し行ではありません)"
            End If
            ActiveCell.Offset(0, 1).Select
            i = i + 1
        Loop
        ActiveCell.Offset(0, (-i + 1)).Select
        ActiveCell.Offset(1, 0).Select
        j = j + 1
    Loop
End Sub
9.任意の表の各セル全範囲を移動し,セルの内容を表示するプログラム
  +行数把握
  +1行目とその他の行で処理分岐
  +2行目以降の奇数行・偶数行で処理分岐
Sub ironuri9()
    Dim j As Integer
    j = 1
    Do While Not (ActiveCell.Value = "")
        Dim i As Integer
        i = 1
        Do While Not (ActiveCell.Value = "")
            If j = 1 Then
                MsgBox ActiveCell.Value & ", " & j & "行目(見出し行です)"
            Else
                If (j Mod 2) = 1 Then
                    MsgBox ActiveCell.Value & ", " & j & "行目(見出し行ではありません)(奇数行)"
                Else
                    MsgBox ActiveCell.Value & ", " & j & "行目(見出し行ではありません)(偶数行)"
                End If
            End If
            ActiveCell.Offset(0, 1).Select
            i = i + 1
        Loop
        ActiveCell.Offset(0, (-i + 1)).Select
        ActiveCell.Offset(1, 0).Select
        j = j + 1
    Loop
End Sub
10.任意の表の各セル全範囲を移動し,セルの内容を表示するプログラム
   +行数把握
   +1行目とその他の行で処理分岐
   +2行目以降の奇数行・偶数行で処理分岐
   +各行にあわせた処理を記述
Sub ironuri10()
    Dim j As Integer
    j = 1
    Do While Not (ActiveCell.Value = "")
        Dim i As Integer
        i = 1
        Do While Not (ActiveCell.Value = "")
            If j = 1 Then
                MsgBox ActiveCell.Value & ", " & j & "行目(見出し行です)"
                ActiveCell.Font.Bold = True
                ActiveCell.Font.ColorIndex = 2
                ActiveCell.Interior.ColorIndex = 1
            Else
                If (j Mod 2) = 1 Then
                    MsgBox ActiveCell.Value & ", " & j & "行目(見出し行ではありません)(奇数行)"
                    ActiveCell.Interior.ColorIndex = 15
                    ActiveCell.BorderAround ColorIndex:=1
                Else
                    MsgBox ActiveCell.Value & ", " & j & "行目(見出し行ではありません)(偶数行)"
                    ActiveCell.Interior.ColorIndex = 48
                    ActiveCell.BorderAround ColorIndex:=1
                End If
            End If
            ActiveCell.Offset(0, 1).Select
            i = i + 1
        Loop
        ActiveCell.Offset(0, (-i + 1)).Select
        ActiveCell.Offset(1, 0).Select
        j = j + 1
    Loop
End Sub

2012年12月25日火曜日

Select-Caseステートメント SAMPLE(Excel VBA)

shiken3()
Sub shiken3()
    Dim tensuu As Integer
    tensuu = Range("C26").Value
    If tensuu >= 80 Then
        MsgBox "合格です"
    Else
        If tensuu >= 60 Then
            MsgBox "追試です"
        Else
            MsgBox "不合格です"
        End If
    End If
End Sub

waribiki()
Sub waribiki()
    Dim kingaku As Currency
    kingaku = Range("C33").Value
    If Range("D33").Value = "一般" Then
        If kingaku >= 50000 Then
            MsgBox "一般:15%割引です"
        Else
            If kingaku >= 30000 Then
                MsgBox "一般:10%割引です"
            Else
                If kingaku >= 10000 Then
                    MsgBox "一般:5%割引です"
                Else
                    MsgBox "一般:割引なしです"
               End If
            End If
        End If
    Else
        If Range("D33").Value = "会員" Then
            If kingaku >= 50000 Then
                MsgBox "会員:30% 割引です"
            Else
                If kingaku >= 30000 Then
                    MsgBox "会員:20%割引です"
                Else
                    If kingaku >= 10000 Then
                        MsgBox "会員:10%割引です"
                    Else
                        MsgBox "会員:割引なしです"
                    End If
                End If
            End If
        End If
    End If
End Sub

iro()
Sub iro()
    Select Case Range("C34").Value
    Case "RED"
        strIro = "RED"
    Case "BLUE"
        strIro = "BLUE"
    Case "PINK"
        strIro = "PINK"
    Case "GREEN"
        strIro = "GREEN"
    Case Else
        strIro = "RED.BLUE.PINK.GREENのいずれかを入力してください"
    End Select
        MsgBox strIro
End Sub

2012年10月25日木曜日

WEBアプリケーションサーバの構築(6) crontab

1.Shell Scriptエラー処理 前回のツールを動作させる前提として「img」ディレクトリが必要だが,もし存在しないとうまく動作しない.
そこで,「img」ディレクトリの存在有無をチェックし,もし存在しない場合は,ディレクトリを作成するようにツールを編集する.
get_image2.sh
#!/bin/bash

for user in `ls /home`
do
    id $user > /dev/null 2>&1
    if [ $? -eq 0 ] && [ ! -d /home/$user/public_html ]; then
        mkdir -p /home/$user/public_html
        chown $user. /home/$user/public_html
        chmod 711 /home/$user
        echo $user
    fi
done


2.crontabの利用 逆方向も試してみよう
WEBから受け取った値...天気予報の予報値や,特定サイトの値...を,
シェルスクリプトでDBサーバに自動登録.
さらにcrontabを使って,定期的に自動実行.
登録された値はHTMLファイルで閲覧可能なものを作成.
#goo天気の場合
#元ファイル取得
# wget http://weather.goo.ne.jp/area/4610.rdf
#時刻
# grep lastBuildDate 4610.rdf | sed -e "s/\(.*\)<\/lastBuildDate>/\1/g"
#天気
# grep description 4610.rdf | sed -e "s/\(.*\)<\/description>/\1/g"

#Yahoo天気の場合
#元ファイル取得
 wget http://rss.weather.yahoo.co.jp/rss/days/4410.xml
#時刻
 grep lastBuildDate 4410.xml | sed -e "s/\(.*\)<\/lastBuildDate>/\1/g"
#現在の天気と気温を抽出
 grep -n description 4410.xml | grep ^13 | sed -e "s/\(.*\)<\/description>/\1/" | sed "s/\s//g" | sed "s/^.*-//g" | sed "s/\/.*$//g"

1.SQL文を用意
vi temp.sql
 insert into temp (temp) values (10);

2.1で作成したファイルを用いてMySQLへ値流し込み
mysql -u root -s test < temp.sql

3.temp.sqlの値を自動的に更新するシェルスクリプトを作成
temp.sql
 #!/bin/sh
 echo "insert into temp (temp) values (10);" > temp.sql
 /usr/bin/mysql -u root -s test < temp.sql
 exit 0

chmod u+x temp.sql
./temp.sql

4.temp.sqlの中身を自動的に変更する.
temp.sql
 !/bin/sh
 wget http://rss.weather.yahoo.co.jp/rss/days/4410.xml
 str_temp=`grep -n description 4410.xml | grep ^13 | sed -e "s/\(.*\)<\/description>/\1/" | sed "s/\s//g" | sed "s/^.*-//g" | sed "s/\/.*$//g"`
 echo 'insert into temp (temp) values ("'$str_temp'");' > temp.sql
 /usr/bin/mysql -u root -s test < temp.sql
 rm 4410.xml
 exit 0

5.対象とする地域を複数とする.
ファイル名の下2桁目が可変 ---> 4410.xml/4420.xml/4430.xml ... ---> 44*0.xmlの*が1~9まで変化

2012年10月18日木曜日

WEBアプリケーションサーバの構築(5) Shell Script

1.Google画像検索APIの利用
http://ajax.googleapis.com/ajax/services/search/images?q=sato&v=1.0&rsz=1


2.Google画像検索API + shellの利用
curl -s 'http://ajax.googleapis.com/ajax/services/search/images?q=sato&v=1.0&rsz=1' | tr , \\n | grep "url" | sed -e 's/"url"://g' -e 's/"//g'
→Google画像検索の1番最初にマッチした画像のURLが表示される.

3.ツールの作成

get_image.sh
#!/bin/sh

target_list=`/usr/bin/mysql -u root -p[password] arts -e "select name from sa2012"`

for name in $target_list
do
        image_url=`curl -s 'http://ajax.googleapis.com/ajax/services/search/images?q='$name'&v=1.0&rsz=1' | tr , '\\n' | grep "url" | sed -e 's/"url"://g' -e 's/"//g'`

        echo $name" --> "$image_url

        curl -s -o img/$name.jpg $image_url
done

exit 0

※{password}は自自身のパスワードに置き換えること.


4.ツールを使用することで,DBに登録されたユーザの画像を,ユーザー名をファイル名として取得することが可能になったので,リストに画像も併せて表示する.
list6.html
<html>
<head>
    <meta http-equiv=content-type content="text/html; charset=UTF-8">
 <title>real-time search sample(AJAX)</title>
 
 <STYLE TYPE="text/css">
 <!--
 .table1 {
  width: 400px;
  border-collapse: collapse;
  border: 1px #708090 solid;
 }
 .table1 TD {
  border: 1px #708090 solid;
 }
 -->
 </STYLE> 
 
    <script type="text/javascript" src="xmlhttp.js"></script>
    <script type="text/javascript">
    <!--
    findText = findTextOld = "";

    function loadXmlFile(fName){
        httpObj = createXMLHttpRequest(displayData);
        if (httpObj){
            httpObj.open("GET",fName,true);
            httpObj.send(null);
        }
    }

    function displayData(){
        if ((httpObj.readyState == 4) && (httpObj.status == 200)){
            xmlData = httpObj.responseXML;
            $("result").innerHTML = parseXmlData(httpObj.responseText);
        }else{
            $("result").innerHTML = "Loading ...";
        }
    }

    function parseXmlData(xmlData){
        $("result").innerHTML = xmlData;
        idListTags = document.getElementsByTagName("id");
        numListTags = document.getElementsByTagName("num");
        nameListTags = document.getElementsByTagName("name");
        idLen = idListTags.length;

        resultText = "<table class='table1'><tr><th colspan=5>list</th></tr><tr><td><b>id</b></td><td><b>num</b></td><td><b>name</b></td><td><b>image</b></td></tr>";
        for(i=0; i<idLen; i++){
            id = idListTags[i].childNodes[0].nodeValue;
            num = numListTags[i].childNodes[0].nodeValue;
            name = nameListTags[i].childNodes[0].nodeValue;
            str = name.match(findText);
            if (str){
                resultText += "<tr><td>" + id + "</td><td><a href='http://10.2.5." + num + "' target='_blank'>" + num + "</a></td><td>" + name + "</td><td><img height=100 width=100 src='img/" + name + ".jpg'></td></tr>";
            }
        }
        resultText += "</table>";
        return resultText;
    }

    function inputCheck(){
        findText = document.ajaxForm.requestText.value;
        if (findText != findTextOld) {
            str_search = "./backend.php?search_key=" + findText
            loadXmlFile(str_search);
            findTextOld = findText;
        }else{
//            $("result").innerHTML = "Loading ...";
        }
        setTimeout(" inputCheck()",500); // 0.5秒毎
    }

    window.onload = inputCheck;
    // -->
    </script>
</head>
<body>
<form name="ajaxForm" onSubmit="return false">
<input type="text" value="a" name="requestText">
</form>
<div id="result"></div>
</body>
</html>

2012年10月11日木曜日

WEBアプリケーションサーバの構築(4) AJAX

フォームにAJAXを使った画面を作成.

xmlhttp.js
// HTTP通信用、共通関数
function createXMLHttpRequest(cbFunc){
 var XMLhttpObject = null;
 try{
  XMLhttpObject = new XMLHttpRequest();
 }catch(e){
  try{
   XMLhttpObject = new ActiveXObject("Msxml2.XMLHTTP");
  }catch(e){
   try{
    XMLhttpObject = new ActiveXObject("Microsoft.XMLHTTP");
   }catch(e){
    return null;
   }
  }
 }
 if (XMLhttpObject) XMLhttpObject.onreadystatechange = cbFunc;
 return XMLhttpObject;
}
 
// document.getElementById
function $(tagId){
 return document.getElementById(tagId);
}

backend.php
<?php
 $db_user  = "[user name]";
 $db_password = "[password]";
 $db_name = "[database name]";
 $db_host  = "localhost";

//create xml
    header('Content-type: text/xml; charset=utf-8');
    echo '<?xml version="1.0"?><sa>';

 $search_key = null;

 if(isset($_GET['search_key'])) {
  $search_key = $_GET['search_key'];

  $con = mysql_connect($db_host,$db_user,$db_password) or die("error!");
  mysql_select_db($db_name,$con) or die("DB is not exist");
  $strsql = "SET CHARACTER SET UTF8";
  mysql_query($strsql,$con);
  $strsql = "SELECT id, num, name FROM sa2012 WHERE name LIKE '%".$search_key."%';";
  $res = mysql_query($strsql,$con);

  while ($item = mysql_fetch_array($res)) {
   print "<list><id>".$item[0]."</id><num>".$item[1]."</num><name>".$item[2]."</name></list>";
  }
  mysql_close($con);
    }

    echo '</sa>'; 
?>

list4.html
<html>
<head>
    <meta http-equiv=content-type content="text/html; charset=UTF-8">
 <title>real-time search sample(AJAX)</title>
 
 <STYLE TYPE="text/css">
 <!--
 .table1 {
  width: 400px;
  border-collapse: collapse;
  border: 1px #708090 solid;
 }
 .table1 TD {
  border: 1px #708090 solid;
 }
 -->
 </STYLE> 
 
    <script type="text/javascript" src="xmlhttp.js"></script>
    <script type="text/javascript">
    <!--
    findText = findTextOld = "";

    function loadXmlFile(fName){
        httpObj = createXMLHttpRequest(displayData);
        if (httpObj){
            httpObj.open("GET",fName,true);
            httpObj.send(null);
        }
    }

    function displayData(){
        if ((httpObj.readyState == 4) && (httpObj.status == 200)){
            xmlData = httpObj.responseXML;
            $("result").innerHTML = parseXmlData(httpObj.responseText);
        }else{
            $("result").innerHTML = "Loading ...";
        }
    }

    function parseXmlData(xmlData){
        $("result").innerHTML = xmlData;
        idListTags = document.getElementsByTagName("id");
        numListTags = document.getElementsByTagName("num");
        nameListTags = document.getElementsByTagName("name");
        idLen = idListTags.length;

        resultText = "<table class='table1'><tr><th colspan=4>list</th></tr><tr><td><b>id</b></td><td><b>num</b></td><td><b>name</b></td></tr>";
        for(i=0; i<idLen; i++){
            id = idListTags[i].childNodes[0].nodeValue;
            num = numListTags[i].childNodes[0].nodeValue;
            name = nameListTags[i].childNodes[0].nodeValue;
            str = name.match(findText);
            if (str){
                resultText += "<tr><td>" + id + "</td><td><a href='http://10.2.5." + num + "' target='_blank'>" + num + "</a></td><td>" + name + "</td></tr>";
            }
        }
        resultText += "</table>";
        return resultText;
    }

    function inputCheck(){
        findText = document.ajaxForm.requestText.value;
        if (findText != findTextOld) {
            str_search = "./backend.php?search_key=" + findText
            loadXmlFile(str_search);
            findTextOld = findText;
        }else{
//            $("result").innerHTML = "Loading ...";
        }
        setTimeout(" inputCheck()",500); // 0.5秒毎
    }

    window.onload = inputCheck;
    // -->
    </script>
</head>
<body>
<form name="ajaxForm" onSubmit="return false">
<input type="text" value="s" name="requestText">
</form>
<div id="result"></div>
</body>
</html>

2012年10月4日木曜日

WEBアプリケーションサーバの構築(3) PHP

HTMLのフォームから値を受け取り,合致したidのみ表示する画面を作成.

list3_form.html
<html>
<head>
 <title>form</title>
</head>
<body>
 <form action="list3.php" method="get">
  id : <input type="text" name="id" />
  <input type="submit" />
 </form>
</body>
</html>

list3.php
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>list</title>
</head>
<body>
<?php
 $id = htmlspecialchars($_GET['id']);

 $db_user  = "[user name]";
 $db_password = "[password]";
 $db_name = "[database name]";
 $db_host  = "localhost";

 $db = mysql_connect($db_host,$db_user,$db_password);
 mysql_select_db($db_name,$db); 
 $str_sql = "select * from sa2012 where id = ".$id;
 $rs = mysql_query($str_sql,$db);
 $num = mysql_num_fields($rs);

 print("<table><tr><th colspan=3>list</th></tr>");
 echo("
 ");
 print("<tr>");
 for ($i=0;$i<$num;$i++){
  print("<td><b>".mysql_field_name($rs,$i)."</b></td>");
 }
 print("</tr>");
 while($row=mysql_fetch_array($rs)){
  echo("
 ");
  print("<tr>");
  for($j=0;$j<$num;$j++){
   print("<td>".$row[$j]."</td>");
  }
  print("</tr>");
 }

 print("</table>");

 mysql_free_result($rs);
 mysql_close($db);
?>
</body>
</html>

2012年9月27日木曜日

WEBアプリケーションサーバの構築(2) DBサーバ

1.php-mysqlモジュールをインストール
yum install php-mysql
service httpd stop
service httpd start
service mysqld stop
mysql_secure_installation
/etc/my.cnf
 [mysql] 
 default_character_set=utf8 

 [mysqld] 
 character_set-server=utf8 
 innodb_log_file_size=64M 
 innodb_buffer_pool_size=128M
service mysqld start


2.MySQLにデータベース,テーブル作成
DB Name : arts
Table Name : sa2012

$ mysql -u root -p
create database arts;

$ mysql -u root -p sa
create table sa2012 ( id integer NOT NULL AUTO_INCREMENT PRIMARY KEY, num char(4), host_name char(20), ip_address char(15) );

show tables;
select * from sa2012;

※テーブルの各値はMySQL Workbench等から流し込みます.

3.DBに接続し,中身を表示するPHPファイルを作成
list.php
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>list</title>
</head>
<body>
<?php
 $db_user  = "[user name]";
 $db_password = "[password]";
 $db_name = "[database name]";
 $db_host  = "localhost";

 $db = mysql_connect($db_host,$db_user,$db_password);
 mysql_select_db($db_name,$db); 
 $str_sql = "select * from sa2012";
 $rs = mysql_query($str_sql,$db);
 $num = mysql_num_fields($rs);

 print("<table><tr><th colspan=3>list</th></tr>");
 echo("
 ");
 print("<tr>");
 for ($i=0;$i<$num;$i++){
  print("<td><b>".mysql_field_name($rs,$i)."</b></td>");
 }
 print("</tr>");
 while($row=mysql_fetch_array($rs)){
  echo("
 ");
  print("<tr>");
  for($j=0;$j<$num;$j++){
   print("<td>".$row[$j]."</td>");
  }
  print("</tr>");
 }

 print("</table>");

 mysql_free_result($rs);
 mysql_close($db);
?>
</body>
</html>

4.パーミッションを755に変更
chmod 755 list.php


5.DBに接続し,id=1のものだけを表示するPHPファイルを作成
list2.php
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>list</title>
</head>
<body>
<?php
 $db_user  = "[user name]";
 $db_password = "[password]";
 $db_name = "[database name]";
 $db_host  = "localhost";

 $db = mysql_connect($db_host,$db_user,$db_password);
 mysql_select_db($db_name,$db); 
 $str_sql = "select * from sa2012 where id = 1";
 $rs = mysql_query($str_sql,$db);
 $num = mysql_num_fields($rs);

 print("<table><tr><th colspan=3>list</th></tr>");
 echo("
 ");
 print("<tr>");
 for ($i=0;$i<$num;$i++){
  print("<td><b>".mysql_field_name($rs,$i)."</b></td>");
 }
 print("</tr>");
 while($row=mysql_fetch_array($rs)){
  echo("
 ");
  print("<tr>");
  for($j=0;$j<$num;$j++){
   print("<td>".$row[$j]."</td>");
  }
  print("</tr>");
 }

 print("</table>");

 mysql_free_result($rs);
 mysql_close($db);
?>
</body>
</html>

2012年9月13日木曜日

WEBアプリケーションサーバの構築(1) WEBサーバ

1.まずはブラウザから自身のサーバにアクセスして状況確認
http://10.2.5.***


2.PHPインストール
yum install php
/etc/php.ini
memory_limit = 16M ; Maximum amount of memory a script may consume
3.Webサーバ(httpd)インストール
yum install httpd
chkconfig httpd on
service httpd start

4.Firewall設定
iptablesのルール初期化
/sbin/iptables -F

現在のルール確認
iptables -L

Firewallにルール追加
/etc/sysconfig/iptables
 # Firewall configuration written by system-config-firewall
 # Manual customization of this file is not recommended.
 *filter
 :INPUT ACCEPT [0:0]
 :FORWARD ACCEPT [0:0]
 :OUTPUT ACCEPT [0:0]
 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 -A INPUT -p icmp -j ACCEPT
 -A INPUT -i lo -j ACCEPT
 -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
 -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
 -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
 -A INPUT -j REJECT --reject-with icmp-host-prohibited
 -A FORWARD -j REJECT --reject-with icmp-host-prohibited
 COMMIT

service iptables restart

5.動作確認
ブラウザから以下のアドレスにアクセスし,テスト画面が表示されることを確認
http://10.2.5.***

2012年9月6日木曜日

各ユーザーのhome以下にpublic_htmlを作成するツール

userDirMake.sh
#!/bin/bash

for user in `ls /home`
do
    id $user > /dev/null 2>&1
    if [ $? -eq 0 ] && [ ! -d /home/$user/public_html ]; then
        mkdir -p /home/$user/public_html
        chown $user. /home/$user/public_html
        chmod 711 /home/$user
        echo $user
    fi
done