スタッフの日記

MS-AccessからODBC経由でFirebirdのテーブルにアクセスは大変

2017年9月3日(平石)

 あるユーザーのシステムで、Ccu労組会計のデータをMS-Accessからアクセスして処理することになりました。それで、ODBC経由で接続することにしたのですが、…私の覚えを兼ねて、ここに書いておきます。

 

1.ODBCって、マルチバイト文字は正しく処理できない!

1.1 DBファイル、クライアントdllへのパスにマルチバイト文字があると接続できない

  

  まず、上図のようにしたら、接続時にエラーとなってしまいました。各パスを確認したところ、後ろの方が切れてしまっている。どうも「会計」とあるのがいけないらしい。「会計」は4バイトだけど2文字なので2バイトと判断して、差額の2バイトはカットしてしまうものと思われる。

  これは、英数字と空白だけのフォルダを作って、そこにコピーして事無きを得ました。

 

1.2 テーブルの中身もマルチバイト文字があると…

  これは、私(平石)ではなく、一緒に仕事をしている組合員が見つけた現象です。

  下図は、RKA23というテーブルの内容を、フリーソフトを使って見たものです。

  

 ところが、同じものをMS-Accessで見ると、データ内容に余計な文字が付加されている。

  (吹き出しは記述者=平石が付けたもの)

  どうも、Shift-JISでのバイト数が項目長と一致するときに、この現象が起きるらしい(このときは、項目長を超えるデータができてしまうかのように見えますが、MS-Accessで見るときの項目長はバイト数ではなくて文字数なので、これらのケースでは、項目長を超えていません)。

  データのShift-JISでのバイト数を求める関数を作り、そのバイト数が項目長を超えている分はカットするようにして、対処できました。

 

2.DAO.TableDef.Connectを書き換えるとReadOnlyになってしまう

  実は、上記1.1に書いた、「DBファイル、クライアントdllへのパス」については、DAO.TableDef.Connectに、その情報があるので、これを書き換えて対処できるのではないかとやってみたのです。

  読むだけなら、うまく行きました。パスに「会計」などのマルチバイト文字があってもちゃんと読めます(ODBCの設定ではマルチバイト文字の無いパスを指定して、あとから書き換えます)。

  ところが、内容を更新しようとすると、ReadOnlyである旨のメッセージが出てダメでした。

一覧表示 ▶︎ スタッフの日記

画像の「赤」と「青」を入れ替えるプログラムを作ってみた

2017年6月10日(平石)

 実は私、赤信号を見ると、青信号であると確信して道路を渡ってしまう人です。
 先だって、たまたま「色彩心理学入門」なる本を読んで、その原因と思われるものが分かりました。
 私の理解では、「正常者」つまり色覚についての多数派の方は、実は「青緑色弱」と呼ぶべきであって、赤と緑の区別はつくらしいが、青と緑の区別はほとんどつかないらしい。
 そこで、もしかしたら、「赤」と「青」を入れ替えたら、彼ら青緑色弱者の気持ちが少しはわかるのではないかと思い、そんなプログラムを作ってみました。

 

 上の画像は、近所のお宅の何とか赤く見える花を撮ったものと、それの「赤」と「青」を入れ替えたものを並べました(クリックしてみてください)。
 左は撮ったままの画像ですが、「いったいどこに花なんかあるんだっ」という感じで、まったく花の存在はわかりません。
 右を見ると、花の存在ははっきりわかります。実は、この右の画像を見るまで、こんなにたくさん花が咲いていることに、まったく気づきませんでした。やはり「正常者」の方が正常なようです。

 そんな訳で、良いプログラムを作ったと自負しております。

一覧表示 ▶︎ スタッフの日記

ACCESSのフォームでSQLServerのテーブルを更新したら『データの競合』エラーが発生

2017年2月19日(staff)

1.事象
 ACCESSの単票フォームのレコードソースとしてSQLServerのテーブルを指定している。「Microsoft SQL Server Manager」を使い、このテーブルに次のような列を追加して、フォームで更新操作をしたらエラーが発生。

追加した列: A項目  bit型  null可

エラーメッセージ:データの競合

