[プログラム詳細]

■Access2003 ADP + SQL SERVER 2005で作る販売管理システム



この販売管理システムはAccess(2002,2003)とSQL Server 2005で動作する本格的クライアントサーバー方式アプリケーションです。
Access ADPやSQL Serverを勉強したい方、そろそろAccess MDBから卒業したいと考えの開発者や.NETシステム開発者などに最適です!!
ストアドプロシージャの利方法がこれでわかる!百聞は一見にしかず!悩むより見た方が早い!!
★この商品はソースコードがすべてオープンとされていますが詳しい解説ドキュメントは含まれていません。ADPに関する基本的な情報を得るためには『「AccessMDBからAccessADPへ」移行支援ドキュメントV1.0』をご購入ください。

[売上処理画面]

○クライアント台数が増えてきたら(10台以上)処理がどんどん重たくなってきた。
○個人情報保護法施行にともないAccessMDBのセキュリティに不安がある
○より堅牢なデータベースに移行したい
○画像やビデオファイルを扱うことでデータサイズが大きくなってきた(AccessMDBは2GBまで)

以上の項目に複数該当するようであれば、積極的に『AccessADP + SQL Server2005』アプリケーションへ移行することをお勧めします。

上図はシステムの中心となる売上データ入力処理画面。随所に入力をサポートする弊社ならではの便利機能を搭載しました。
おもな機能は次の通り。
  1. 得意先を指定するとすぐに該当する受注データを表示。受注表の管理番号をダブルクリックすると指定したデータが売上明細に複写されます。
  2. 商品マスターの参照はもとより、得意先ごとの単価表、売上台帳、受注表からも明細複写がマウスで簡単可能
  3. 得意先ごとの単価、別名で売上処理が可能。もちろん、売上伝票には客先品名で印刷されます。
  4. 処理速度(カーソルレスポンスなど)にとことんこだわったコーディング!!


[メインメニュー]
売上処理、仕入処理、在庫管理、受注管理、発注管理がおもな機能。


[受注表]
受注表は分かりやすさと使いやすさを重視。売上処理を行うと納品数量が加算され、受注算数量が更新されます。
納期が迫ったものは黄、納期が過ぎたものは赤、納品が完了したものは緑で表示。


[商品マスター]
商品マスターには売上単位、仕入単位、在庫単位を登録。また、売上仕入時に違った単位で入力しても在庫数量をきちんと管理できます。たとえば、仕入時は箱、売上時にはダース、在庫管理では個で管理するということも可能です。
得意先ごとに商品の単価が違う場合は、得意先ごとの単価表を利用します。
画面の[単位数量]は、商品マスタのカーソル位置の商品が利用可能な単位を表示しています。


[在庫表]
何がいくつあるのかを表示するのはあたりまえ。今回はさらに、現在在庫数量とあわせて受注、発注データから得られる
余裕数量を表示。また、発注点を下回ったものは黄、余裕数量がゼロを下回ったものも黄で表示。
この機能を利用すれば、製品の過不足または適正在庫を管理することができます。
また、オプションとなりますが部品展開を前提にしたMRPも可能です。MRPではたとえば、商品を受注登録した時点で、その商品に関するすべての部品の余裕数量を確認することができます。
本システムは、在庫管理とは何か?を学ぶための絶好の教材です。

★MRPとは
MRPとは、Material Requirements Planning(資材所要量計画)の略で、生産計画立案を支援するシステムを指します。
MRPでいう余裕数量とは、
[余裕数量]=[現在在庫数量]+[発注残数量]-[すでに計画済みで未着手分の必要数量]
この余裕数量をみて、発注が必要な部品数量が分かります。仮に、数千点の部品を扱い、部品展開が5、6階層にわたる生産であっても弊社のMRPでは30分以内に発注すべき部品数量を求めることができますので、生産計画の変更がスピーディーに行えます。※MRPによる部品展開処理速度について


[在庫受払履歴]
何がいくつあるかが分かっても、それがなぜそうなったのか、そこが肝心。今回は、入庫と出庫の両方のデータを同一画面で時系列を追って表示する機能を搭載。理論在庫と実在庫の不一致の原因を追究しやすくしています。
関連データの修正を行った際に[再計算]を実行すると、最新の値でいつでも在庫数量が再計算されます。


[パスワード設定]
企業におけるLAN環境が発達した今、求められるのはより高いセキュリティです。多くの人間がかかわるようになればなるほど、セキュリティの点で問題点も増えてきます。
本システムでは利用者のログイン管理を行い、担当者別、処理別に権限を最大3段階で管理。たとえば、売上担当者は仕入データにいっさい触れられないようにもできます。また、
売上仕入データ等は誰がいつ作成したか、編集したか、さらには誰がいつ削除したかを自動的に記録しますので、後々のトラブル時に効力を発揮します

[利用環境について]
本システムはSQL Serverでの利用を前提としていますが、MSDE(制限付き無料データベース)での利用も可能です。
※本格運用には是非ともSQL Server2005以上をご利用ください。
※MSDEはマイクロソフトのサイトから無料でダウンロードできます。
※本システムを運用するためにはAccess2002、または2003が必要です。(Access2007では動作未確認)

ダウンロードファイルは自己解凍ファイルです。
このプログラムには次のファイルが含まれています。
・bitstart.adp (Sql Serverにデータベースを作成するためのプログラム)
・hanbai.dat (データを含んだ復元ファイル)
・MouseHook.dll (マウスホイールの動作を無効にするためのDLLファイル)
・prg.adp (プログラム本体)
・readme.doc (ドキュメント:最初にお読みください)

