SQLの窓

2019年02月03日


PHP で MySQLをテストする為のソースコード


※ $_GET['text'] で入力された SQL が引き渡されます。
※ GET コマンドなので、内容はアドレスバーで確認する事ができます
※ Form を使わずにアドレスバーから直接 SQL を実行できます。
( IE11 は不可 )

列(セル)の HTML の出力用に関数を作成しています。内部は『ヒアドキュメント』を利用した比較的可読性の高い方法を用いて文字列を作成しています。

ヒアドキュメント構文では、最後の識別子をインデントしてはいけないので関数内でHTML の階層を単純化するほうがメンテナンス性が高くなると思います。

QueryString に text が無い場合と text に有効な文字が全く無い場合は  show variables でシステム変数の一覧を表示します
if ( !isset( $_GET['text'] ) || trim($_GET['text']) == "" ) {
	$_GET['text'] = "show variables";
}
MySQL 改良版拡張モジュール
<?php
session_cache_limiter('nocache');
session_start();

header( "Content-Type: text/html; charset=utf-8" );

?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SQL実行結果</title> 
<style>
table {
	border: solid 1px #000;
	border-collapse: collapse;
}

th,td {
	border: solid 1px #000;
	padding: 5px;
}
</style>
</head>
<body style='white-space:pre;'>
<?php
if ( !isset( $_GET['text'] ) || trim($_GET['text']) == "" ) {
	$_GET['text'] = "show variables";
}

print $_GET['text'] . "\n";

$server = 'localhost';
$dbname = 'lightbox';
$user = 'root';
$password = 'パスワード';

// ***************************
// 接続
// ***************************
$mysqli = @ new mysqli($server, $user, $password, $dbname);
if ($mysqli->connect_error) {
	print "接続エラーです : ({$mysqli->connect_errno}) ({$mysqli->connect_error})";
	exit();
}

// ***************************
// クライアントの文字セット
// ***************************
$mysqli->set_charset("utf8"); 

// ***************************
// クエリ
// ***************************
$result = $mysqli->query($_GET['text']);
if ( !$result ) {
	print "\n";
	print "<span style='color:#f00'>error : " . $mysqli->error . "</span>";
	exit();
}

// ***************************
// 列数
// ***************************
$nfield = $result->field_count;
if ( $nfield ) {
	$ncount = 0;
	print "<table>\n";

	// 行番号用タイトル
	print "\t<th></th>";

	// 列のタイトルを作成
	$field = $result->fetch_fields( );
	for( $i = 0; $i < $nfield; $i++ ) {

		print_cell_html( "th", $field[$i]->name );

	}

	print "\n";

	// ***************************
	// 行データ
	// ***************************
	while ($row = $result->fetch_row()) {

		print "<tr>\n";
		// 行番号
		print "\t<td>" . ($ncount + 1) . "</td>";

		for( $i = 0; $i < $nfield; $i++ ) {

			print_cell_html( "td", $row[$i] );

		}
		print "\n</tr>\n";

		$ncount++;
	}

	print "</table>";
}

// ***************************
// 接続解除
// ***************************
$mysqli->close();


// ***************************
// セルの HTML 出力
// ***************************
function print_cell_html( $html, $data ) {

print <<<CELL_HTML
<{$html}>{$data}</{$html}>
CELL_HTML;

}

?>

</body>
</html>


PHP 5.5.0 で非推奨になり、PHP 7.0.0 で削除
<?php
session_cache_limiter('nocache');
session_start();

header( "Content-Type: text/html; charset=utf-8" );

?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SQL実行結果</title> 
</head>
<body style='white-space:pre;'>
<?php
print $_GET['text'] . "\n";

$server = 'localhost';
$dbname = 'lightbox';
$user = 'root';
$password = 'パスワード';

// ***************************
// 接続
// ***************************
$connect = @mysql_connect( $server, $user, $password );
if ( !$connect ) {
	print "接続エラーです";
	exit();
}

// ***************************
// DB選択
// ***************************
mysql_select_db( $dbname, $connect );
mysql_set_charset("utf8", $connect); 