“このレコードは他のユーザーによって変更されています。[レコードの保存]を選択すると、他のユーザーによる変更を無視し、自分が行った変更を反映します。[クリップボードにコピー]を選択すると、変更したデータはクリップボードコピーされ、他のユーザによる変更が反映されます。必要に応じて、クリップボードのデータを張り付け、自分が変更したデータに戻すこともできます。”

なお、このエラーが出た時、もちろん操作をしているのは、自分だけです。

2.対処と原因

[対処]

 A項目 bit型 null可   →   A項目 bit型 null不可 (必須項目、初期値:0)

 nullを許容しない、必須項目とする事でエラーを回避しました。

[原因]
 はっきりした原因は不明。ネットで検索した対処方法によると、どうやら、ACCESSでリンクする場合、bit型のようなBOOL属性の項目は、必須項目にしないとダメなようです。裏でどんな動きをして、今回のようなエラーが発生してしまうのか。

 以下、思った事。

 bit型は、ACCESSのデータ型ではYes/No型になります。ACCESSのフォームにおいて、チェックボックスの値を格納する時のデータ型として、よく利用します。なので、データはYESかNOかの2択で、nullはありません。今回、該当のテーブルは、元々、ACCESSのmdbのテーブルで、ACCESSのアップサイジング機能を利用してSQLServerのテーブルに変換したテーブルです。追加した列のプロパティは、そのテーブルにおいて既存のbit型列にならって設定しました。既存のbit型列は"null可"になっていました。同じように設定して、結果、エラーが起きました。改めて既存のbit型列のプロパティを見直したところ、拡張プロパティが設定されていたので、全て同じように設定しました。

例えば、次の拡張プロパティ

AllowZeroLength : False
AppendOnly: False
Attributes:1
CollatingOrder:1041
DataUpdatable:False
MS_Format:Yes/No
etc..(拡張プロパティは18項目あり)

 これらを設定しても、状況は変わりませんでした。さて、なんだろう。

 アップサイジング機能で変換されたbit型の列は、nullを許容する設定でしたが、既存レコードには値が全て設定されていました。後で、「Microsoft SQL Server Manager」で追加したbit型の列は、既存レコードにnull値が設定された状態になり、システム側で強制的に値を設定しようとして、結果的にその動作が競合となりエラーになってしまったのでしょうか。
(根拠なし、想像です)

以上

一覧表示 ▶︎ スタッフの日記

BlenderでモデリングしたワイヤーフレームをFlashで描画再生してみる。

2016年9月2日(staff)

はじめに

  今回の思いつきは、『Webサイトのコンテンツで、多面体のワイヤーフレーム画像を動かしたい。』です。幾つか実現方法はあると思うのですが、Blenderでモデリングを行い、そこで作られた頂点座標情報を取り込んでflashで再生する、という方法を選びました。
 
1.Blenderでモデリング
   Blenderは、オープンソースの3次元CG開発ソフトウエア(統合開発環境)ですね。だいぶ前に同様のCGソフトのMetasequoiaで何かやろうとチャレンジした事があったのですが、挫折しました。そこでBlenderです。使い方は、次のサイトを参考にさせて頂きました。