【SQL Server 2005をAccessADPから利用するメリットとは】
●MDBで利用していたVBAはほぼそのまま利用可能(一部修正が必要)
●フォームやレポート作成がMDBとほぼ同様に行える
●VBや.NETに比べて開発効率が格段に高い

【SQL Serverのストアドプロシージャとは??】

Access開発者がSQL Serverを勉強する上でポイントとなるのはストアドプロシージャです。
ストアドプロシージャは一言で言うと、『複数のクエリを一まとめに扱うバッチファイル』と見ることができます。しかもこのプロシージャはサーバー側に保存されますのでパフォーマンスが非常に高い。

ではなぜストアドプロシージャがパフォーマンスにおいて優れているのか?
それはたとえば単体のSQL文をクライアントから投げる場合と、そのSQLをあらかじめサーバー内部に登録するストアドプロシージャ方式とを比較するとその違いがよく分かります。

前者の場合は、
 1.クライアントがSQL文を投げる
 2.SQL Serverがそれを受けとりコンパイルする。
 3.コンパイルされたプログラムを実行してデータベースの問い合わせ作業が始まる
といった手順を踏みます。
これに対しストアドプロシージャを利用する場合はあらかじめSQL文がコンパイルされて保存されていますので上記2の処理は不要となります。
この処理はおよそ10分の1秒以内の処理とあろうと思われますが、それを100台のコンピュータが実行するとすれば約10秒の処理時間が必要となります。よって、この処理を必要としないストアドプロシージャ方式が処理速度的には優れているということになるわけです。

*///////////////////////////////////////////////////
<<ストアドプロシージャの一例>>
CREATE PROCEDURE usp_請求書発行
(
-- 以下は引数定義 クライアントからこのプロシージャが呼び出される時にこれらの引数が与えられる
@締日 int,
@得意先C1 int, @得意先C2 int,
@期間1 datetime, @期間2 datetime
)
AS
SET NOCOUNT ON

-- 変数の定義
declare @エラー番号 int, @エラー内容 varchar(50)
declare @消費税率 money
-- 環境設定より消費税率をセットする
set @消費税率=(select 消費税率 from 環境設定)
-- トランザクション開始
begin transaction
-- 1.得意先マスタの金額欄をリセットする
update 得意先マスタ
set 当月入金額=0, 当月調整額=0, 当月買上額=0, 当月外税額=0, 当月内税額=0
from 得意先マスタ
where 得意先マスタ.得意先C between @得意先C1 and @得意先C2 and 得意先マスタ.締日 = @締日
-- エラー処理
set @エラー番号=@@error
if @エラー番号<>0
begin
set @エラー内容='usp_請求書発行_得意先マスタリセット'
goto エラー処理
end
-- 2.作業用一時テーブルの作成 この作業用テーブルは他のクライアントからは全く見えないもの
create table #当月請求(
[得意先C] [int],
[当月入金額] [money],
[当月調整額] [money],
[当月買上額] [money],
[当月外税額] [money],
[当月内税額] [money]
) on [primary]
-- 3.得意先マスタ金額更新用データ作成
insert into #当月請求(得意先C, 当月入金額, 当月調整額, 当月買上額, 当月外税額, 当月内税額)
select 得意先マスタ.得意先C,
当月入金額=sum(case when 売上台帳メイン.区分=9 and 入金種別マスタ.調整額CH=0 then isnull(売上台帳明細.金額,0) else 0 end),
当月調整額=sum(case when 売上台帳メイン.区分=9 and 入金種別マスタ.調整額CH=1 then isnull(売上台帳明細.金額,0) else 0 end),
当月買上額=sum(case when 売上台帳メイン.区分=0 then dbo.ufc_Round(isnull(売上台帳明細.金額,0), 0, 得意先マスタ.金額端数処理) else 0 end),
当月外税額=0, 当月内税額=0
from 得意先マスタ inner join 売上台帳メイン on 得意先マスタ.得意先C=売上台帳メイン.得意先C
inner join 売上台帳明細 on 売上台帳メイン.伝票番号=売上台帳明細.伝票番号
left join 入金種別マスタ on 売上台帳明細.品C=入金種別マスタ.入金種別C
where 売上台帳メイン.売上日 between @期間1 and @期間2
and 得意先マスタ.得意先C between @得意先C1 and @得意先C2
and 得意先マスタ.締日 = @締日
and isnull(売上台帳メイン.区分,0)<>1
group by 得意先マスタ.得意先C
-- 4.消費税計算(請求書単位)
・・・・・・省略
-- 5.消費税計算(伝票単位)
・・・・・・省略
-- 6.得意先マスタの金額欄に計算した金額をセットする
update 得意先マスタ set
当月入金額=#当月請求.当月入金額,
当月調整額=#当月請求.当月調整額,
当月買上額=#当月請求.当月買上額,
当月外税額=#当月請求.当月外税額,
当月内税額=#当月請求.当月内税額
from 得意先マスタ inner join #当月請求 on 得意先マスタ.得意先C=#当月請求.得意先C
-- エラー処理
set @エラー番号=@@error
if @エラー番号<>0
begin
set @エラー内容='usp_請求書発行_得意先マスタ金額欄セット'
goto エラー処理
end
-- トランザクションのコミット(処理確定)
commit transaction
select '正常' as 結果
RETURN
エラー処理:
-- トランザクションのロールバック
rollback transaction
select '異常' as 結果

-- エラー処理記述
insert into エラーログ (エラー番号, エラー内容, 日付, ホスト名)
values (@エラー番号, @エラー内容, getdate(), host_name())
RETURN


GO




有限会社ビット