// ***************************
// クエリ
// ***************************
$result = mysql_query($_GET['text'], $connect);
if ( !$result ) {
	print "\n";
	print "<span style='color:#f00'>" . mysql_error() . "</span>";
}

// ***************************
// 列数
// ***************************
$nfield = @mysql_num_fields( $result );
if ( $nfield ) {
	$ncount = 0;
	print "<table style='border:solid 1px #000;border-collapse:collapse;'>\n";

	print "\t<th style='border:solid 1px #000;padding:5px;'></th>\n";
	for( $i = 0; $i < $nfield; $i++ ) {
		$field = mysql_fetch_field( $result, $i );

		print "\t<th style='border:solid 1px #000;padding:5px;'>{$field->name}</th>\n";
	}

	while ($row = mysql_fetch_row($result)) {
		print "<tr>\n";
		print "\t<td style='border:solid 1px #000;padding:5px;'>" . ($ncount + 1) . "</td>\n";
		for( $i = 0; $i < $nfield; $i++ ) {
			print "\t<td style='border:solid 1px #000;padding:5px;'>{$row[$i]}</td>\n";
		}
		print "</tr>\n";
		$ncount++;
	}
	print "</table>";
}

// ***************************
// 接続解除
// ***************************
mysql_close($connect);
?>

</body>
</html>

※ これらのコードは、開発上のテストを目的としているのでセキュリティ上の考慮はされていません。



【PHP + データベースの最新記事】
posted by lightbox at 2019-02-03 18:37 | PHP + データベース | このブログの読者になる | 更新情報をチェックする

2019年02月02日


PHP で ODBC 関数を使って MS Access( データベース )にアクセスして結果を JSON 文字列として出力する



db.php は簡単なクラスですが、MS Access を使用する為に SHIFT_JIS でSQL を作成する必要があります。また、戻された結果も SHIFT_JIS なので UTF-8 に変換しています。利用者は、UTF-8 ベースのソースコードから SHIFT_JIS を意識せずに処理する事が可能になります。
db.php(クラス)
<?php
// ***************************
// データベースクラス
// (このソースは UTF-8N)
//
// UTF-8 => SHIFT_JIS
// ***************************
class DB {
 
	public $connect;
	public $result;
 
// ***************************
// コンストラクタ
// ***************************
	function DB( $connect ) {

		$this->connect = odbc_connect($connect, "", "");

	}
 
// ***************************
// 接続解除
// ***************************
	function close( ) {

		odbc_close( $this->connect );

	}
 
// ***************************
// 単純クエリー( 実行 )
// ***************************
	function query( $sql_query ) {

		// SHIFT_JIS に変換
		$sql_query = mb_convert_encoding( $sql_query, "cp932", "utf-8" );

		$ret = @odbc_exec( $this->connect, $sql_query );
		return $ret;
	}
 
// ***************************
// フェッチ
// ***************************
	function fetch( $result=null ) {

		// 引数が無い場合は前回実行された 
		// $this->result を使用する
		if ( $result == null ) {
			$result = $this->result;
		}

		// ※ Invalid argument supplied for foreach()
		$error = error_reporting(E_ALL & ~E_WARNING);

		// SHIFT_JIS のデータ
		$ret1 = odbc_fetch_array( $result );
		// 空の配列
		$ret2 = array();

		// 数字をインデックスとする配列を作成する
		foreach ($ret1 as $key => $value) {
			// UTF-8 で使えるようにする
			$ret2[] = mb_convert_encoding( $value, "utf-8", "cp932" );
		}
		// 連想配列を作成する
		foreach ($ret1 as $key => $value) {
			// UTF-8 で使えるようにする
			$key = mb_convert_encoding( $key, "utf-8", "cp932" );
			$ret2[$key] = mb_convert_encoding( $value, "utf-8", "cp932" );
		}

		// 関数内での設定以前に戻す
		error_reporting($error);

		// 数字インデックスと文字列インデックスの連想配列
		return $ret2;
	}
 
// ***************************
// クエリーとフェッチ
// ***************************
	function query_ex( $sql_query='' ) {

		// 引数がある場合は、query and fetch
		if ( $sql_query != '' ) {
			$this->result = $this->query( $sql_query );
			if ( !$this->result ) {
				return false;
			}
			return $this->fetch( );
		}
		// 引数が無い場合は fetch のみ
		else {
			return $this->fetch( );
		}
 
	}

// ***************************
// 実行 : query と同じ
// ***************************
	function execute( $sql_exec ) {

		// SHIFT_JIS に変換
		$sql_exec = mb_convert_encoding( $sql_exec, "cp932", "utf-8" );

		$ret = odbc_exec( $this->connect, $sql_exec );
		return $ret;

	}
 
 
}
?>


