2011年11月15日火曜日

オラクル PLSQL入門

http://www.shift-the-oracle.com/sql/create-table.html



CREATE TABLE USER_MASTER
(
   USER_ID           VARCHAR2(8) NOT NULL,
   DEPT_NO           VARCHAR2(8),
   USER_NAME         VARCHAR2(32),
   CREATED_ON        DATE DEFAULT SYSDATE,
   MODIFIED_ON       DATE
);

--■■■■■■■■■■■■■■■■■プライマリキーを作成するDDL文■■■■■■■■■■■■■■■■■

ALTER TABLE USER_MASTER ADD CONSTRAINT USER_MASTER_PK PRIMARY KEY (USER_ID) ;



--■■■■■■■■■■■■■■■■■テーブル一覧 ■■■■■■■■■■■■■■■■■

select table_name from user_tables;



--■■■■■■■■■■■■■■■■■UPDATE■■■■■■■■■■■■■■■■■
UPDATE (
     SELECT
            USER_ID, USER_NAME
     FROM USER_MASTER
) -- [ ビューの別名 ]
SET
    USER_NAME = USER_NAME || ' さま';

--■■■■■■■■■■■■■■■■■レコード削除 ■■■■■■■■■■■■■■■■■

-- USER_ID = '0020' OR  USER_ID ='0019' を削除
DELETE
  FROM USER_MASTER
 WHERE USER_ID IN ('0020', '0019');

--■■■■■■■引数ありのカーソル■■■■■■
------------------------------------------------------------------------------
--  カーソル定義
------------------------------------------------------------------------------
  CURSOR CJIDO(p_START   IN NUMBER,                --引数ありのカーソルを作成
               p_END     IN NUMBER,
               p_KIJUNBI IN NUMBER) IS
    SELECT A.KOJIN_NO,
           A.SHIMEI_KANA,
           A.SHIMEI_KANJI,
      FROM EAT_ATENAKIHON A
     WHERE A.SEINENGAPI BETWEEN p_START AND p_END
       AND A.GENZON_KBN < 3;
      
CRJIDO   CJIDO%ROWTYPE;                         --カーソルにある、全てのテーブル列型を取得、
******呼び出し元*******
FOR CRJIDO IN CJIDO(ISTART,IEND,V_KIJUNBI) LOOP    --カーソルの呼出
    DBMS_OUTPUT.PUT_LINE(CRJIDO.KOJIN_NO);                          
END LOOP;

--■■■■■■テーブルを使ったコレクション■■■■■■
    -- 取得したデータのワーク領域
    TYPE MTJIDO_TYPE IS TABLE OF EQT_SEIJINSYA%ROWTYPE INDEX BY BINARY_INTEGER;
    MJIDO_WORK MTJIDO_TYPE;
   
    MJIDO_WORK(1).「カラム名」:= 'TEST';       --文字列を代入

--■■■■■■動的SQL■■■■■■
DBMS_SQL.DEFINE_COLUMN(カーソル変数名, 位置, 変数名, サイズ);

--■■■■■■定数の宣言■■■■■■
--定数名 定数指定 データ型 初期値;
--初期値を設定しない場合はNULLになります。
NUM CONSTANT PLS_INTEGER := 10;

--■■■■■■例外処理EXCEPTION■■■■■■
BEGIN
  BEGIN
    SELECT 「カラム名」 INTO 「カラムのデータ型」 FROM 「テーブル名」WHERE 「カラム名」= 1;
  EXCEPTION
      WHEN NO_DATA_FOUND THEN                --SQLが行をもどさない場合の例外
        DBMS_OUTPUT.PUT_LINE(SQLCODE);
      WHEN OTHERS THNE
        DBMS_OUTPUT.PUT_LINE(SQLCODE);       --全ての例外を出力
  END;
END;


--■■■■■■ユーザ定義例外処理EXCEPTION■■■■■■
BEGIN
  IS
    uSER_eXCEPTION EXCEPTION;  --ユーザ定義例外を宣言
  BEGIN
    SELECT 「カラム名」 INTO 「カラムのデータ型」 FROM 「テーブル名」WHERE 「カラム名」= 1;
    RAISE  uSER_eXCEPTION;    --ユーザ定義例外の呼出
  EXCEPTION
      WHEN uSER_eXCEPTION THEN
        DBMS_OUTPUT.PUT_LINE('ユーザ定義例外の呼出です');
  END;
END;

--■■■■■FOR UPDATE句■■■■■■
BEGIN
  IS
    CURSOR c_1 IS
        SELECT 「カラム名」
        INTO 「カラムのデータ型」
        FROM 「テーブル名」
        WHERE 「カラム名」> 100
        FOR UPDATE NOWAIT;    --ロックが解放されるのを待たずに、プログラムにもどり、例外が発生します。
  BEGIN
    OPEN c_1
       FOR r_1 IN c_1 LOOP;
               UPDATE(SELECT  r_1.「カラム名」FORM 「テーブル名」) SET 「カラム名」= 'レコード';
               COMMIT;
       END LOOP;
  EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('ロックが掛かっているか、行がありません');
  END;
END;
--■■■■■プロシジャーの作成■■■■■■
CREATE OR REPLACE PROCEDURE proc_1(
  i1 IN PLS_INTEGER;  --引数
  i2 IN PLS_INTEGER;
) RETURN PLS_INTEGER IS

  USER_i_1 PLS_INTEGER;  --フィールド変数
  USER_i_2 PLS_INTEGER;
BEGIN
  実行部;
  RETURN 0;
END;

2011年11月11日金曜日

サッサと PHP5のクラス定義解説

クラス定義
<?php
class Hoge{
}
?>
new Hoge();

コンストラクタ
<?php

include 'Debug_Show.php';


class Hoge{
    function Hoge(){
        print "コンストラクタです";
    }

}

new Hoge();

クラスメソッド
<?php

class Hoge{
    static function calc($str){
        print $str;
    }
}
Hoge::calc("クラスメソッド");
クラス変数
<?php

Class Hoge {
    static $str = "クラス変数";

}

print Hoge::$str;


メンバー変数
<?php

Class Hoge {
 public $a = "メンバー変数";
}

$hoge = new Hoge();
echo $hoge->a;

メソッド

<?php

Class Hoge {
    function calc(){
        print 1+1;
        print "メソッド";
    }
}

$hoge = new Hoge();
echo $hoge->calc();


クラス定数
<?php

Class Hoge {
    const STR = "クラス定数";

}

print Hoge::STR;

thisとは?そのクラスをさします
<?php

Class Hoge {
    var $a= "thisです";
    function calc($a){
        print $a;
        print "<br />";
        print $this->a;
    }
}

$hoge = new Hoge();
$hoge->calc("thisではない");

#thisではない
#thisです

オブジェクトのコピー
<?php

Class Hoge {
    var $a= "thisです。";
}

$hoge = new Hoge();
$obj = $hoge;
print $obj->a;
print $hoge->a;

$obj->a = "てすと。";

print $obj->a;
print $hoge->a;

$b = $obj->a;
$b = "ffff。";

print $obj->a;
print $hoge->a;


#thisです。thisです。てすと。てすと。てすと。てすと。

継承 親子関係
<?php

Class Oy {
    var $a= "Oyです。";

    function getA(){
        print $this->a;
    }
}

Class Ko extends Oy{

}

$ko =  new Ko();
print  get_Class($ko);
$ko->getA();
print $ko->a;


#KoOyです。Oyです。

Androidアプリ開発 CVSファイルとDBへの書き込み

/********************アクティビティクラス*************************/
package kawasaki.com;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;

import android.app.Activity;
import android.content.ContentValues;
import android.content.res.AssetManager;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;

public class Db_Test_1 extends Activity {
    /** Called when the activity is first created. */
    //メンバー変数
    //データベースヘルパーの作成

    private DatabaseHelper helper;

    //データベースの宣言
    public static SQLiteDatabase mDb;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //DBファイルの真偽
        File file = new File("/data/data/kawasaki.com/databases/sample.db");
        if(file.exists()){
            file.delete();
            Log.d("kawasaki_debug","ファイルを消去しました");
        }else{
            Log.d("kawasaki_debug","ファイルはありません");
        }

