AtmarkartworksReadSheet Xtra
互換スクリプト
はじめに
ReadSheet Xtra 使用許諾契約書
動作環境
インストール
使用方法
リファレンス
キャストメンバ・プロパティ
キャストメンバ・ハンドラ スプライト・ハンドラ 試用版ダウンロード
  書き換え済みの下記スクリプトをsearch.dir のキャスト番号20「scripts」に差し替えてください(カットアンドペースト)。


--
-- 郵便番号検索 v1.2 without Grid
--
-- 
-- (C) 2002-2005 AtmarkArtWorks Corp, All Rights Reserved.
--
global db1, db2, db3, db4, db5, db6, db7, db8
global pullDownList
global g1, g2
global searchType

global gTime

on keySearch
  
  member("result box").text = ""
  member("time msg").text = ""
  member("search txt").text = ""
  
  if 1 <= searchType and searchType < 5 then
    keyword = member("keyword").text
    if keyword <> "" then
      
      if searchType = 1 then  
        searchZip5Init(keyword)
      else if searchType = 2 then
        searchZip7Init(keyword)
      else if searchType = 3 then
        searchKanjiInit(keyword)
      else if searchType = 4 then
        searchKanaInit(keyword)
      end if
      
    else
      alert("キーワードを入力してください。")
    end if
  else if searchType = 5 then
    set pullDownList to sendSprite (11, #DropList_Selection) 
    provinceNum = pullDownList[#item]
    if provinceNum <> 1 then    
      province = pullDownList[#text]
      searchProvinceInit(province)
    else
      alert("キーワードを選択してください。")
    end if
  end if
end

on closeDb
  db1 = 0
  db2 = 0
  db3 = 0
  db4 = 0
  db5 = 0
  db6 = 0
  db7 = 0
  db8 = 0  
  
  -- clearStr()
end


--
-- changed
--
on initUbin
  onInitPain()
  
  db1 = member("rs")
  db1.openFile = "@郵便番号.xls"
  if db1.openStatus = #no_open then
    alert("エクセルファイルのオープンに失敗しました。終了します。")
    quit
  end if  
  updateStage
  
  
  offInitPain()
  
end



global ret
global resultLst
global dbcnt
global keyStr
global db
global searchStr

--
-- 5桁郵便番号検索
--
on searchZip5Init data
  ret = []
  resultLst = []
  dbcnt = 0
  searchStr = data
  
  onSearchPain()
  go to marker(0) + 6
end

on searchZip5First
  
  dbcnt = dbcnt + 1 
  
  member("search txt").text = dbcnt &"/8"
  updatestage
  
  --db = value("db"&dbcnt)
  db = member("rs")
  db.sheet(dbcnt)
  
  
  ret = db.searchFirst(4, 1, searchStr)
  
  if ret = 1 then
    
    -- 次ぎのフレームで検索を処理
    
  else  -- ret = 0
    -- エラー
    -- 検索終了処理
    go to marker(0) + 8
  end if
end

on searchZip5
  
  repeat while 1 
    ret = db.searchNext()
    
    if ret[1] = 1 then -- キーワード一致
      valzip5 = ret[2] -- 一致セルデータ
      
      valzip7 = db.readNextX()
      valkana = db.readNextX()
      valkana = valkana && db.readNextX()
      valkana = valkana && db.readNextX()
      valpro = db.readNextX() 
      valkanji = db.readNextX()
      valkanji = valkanji && db.readNextX()
      
      str = valzip5 && valzip7 && valkana && valpro &&valkanji
      resultLst.append(str)
      
    else if ret[1] = 2 then -- キーワード不一致
      --
      -- 最後まで検索終了
      --
      exit repeat
      
    end if
  end repeat
  
  if dbcnt = 8 then go to marker(0) + 8
  else go to marker(0) + 6
  
  
  -- go the frame
  
end



on searchEnd  
  --
  -- TEXT キャストは 64KB 以上データを扱えない。ここでは32KBまで表示。
  --
  offSearchPain()  
  onOutput()
  
  if resultLst.count <> 0 then
    tmp = 0
    repeat with i = 1 to resultLst.count
      tmp = 8 + tmp + resultLst[i].length
      if tmp > 32768 then exit repeat
      member("result box").line[i] = "[" & i & "]" & resultLst[i]    
    end repeat
    
  else
    member("result box").text = "一致するキーワードはありませんでした"
  end if  
  
  offOutput()
  
  -- 終了処理
  
  --closeDb()
  
  go to marker(0) + 1
end


--
-- 7桁郵便番号検索
--


on searchZip7Init data
  ret = []
  resultLst = []
  dbcnt = 0
  searchStr = data
  
  onSearchPain()
  go to marker(0) + 6
end

on searchZip7First
  
  dbcnt = dbcnt + 1 
  
  member("search txt").text = dbcnt &"/8"
  updatestage
  
  --db = value("db"&dbcnt)
  db = db1
  db.sheet(dbcnt)
  
  ret = db.searchFirst(5, 1, searchStr)  
  if ret = 1 then
    
    -- 次ぎのフレームで検索を処理
    
  else  -- ret = 0
    -- エラー
    -- 検索終了処理
    go to marker(0) + 8
  end if
end

on searchZip7
  
  repeat while 1 
    ret = db.searchNext()
    
    if ret[1] = 1 then -- キーワード一致
      valzip7 = ret[2] -- 一致セルデータ
      
      valkana = db.readNextX()
      valkana = valkana && db.readNextX()
      valkana = valkana && db.readNextX()
      valpro = db.readNextX() 
      valkanji = db.readNextX()
      valkanji = valkanji && db.readNextX()
      
      valzip5 = db.read(3, db.y()) -- キーより左側のデータなので直接読み出す
      
      str = valzip5 && valzip7 && valkana && valpro &&valkanji
      resultLst.append(str)
      
    else if ret[1] = 2 then -- キーワード不一致
      --
      -- 最後まで検索終了
      --
      exit repeat
      
    end if
  end repeat
  
  if dbcnt = 8 then go to marker(0) + 8
  else go to marker(0) + 6
  
  
  -- go the frame
end


--
-- 都道府県 郵便番号検索
--
on searchProvinceInit data
  ret = []
  resultLst = []
  dbcnt = 0
  searchStr = data
  
  onSearchPain()
  go to marker(0) + 6  
end

on searchProvinceFirst
  dbcnt = dbcnt + 1 
  
  member("search txt").text = dbcnt &"/8"
  updatestage
  
  --db = value("db"&dbcnt)
  db = db1
  db.sheet(dbcnt)
  
  ret = db.searchFirst(3, 1, searchStr)
  
  if ret = 1 then
    
    -- 次ぎのフレームで検索を処理
    
  else  -- ret = 0
    -- エラー
    -- 検索終了処理
    go to marker(0) + 8
  end if
end

on searchProvince
  repeat while 1 
    ret = db.searchNext()
    
    if ret[1] = 1 then -- キーワード一致
      valpro = ret[2] -- 一致セルデータ
      
      valkanji = db.readNextX()
      valkanji = valkanji && db.readNextX()
      
      -- キーより左側のデータなので直接読み出す
      -- xls データを readNext で読めるように変更すると高速に処理できる
      row = db.y()
      valzip5 = db.read(3, row) 
      valzip7 = db.read(4, row)
      valkana = db.read(5, row)
      valkana = valkana && db.read(6, row)
      valkana = valkana && db.read(7, row)
      
      str = valzip5 && valzip7 && valkana && valpro &&valkanji
      resultLst.append(str)
      
    else if ret[1] = 2 then -- キーワード不一致
      --
      -- 最後まで検索終了
      --
      exit repeat
      
    end if
  end repeat
  
  if dbcnt = 8 then go to marker(0) + 8
  else go to marker(0) + 6
  
  
  -- go the frame
end



--
-- 漢字 郵便番号検索 (2つの項目を連結して検索、時間がかかる方法)
--
on searchKanjiInit data
  ret = []
  resultLst = []
  dbcnt = 0
  searchStr = data
  
  onSearchPain()
  go to marker(0) + 6
end

on searchKanjiFirst
  
  dbcnt = dbcnt + 1 
  
  member("search txt").text = dbcnt &"/8"
  updatestage
  
  --db = value("db"&dbcnt)
  db = db1
  db.sheet(dbcnt)
  
  valkanji = db.readFirst(9, 2)  
  valkanji = valkanji && db.readNextX()
  
  if valkanji contains searchStr then
    
    -- キーより左側のデータなので直接読み出す
    -- xls データを readNext で読めるように変更すると高速に処理できる    
    row = db.y()
    valzip5 = db.read(3, row) 
    valzip7 = db.read(4, row)
    valkana = db.read(5, row)    
    valkana = valkana && db.read(6, row)
    valkana = valkana && db.read(7, row)
    valpro = db.read(8, row) && valkanji
    
    str = valzip5 && valzip7 && valkana && valkanji
    resultLst.append(str)
    
  end if
  
end

on searchKanji
  
  num = db.tate()
  
  repeat with i = 2 to num -- readFirstr の1回分を差し引く
    
    valkanji = db.readNext()  
    valkanji = valkanji && db.readNextX()
    
    if valkanji contains searchStr then
      
      -- キーより左側のデータなので直接読み出す
      -- xls データを readNext で読めるように変更すると高速に処理できる 
      row = db.y()
      valzip5 = db.read(3, row) 
      valzip7 = db.read(4, row)
      valkana = db.read(5, row)
      valkana = valkana && db.read(6, row)
      valkana = valkana && db.read(7, row)
      valpro = db.read(8, row) && valkanji
      
      str = valzip5 && valzip7 && valkana && valkanji && valpro
      resultLst.append(str)
      
    end if  
    
  end repeat
  
  if dbcnt = 8 then
    go to marker(0) + 8
  else
    go to marker(0) + 6
  end if
  
end

--
-- かな 郵便番号検索 
-- searchFirst を2つの項目に対して処理する。半角全角は同一視。
--
on searchKanaInit data
  ret = []
  resultLst = []
  dbcnt = 0
  searchStr = data
  
  onSearchPain()
  go to marker(0) + 5
end

on searchKanaFirst1
  dbcnt = dbcnt + 1 
  
  member("search txt").text = dbcnt &"/8"
  updatestage
  
  --db = value("db"&dbcnt)
  db = db1
  db1.sheet(dbcnt)
  
  ret = db.searchFirst(7, 1, searchStr)
  
  if ret = 1 then
    
    -- 次ぎのフレームで検索を処理
    
  else  -- ret = 0
    -- エラー
    -- 検索終了処理
    go to marker(0) + 9
  end if
end

on searchKana1
  repeat while 1 
    ret = db.searchNext()
    
    if ret[1] = 1 then -- キーワード一致
      valkana = ret[2] -- 一致セルデータ
      
      valkana = valkana && db.readNextX()  
      valpro = db.readNextX() 
      valkanji = db.readNextX()
      valkanji = valkanji && db.readNextX()
      
      -- キーより左側のデータなので直接読み出す
      -- xls データを readNext で読めるように変更すると高速に処理できる
      row = db.y()
      valzip5 = db.read(3, row) 
      valzip7 = db.read(4, row)
      valkana = db.read(5, row) && valkana
      
      
      str = valzip5 && valzip7 && valkana && valpro &&valkanji
      resultLst.append(str)
      
    else if ret[1] = 2 then -- キーワード不一致
      --
      -- 最後まで検索終了
      --
      exit repeat
      
    end if
  end repeat
  
  if dbcnt = 8 then 
    dbcnt = 0
    go to marker(0) + 7 -- 次ぎの検索処理
  else 
    go to marker(0) + 5
  end if
  
  
  -- go the frame
end

on searchKanaFirst2
  dbcnt = dbcnt + 1 
  
  member("search txt").text = dbcnt &"/8"
  updatestage
  
  --db = value("db"&dbcnt)
  db = db1
  db.sheet(dbcnt)
  
  ret = db.searchFirst(8, 1, searchStr)
  
  if ret = 1 then
    
    -- 次ぎのフレームで検索を処理
    
  else  -- ret = 0
    -- エラー
    -- 検索終了処理
    go to marker(0) + 9
  end if
end

on searchKana2
  repeat while 1 
    ret = db.searchNext()
    
    if ret[1] = 1 then -- キーワード一致
      valkana = ret[2] -- 一致セルデータ
      
      valkana = valkana && db.readNextX()  
      valpro = db.readNextX() 
      valkanji = db.readNextX()
      valkanji = valkanji && db.readNextX()
      
      -- キーより左側のデータなので直接読み出す
      -- xls データを readNext で読めるように変更すると高速に処理できる
      row = db.y()
      valzip5 = db.read(3, row) 
      valzip7 = db.read(4, row)
      valkana = db.read(5, row) && valkana
      
      
      str = valzip5 && valzip7 && valkana && valpro &&valkanji
      resultLst.append(str)
      
    else if ret[1] = 2 then -- キーワード不一致
      --
      -- 最後まで検索終了
      --
      exit repeat
      
    end if
  end repeat
  
  if dbcnt = 8 then go to marker(0) + 9
  else go to marker(0) + 7
  
  
  -- go the frame
end

on startMovie  
  clearStr()
  searchType = 0
  initUbin()  
end startMovie

on stopMovie
  closeDB()
end


on clearStr
  member("keyword").text = ""
  member("result box").text = ""
  member("time msg").text = ""
  member("search txt").text = ""
end



on onInitPain
  sprite(40).loch = 247
  sprite(41).loch = 258
  gTime = the ticks  
  updateStage
end

on offInitPain
  sprite(40).loch = -500
  sprite(41).loch = -500
  updateStage
  gTime = the ticks - gTime
  member("time init msg").text = "▼初期化:" & (gTime / 60.0) & "秒 "
  
  
end

on onSearchPain
  sprite(42).loch = 247
  sprite(43).loch = 258
  sprite(44).loch = 184
  gTime = the ticks
  updateStage
end

on offSearchPain
  sprite(42).loch = -500
  sprite(43).loch = -500
  sprite(44).loch = -500
  gTime = the ticks - gTime
  --msg = member("time msg").text
  msg = msg & "▼検索:" & (gTime / 60.0) & "秒 "
  
  
  TotalLine = 0
  db.sheet(1)
  TotalLine = TotalLine + db.tate()
  db.sheet(2)
  TotalLine = TotalLine + db.tate()  
  db.sheet(3)
  TotalLine = TotalLine + db.tate()
  db.sheet(4)
  TotalLine = TotalLine + db.tate()
  db.sheet(5)
  TotalLine = TotalLine + db.tate()
  db.sheet(6)
  TotalLine = TotalLine + db.tate()
  db.sheet(7)
  TotalLine = TotalLine + db.tate()
  db.sheet(8)
  TotalLine = TotalLine + db.tate()

  
  msg = msg & "▼ヒット:" & resultLst.count & " / " & TotalLine 
  member("time msg").text = msg
  updateStage
end

on onOutput
  sprite(45).loch = 247
  sprite(46).loch = 258
  updateStage
end

on offOutput
  sprite(45).loch = -500
  sprite(46).loch = -500
  updateStage
end