以下は、accdb を使って( mdb でも可 )データを JSON として出力しています。

ms-access-json.php
<?php
// ***************************
// このソースは UTF-8N
// ***************************
header( "Content-Type: text/plain; Charset=utf-8" );

// ***************************
// キャッシュを使用しない
// ***************************
header( "Expires: Thu, 19 Nov 1981 08:52:00 GMT" );
header( "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0" );
header( "Pragma: no-cache" );

// ***************************
// データベースアクセスクラス
// ***************************
require_once("db.php");

// ***************************
// PHP 設定
// ***************************
mb_language( "ja" );
mb_internal_encoding("UTF-8");

// ***************************
// MS Acceess ファイル
// ***************************
$dbfile = "販売管理B.accdb";
//$dbfile = "販売管理B.mdb";

// ***************************
// ファイル名を SHIFT_JIS に変換
// ***************************
$dbfile = mb_convert_encoding( $dbfile, "cp932", "utf-8" );


// ***************************
// 接続文字列
// ODBC ドライバ名( 32ビット )
// のある場所 ▼
// HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ODBC\ODBCINST.INI
// ***************************
$connect_string = "Provider=MSDASQL;";
$connect_string .= "Driver={Microsoft Access Driver (*.mdb, *.accdb)};";
$dbpath = realpath($dbfile);
$connect_string .= "dbq={$dbpath};";

// ***************************
// クラスのインスタンス
// ***************************
$db = new DB( $connect_string );
if ( $db->connect === false ) {
	print "接続に失敗しました : " . mb_convert_encoding( odbc_errormsg(), "utf-8", "cp932" );
	exit();
}

// ***************************
// 1) UTF-8 で SQL を作成
// ***************************
$query = <<<SQL
	select
		[社員マスタ].*,
		[社員マスタ].[社員コード] as scode
	from [社員マスタ]
	where [社員コード] in('0001','0002','0003')
SQL;

// ***************************
// データ全体用の配列
// ***************************
$json = array();

// ***************************
// クラスでクエリの実行
// ※ 初回
// ***************************
$column = $db->query_ex( $query );
if ( $column === false ) {
	print "SQLの実行に失敗しました : " . mb_convert_encoding( odbc_errormsg( $db->connect ), "utf-8", "cp932" );
	$db->close();
	exit();
}

// ***************************
// 全ての行を取得
// ***************************
while ( $column ) {

	// ***************************
	// 行単位で結果の連想配列をセット
	// ***************************
	$json['items'][] = $column;
	$column = $db->query_ex( );

};

// ***************************
// 接続解除
// ***************************
$db->close();

// ***************************
// php.exe の確認
// ***************************
if( PHP_INT_SIZE == 4 ) {
	print "PHPは 32ビットです\n";
}