「Blender入門」(http://www.blender3d.biz/)大変感謝しています。

 以下、何とかリンゴをモデリング。

blender
 

 

 

 


2.頂点座標情報の取り込み
  モデリングしたリンゴの頂点座標情報の取り込みは、BlenderのExport機能で情報をファイル出力して、そのファイルから読み込む事にしました。幾つかあるファイルフォーマットの中から、Wavefront(.obj)フォーマットを選択。 このフォーマットで出力された3Dモデルデータが一番扱い易いと判断しました。 Wavefrontフォーマットの説明は、次のサイトを参考にさせて頂きました。
「OBJファイルフォーマット」(http://www.hiramine.com/programming/3dmodelfileformat/objfileformat.html)
大変感謝しています。
 OBJファイルフォーマットは、頂点座標値(x,y,z)データ、多面体の面(メッシュ)を構成する頂点座標を指すインデックス情報や、モデリングした時の法線ベクトルの情報等が含まれています。今回は、頂点座標値(x,y,z)データ、多面体の面(メッシュ)を構成する頂点座標を指すインデックス情報を利用します。
  
3.flashで再生する
  objファイルを読み込んで描画するプログラムをAS3.0でコーディング。AS3.0を選んだのは、ブラウザ上で画像を操作できるインターフェース(各種イベントを拾える)が用意されている点がいいと思ったから。 AS3.0のコーディングは、次の本を参考にさせて頂きました。
「C++による簡単実習 3次元CG入門」(http://www.morikita.co.jp/books/book/2149)
言語はC++ですが、AS3.0でプログラミングする際に大変役に立ちました。
 [ワイヤーフレーム]

 wire

 
 

 

 

 

 

 

 

 

[面を塗りつぶし  ]

apple apple2

 

 

 

 

 

 

 

 

 

今回はここまでです。

 

一覧表示 ▶︎ Webノウハウ

タスクイメージは破損しているか、または変更されています。(HRESULTからの例外:0x80041321)

2016年7月9日(staff)

1.事象
 Windows7のパソコンにおいて、タスクスケジューラで毎日実行していたバックアップ処理が出来ていない事が発覚。とりあえず、実行記録を確認しようとタスクスケジューラを起動したらタイトルのエラーが発生。エラーメッセージの応答で[OK]をするが、引き続き同じメッセージが表示される。
この操作は数十回繰り返した。おそらく、設定されていた多くのタスクに対してメッセージが表示されたと考えられる。バックアップ処理が出来ていなかったのは、このタスク設定が壊れてたためと断定。

2.原因調査と対処
 とりあえず、タスクスケジューラの設定を元通りにする対処方法をネットで検索。同様の事象は過去にも結構出ているらしい。以下のサイトを参考に対処してみる。

  タスクスケジューラを開くとエラーメッセージが表示される「タスクスケジューラサービスが利用できません」
  http://answers.microsoft.com/ja-jp/windows/forum/windows_7-performance/%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%B9%E3%82%B1/fde068e5-d1d5-4821-9888-b2270a428e6f?auth=1


 [対処: ”タスクのインポート”操作でタスクの再設定]
 C:\Windows\System32\Tasksフォルダ配下の全ファイルを任意の場所に移動してタスクスケジューラを起動。エラーは出なくなった。ここから、全部のタスクをインポートで再設定することにした。TasksフォルダにはWindowsやパソコンベンダー等のフォルダ配下に100を超える設定ファイルがある。気が滅入りながらちびちびやっていると、設定ファイルのタイムスタンプで気づきが・・。どうやらバックアップ処理が失敗した日の直近で更新されている設定ファイルが破損しているらしい。まず、設定ファイルのタイムスタンプをみてインポートしないで元に戻せるか判断。これでだいぶ楽になった。

 [タスクイメージが破損した原因(多分): Windows10->Windows7のダウングレード]

 しかし、以下のエラーが発生してインポート操作で復旧が出来ないタスクが出てきた。


 “タスクの形式が有効ではありません。(2,8):version:1.5”
 

 ネットを検索。以下が参考になりました。

  タスクスケジューラーで「タスクの形式が有効ではありません」と表示され作成できない
  http://answers.microsoft.com/ja-jp/windows/forum/windows_7-update/%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%B9%E3%82%B1/b20e1938-22ee-4fce-8f71-db4fa66dcf50?auth=1

 確かに、破損している設定ファイルのタイムスタンプは、Windows10からWindows7に戻したタイミングと一致している!
 おそらく、元に戻す課程で破損してしまったのではなかろうか。但し、 原因が分かったところで、戻せないタスクがあるってことは問題だな。そのタスクが何をやっていたのかも分からないし。
 
  Microsoftめー、またやってくれたなー。

 おそらくWindows10にしてから元のOSに戻したパソコンは、こうなっている可能性が大。 一度、タスクスケジューラを起動して確認してみることをお勧めします。

 

一覧表示 ▶︎ スタッフの日記

jQueryのAjaxリクエスト(POST)で日本語の送信データが文字化け

2016年1月10日(staff)

ブラウザ側入力フォームで指定した日本語文字列をAjaxリクエスト(POST)でサーバに渡した際、サーバ側で参照したら文字化けを起こしていてハマりました。

jQuey日本語リファレンスをみると、サーバに送信するデータはクエリー文字列に変換されてGETリクエストとして付加されるとあったので、URLエンコードは自動的にやってくれると思いましたが、POSTの場合はこちらで変換した値を指定してあげないとダメなようです。
以下、サンプル。日本語が入力されている「cSearchKeyWord」をencodeURIで変換してdata:{・・・・}に指定してます。

 var cSearchKeyWord = encodeURI(document.form001.cSearchKeyWord.value.trim());
 $.ajax({
  type:"POST",
  url:"送信URL",
  dataType:"html",
  data:{
   "cSearchKeyWord":cSearchKeyWord,
   "cHashTags":cHashTags,
   "cFromID":cFromID,
   "cToID":cToID,
   "nRetweetFlag":nRetweetFlag,
   "cGetCount":cGetCount
  }
 }).then(
  // 通信成功
  function(data,status,xhr){
  ・・・・
  },
  // 通信失敗
  function(xhr,status,error){
  ・・・・
  }
 );
 
この結果にたどり着くまで、えらい時間が掛ってしまいました。phpのmb_stringとかhtmlの文字コード設定やら、php.iniの文字コードに関わる設定とかを改めて見直しました。結局、中途半端な知識で仕事をしてきているからハマると一から調べなおす事になってしまう。ネットで検索できて便利なのだけど、頭にちゃんと入らないんですよね。いかんなぁ・・・・。

一覧表示 ▶︎ スタッフの日記

SQLSERVERのViewをACCESSのMDBでODBC接続したが、ACCESSで表示する値が違う。

2015年9月11日(staff)

(mdbでリンクする際、[固有レコード識別子の選択]は正確に行いましょう)


■事象
ACCESSのMDBで、SQLSERVERで定義しているViewをODBC接続でリンクした。
ACCESSで表示したところ、SQLSERVERのVIEWの表示が一部の列で値が違って表示されている。

例)

以下のようなView_TEST をMDBでリンクしたところ、表示した"単価"、"個数"列がSQLSERVERのViewと違って表示されている。

View_TEST:

select 店舗,販売日,品物,単価,count(*) as 個数 from TEST group by 店舗,販売日,品物,単価 order by A.

[SQLSERVERの表示]

店舗 販売日 品物 単価 個数
支店A 2015/8/31 みかん 250 3
支店A 2015/8/31 バナナ 100 25
支店A 2015/8/31 バナナ 198 13

[ACCESS MDBの表示]

店舗 販売日 品物 単価 個数
支店A 2015/8/31 みかん 250 3
支店A 2015/8/31 バナナ 100 25
支店A 2015/8/31 バナナ 100 25

  ※ 3行目の単価、個数が198、13のはずが、2行目の値になっている。

■原因と対応
mdbでリンク指定する時に、[固有レコード識別子の選択]という操作があり、そのテーブルの主キーとなる項目を設定するのですが、この項目の選択が誤っていました。今回の場合、group byで集計していたら集計した列を全て指定しないと一意になりません。結果、おかしな表示になってます。(なぜ上記のような表示になるのかは疑問が残るが、そこは追及する意味がないと判断。)

以前から、[固有レコード識別子の選択]は結構いい加減に考えていて、適当に設定していても問題なかったのですが、今回の不具合で改めて重要であることを認識しました。というか、ちゃんと理解して設定しろよ!正しく理解する為の時間を惜しんで、結局遠回りして痛い目に遭う。
(こんな事、結構繰り返してます……OTL)
 

 

一覧表示 ▶︎ スタッフの日記

Access2013にはSQLServerへのアップサイジング機能が無いのです

2015年6月23日(staff)

Access2010まで提供されていたSQL Serverへのアップサイジング機能
(アップサイジングウィザード)が、Access2013では削除されてしまいました。

 ※Office 2013 での変更点
  https://technet.microsoft.com/ja-jp/library/cc178954.aspx

処理速度改善の案件で、システムはLAN環境でAccessデータベース(mdb)をサーバに配置して
クライアントPCのGUI画面から読み書きをしていたのだけど、Jet Database Engineの処理の
仕方でどうしても処理速度が上がらないため、SQL Serverに移行してしまおう
(無償のExpress Editionバージョン)となりました。

 そこで出番となったAccessの素晴らしい機能であるアップサイジングウィザードです。
これを使えば、テーブルとそのデータだけでなく、インデックス、入力規則、テーブルの
リレーション等も一緒にSQLServerのデータベースに移行してくれます。
大変便利です。ところが。。。。表題のとおり。仕方がないのでAccess2010がインストール
されている別のマシンで処理しました。

 移行の代替案としてSQLServerのインポート機能を利用しようと思いましたが、
これだどテーブルとそのデータだけなんですよね。

なぜ、MicrosoftはAccess2013で削除してしまったのか理由は分かりません。
今後のAccessバージョンで復活してくれることを願いつつ、Access2010は無くさずに
に大切に扱う使うこととします。

一覧表示 ▶︎ スタッフの日記

Windows オフライン ファイルの機能にハマッてしまいました。

2014年9月22日(staff)

 今のWindows OS(※1)には、オフライン ファイル(※2)と呼ばれるファイルの編集機能が備わっています。これは、ネットワーク上のサーバ等の共有フォルダのファイルをクライアントパソコンからアクセスする際、ネットワークが切断していても、パソコン上にあらかじめ共有フォルダのファイルがコピーされていて編集等ができて、その後、ネットワークが繋がった時にパソコン側で操作してファイルの同期をとる。という仕組みのようです。

 さて、こんな機能を知らずにシステムを運用していると、次のような不具合が発生します。

『あるパソコンで共用フォルダのファイルを更新したが、別のパソコンでそのファイルをみると
内容が反映されていない。』

 今回のケースは、Microsoft Accessで作成したシステムで起きました。DBをサーバの共有フォルダに置いて入力フォームはパソコン上に置いてデータの入出力を行うシステムです。

半日悩みに悩んで、上記の内容にたどりついて解決。とりあえず各パソコンで、"オフライン ファイルを無効にする"設定をしました。


・[コントロールパネル]を開く
・[同期センター]を選択
・同期センター画面で[オフライン ファイルの管理]を選択
・オフラインファイル ダイアログで[オフライン ファイルを無効にする]

ブログ画像1ブログ画像1ブログ画像2ブログ画像1

 

 

 

 

 

 

 


 後で調べると、以下の共有フォルダ側のプロパティで、オフラインの利用をできない設定にできることが分かりました。これをしておけば、台数の多いクライアント側パソコンで設定は不要になりますね。


・[共有フォルダ]のプロパティを開く
・[共有]タブ選択
・[詳細な共有]ボタンを押す
・[詳細な共有]ダイアログの[キャッシュ]ボタンを押す
・[オフラインの設定]ダイアログの"共有フォルダーにあるファイルやプログラムはオフラインで利用可能にしない"
  を選択する。
ブログ画像2ブログ画像2

 

 

 

 

 

 

 

 ここまできて、当然「そもそも同期がとれれば問題ないんじゃないか?」という疑問もでてきます。ためしに同期センター(※3)の機能を使って同期をとる操作をしてみましたが、RDBの中身の同期を取ることはさすがに無理なようです。(そんな事ができたらすごいことですね)

以上、備忘録もかねて。


※1 利用可能なWindows OS
   古くはWindows2000の頃から備わっていた機能らしいですが、現時点では、Windows7 Pro,  Windows 8 Proが利用可能。
   (各OSバージョンのProffesional Editionが利用可能か?)

※2 オフライン ファイルとは
http://windows.microsoft.com/ja-jp/windows/understanding-offline-files#1TC=windows-7

※3 同期センター
http://windows.microsoft.com/ja-jp/windows7/what-is-sync-center

 

一覧表示 ▶︎ スタッフの日記

メモ書きツール:ライプ

2014年4月22日(関)

ちょっとしたメモ、を取る時のお役立ちアプリを紹介します。

手帳感覚でツールにメモる。

保存先がクラウドなので、PCで仕事中にメモしたものを出先でモバイルからチェック、なんてことができちゃう。

なかなか便利そうです。

wri.pe = ライプ って、write(書く)とtype(タイプ)の複合語でしょうか。

記事紹介はこちら

 Webブラウザだけで利用できるシンプルで軽快なメモ帳アプリ

ライプサイトはこちら  https://wri.pe/

一覧表示 ▶︎ Webノウハウ