        //DBの作成
        helper  = new DatabaseHelper(this);

        //CSVファイルの読み込み準備
        AssetManager as = getResources().getAssets();
        //DBオープン
        mDb = helper.getWritableDatabase();
        //DB値格納変数
        ContentValues value = new ContentValues();
        try {

            BufferedReader bf = new BufferedReader(new InputStreamReader(as.open("test_csv.csv")));
            String s;
            while((s = bf.readLine()) != null){
                String [] strAry = s.split(",");
                Log.d("kawasaki_debug","" + strAry[0] + "");
                value.put("NAME",strAry[0]);
                value.put("TEL",strAry[1]);
                mDb.insert("BOOK",null,value);
            }
        } catch (IOException e) {
            // TODO 自動生成された catch ブロック
            Log.d("kawasaki_debug", "" + e + "");
        }
    }

    //DBクローズ
    @Override
    public void onDestroy(){
        super.onDestroy();
        helper.close();
    }
}

/**********************DatabaseHelperクラス**********************/

import java.io.File;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper{

    //コンテキスト
    public DatabaseHelper(Context context){
        super(context,"sample.db",null,1);
        //super(context, null, null, 1);
        System.out.println("DBです");
    }

    //テープル作成
    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO 自動生成されたメソッド・スタブ
        db.execSQL("CREATE TABLE BOOK (_id INTEGER PRIMARY KEY,NAME TEXT,TEL TEXT)");


    }

    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
        // TODO 自動生成されたメソッド・スタブ
    }
}
★★★★★★★★★★★★★まとめ★★★★★★★★★★★★★★
AndroidでもDB基本的なところはかわりません、
SQLiteOpenHelperなど便利なクラスもありますので積極的に使うべきですね、

2011年11月1日火曜日

android開発 サイト

開発環境参考サイト
http://codezine.jp/article/detail/5943


eclipseのサイトURL

    • File Password: 0Rfkkk3
    ①androidSDKのtoolにパスを通す。
    ②eclipseにアンドロイドのフラグインを取り込む、使用可能なソフトウエアで「android」で検索、
余裕があればhttp://codezine.jp/article/detail/5957で電卓アプリなど作ってみようかな?

2011年10月31日月曜日

php ファイルアップロード

<html>
<head><title>uploader.html</title></head>
<body>
<form method="post" enctype="multipart/form-data" action="up_load.php">
  <input type="file" name="upfile">
  <input type="submit" value="アップロードする">
</form>
</body>
</html>

<?php
  $updir = "c:test_up/";
  $filename = $_FILES['upfile']['name'];
  if(move_uploaded_file($_FILES['upfile']['tmp_name'], $updir.$filename)==FALSE){
    print("Upload failed");
    print($_FILES['upfile']['error']);
  }
  else {
    print("<b> $filename </b> uploaded");
  }
?>

phpでカレンダー


<form action="calen.php" method="get">
    <select name="year">
        <option value="2011">2011</option>
        <option value="2012">2012</option>
        <option value="2013">2013</option>
        <option value="2014">2014</option>
    </select>
    <select name="month">
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
        <option value="6">6</option>
        <option value="7">7</option>
        <option value="8">8</option>
        <option value="9">9</option>
        <option value="10">10</option>
        <option value="11">11</option>
        <option value="12">12</option>
    </select>
    <input type="submit">
</form>



<?php
class Calen{
    function Calen(){
        if($_GET){
            $this->select_year = $_GET["year"];
            $this->select_month = $_GET["month"];
        }else{
            $this->select_year = date("Y");//年
            $this->select_month = date("n");//月
        }
    }
    function show_calender(){

        $max_day = date("t",mktime(0,0,0,$this->select_month,1,$this->select_year));//最大日

        print "$this->select_year"."年"."$this->select_month"."月";
        print "<table border=\"1\">";
        for($day = 1; $day <= $max_day; $day++){
            $day_color = date("w",mktime(0,0,0,$this->select_month,$day,$this->select_year));//曜日にナンバーを取得
            if($day_color == 0 || $day == 1){    //1日か0ならtrタグ開始
                print "<tr>";
            }
           
            if($day == 1){
                $i = 0;
                $day_color = (int)$day_color;
                while($day_color > 0){
                    print "<td> </td>";
                    $day_color--;
                }
            }
            print "<td>".$day."</td>";
            if($day_color == 6){                //6ならtrタグ終了
                print "</tr>";
            }
        }
        print "</table>";

        //////////
    }
}

$calender = new Calen();
$calender->show_calender();



?>

2011年10月28日金曜日

現場でperlをやってみて思ったこと、

現場でperlをやってみて思ったこと、

①まず、引数の受け取りが違っていた、「$_」「$_[0]」「@_」
②言語の文法が柔軟でした、
③特殊変数の使い方にとまどいました、
④引数の渡し方は普通でした、
⑤ローカル変数の宣言  my($i,@j)
⑥perlとは違うがmysqlで「SELECT DATE_ADD」は勉強になった、「SELECT date_add(current_date, interval 3 day);」など超楽できた。
⑦関数の戻り値のうけとりで、($a,$b)=関数($c$d)、普通だった、

⑧「map・join」関数はよくつかっていたし、あわせて「$_」もで、正直は????だった、
書式は「join(','map {$_b} list)」こんなのです。


※今の課題を解決する方法として
①しっかりとしたリファレンスを読む、


②他人に書いたコードを読む、


③自分で動かし、デバックで確認する

④知らない関数はググルり、書式として残す、アウトプットは大切だし記憶に残ることがよくわかった

やるしかないのだ!!

2011年9月27日火曜日

Rails sqliteでboolean

Shop.paginate(:page => 1,:per_page => 5,:conditions => ['ec_flag = ?',true])
■mysql では boolean は true と false ですが、sqlite3 では 1 と 0 だからということなのですね。

2011年9月26日月曜日

rails3 1つ前のURLに戻る

<input type=button value="買い物を続ける" onClick="history.go(-1)">

2011年9月22日木曜日

rails3 失敗したscaffoldを削除する

取り消したいscaffold名を*****で実行する。
$ rails destroy scaffold *****
 

Javascriptでのデバック関数

<script type="text/javascript"><!--
function print_r(obj) {
var count_obj = 0;
    function _output(str) {
       document.writeln(str + "<br/>");
    }
    function _print_r(obj, name, level) {
        var s = "";
        if (obj == undefined || level > 4) return;
        for (var i = 0; i < level; i++) { s += " | "; }
        s += " - " + name + ":" + typeof(obj) + "=" + obj;
        _output(s);
        if (name == "document" || typeof(obj) != "object") return;
        for ( key in obj ) {
        if (count_obj++ > 150) return;
            _print_r(obj[key], key, level + 1);
        }
    }
      _print_r(obj, "*", 0);
}
//-->
</script>

2011年9月21日水曜日

rails3 でsessionを情報をDBで管理

$ rake db:sessions:create
$ rake db:migrate
また、config/initializers/session_store.rbの8行目
********::Application.config.session_store :active_record_store
のコメントをはずす,
また、3行目の下記をコメントに変更
#Application.config.session_store :cookie_store, :key => '_market_session' 
でOKです。


2011年9月15日木曜日

Rails3 ネストしたコントローラへの値の渡し方

 ■たとえば下記のようrake routesがあったとすると、
new_shop_shop_article GET    /shops/:shop_id/shop_articles/new(.:format){:action=>"new",:controller=>"shop_articles"}
のように値をわたせばよ、

new_shop_shop_article_path(@shop)


■また、下記のような場合だと

edit_shop_shop_article GET    /shops/:shop_id/shop_articles/:id/edit(.:format){:action=>"edit", :controller=>"shop_articles"}


edit_shop_shop_article(@shop,@shop_articles)やedit_shop_shop_article()でOKです。たぶん

redirect_toアクション指定

■下記はrake routes の表示
 shop_admin_relay GET    /shop_admin_relays/:id(.:format){:action=>"show",:controller=>"shop_admin_relays"}


■redirect_toでshop_admin_relay_pathを記述せず@shop_admin_aelay.shop_adminだけを渡すと、


format.html { redirect_to(@shop_admin_aelay.shop_admin 。。。。
のように渡すとshopコントローラのshowメソッドが存在する場合,
shopのshowにアクションが移ってしまうが、
*下記にように指定shop_admin_relay_pathするとrake routesの記載どうりアクションが移動する
format.html { redirect_to(shop_admin_relay_path(@shop_admin_aelay.shop_admin)

2011年9月14日水曜日

findメソッドでActiveRecord::RecordNotFoundの対処

find_by_idを使いましょう、
こちらはnilが帰ってきます。

rails 多対多

rails generate scaffold group name:string

rails generate scaffold menber name:string

rails generate migration group_and_menber







class GroupAndMenber < ActiveRecord::Migration
  def self.up
    create_table :group_and_menbers do |t|
      t.integer :menber_id
      t.integer :group_id
    end
  end

  def self.down
    drop_table :group_and_menbers
  end
end

class GroupAndMenber < ActiveRecord::Base
  belongs_to :menber
  belongs_to :group
end


class Group < ActiveRecord::Base
  has_many :group_and_menbers
  has_many :menbers, :through => :group_and_menbers
end

class Menber < ActiveRecord::Base
  has_many :group_and_menbers
  has_many :groups, :through => :group_and_menbers
end



menber = Menber.new(:name => 'menber1')
menber.save
group = Group.new(:name => 'group1')
group.save  

menber.groups << group

で多対多が成立します







2011年9月13日火曜日

rails3 fields_forでcontrollerに配列渡し



    <%= fields_for :パラメータ名 do |field| %>
        <% @mise_admins.each do |mise_admin| %> 
              <%= field.check_box %><%= mise_admin.name %>
          <% end %>   
    <% end %> 


解説:fields_for :パラメータ名 の部分がparams[:パラメータ名]になり、
{"1"=>"0", "2"=>"1", "3"=>"1"}に受け取ることができます。1と0で判別します

rails3 多対多

rails generate scaffold man name:string

rails generate scaffold woman name:string

rails generate migration create_to_man_woman


class Woman < ActiveRecord::Base
  has_and_belongs_to_many :mans
end


class Man < ActiveRecord::Base
  has_and_belongs_to_many :womans
end

class CreateToManWoman < ActiveRecord::Migration
  def self.up
    create_table :men_women, :id => false do |t|
      t.integer :man_id
      t.integer :woman_id
    end
  end

  def self.down
    drop_table :man_woman
  end
end





m = Man.create(:name => 'man1')
w = Woman.create(:name => 'woman1')
m.womans << w


m = Man.create(:name => 'man3')
m.womans << w

rails3では<%= check_box_tag の引数

<%= check_box_tag '第1引数','第2引数' %>
第1引数はidとnameになります。
第2引数はvalueになります。

2011年9月2日金曜日

link_to タグでアクション指定

<% @shops.each do |shop| %>
  <tr>
    <td><font size="1"><%= shop.name %></font></td>
    <td><font size="1"><%= shop.address %></font></td>
     <td><%= link_to("確認",  :action => "show", :id => shop) %>
  </tr>
<% end %>

2011年8月23日火曜日

Feforaでユーザ作成とshh接続

「Fedoreでの設定」
①$ su -
でrootに変更

②$ useradd ユーザ名
でユーザを登録
③$ passwd ユーザ名
でパスワードを作成
④gpasswd -a ユーザ名 グループ名
でユーザをグループに追加
⑤$vi  /etc/pam.d/su
で#auth  required  pam_wheel.so user_uid
のをコメントからはずす
⑥/etc/sudoers visudo
で安全にファイルを開く、そのなかの
#wheel ALL=(ALL)  ALL
のコメントをはずす。これでユーザがroot権限の実行が可能になる
⑦$sudo yum install vim
でvimをインストール

⑧$ service sshd start
でsshdの起動

「Puttyでの作業」
①puttyの文字コードをUTF-8(CJK)に設定
②サーバに接続し「$ ssh-keygen -t rsa」
でデフォルトのまま保存(/.ssh/id_rsa)
で秘密鍵のパスフレーズを聞いてくるので入力,
③$cat id_rsa.pub > .ssh/authorized_keys
でサーバに公開鍵をとうろく,authorized_keysのパーミッションをchmod 600で書き込み可能にする
④puttryで接続しカギをダウンロードし「puttygen.exe」で秘密カギを登録、接続でいいはず。

2011年8月11日木曜日

Rails3でfrom_forの引数していの内容

<%= form_for :test, :url => "tests/show" do |f| %>
<%= f.select  :id, @tests.collect {|m| [m.name, m.id] }  %>
<%= f.submit    %>

上記の記述では
第一引数がパラメータ名、第2引数がコントローラとメソッドの指定になります。
また、f.selectの第一引数がパラメータ名、第2引数を配列で渡した場合、でオプションタグのvalueとテキストになります。

コントローラでパラメータを受け取る場合は、
params[:test][:id]で受け取る事ができます。

Rails3 のroutes.rbでpostでパラメータを受け取る

routes.rbの記述
post  "tests/show", :via => :post
を記述すると
$ rake routes
コマンドを実行すると、
tests_show POST   /tests/show(.:format)       {:controller=>"tests", :action=>"show"}
が生成されパラメータを受け取る事ができます。


2011年7月13日水曜日

WindowsでRuby on Railsをインスト

■■■■Rails 3.0.9バージョンのインスト■■■■
>gem update --system
>gem install rails sqlite3

■■■■SQLITEのドライバインスト■■■■■
 http://www.sqlite.org/sqlitedll-3_7_3.zip
よりsqliteのドライバをインストしパスの通っている・Rubyのbin等にコピーしてください


■■■■Rails3のアプリの作成■■■■■

>rails new demo

create
create  README
create  Rakefile
create  config.ru
create  .gitignore
create  Gemfile
create  app
create  app/controllers/application_controller.rb
create  app/helpers/application_helper.rb
create  app/mailers
create  app/models
create  app/views/layouts/application.html.erb
create  config
create  config/routes.rb
create  config/application.rb
create  config/environment.rb
create  config/environments
create  config/environments/development.rb
create  config/environments/production.rb
create  config/environments/test.rb
create  config/initializers
create  config/initializers/backtrace_silencers.rb
create  config/initializers/inflections.rb
create  config/initializers/mime_types.rb
create  config/initializers/secret_token.rb
create  config/initializers/session_store.rb
create  config/locales
create  config/locales/en.yml
create  config/boot.rb
create  config/database.yml
create  db
create  db/seeds.rb
create  doc
create  doc/README_FOR_APP
create  lib
create  lib/tasks
create  lib/tasks/.gitkeep
create  log
create  log/server.log
create  log/production.log
create  log/development.log
create  log/test.log
create  public
create  public/404.html
create  public/422.html
create  public/500.html
create  public/favicon.ico
create  public/index.html
create  public/robots.txt
create  public/images
create  public/images/rails.png
create  public/stylesheets
create  public/stylesheets/.gitkeep
create  public/javascripts
create  public/javascripts/application.js
create  public/javascripts/controls.js
create  public/javascripts/dragdrop.js
create  public/javascripts/effects.js
create  public/javascripts/prototype.js
create  public/javascripts/rails.js
create  script
create  script/rails
create  test
create  test/fixtures
create  test/functional
create  test/integration
create  test/performance/browsing_test.rb
create  test/test_helper.rb
create  test/unit
create  tmp
create  tmp/sessions
create  tmp/sockets
create  tmp/cache
create  tmp/pids
create  vendor/plugins
create  vendor/plugins/.gitkeep

が作成されます。


■■■■Railsのwebサーバの起動■■■■■
>rails server
で起動、このときセキュリティの警告がでますが解除してください。

次に「http://localhost:3000/」にアクセスしてみてください、
WEBrickサーバが立ち上がり「welcome aboard」と表示されるはずです。


■■■■say/indexを表示■■■■■
>rails generate controller say index
上記のコマンドは「say」がコントローラ名で、
「index」がアクションになります。


下記がはきだされるはずです。
create  app/controllers/say_controller.rb
 route  get "say/index"
invoke  erb
create    app/views/say
create    app/views/say/index.html.erb
invoke  test_unit
create    test/functional/say_controller_test.rb
invoke  helper
create    app/helpers/say_helper.rb
invoke    test_unit
create      test/unit/helpers/say_helper_test.rb


それでは「http://localhost:3000/say/index」にアクセスしてみましょう。
「Say#index
Find me in app/views/say/index.html.erb」と表示されているはずです。

コントローラの中身は
class SayController < ApplicationController
  def index
  end
end
となっているはずです。http://localhost:3000/say/indexのindexがメソッドになります。

■■■■say/helloを作成しを表示■■■■■
class SayController < ApplicationController
  def index
  end
  def hello
  end
end
を追加、demo/config/routes.brに
get "say/hello"を追加し、
また、demo\app\viwe\say\hello.html.erbを作成し、<h1>hello</h1>
「http://localhost:3000/say/hello」を表示するとhelloと表示されるはずです。

2011年6月6日月曜日

MySQLをphpmyadminで操作

①xamppをインストール後、アパッチとmysqlを起動し、
C:\xampp\phpMyAdmin\config.inc.php
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['user'] = '';
$cfg['Servers'][$i]['password'] = '';
と変更し、
②http://localhost/phpmyadmin/をブラウザーで表示、
変更が成功しているなら、IDとPSを求められるので入力しphpmyadminをしようします。



2011年6月2日木曜日

ありがちな受注管理システムのmysql文 2

#初回にrootユーザのパスワード設定コマンド
mysqladmin -u root password mysql

#rootユーザでmysqlにログイン
mysql -u root -p

★★★★#P476 データベースの作成
CREATE DATABASE 受注管理;

#MySQLのコマンド。カレントデータベースを変更する。
use 受注管理;

★★★★#P476 テーブルの作成
CREATE TABLE 顧客 (
顧客番号 CHAR(4) PRIMARY KEY,
顧客名 VARCHAR(20),
住所 VARCHAR(50),
電話番号 CHAR(15));

CREATE TABLE 受注 (
受注番号 CHAR(5) PRIMARY KEY,
受注年月日 DATE NOT NULL,
顧客番号 CHAR(4),
受注合計 DECIMAL,
FOREIGN KEY(顧客番号) REFERENCES 顧客(顧客番号));
##################
#FOREIGN KEYは指定した
#親テーブルに存在しない値を指定してデータを追加
#するとエラーとなります。
#################


CREATE TABLE 商品 (
商品番号 CHAR(3) PRIMARY KEY,
商品名 VARCHAR(20),
単価 DECIMAL );

CREATE TABLE 受注明細 (
受注番号 CHAR(5),
商品番号 CHAR(3),
数量 INTEGER,
受注小計 DECIMAL,
PRIMARY KEY(受注番号,商品番号),
FOREIGN KEY(受注番号) REFERENCES 受注(受注番号),
FOREIGN KEY(商品番号) REFERENCES 商品(商品番号));

★★★★#P496 レコードの挿入(1件のみ)
INSERT INTO 顧客 (顧客番号,顧客名,住所,電話番号)
VALUES ('1001','株式会社冨田貿易','東京都港区芝浦1-XX-XX','03-3256-XXXX');

#カラムを指定せずに複数行を挿入
INSERT INTO 顧客 VALUES
('1003','宇宙商事株式会社','東京都足立区神明22-XX','03-5126-XXXX'),
('1006','有限会社吉野物産','大阪府大阪市中央区城見23-XX','06-6112-XXXX');

INSERT INTO 商品 VALUES
('A01','テレビ(液晶大型)','200000'),
('A11','テレビ(液晶小型)','50000'),
('G02','DVDレコーダー','80000'),
('S05','ラジオ','3000');

INSERT INTO 受注 VALUES
('00001','2010/04/01','1001','640000'),
('00002','2010/04/02','1006','518000'),
('00003','2010/04/02','1003','600000'),
('00004','2010/04/05','1001','3000');

INSERT INTO 受注明細 VALUES
('00001','A01','2','400000'),
('00001','G02','3','240000'),
('00002','S05','6','18000'),
('00002','A11','10','500000'),
('00003','A01','3','600000'),
('00004','S05','1','3000');

★★★★P497 挿入(INSERT文)★★★★★
INSERT INTO 顧客 (顧客番号,顧客名)
VALUES ('2001','株式会社こあら百貨店');
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------------------+-----------------------------+--------------+

| 顧客番号 | 顧客名 | 住所 | 電話番号 |

+----------+----------------------+-----------------------------+--------------+

| 1001 | 株式会社冨田貿易 | 東京都港区芝浦1-XX-XX | 03-3256-XXXX |

| 1003 | 宇宙商事株式会社 | 東京都足立区神明22-XX | 03-5126-XXXX |

| 1006 | 有限会社吉野物産 | 大阪府大阪市中央区城見23-XX | 06-6112-XXXX |

| 2001 | 株式会社こあら百貨店 | NULL | NULL |

+----------+----------------------+-----------------------------+--------------+


★★★★★★★★#P497 更新(UPDATE文)★★★★
UPDATE 顧客 SET 住所='埼玉県入間市東町1-XX' WHERE 顧客番号='2001';
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------------------+-----------------------------+--------------+

| 顧客番号 | 顧客名 | 住所 | 電話番号 |

+----------+----------------------+-----------------------------+--------------+

| 1001 | 株式会社冨田貿易 | 東京都港区芝浦1-XX-XX | 03-3256-XXXX |

| 1003 | 宇宙商事株式会社 | 東京都足立区神明22-XX | 03-5126-XXXX |

| 1006 | 有限会社吉野物産 | 大阪府大阪市中央区城見23-XX | 06-6112-XXXX |

| 2001 | 株式会社こあら百貨店 | 埼玉県入間市東町1-XX | NULL |

+----------+----------------------+-----------------------------+--------------+


★★★★★★★★#P498 削除(DELETE文)★★★★
DELETE FROM 顧客 WHERE 顧客番号='2001';
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------------+-----------------------------+--------------+
| 顧客番号 | 顧客名 | 住所 | 電話番号 |
+----------+------------------+-----------------------------+--------------+
| 1001 | 株式会社冨田貿易 | 東京都港区芝浦1-XX-XX | 03-3256-XXXX |
| 1003 | 宇宙商事株式会社 | 東京都足立区神明22-XX | 03-5126-XXXX |
| 1006 | 有限会社吉野物産 | 大阪府大阪市中央区城見23-XX | 06-6112-XXXX |
+----------+------------------+-----------------------------+--------------+


★★★★★★★★#P479 ビューの定義★★★★
CREATE VIEW 顧客名簿 AS SELECT 顧客番号,顧客名 FROM 顧客;
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------------+
| 顧客番号 | 顧客名 |
+----------+------------------+
| 1001 | 株式会社冨田貿易 |
| 1003 | 宇宙商事株式会社 |
| 1006 | 有限会社吉野物産 |
+----------+------------------+

★★★★★★★★#P480 検索系のデータ操作(SELECT文)★★★★
★★★★#P481 全ての項目の検索
SELECT * FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
| 00002 | 2010-04-02 | 1006 | 518000 |
| 00003 | 2010-04-02 | 1003 | 600000 |
| 00004 | 2010-04-05 | 1001 | 3000 |
+----------+------------+----------+----------+


★★★★★★★★#P481 特定の項目の検索★★★★
SELECT 受注番号,受注合計 FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------+
| 受注番号 | 受注合計 |
+----------+----------+
| 00001 | 640000 |
| 00002 | 518000 |
| 00003 | 600000 |
| 00004 | 3000 |
+----------+----------+

★★★★★★★★#P481 計算結果の表示★★★★
SELECT 受注番号,受注合計,受注合計*1.05-受注合計 AS 消費税 FROM 受注
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------+----------+
| 受注番号 | 受注合計 | 消費税 |
+----------+----------+----------+
| 00001 | 640000 | 32000.00 |
| 00002 | 518000 | 25900.00 |
| 00003 | 600000 | 30000.00 |
| 00004 | 3000 | 150.00 |
+----------+----------+----------+


★★★★★★★★#P482 ひとつの項目で重複するデータを除いた検索★★★★
SELECT DISTINCT 受注年月日 FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+------------+
| 受注年月日 |
+------------+
| 2010-04-01 |
| 2010-04-02 |
| 2010-04-05 |
+------------+

★★★★★★★★#P482 複数の項目で重複するデータを除いた検索★★★★
SELECT DISTINCT 受注年月日,顧客番号 FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+------------+----------+
| 受注年月日 | 顧客番号 |
+------------+----------+
| 2010-04-01 | 1001 |
| 2010-04-02 | 1006 |
| 2010-04-02 | 1003 |
| 2010-04-05 | 1001 |
+------------+----------+


★★★★★★★★#P482 条件を指定したデータの検索★★★★
#前準備
INSERT INTO 受注 (受注番号,受注年月日,顧客番号) VALUES ('00005','2010/04/05','1001');
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
| 00002 | 2010-04-02 | 1006 | 518000 |
| 00003 | 2010-04-02 | 1003 | 600000 |
| 00004 | 2010-04-05 | 1001 | 3000 |
| 00005 | 2010-04-05 | 1001 | NULL |
+----------+------------+----------+----------+


★★★★#P484 条件を満たすデータの検索★★★★
SELECT * FROM 受注 WHERE 顧客番号='1001';
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
| 00004 | 2010-04-05 | 1001 | 3000 |
| 00005 | 2010-04-05 | 1001 | NULL |
+----------+------------+----------+----------+

★★★★#P484 すべての条件を満たすデータの検索★★★★
SELECT * FROM 受注 WHERE 顧客番号='1001' AND 受注合計>=600000;
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
+----------+------------+----------+----------+

★★★★#P484 いずれかの条件を満たすデータの検索★★★★
SELECT * FROM 受注 WHERE 顧客番号='1001' OR 受注合計>=600000;
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
| 00003 | 2010-04-02 | 1003 | 600000 |
| 00004 | 2010-04-05 | 1001 | 3000 |
| 00005 | 2010-04-05 | 1001 | NULL |
+----------+------------+----------+----------+

★★★★#P485 条件を満たさないデータの検索★★★★
SELECT * FROM 受注 WHERE NOT 顧客番号='1001';
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00002 | 2010-04-02 | 1006 | 518000 |
| 00003 | 2010-04-02 | 1003 | 600000 |
+----------+------------+----------+----------+

★★★★#P485 NULLを含むレコードの検索★★★★
SELECT 受注番号,受注合計 FROM 受注 WHERE 受注合計 IS NULL;
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------+
| 受注番号 | 受注合計 |
+----------+----------+
| 00005 | NULL |
+----------+----------+

★★★★#P485 NULLを含まないレコードの検索★★★★
SELECT 受注番号,受注合計 FROM 受注 WHERE 受注合計 IS NOT NULL;
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------+
| 受注番号 | 受注合計 |
+----------+----------+
| 00001 | 640000 |
| 00002 | 518000 |
| 00003 | 600000 |
| 00004 | 3000 |
+----------+----------+

★★★★#P486 2つの値の間にあるデータを含むレコードの検索★★★★
SELECT 受注番号,受注合計 FROM 受注
WHERE 受注合計 BETWEEN 600000 AND 1000000;
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
| 00003 | 2010-04-02 | 1003 | 600000 |
+----------+------------+----------+----------+

★★★★#P486 リストの値と一致するデータを含むレコードの検索★★★★
SELECT 受注番号,受注合計 FROM 受注 WHERE 受注番号 IN ('00001','00004');
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
| 00004 | 2010-04-05 | 1001 | 3000 |
+----------+------------+----------+----------+

★★★★#P486 リストの値のすべてと一致しないデータを含むレコードの検索★★★★
SELECT 受注番号,受注合計 FROM 受注
WHERE 受注番号 NOT IN ('00001','00004');
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------+
| 受注番号 | 受注合計 |
+----------+----------+
| 00002 | 518000 |
| 00003 | 600000 |
| 00005 | NULL |
+----------+----------+

★★★★#P487 文字列の一部を条件とした検索★★★★
SELECT 商品番号,商品名 FROM 商品 WHERE 商品名 LIKE 'ラ__';
+----------+--------+
| 商品番号 | 商品名 |
+----------+--------+
| S05 | ラジオ |
+----------+--------+
SELECT 商品番号,商品名 FROM 商品 WHERE 商品名 LIKE '%液晶%';
■■■■■■■■■結果■■■■■■■■■■■
+----------+--------------------+
| 商品番号 | 商品名 |
+----------+--------------------+
| A01 | テレビ(液晶大型) |
| A11 | テレビ(液晶小型) |
+----------+--------------------+

★★★★#P487 表の結合★★★★
#下準備
DELETE FROM 受注 WHERE 受注番号='00005';
■■■■■■■■■結果■■■■■■■■■■■


★★★★#P488 2つの表の結合★★★★
SELECT 受注番号,受注.顧客番号,顧客名 FROM 受注,顧客
WHERE 受注.顧客番号=顧客.顧客番号;

******INNER JOINを使った場合*****
SELECT 受注番号,受注.顧客番号,顧客名 FROM 受注
INNER JOIN 顧客
WHERE 受注.顧客番号=顧客.顧客番号;

■■■■■■■■■結果■■■■■■■■■■■
:::::::::受注テーブル::::::::
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
| 00002 | 2010-04-02 | 1006 | 518000 |
| 00003 | 2010-04-02 | 1003 | 600000 |
| 00004 | 2010-04-05 | 1001 | 3000 |
| 00005 | 2010-04-05 | 1001 | NULL |
+----------+------------+----------+----------+
:::::::::顧客テーブル:::::::::
+----------+------------------+-----------------------------+--------
| 顧客番号 | 顧客名 | 住所 | 電話番号
+----------+------------------+-----------------------------+--------
| 1001 | 株式会社冨田貿易 | 東京都港区芝浦1-XX-XX | 03-3256
| 1003 | 宇宙商事株式会社 | 東京都足立区神明22-XX | 03-5126
| 1006 | 有限会社吉野物産 | 大阪府大阪市中央区城見23-XX | 06-6112
+----------+------------------+-----------------------------+--------
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
+----------+----------+------------------+
| 受注番号 | 顧客番号 | 顧客名 |
+----------+----------+------------------+
| 00001 | 1001 | 株式会社冨田貿易 |
| 00004 | 1001 | 株式会社冨田貿易 |
| 00005 | 1001 | 株式会社冨田貿易 |
| 00003 | 1003 | 宇宙商事株式会社 |
| 00002 | 1006 | 有限会社吉野物産 |
+----------+----------+------------------+
★★★★#P488 3つ以上の表の結合★★★★
SELECT 受注.受注番号,受注.顧客番号,顧客名,受注明細.商品番号,商品名,単価,数量,受注小計
FROM 受注,顧客,受注明細,商品
WHERE 受注.顧客番号=顧客.顧客番号 AND 受注.受注番号=受注明細.受注番号 AND 受注明細.商品番号=商品.商品番号;
*********下記のテーブルを結合してSQLを実行します。*********
:::::::::::::::受注:::::::::::::::
+----------+------------+----------+----------+
| 受注番号 | 受注年月日 | 顧客番号 | 受注合計 |
+----------+------------+----------+----------+
| 00001 | 2010-04-01 | 1001 | 640000 |
| 00002 | 2010-04-02 | 1006 | 518000 |
| 00003 | 2010-04-02 | 1003 | 600000 |
| 00004 | 2010-04-05 | 1001 | 3000 |
| 00005 | 2010-04-05 | 1001 | NULL |
+----------+------------+----------+----------+
::::::::::::::顧客:::::::::::::
+----------+------------------+-----------------------------+--------------+
| 顧客番号 | 顧客名 | 住所 | 電話番号 |
+----------+------------------+-----------------------------+--------------+
| 1001 | 株式会社冨田貿易 | 東京都港区芝浦1-XX-XX | 03-3256-XXXX |
| 1003 | 宇宙商事株式会社 | 東京都足立区神明22-XX | 03-5126-XXXX |
| 1006 | 有限会社吉野物産 | 大阪府大阪市中央区城見23-XX | 06-6112-XXXX |
+----------+------------------+-----------------------------+--------------+
::::::::受注明細::::::::::::
+----------+----------+------+----------+
| 受注番号 | 商品番号 | 数量 | 受注小計 |
+----------+----------+------+----------+
| 00001 | A01 | 2 | 400000 |
| 00001 | G02 | 3 | 240000 |
| 00002 | A11 | 10 | 500000 |
| 00002 | S05 | 6 | 18000 |
| 00003 | A01 | 3 | 600000 |
| 00004 | S05 | 1 | 3000 |
+----------+----------+------+----------+
::::::::商品:::::::::::
+----------+--------------------+--------+
| 商品番号 | 商品名 | 単価 |
+----------+--------------------+--------+
| A01 | テレビ(液晶大型) | 200000 |
| A11 | テレビ(液晶小型) | 50000 |
| G02 | DVDレコーダー | 80000 |
| S05 | ラジオ | 3000 |
+----------+--------------------+--------+
↓↓↓↓上記のテーブルを結合して実行するSQL文↓↓↓↓
SELECT 受注.受注番号,受注.顧客番号,顧客名,受注明細.商品番号,商品名,単価,数量,受注小計
FROM 受注,顧客,受注明細,商品
WHERE 受注.顧客番号=顧客.顧客番号 AND 受注.受注番号=受注明細.受注番号 AND 受注明細.商品番号=商品.商品番号;
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------+------------------+----------+--------------------+--------+------+----------+
| 受注番号 | 顧客番号 | 顧客名 | 商品番号 | 商品名 | 単価 | 数量 | 受注小計 |
+----------+----------+------------------+----------+--------------------+--------+------+----------+
| 00001 | 1001 | 株式会社冨田貿易 | A01 | テレビ(液晶大型) | 200000 | 2 | 400000 |
| 00003 | 1003 | 宇宙商事株式会社 | A01 | テレビ(液晶大型) | 200000 | 3 | 600000 |
| 00002 | 1006 | 有限会社吉野物産 | A11 | テレビ(液晶小型) | 50000 | 10 | 500000 |
| 00001 | 1001 | 株式会社冨田貿易 | G02 | DVDレコーダー | 80000 | 3 | 240000 |
| 00004 | 1001 | 株式会社冨田貿易 | S05 | ラジオ | 3000 | 1 | 3000 |
| 00002 | 1006 | 有限会社吉野物産 | S05 | ラジオ | 3000 | 6 | 18000 |
+----------+----------+------------------+----------+--------------------+--------+------+----------+



★★★★#P489 データの集計★★★★
★★★★#P489 レコード数の表示★★★★
SELECT COUNT(*) FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+----------+
| COUNT(*) |
+----------+
| 5 |
+----------+

★★★★P#490 指定した項目の合計値の表示★★★★
SELECT SUM(受注合計) FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+---------------+
| SUM(受注合計) |
+---------------+
| 1761000 |
+---------------+


★★★★#P490 指定した項目の平均値の表示★★★★
SELECT AVG(受注合計) FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+---------------+
| AVG(受注合計) |
+---------------+
| 440250.0000 |
+---------------+

★★★★#P490 指定した項目の最大値の表示★★★★
SELECT MAX(受注合計) FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+---------------+
| MAX(受注合計) |
+---------------+
| 640000 |
+---------------+


★★★★#P490 指定した項目の最小値の表示★★★★
SELECT MIN(受注合計) FROM 受注;
■■■■■■■■■結果■■■■■■■■■■■
+---------------+
| MIN(受注合計) |
+---------------+
| 3000 |
+---------------+

★★★★#P491 データのグループ化★★★★
★★★★#P491 項目ごとにグループ化して表示★★★★
SELECT 受注年月日,COUNT(*),SUM(受注合計) FROM 受注 GROUP BY 受注年月日;
■■■■■■■■■結果■■■■■■■■■■■
+------------+----------+---------------+
| 受注年月日 | COUNT(*) | SUM(受注合計) |
+------------+----------+---------------+
| 2010-04-01 | 1 | 640000 |
| 2010-04-02 | 2 | 1118000 |
| 2010-04-05 | 2 | 3000 |
+------------+----------+---------------+
★★★★#P491 データのグループ化★★★★
★★★★#P491 項目ごとにグループ化して表示★★★★
SELECT 顧客番号,COUNT(*),SUM(受注合計) FROM 受注 GROUP BY 顧客番号;
+----------+----------+---------------+
| 顧客番号 | COUNT(*) | SUM(受注合計) |
+----------+----------+---------------+
| 1001 | 3 | 643000 |
| 1003 | 1 | 600000 |
| 1006 | 1 | 518000 |
+----------+----------+---------------+

★★★★#P492 項目ごとにグループ化して条件を絞り込んで表示★★★★
SELECT 受注年月日,COUNT(*),SUM(受注合計)
FROM 受注
GROUP BY 受注年月日
HAVING SUM(受注合計)>1000000;
■■■■■■■■■結果■■■■■■■■■■■
+------------+----------+---------------+
| 受注年月日 | COUNT(*) | SUM(受注合計) |
+------------+----------+---------------+
| 2010-04-02 | 2 | 1118000 |
+------------+----------+---------------+

★★★★#P492 データの並べ替え★★★★
★★★★#P493 ひとつの項目による並べ替え★★★★
SELECT 受注番号,顧客番号,受注合計
FROM 受注
ORDER BY 受注合計;
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------+----------+
| 受注番号 | 顧客番号 | 受注合計 |
+----------+----------+----------+
| 00005 | 1001 | NULL |
| 00004 | 1001 | 3000 |
| 00002 | 1006 | 518000 |
| 00003 | 1003 | 600000 |
| 00001 | 1001 | 640000 |
+----------+----------+----------+

★★★★#P492 複数の項目による並べ替え★★★★
SELECT 受注番号,顧客番号,受注合計
FROM 受注
ORDER BY 顧客番号
ASC,受注合計 DESC;
■■■■■■■■■解説■■■■■■■■■
顧客番号順に並べ受注合計が多い多い順に表示
■■■■■■■■■結果■■■■■■■■■■■
+----------+----------+----------+
| 受注番号 | 顧客番号 | 受注合計 |
+----------+----------+----------+
| 00001 | 1001 | 640000 |
| 00004 | 1001 | 3000 |
| 00005 | 1001 | NULL |
| 00003 | 1003 | 600000 |
| 00002 | 1006 | 518000 |
+----------+----------+----------+


★★★★#P492 副問い合わせ★★★★
★★★★#P493 単一行問い合わせ★★★★
SELECT * FROM 顧客
WHERE 顧客番号=
(SELECT 顧客番号 FROM 受注 WHERE 受注番号='00001');
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------------+-----------------------+--------------+
| 顧客番号 | 顧客名 | 住所 | 電話番号 |
+----------+------------------+-----------------------+--------------+
| 1001 | 株式会社冨田貿易 | 東京都港区芝浦1-XX-XX | 03-3256-XXXX |
+----------+------------------+-----------------------+--------------+

★★★★#P493 複数行問い合わせ★★★★
SELECT * FROM 顧客 WHERE 顧客番号 IN
(SELECT 顧客番号 FROM 受注 WHERE 受注合計>=600000);
■■■■■■■■■結果■■■■■■■■■■■
+----------+------------------+-----------------------+--------------+
| 顧客番号 | 顧客名 | 住所 | 電話番号 |
+----------+------------------+-----------------------+--------------+
| 1001 | 株式会社冨田貿易 | 東京都港区芝浦1-XX-XX | 03-3256-XXXX |
| 1003 | 宇宙商事株式会社 | 東京都足立区神明22-XX | 03-5126-XXXX |
+----------+------------------+-----------------------+--------------+

★★★★#P495 相関副問い合わせ★★★★
#下準備
INSERT INTO 商品 VALUES ('Z01','冷蔵庫','150000'),('Z11','エアコン','98000');
■■■■■■■■■結果■■■■■■■■■■■
+----------+--------------------+--------+
| 商品番号 | 商品名 | 単価 |
+----------+--------------------+--------+
| A01 | テレビ(液晶大型) | 200000 |
| A11 | テレビ(液晶小型) | 50000 |
| G02 | DVDレコーダー | 80000 |
| S05 | ラジオ | 3000 |
| Z01 | 冷蔵庫 | 150000 |
| Z11 | エアコン | 98000 |
+----------+--------------------+--------+


★★★★#P495 複数の表で一致するレコードの検索★★★★
SELECT 商品番号,商品名 FROM 商品 WHERE EXISTS
(SELECT * FROM 受注明細 WHERE 商品.商品番号=受注明細.商品番号);

********解説********
EXISTS は TRUE になり、NOT EXISTS は FALSE になります。

■■■■■■■■■結果■■■■■■■■■■■
+----------+--------------------+
| 商品番号 | 商品名 |
+----------+--------------------+
| A01 | テレビ(液晶大型) |
| A11 | テレビ(液晶小型) |
| G02 | DVDレコーダー |
| S05 | ラジオ |
+----------+--------------------+


★★★★#P496 複数の表で一致しないレコードの検索★★★★
SELECT 商品番号,商品名 FROM 商品 WHERE NOT EXISTS
(SELECT * FROM 受注明細 WHERE 商品.商品番号=受注明細.商品番号);
■■■■■■■■■結果■■■■■■■■■■■
::::::商品テーブル::::::::
+----------+--------------------+--------+
| A01 | テレビ(液晶大型) | 200000 |
| A11 | テレビ(液晶小型) | 50000 |
| G02 | DVDレコーダー | 80000 |
| S05 | ラジオ | 3000 |
| Z01 | 冷蔵庫 | 150000 |
| Z11 | エアコン | 98000 |
+----------+--------------------+--------+

::::::受注明細テーブル::::::::
+----------+----------+------+----------+
| 受注番号 | 商品番号 | 数量 | 受注小計 |
+----------+----------+------+----------+
| 00001 | A01 | 2 | 400000 |
| 00001 | G02 | 3 | 240000 |
| 00002 | A11 | 10 | 500000 |
| 00002 | S05 | 6 | 18000 |
| 00003 | A01 | 3 | 600000 |
| 00004 | S05 | 1 | 3000 |
+----------+----------+------+----------+
↓↓↓↓↓結果↓↓↓↓↓
+----------+----------+
| 商品番号 | 商品名 |
+----------+----------+
| Z01 | 冷蔵庫 |
| Z11 | エアコン |
+----------+----------+

2011年6月1日水曜日

ありがちな受注管理システムのmysql文

*********************************************
ありがちな受注管理システムのmysql文です。
今回xamppのmysqlを使いました。

#初回にrootユーザのパスワード設定コマンド
mysqladmin -u root password mysql

#rootユーザでmysqlにログイン
mysql -u root -p

#P476 データベースの作成
CREATE DATABASE 受注管理;

#MySQLのコマンド。カレントデータベースを変更する。
use 受注管理;

#P476 テーブルの作成
CREATE TABLE 顧客 (
顧客番号 CHAR(4) PRIMARY KEY,
顧客名 VARCHAR(20),
住所 VARCHAR(50),
電話番号 CHAR(15));

CREATE TABLE 受注 (
受注番号 CHAR(5) PRIMARY KEY,
受注年月日 DATE NOT NULL,
顧客番号 CHAR(4),
受注合計 DECIMAL,
FOREIGN KEY(顧客番号) REFERENCES 顧客(顧客番号));



CREATE TABLE 商品 (
商品番号 CHAR(3) PRIMARY KEY,
商品名 VARCHAR(20),
単価 DECIMAL );

CREATE TABLE 受注明細 (
受注番号 CHAR(5),
商品番号 CHAR(3),
数量 INTEGER,
受注小計 DECIMAL,
PRIMARY KEY(受注番号,商品番号),
FOREIGN KEY(受注番号) REFERENCES 受注(受注番号),
FOREIGN KEY(商品番号) REFERENCES 商品(商品番号));

#P496 レコードの挿入(1件のみ)
INSERT INTO 顧客 (顧客番号,顧客名,住所,電話番号)
VALUES ('1001','株式会社冨田貿易','東京都港区芝浦1-XX-XX','03-3256-XXXX');

#カラムを指定せずに複数行を挿入
INSERT INTO 顧客 VALUES
('1003','宇宙商事株式会社','東京都足立区神明22-XX','03-5126-XXXX'),
('1006','有限会社吉野物産','大阪府大阪市中央区城見23-XX','06-6112-XXXX');

INSERT INTO 商品 VALUES
('A01','テレビ(液晶大型)','200000'),
('A11','テレビ(液晶小型)','50000'),
('G02','DVDレコーダー','80000'),
('S05','ラジオ','3000');

INSERT INTO 受注 VALUES
('00001','2010/04/01','1001','640000'),
('00002','2010/04/02','1006','518000'),
('00003','2010/04/02','1003','600000'),
('00004','2010/04/05','1001','3000');

INSERT INTO 受注明細 VALUES
('00001','A01','2','400000'),
('00001','G02','3','240000'),
('00002','S05','6','18000'),
('00002','A11','10','500000'),
('00003','A01','3','600000'),
('00004','S05','1','3000');

#P497 挿入(INSERT文)
INSERT INTO 顧客 (顧客番号,顧客名)
VALUES ('2001','株式会社こあら百貨店');

#P497 更新(UPDATE文)
UPDATE 顧客 SET 住所='埼玉県入間市東町1-XX' WHERE 顧客番号='2001';

#P498 削除(DELETE文)
DELETE FROM 顧客 WHERE 顧客番号='2001';

#P479 ビューの定義
CREATE VIEW 顧客名簿 AS SELECT 顧客番号,顧客名 FROM 顧客;

#P480 検索系のデータ操作(SELECT文)
#P481 全ての項目の検索
SELECT * FROM 受注;

#P481 特定の項目の検索
SELECT 受注番号,受注合計 FROM 受注;

#P481 計算結果の表示
SELECT 受注番号,受注合計*1.05 FROM 受注;

#P482 ひとつの項目で重複するデータを除いた検索
SELECT DISTINCT 受注年月日 FROM 受注;

#P482 複数の項目で重複するデータを除いた検索
SELECT DISTINCT 受注年月日,顧客番号 FROM 受注;

#P482 条件を指定したデータの検索
#前準備
INSERT INTO 受注 (受注番号,受注年月日,顧客番号) VALUES ('00005','2010/04/05','1001');

#P484 条件を満たすデータの検索
SELECT * FROM 受注 WHERE 顧客番号='1001';

#P484 すべての条件を満たすデータの検索
SELECT * FROM 受注 WHERE 顧客番号='1001' AND 受注合計>=600000;

#P484 いずれかの条件を満たすデータの検索
SELECT * FROM 受注 WHERE 顧客番号='1001' OR 受注合計>=600000;

#P485 条件を満たさないデータの検索
SELECT * FROM 受注 WHERE NOT 顧客番号='1001';

#P485 NULLを含むレコードの検索
SELECT 受注番号,受注合計 FROM 受注 WHERE 受注合計 IS NULL;

#P485 NULLを含まないレコードの検索
SELECT 受注番号,受注合計 FROM 受注 WHERE 受注合計 IS NOT NULL;

#P486 2つの値の間にあるデータを含むレコードの検索
SELECT 受注番号,受注合計 FROM 受注
WHERE 受注合計 BETWEEN 600000 AND 1000000;

#P486 リストの値と一致するデータを含むレコードの検索
SELECT 受注番号,受注合計 FROM 受注
WHERE 受注番号 IN ('00001','00004');

#P486 リストの値のすべてと一致しないデータを含むレコードの検索
SELECT 受注番号,受注合計 FROM 受注
WHERE 受注番号 NOT IN ('00001','00004');

#P487 文字列の一部を条件とした検索
SELECT 商品番号,商品名 FROM 商品 WHERE 商品名 LIKE 'ラ__';

SELECT 商品番号,商品名 FROM 商品 WHERE 商品名 LIKE '%液晶%';

#P487 表の結合
#下準備
DELETE FROM 受注 WHERE 受注番号='00005';

#P488 2つの表の結合
SELECT 受注番号,受注.顧客番号,顧客名 FROM 受注,顧客
WHERE 受注.顧客番号=顧客.顧客番号;

#P488 3つ以上の表の結合
SELECT 受注.受注番号,受注.顧客番号,顧客名,受注明細.商品番号,商品名,単価,数量,受注小計
FROM 受注,顧客,受注明細,商品
WHERE 受注.顧客番号=顧客.顧客番号 AND 受注.受注番号=受注明細.受注番号 AND 受注明細.商品番号=商品.商品番号;

#P489 データの集計
#P489 レコード数の表示
SELECT COUNT(*) FROM 受注;

#490 指定した項目の合計値の表示
SELECT SUM(受注合計) FROM 受注;

#P490 指定した項目の平均値の表示
SELECT AVG(受注合計) FROM 受注;

#P490 指定した項目の最大値の表示
SELECT MAX(受注合計) FROM 受注;

#P490 指定した項目の最小値の表示
SELECT MIN(受注合計) FROM 受注;

#P491 データのグループ化
#P491 項目ごとにグループ化して表示
SELECT 受注年月日,COUNT(*),SUM(受注合計) FROM 受注 GROUP BY 受注年月日;

#P492 項目ごとにグループ化して条件を絞り込んで表示
SELECT 受注年月日,COUNT(*),SUM(受注合計) FROM 受注 GROUP BY 受注年月日
HAVING SUM(受注合計)>1000000;

#P492 データの並べ替え
#P493 ひとつの項目による並べ替え
SELECT 受注番号,顧客番号,受注合計 FROM 受注 ORDER BY 受注合計;

#P492 複数の項目による並べ替え
SELECT 受注番号,顧客番号,受注合計 FROM 受注 ORDER BY 顧客番号 ASC,受注合計 DESC;

#P492 副問い合わせ
#P493 単一行問い合わせ
SELECT * FROM 顧客 WHERE 顧客番号=
(SELECT 顧客番号 FROM 受注 WHERE 受注番号='00001');

#P493 複数行問い合わせ
SELECT * FROM 顧客 WHERE 顧客番号 IN
(SELECT 顧客番号 FROM 受注 WHERE 受注合計>=600000);

#P495 相関副問い合わせ
#下準備
INSERT INTO 商品 VALUES ('Z01','冷蔵庫','150000'),('Z11','エアコン','98000');

#P495 複数の表で一致するレコードの検索
SELECT 商品番号,商品名 FROM 商品 WHERE EXISTS
(SELECT * FROM 受注明細 WHERE 商品.商品番号=受注明細.商品番号);

#P496 複数の表で一致しないレコードの検索
SELECT 商品番号,商品名 FROM 商品 WHERE NOT EXISTS
(SELECT * FROM 受注明細 WHERE 商品.商品番号=受注明細.商品番号);






2011年5月29日日曜日

eclipseでRuby環境を作成

色々とeclipseとRubyの開発環境構築のサイトはありますが、
情報がまちまちだったり
ダウンロードサイトが変わっていたりと、、、、
一応 私が2011年05月に開発環境を構築した手順を掲載いたします。

①http://mergedoc.sourceforge.jp/より
Full All in One (JRE あり)の Ultimateをダウンロードします。
すでに日本語化もしてあります。

②ダウンロードしたeclipse.exeをクリックしインストします

③ 次にeclipseのメニューより「ウインドウ」→「設定」→「一般」→「機能」→「クラシック更新」→
「適用」 →「Ok」

④ 次にeclipseのメニューより「ヘルプ」→「ソフトウエアの更新」→「検索とインストール」
→「追加」→「http://download.aptana.com/tools/radrails/plugin/install/radrails-bundle」と入力し
後は指示にしたがってインストールします。
これで完了です。
おつかれさまでした。


2011年5月27日金曜日

スタックとキュー とは?と多重配列



arr = [],[]
p arr[0][0] = 12
p arr[0][1] = 11
p arr[0][2] = 11
p arr[0][3] = 13

p arr[1][0] = 02
p arr[1][1] = 01
p arr[1][2] = 01
p arr[1][3] = 03
p arr
p arr << [1,2]
p arr 


###結果####
12
11
11
13
2
1
1
3
[[12, 11, 11, 13], [2, 1, 1, 3]]
[[12, 11, 11, 13], [2, 1, 1, 3], [1, 2]]
[[12, 11, 11, 13], [2, 1, 1, 3], [1, 2]]

#####用語#####
スタックポインターとは?
データの位置を格納しているポインター

プッシュとは?
データをスタック領域に格納する作業

キューとは?
行列です

エンキューとは?
 配列に追加

デキューとは?
配列から削除

2011年5月23日月曜日

Ruby言語 でじゃんけん

pc = ["グー","チョキ","パー"]
pcnum = rand(3)
puts "PCは#{pc[pcnum]}"
puts "私は#{pc[name]}"
puts "シャンケンの判定は"
ans = ((name - pcnum)+3)%3//
if(ans == 0)
puts "アイコ"
elsif(ans == 2)
puts "勝ち"
elsif(ans == 1)
puts "負け"
end

Ruby言語 ループ

p "■■■hello1■■■"
def hello1(num,i=0)
(i..num-1).each do |i|
puts "Hello world"
end
end
hello1(3)

p "■■■hello2■■■"
def hello2(num)
array = ["Hello world"]*num
array.each do |item|
p item
end
end
hello2(3)

p "■■■hello3■■■"
def hello3(num)
num.times do
puts "Hello World"
end
end
hello3(3)

p "■■■hello4■■■"

def hello4 (num,str,i=0)
while i < num puts str i +=1 end end hello4(3,"Hello") p "■■■hello5■■■" def hello5(num) 1.upto(num) do puts "Hello World" end end hello5(3) p "■■■file■■■" File.open("hello.txt","r") do |txt| puts txt.read end p "■■■file2■■■" File.open("hello.txt","r") do |txt| txt.each_line do |line| puts line end end


2011年5月17日火曜日

Ruby 変数と定数とスコープ

puts "###############試験対策ソース###############"

puts "###############変数と定数とスコープ1###############"
x = 1
def ans
x = 4 #xを初期設定していない場合、xを呼び出す場合NameErrorが返されます。
puts x #=>4 xのスコープはメソッド内だけです。
end
ans
puts x #=>1


puts "###############変数と定数とスコープ2###############"

def ans2
x = 100 if false #この場合xへの代入は実行されないが、宣言はされます。
puts x #=>nil
end

ans2

puts "###############変数と定数とスコープ3###############"

def ans3
x = 0 #ブロックの外で初期設定
(0 ... 11).each do |i|
puts x += i #ブロック内でも有効です
end
end

ans3

puts "###############変数と定数とスコープ4###############"
def ans4
o = 0 #初期化を行っていない変数に代入を行うとNameErrarが吐き出されます。
for i in 1..10
o += i
end
puts o
end

ans4
★★★★★★実行結果★★★★★★
###############試験対策メ[ス###############
###############変数と定数とスコープ1###############
4
1
###############変数と定数とスコープ2###############
nil
###############変数と定数とスコープ3###############
0
1
3
6
10
15
21
28
36
45
55
###############変数と定数とスコープ4###############
55