// ***************************
// テストの為、見やすいオプション
// 1) 日本語をエスケープしない
// 2) 整形する
// ***************************
print json_encode( $json, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

?>


関連する Microsoft ドキュメント( 接続文字列 )

Microsoft OLE DB Provider for ODBC の概要

データ ソースにアクセスする( 接続文字列を作成する )


出力結果
PHPは 32ビットです
{
    "items": [
        {
            "0": "0001",
            "1": "浦岡 友也",
            "2": "ウラオカ トモヤ",
            "3": "0003",
            "4": "0",
            "5": "2005-09-12 00:00:00",
            "6": "2005-11-28 00:00:00",
            "7": "270000",
            "8": "9000",
            "9": "",
            "10": "0001",
            "社員コード": "0001",
            "氏名": "浦岡 友也",
            "フリガナ": "ウラオカ トモヤ",
            "所属": "0003",
            "性別": "0",
            "作成日": "2005-09-12 00:00:00",
            "更新日": "2005-11-28 00:00:00",
            "給与": "270000",
            "手当": "9000",
            "管理者": "",
            "scode": "0001"
        },
        {
            "0": "0002",
            "1": "山村 洋代",
            "2": "ヤマムラ ヒロヨ",
            "3": "0003",
            "4": "1",
            "5": "2005-06-17 00:00:00",
            "6": "2005-09-18 00:00:00",
            "7": "300000",
            "8": "",
            "9": "",
            "10": "0002",
            "社員コード": "0002",
            "氏名": "山村 洋代",
            "フリガナ": "ヤマムラ ヒロヨ",
            "所属": "0003",
            "性別": "1",
            "作成日": "2005-06-17 00:00:00",
            "更新日": "2005-09-18 00:00:00",
            "給与": "300000",
            "手当": "",
            "管理者": "",
            "scode": "0002"
        },
        {
            "0": "0003",
            "1": "多岡 冬行",
            "2": "タオカ フユユキ",
            "3": "0002",
            "4": "0",
            "5": "2005-08-14 00:00:00",
            "6": "2005-11-14 00:00:00",
            "7": "250000",
            "8": "",
            "9": "",
            "10": "0003",
            "社員コード": "0003",
            "氏名": "多岡 冬行",
            "フリガナ": "タオカ フユユキ",
            "所属": "0002",
            "性別": "0",
            "作成日": "2005-08-14 00:00:00",
            "更新日": "2005-11-14 00:00:00",
            "給与": "250000",
            "手当": "",
            "管理者": "",
            "scode": "0003"
        }
    ]
}

32 ビット ODBC の一覧をレジストリエディタで開く

strParam = "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ODBC\ODBCINST.INI"

' レジストリ書き込み用
Set WshShell = CreateObject( "WScript.Shell" )
' WMI用
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")

' レジストリエディタが最後に開いていたキーの登録を行います
strPath = "Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\LastKey"
if GetOSVersion() >= 6 then
	strRegPath = "コンピューター\" & strParam
else
	strRegPath = "マイ コンピュータ\" & strParam
end if

' 既に regedit が実行中の場合はいったん終了させます
Set colProcessList = objWMIService.ExecQuery _ 
	("Select * from Win32_Process Where Name = 'regedit.exe'") 
For Each objProcess in colProcessList
	' 最後のウインドウの位置とサイズを保存する為の終わらせ方
	WshShell.AppActivate("レジストリ エディタ")
	Wscript.Sleep(500)
	WshShell.SendKeys ("%{F4}")
	Wscript.Sleep(500)
	' 上記終わらせ方が失敗した時の強制終了
	on error resume next
	objProcess.Terminate() 
	on error goto 0
Next 

WshShell.RegWrite "HKCU\" & strPath, strRegPath, "REG_SZ"

' レジストリエディタを起動します
Call WshShell.Run( "regedit.exe" )
' レジストリエディタが終わるまで待つ場合は以下のようにします
' Call WshShell.Run( "regedit.exe", , True )

REM **********************************************************
REM OS バージョンの取得
REM **********************************************************
Function GetOSVersion()

	Dim colTarget,str,aData,I,nTarget

	Set colTarget = objWMIService.ExecQuery( _
		 "select Version from Win32_OperatingSystem" _
	)
	For Each objRow in colTarget
		str = objRow.Version
	Next

	aData = Split( str, "." )
	For I = 0 to Ubound( aData )
		if I > 1 then
			Exit For
		end if
		if I > 0 then
			nTarget = nTarget & "."
		end if
		nTarget = nTarget & aData(I)
	Next

	GetOSVersion = CDbl( nTarget )

End Function




posted by lightbox at 2019-02-02 17:52 | PHP + データベース | このブログの読者になる | 更新情報をチェックする

2019年02月01日


VBScript : ファイルのフルパスをクリップボードへ( ダブルクォートなし )

エクスプローラで、SHIFT キーを押しながら右クリックすると『パスとしてコピー』がありますが、ダブルクォートが付加されています( たいていはそのほうがいいのですが )ので、ダブルクォートのないパスを取得します


▼ こんな感じで取得されます
"C:\Program Files\7-Zip\7-zip.dll"

filepath.vbs( SendTo ディレクトリに置いてください )

Set WshShell = Wscript.CreateObject("WScript.Shell")
Set Fso = Wscript.CreateObject("Scripting.FileSystemObject")

strTemp = WshShell.ExpandEnvironmentStrings("%temp%")
strPath = strTemp & "\__clipCommand.tmp"

Set objHandle = Fso.OpenTextFile( strPath, 2, True )
objHandle.Write Wscript.Arguments(0)

Call WshShell.Run( "cmd.exe /c clip < """ & strPath & """", 0, True )
▼ こうなります
C:\Program Files\7-Zip\7-zip.dll

以下はディレクトリ部分を省いた名前の部分のみをクリップボードにコピーします。

filename.vbs( SendTo ディレクトリに置いてください )

Set WshShell = Wscript.CreateObject("WScript.Shell")
Set Fso = Wscript.CreateObject("Scripting.FileSystemObject")

strTemp = WshShell.ExpandEnvironmentStrings("%temp%")
strPath = strTemp & "\__clipCommand.tmp"

Set objHandle = Fso.OpenTextFile( strPath, 2, True )
strName = Wscript.Arguments(0)
aPath = Split(strName,"\")
strName = aPath(Ubound(aPath))
objHandle.Write strName

Call WshShell.Run( "cmd.exe /c clip < """ & strPath & """", 0, True )

▼ こうなります
7-zip.dll

さらに以下では、複数ファイルを選択した場合のファイル名部分だけを取り出して複数行としてコピーします( 但しあまり大量のファイルは元々の文字列の制限によりエラーとなります

filelist.vbs( SendTo ディレクトリに置いてください )

Set WshShell = Wscript.CreateObject("WScript.Shell")
Set Fso = Wscript.CreateObject("Scripting.FileSystemObject")

str = ""
For I = 0 to Wscript.Arguments.Count-1
	aData = Split( Wscript.Arguments(I), "\" )
	str = str & aData(Ubound(aData)) & vbCrLf
Next

strTemp = WshShell.ExpandEnvironmentStrings("%temp%")
strPath = strTemp & "\__clipCommand.tmp"

Set objHandle = Fso.OpenTextFile( strPath, 2, True )
objHandle.Write str
Call WshShell.Run( "cmd.exe /c clip < """ & strPath & """", 0, True )

▼ ファイルが多すぎて起きるエラー


▼ うまくいくとこんな感じです
nslookup.exe
ntdll.dll
odbc32.dll
ole32.dll


操作補足

エクスプローラで SendTo フォルダに移動するには、アドレスバーに sendto と直接入力します。テンポラリフォルダは、%temp% と入力して下さい。




コードを直接ダウンロードした場合は、右クリックのプロパティより『許可する』にチェックしておきます。






posted by lightbox at 2019-02-01 11:47 | 右クリックで「送る」 | このブログの読者になる | 更新情報をチェックする

2019年01月28日


VBScript : Windows標準のオブジェクト( CDO.Message ) と GMail( または Yahoo!メール ) を使ってメール送信

※ Gmail の場合、安全性の低いアプリの許可を『有効』にする必要があります メールサービスとしては、Gmail と Yahoo メールが使用可能でした。( Microsoft( Outlook.com ) は CDO では使用できません / ※ TLS が使用できないようです ) コマンドプロンプトから、以下のようにしてテストしています cscript mail.vbs ssl を使用( ポート 465 )するので、smtpusessl が true になっています。 mail.vbs
' ***********************************************************
' 使用するパラメータ
' ***********************************************************
strFrom = "わたしです <ユーザ名@gmail.com>"
'strFrom = "わたしです <ユーザ名@yahoo.co.jp>"

strTo = "あなたです <宛先>"

strServer = "smtp.gmail.com"
'strServer = "smtp.mail.yahoo.co.jp"

nPort = 465
strUser = "ユーザ名"
strPass = "パスワード"

' ***********************************************************
' オブジェクト
' ***********************************************************
Set Cdo = WScript.CreateObject("CDO.Message")

' ***********************************************************
' 自分のアドレスと宛先
' ***********************************************************
Cdo.From = strFrom
Cdo.To = strTo

' ***********************************************************
' 件名と本文
' ***********************************************************
Cdo.Subject	= "件名の文字列 / " & Now()
Cdo.Textbody = "テキスト本文" & vbCrLf & "改行は vbCrLf"

' ***********************************************************
' CC BCC HTMLメール( CC BCC はどちらか片方  )
' ※ 両方指定すると CC
' ***********************************************************
Cdo.Cc = "ユーザ名@yahoo.co.jp,ユーザ名@hotmail.co.jp"
'Cdo.Bcc = "ユーザ名@yahoo.co.jp,ユーザ名@hotmail.co.jp"
Cdo.Htmlbody = "<img src=""http://winofsql.jp/image/winofsql.png"">"

' ***********************************************************
' ファイル添付あり
' ***********************************************************
Cdo.AddAttachment( "C:\Users\lightbox\Desktop\画像\_img.jpg" )
Cdo.AddAttachment( "C:\Users\lightbox\Downloads\del.gif" )

' ***********************************************************
' 設定
' ***********************************************************
Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = strServer
Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = nPort
Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = true

Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
Cdo.Configuration.Fields.Item _
 ("http://schemas.microsoft.com/cdo/configuration/sendusername") = strUser
Cdo.Configuration.Fields.Item _ 
 ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = strPass

' ***********************************************************
' 設定の反映
' ***********************************************************
Cdo.Configuration.Fields.Update

' ***********************************************************
' 送信
' ***********************************************************
on error resume next
Cdo.Send
if Err.Number <> 0 then
	strMessage = Err.Description
else
	strMessage = "送信が完了しました"
end if
on error goto 0

Wscript.Echo strMessage

関連する記事

Windows 標準の CDO.Message で簡単にバッチ処理からメールを送る
Basp21 を使ってバッチ処理からメールを送る

変更履歴
2013-01-09 : 初回投稿
2013-07-27 : Yahoo メールと Nifty メールでテスト
2014-02-28 : 添付ファイル、cc、bcc、HTML メール を追加


posted by lightbox at 2019-01-28 22:51 | VBS + インターネット | このブログの読者になる | 更新情報をチェックする

VBScript : キーストロークをウインドウに送信して、キー操作をした事にする( 例 : リモート デスクトップ接続ダイアログ )

リモート デスクトップ接続は開いた後、詳細画面が表示されないので、ALT+O を送り、その後 SHIFT+TAB でタブを選択して、右矢印で次のタブに移動させます。
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run( "mstsc.exe" )

WScript.Sleep(500)
WshShell.AppActivate("リモート デスクトップ接続")
WScript.Sleep(500)

' キーストロークを送信
WshShell.SendKeys ("%O")
WScript.Sleep(500)
WshShell.SendKeys ("+{TAB}")
WScript.Sleep(500)
WshShell.SendKeys ("{RIGHT}")

※ キーストロークの送信は環境や状況によっては、うまく動作しないかもしれません。その場合は適宜変更して下さい(キーストローク詳細)




タグ:VBScript
posted by lightbox at 2019-01-28 17:17 | VBS + Shell | このブログの読者になる | 更新情報をチェックする

販売管理 (2)

業務フロー

業務フローはその名の通り業務の流れを図解したものです。その中にはコンピュータの操作が発生するタイミング以外に、人間が実際に作業する内容も含まれています。

例えば、売上を発生させる為には商品が必要です。その商品は他の企業から仕入れるかもしれませんし、倉庫にある在庫から取り出すかもしれません。そして、その商品を必要とする顧客に引き渡す為には、誰かが届ける必要があり、届けた場合に相手が受け取ったという証明が必要になります。

これを販売管理に必要な事実として流れとして繋げると一例として以下のようになります。
出庫 => 納品伝票作成 => 輸送 => 納品 => 受領書受取り => 売上確定 
まだこの前後に必要な販売活動のバリエーションがありますが、【売る】と言う事実だけを取り出すとこのようになります。企業は、この流れを日々繰り返して売上を蓄積させて締めというタイミングで合計して請求と言う作業を行います。 締め処理 締めのタイミングは取引では立場の強い支払い側が決定します。つまり、売る側からすると納品先毎に締めのタイミングが違う事になりますが、期間は管理上必ず1か月となります。 販売活動として、締めの日付の次の日から次の締めの日までの売上を合計して請求書を作成します。その請求書を何らかの方法で請求先に届ける必要があるので、得意先(支払い側)がその内容を確認するのは少し先になります。 支払い 得意先側も販売活動の一環としてその請求書の内容を確認する必要があります。その請求書に該当する期間に納品された商品の納品書の内容と請求書の明細とが一致するかを確認した上で、支払処理の準備をする必要があります。 支払い側は、他の仕入先も同じ締め日になるので、全ての支払う必要のある買掛金の合計を販売管理のシステムで合計する事ができます。そして、支払時期に合わせて現金やその他の支払う為に必要な対価を準備します。この作業を一般的に資金繰りと言います。この資金繰りの状況によっては、銀行に融資をしてもらったりする事もあり、最悪資金が調達できなければ企業が負債を抱えて倒産する事もあります。 単純には、売上げてもすぐ現金が入ってこない掛け売りという形態であり、さらに支払いに関して言えば通常締めの期日より1か月以上後に支払われる事は一般的です。なので資金繰りという重要な販売活動をする上で、売上支払の金額を正確に知って分析する為に販売管理システムは販売活動の大きな助けとなります。 入金種別 企業の一般的な支払方法は銀行振込になります。その場合、振込手数料は慣習的に請求書を発行する側の負担になる事が多いようですが、支払側が事前の取り決めで負担してくれる場合もあります。 昔は集金という業務があり、現金で支払ってもらう為に直接出向いて現金を受け取るという形態もありましたが、今ではリスクが大きいのである程度の規模の企業が利用する事は稀だと思われます。 現金にやや近い形態が小切手による支払いです。小切手を利用するには当座預金が必要で、降り出した小切手を受け取った側が銀行に出向くという手間が必要になります。現金を持ち歩くリスクは無くなりますが、盗難のリスクは残ります。そして、銀行にある口座に預け入れてもらうか現金で受け取る事になるので、リスクを考えれば得意先の取引銀行に口座を持つ必要があります。 当座預金口座を持っておれば、支払い方法として手形を選択可能になります。手形に関する詳細はさらに複雑ですが、販売管理とは直接つながりません( 在庫管理のように大きな範囲では関連します ) 特殊な条件下では相殺という入金の種類があります。ある取引先が得意先にも仕入先にもなる場合、売掛金と買掛金が同時に発生する場合があります。その場合実際の現金の動きが必要無い場合は相殺という形で売掛金と買掛金を消滅させる方法です。この場合、販売管理で入金した場合は支払いも同時に発生する事になるので、ユーザができるだけ簡単に処理できるように考える必要があります。 金融機関を使う方法でもう一つ利用可能な決済方法があり、口座振替と呼ばれています。これは支払い側と同じ銀行に口座を持つ事によって、手続きだけで現金を移動させる方法です。これは、金融機関内の現金は変化せずに、持ち主のみが変わるので手数料が必要無いのが通常となります。
posted by lightbox at 2019-01-28 16:56 | システム開発 | このブログの読者になる | 更新情報をチェックする
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり