SQLの窓 イラストAC フリー素材

2019年08月18日

JScript( WSH ) で MsgBox と InputBox を使う

相互に呼び出し可能ですが、メインとなるほうを下に定義するのが経験則的に間違いがありません。
( つまり、メインに無い機能は先に関数として定義しておく )

<JOB>
<SCRIPT language="VBScript">
function input_box( title )

	input_box = InputBox( title )

end function
function msg_box( message )

	MsgBox( message )

end function
</SCRIPT>
<SCRIPT language="JScript">

var text = input_box("入力してください")
if ( typeof( text ) == "undefined" ) {
	WScript.Echo( "キャンセルされました" );
	WScript.Quit()
}

msg_box( text + " が入力されました" )

</SCRIPT>
</JOB>




posted by at 2019-08-18 19:19 | WSH( JScript ) | このブログの読者になる | 更新情報をチェックする

2019年08月17日

下半分がスクロールするページ【 height: calc( 100% - 120px ) 】

デモページ



<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width initial-scale=1.0 minimum-scale=1.0 maximum-scale=1.0 user-scalable=no" name="viewport">
<meta charset="utf-8">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.css">

<link rel="stylesheet" href="https://lightbox.sakura.ne.jp/demo/two-section.css">
</head>
<body>
	<div id="head">
	</div>

	<div id="extend">
		<table class="table">
		<tbody id="tbl">
			<th>社員コード</th><th>氏名</th><th>フリガナ</th><th>所属</th><th>性別</th><th>作成日</th><th>更新日</th><th>給与</th><th>手当</th><th>管理者</th><th>生年月日</th>
			
			<!-- ここに複数の行データ -->

		</tbody>
		</table>

	</div>

</body>
</html>


two-section.css
@charset utf-8;


/* ****************************
 上下エリア
 フィットコントロール用
******************************/
html,body {
	height: 100%;
}
/* ****************************
 それぞれのエリアの特性
******************************/
/* 基本枠 */
body {
	margin: 0;
}
/* 上固定部分 */
#head {
	padding: 16px;
	display: block;
	margin: auto;
	width: 100%;							/* 幅 */
	height: 120px;							/* 高さ */
	background-color: #e0e0e0;
}
/* 下スクロール部分 */
#extend {
	padding: 4px 16px;
	display: block;
	margin: auto;
	width: calc( 100% - 3px );				/* 幅 */
	height: calc( 100% - 120px - 2px );		/* 高さ */
	border: solid 2px #c0c0c0;
	overflow: scroll;
}

/* ****************************
 一覧用テーブル
******************************/
/* 列の改行コードを有効 */
td,th {
	white-space: pre;
}

/* テーブル内のデータを選択不可 */
#tbl {
	user-select: none;
	-moz-user-select: none;
	-webkit-user-select: none;
	-ms-user-select: none;
}





posted by at 2019-08-17 14:48 | CSS | このブログの読者になる | 更新情報をチェックする

2019年08月16日

Android Studio : LiveDoor のお天気情報をリストビューに表示する手順

手順1

AndroidManifest.xml に、以下を追加する

<uses-permission android:name="android.permission.INTERNET"/>

手順2

build.gradle(Module) に、OkhttpGoogle Gson の記述を追加する
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.google.code.gson:gson:2.8.5'
    implementation 'com.squareup.okhttp3:okhttp:4.1.0'
}


activity_main.xml に ListView をセット
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>


JSON データをデシリアイズする為のクラスを作成
public class Weather {

	WebData[] pinpointLocations;

}
public class WebData {

	String link;
	String name;

	@Override
	public String toString() {
		return name;
	}
}

インターネットアクセス用のクラス

HttpAccess クラスを追加
import android.os.AsyncTask;

import java.io.IOException;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class HttpAccess {

	private OkHttpClient okHttpClient;
	private String url;

	public interface OnAsyncTaskListener {
		abstract public void onAsyncTaskListener(String s);
	}

	public HttpAccess(String url) {
		this.okHttpClient = new OkHttpClient();
		this.url = url;
	}

	public void sendGet(final OnAsyncTaskListener listener ) {

		new AsyncTask<Void,Void,String>(){
			@Override
			protected String doInBackground(Void... params) {
				String result = "[\"error\"]";

				Request.Builder builder = new Request.Builder();
				builder.url(HttpAccess.this.url);
				Request request = builder.build();

				Response response = null;
				try {
					response = HttpAccess.this.okHttpClient.newCall(request).execute();
					result = response.body().string();
				}
				catch (IOException e) {
					e.printStackTrace();
				}

				return result;
			}

			// UI スレッド処理
			@Override
			protected void onPostExecute(String s) {
				super.onPostExecute(s);

				listener.onAsyncTaskListener(s);

			}
		}.execute();

	}

}


private 変数を三つ作成
private ListView listView;
private ArrayAdapter<WebData> arrayAdapter;
private HttpAccess httpAccess;


ListView と ArrayAdapter のインスタンスを作成

以降 onCreate にて。
listView = (ListView) MainActivity.this.findViewById(R.id.listView);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

		// クリックされたアイテムを取得
		WebData mydata = (WebData) parent.getItemAtPosition(position);
		// LogCatに表示
		Log.i("lightbox", mydata.name);
		Log.i("lightbox", mydata.link);

		// URL を開く
		Uri uri = Uri.parse(mydata.link);
		Intent intent = new Intent(Intent.ACTION_VIEW, uri);
		if (intent.resolveActivity(MainActivity.this.getPackageManager()) != null) {
			MainActivity.this.startActivity(intent);
			return;
		}

	}
});
arrayAdapter = new ArrayAdapter<WebData>(MainActivity.this,android.R.layout.simple_list_item_1);


ListView に ArrayAdapter をセット

listView.setAdapter(arrayAdapter);

API を呼び出して結果をリストビューにセット
最新の Android では、https 通信以外では設定が必要なので、Firebase にJSON を登録してテストしました

( http://weather.livedoor.com/forecast/webservice/json/v1?city=270000 )
new HttpAccess("https://your-project-xxxxx.firebaseio.com/weather.json")
	.sendGet(new HttpAccess.OnAsyncTaskListener() {
		@Override
		public void onAsyncTaskListener(String s) {

			Gson gson = new Gson();
			Weather weather = gson.fromJson(s, Weather.class);

			arrayAdapter.clear();
			arrayAdapter.addAll(weather.pinpointLocations);

		}
	});


さらに Intent で第二画面

Android Studio : LiveDoor のお天気情報をリストビューに表示した後、第二画面で name を変更して第一画面で再表示する手順



タグ:android java
posted by at 2019-08-16 23:08 | Android | このブログの読者になる | 更新情報をチェックする

WSH( JScript ) : MySQL から Excel へエクスポート ( Microsoft.ACE.OLEDB.12.0 接続 )

テストした環境では、MySQL の ODBC ドライバは 32 ビットしかないので、SysWOW64\cscript.exe を使用する必要があります

<JOB>
<SCRIPT language="JScript">
// ****************************
// SysWOW64\cscript.exe を使用
// ****************************
str = WScript.FullName;
if ( str.search(/syswow/i) == -1 ) {

	shell = new ActiveXObject("Shell.Application");
	folder = shell.Namespace( 0x29 );
	folderItem = folder.Self;
	target_path = folderItem.Path;

	str = WScript.ScriptFullName;
	WshShell =  new ActiveXObject("WScript.Shell");
	WshShell.Run( "cmd.exe /c " + target_path + "\\cscript.exe \"" + str + "\" & pause", 3 );
	WScript.Quit();
}

// ****************************
// オブジェクト作成
// ****************************
var cn = new ActiveXObject( "ADODB.Connection" )

// ****************************
// 接続用の文字列を準備
// ****************************
var file_path1_accdb = "C:\\Users\\sworc\\Documents\\hanbaic-set\\hanbaic.accdb";
var connection_string = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file_path1_accdb + ";";

// ****************************
// エクスポート用の文字列を準備
// ****************************
var import_target = "[ODBC;Driver={MySQL ODBC 5.3 Unicode Driver};server=localhost;database=lightbox;uid=root;pwd=]";
var target_name = "社員マスタ";
var file_path_xlsx = "C:\\Users\\sworc\\Documents\\hanbaic-set\\new.xlsx";
var export_target = "[Excel 12.0 xml;DATABASE=" + file_path_xlsx +"]";
var export_query = "select * into " + export_target + "." + target_name + " from " + import_target + "." + target_name;

WScript.Echo( export_query );

// ****************************
// エクスポート
// ****************************
cn.Open( connection_string );
cn.Execute( export_query );
cn.Close();

WScript.Echo( target_name + " の Excel へのエクスポート処理が終了しました" );

</SCRIPT>
</JOB>





posted by at 2019-08-16 18:04 | WSH( JScript ) | このブログの読者になる | 更新情報をチェックする

デスクトップにユーザアイコン( 右クリックでメニュー )



デスクトップにネームスペース( {6100C8E5-973E-40B7-8254-807855D2C355} ) を作成して、初期名 を USER で設定してアイコンを割り付け、右クリックで実行可能なメニューを登録しています。




Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{6100C8E5-973E-40B7-8254-807855D2C355}]
@="USER"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}]
@="USER"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\DefaultIcon]
@="%SystemRoot%\\system32\\imageres.dll,1"


[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\ShellFolder]
"Attributes"=dword:00000010

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000]
@="Google Chrome"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\000\command]
@="\"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe\" --incognito https://www.google.co.jp/"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\001]
@="   サービス"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\001\command]
@=hex(2):6d,00,6d,00,63,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,00,53,00,79,\
  00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,5c,00,73,00,79,00,\
  73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,73,00,65,00,72,00,76,00,69,00,63,\
  00,65,00,73,00,2e,00,6d,00,73,00,63,00,22,00,20,00,2f,00,73,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\002]
@="   システム情報"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\002\command]
@=hex(2):22,00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,\
  00,65,00,73,00,25,00,5c,00,43,00,6f,00,6d,00,6d,00,6f,00,6e,00,20,00,46,00,\
  69,00,6c,00,65,00,73,00,5c,00,4d,00,69,00,63,00,72,00,6f,00,73,00,6f,00,66,\
  00,74,00,20,00,53,00,68,00,61,00,72,00,65,00,64,00,5c,00,4d,00,53,00,49,00,\
  6e,00,66,00,6f,00,5c,00,6d,00,73,00,69,00,6e,00,66,00,6f,00,33,00,32,00,2e,\
  00,65,00,78,00,65,00,22,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\003]
@="   プログラムと機能"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\003\command]
@="RunDLL32.EXE shell32.dll,Control_RunDLL appwiz.cpl"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\004]
@="   ODBC アドミニストレータ"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\004\command]
@="RunDLL32.EXE shell32.dll,Control_RunDLL odbccp32.cpl"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\005]
@="   レジストリエディタ"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\005\command]
@="regedit.exe"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\006]
@="   コマンドプロンプト"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\006\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,63,00,6d,00,\
  64,00,2e,00,65,00,78,00,65,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\007]
@="   UAC"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\007\command]
@=hex(2):55,00,73,00,65,00,72,00,41,00,63,00,63,00,6f,00,75,00,6e,00,74,00,43,\
  00,6f,00,6e,00,74,00,72,00,6f,00,6c,00,53,00,65,00,74,00,74,00,69,00,6e,00,\
  67,00,73,00,2e,00,65,00,78,00,65,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\008]
@="   イベント ビューアー"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\008\command]
@=hex(2):6d,00,6d,00,63,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,00,77,00,69,\
  00,6e,00,64,00,69,00,72,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,\
  33,00,32,00,5c,00,65,00,76,00,65,00,6e,00,74,00,76,00,77,00,72,00,2e,00,6d,\
  00,73,00,63,00,22,00,20,00,2f,00,73,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\009]
@="   ユーザーアカウント"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\009\command]
@="rundll32.exe netplwiz.dll,UsersRunDll"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\010]
@="   環境変数"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\010\command]
@="rundll32.exe sysdm.cpl,EditEnvironmentVariables"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\011]
@="   HOSTS"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\011\command]
@=hex(2):63,00,6d,00,64,00,2e,00,65,00,78,00,65,00,20,00,2f,00,63,00,20,00,70,\
  00,6f,00,77,00,65,00,72,00,73,00,68,00,65,00,6c,00,6c,00,20,00,2d,00,4e,00,\
  6f,00,50,00,72,00,6f,00,66,00,69,00,6c,00,65,00,20,00,2d,00,45,00,78,00,65,\
  00,63,00,75,00,74,00,69,00,6f,00,6e,00,50,00,6f,00,6c,00,69,00,63,00,79,00,\
  20,00,75,00,6e,00,72,00,65,00,73,00,74,00,72,00,69,00,63,00,74,00,65,00,64,\
  00,20,00,2d,00,57,00,69,00,6e,00,64,00,6f,00,77,00,53,00,74,00,79,00,6c,00,\
  65,00,20,00,68,00,69,00,64,00,64,00,65,00,6e,00,20,00,2d,00,43,00,6f,00,6d,\
  00,6d,00,61,00,6e,00,64,00,20,00,22,00,73,00,74,00,61,00,72,00,74,00,20,00,\
  6e,00,6f,00,74,00,65,00,70,00,61,00,64,00,2e,00,65,00,78,00,65,00,20,00,25,\
  00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,5c,00,\
  73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,64,00,72,00,69,00,76,\
  00,65,00,72,00,73,00,5c,00,65,00,74,00,63,00,5c,00,68,00,6f,00,73,00,74,00,\
  73,00,20,00,2d,00,76,00,65,00,72,00,62,00,20,00,72,00,75,00,6e,00,61,00,73,\
  00,22,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\012]
@="   フォルダオプション"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\012\command]
@="RUNDLL32.EXE shell32.dll,Options_RunDLL 7"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\013]
@="   タスク スケジューラ"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\013\command]
@=hex(2):6d,00,6d,00,63,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,00,77,00,69,\
  00,6e,00,64,00,69,00,72,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,\
  33,00,32,00,5c,00,74,00,61,00,73,00,6b,00,73,00,63,00,68,00,64,00,2e,00,6d,\
  00,73,00,63,00,22,00,20,00,2f,00,73,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\014]
@="   ローカル グループ ポリシーエディタ"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\014\command]
@=hex(2):6d,00,6d,00,63,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,00,53,00,79,\
  00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,00,5c,00,73,00,79,00,\
  73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,67,00,70,00,65,00,64,00,69,00,74,\
  00,2e,00,6d,00,73,00,63,00,22,00,00,00

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\015]
@="   リモートデスクトップ"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\015\command]
@="mstsc.exe"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\016]
@="   Windows Update"

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\016\command]
@="control.exe /name Microsoft.WindowsUpdate"


[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\Manage]
@=hex(2):40,00,25,00,73,00,79,00,73,00,74,00,65,00,6d,00,72,00,6f,00,6f,00,74,\
  00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,00,\
  79,00,63,00,6f,00,6d,00,70,00,75,00,74,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,\
  00,34,00,30,00,30,00,00,00
"HasLUAShield"=""
"MUIVerb"=hex(2):40,00,25,00,73,00,79,00,73,00,74,00,65,00,6d,00,72,00,6f,00,\
  6f,00,74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,\
  00,6d,00,79,00,63,00,6f,00,6d,00,70,00,75,00,74,00,2e,00,64,00,6c,00,6c,00,\
  2c,00,2d,00,34,00,30,00,30,00,00,00
"SuppressionPolicy"=dword:4000003c

[HKEY_CLASSES_ROOT\CLSID\{6100C8E5-973E-40B7-8254-807855D2C355}\shell\Manage\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,43,00,6f,00,\
  6d,00,70,00,4d,00,67,00,6d,00,74,00,4c,00,61,00,75,00,6e,00,63,00,68,00,65,\
  00,72,00,2e,00,65,00,78,00,65,00,00,00








posted by at 2019-08-16 14:37 | Windows | このブログの読者になる | 更新情報をチェックする

2019年08月15日

WSH( JScript ) : .accdb より Excel へのエクスポート

★ 主キーはあとから作成する必要があります。
★ 主キー作成しなければ、insert 〜 select で重複したデータを追加する事ができます

<JOB>
<SCRIPT language="JScript">
// ****************************
// オブジェクト作成
// ****************************
var cn = new ActiveXObject( "ADODB.Connection" )

// ****************************
// 接続用の文字列を準備
// ****************************
var file_path1_accdb = "C:\\Users\\sworc\\Documents\\hanbaic-set\\hanbaic.accdb";
var connection_string = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file_path1_accdb + ";";

// ****************************
// エクスポート用の文字列を準備
// ****************************
var target_name = "社員マスタ";
var file_path_xlsx = "C:\\Users\\sworc\\Documents\\hanbaic-set\\new.xlsx";
var export_target = "[Excel 12.0 xml;DATABASE=" + file_path_xlsx +"]";
var export_query = "select * into " + export_target + "." + target_name + " from " + target_name;

// ****************************
// エクスポート
// ****************************
cn.Open( connection_string );
cn.Execute( export_query );
cn.Close();

WScript.Echo( target_name + " の Excel へのエクスポート処理が終了しました" );

</SCRIPT>
</JOB>




posted by at 2019-08-15 17:18 | WSH( JScript ) | このブログの読者になる | 更新情報をチェックする

WSH( JScript ) の基本

拡張子を js にして、SCRIPT 要素内のみでも実行可能です。
但しその場合は、オブジェクトは new ActiveXObject で作成しておくと 他(IE11/HTA)へ 転用しやすくなります。

<JOB>
<OBJECT id="objShell" progid="Shell.Application" />
<SCRIPT language="JScript">
// OBJECT 要素を使用しない場合は以下
// var objShell = new ActiveXObject("Shell.Application"); // タイプ1
// var objShell = WScript.CreateObject("Shell.Application"); // タイプ2

objShell.ShutdownWindows();
</SCRIPT>
</JOB>


<JOB>
<OBJECT id="objShell" progid="Shell.Application" />
<SCRIPT language="JScript">
// OBJECT 要素を使用しない場合は以下
// var objShell = new ActiveXObject("Shell.Application"); // タイプ1
// var objShell = WScript.CreateObject("Shell.Application"); // タイプ2

objShell.FileRun();
</SCRIPT>
</JOB>


<JOB>
<SCRIPT language="JScript">
str = WScript.FullName;
str = str.substr( str.length - 11, 11 );
str = str.toUpperCase();
if ( str != "CSCRIPT.EXE" ) {
	str = WScript.ScriptFullName;
	WshShell =  new ActiveXObject("WScript.Shell");
	WshShell.Run( "cmd.exe /c cscript.exe \"" + str + "\" & pause", 3 );
	WScript.Quit();
}

WScript.Echo();
WScript.Echo("表示");
WScript.Echo("5000ミリ秒停止");

WScript.Sleep(5000);

WScript.Echo("終了します");
WScript.Quit();

</SCRIPT>
</JOB>





posted by at 2019-08-15 16:50 | WSH( JScript ) | このブログの読者になる | 更新情報をチェックする

WSH(JScript) + Excel : 名前の定義がされた範囲をテーブルとして SELECT 文で 標準出力に CSV 出力

▼ CSV を作成するには以下のようにコマンドプロンプトで実行します。
cscript //nologo read-excel12-ado.wsf > table.csv 
★ テスト実行は、エクスプローラより実行します。 ★ .xls でも動作します read-excel12-ado.wsf
<JOB>
<SCRIPT language="JScript">

str = WScript.FullName;
str = str.substr( str.length - 11, 11 );
str = str.toUpperCase();
if ( str != "CSCRIPT.EXE" ) {
	str = WScript.ScriptFullName;
	WshShell =  new ActiveXObject("WScript.Shell");
	WshShell.Run( "cmd.exe /c cscript.exe //Nologo \"" + str + "\" & pause", 3 );
	WScript.Quit();
}

// ****************************
// オブジェクト作成
// ****************************
var cn = new ActiveXObject( "ADODB.Connection" )
var rs = new ActiveXObject( "ADODB.Recordset" )

var file_path = "C:\\Users\\sworc\\Documents\\hanbaic-set\\hanbaic.xlsx";
var target_name = "社員マスタ";

// ****************************
// 接続用の文字列を準備
// ****************************
var connection_string = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + file_path + ";" + "Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\"";

// ****************************
// 接続
// ****************************
cn.Open( connection_string );

// ****************************
// レコードセット取得
// ****************************
query = "select * from " + target_name;
rs.Open( query, cn );

// ****************************
// タイトル出力
// ****************************
var line_buffer = "";
for( i = 0; i < rs.Fields.Count; i++ ) {
	if ( line_buffer != "" ) {
		line_buffer += ",";
	}
	line_buffer += rs.Fields(i).Name;
}
WScript.echo( line_buffer );

// ****************************
// データ出力
// ****************************
while( !rs.EOF ) {
	line_buffer = "";
	if ( line_buffer != "" ) {
		line_buffer += ",";
	}
	for( i = 0; i < rs.Fields.Count; i++ ) {
		if ( line_buffer != "" ) {
			line_buffer += ",";
		}
		line_buffer += rs.Fields(i).Value;
	}
	WScript.echo( line_buffer );

	rs.MoveNext();
}

// ****************************
// レコードセットクローズ
// ****************************
rs.Close();

// ****************************
// 接続解除
// ****************************
cn.Close();

</SCRIPT>
</JOB>




posted by at 2019-08-15 16:27 | WSH( JScript ) | このブログの読者になる | 更新情報をチェックする

2019年08月14日

IE11 : new ActiveXObject("ADODB.Connection") で .accdb のテーブル一覧を jQuery で TABLE に作成する

関連する記事

VBScript : 3種のMDB(または accdb)内の テーブル一覧取得方法

var cn = new ActiveXObject("ADODB.Connection");
var rs = new ActiveXObject("ADODB.Recordset");
var schema;

// ******************************
// データベースの接続
// ******************************
function connectDb(){

	// データベースの処理
	var path = "C:\\Users\\sworc\\Documents\\hanbaic-set\\hanbaic.accdb";
	var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";";

	cn.Open( connectionString );

	schema = cn.OpenSchema( 20, [,,,] );

}

// ******************************
// jQuery でテーブル作成
// https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/schemaenum?view=sql-server-2017
// ******************************
function buildTable( ){

	while( !schema.EOF ) {

		var table_name = schema.Fields("TABLE_NAME").Value;
		if ( table_name.indexOf("MSys") == 0 ) {
			schema.MoveNext();
			continue;
		}

		var tr = $("<tr class='rowdata'></tr>")
			.appendTo("#tbl");

		$("<td></td>")
			.appendTo(tr)
			.css({
				"color": "#007bff",
				"text-decoration": "underline",
				"cursor": "pointer",
				"width": "250px"
			})
			.text(schema.Fields("TABLE_NAME").Value)
			// セルにイベントを作成
			.on("click", function(){

				console.log( $(this).text() );

			})
			;

		$("<td></td>")
			.appendTo(tr)
			.text(schema.Fields("TABLE_TYPE").Value);


		schema.MoveNext();
	}

	cn.Close();

}

$(function(){

	// ロード時の全ての行の表示
	connectDb();
	buildTable( );

});



※ これ以外に、ドメイン間のデーターソースのアクセスを【有効】にしてください

<!DOCTYPE html>
<html>
<head>
<meta content="width=device-width initial-scale=1.0 minimum-scale=1.0 maximum-scale=1.0 user-scalable=no" name="viewport">
<meta charset="utf-8">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.css">

<link rel="stylesheet" href="https://lightbox.sakura.ne.jp/demo/two-section.css">

<script>
var cn = new ActiveXObject("ADODB.Connection");
var rs = new ActiveXObject("ADODB.Recordset");
var schema;

// ******************************
// データベースの接続
// ******************************
function connectDb(){

	// データベースの処理
	var path = "C:\\httpd142p\\ie11\\hanbaic-set\\hanbaic.accdb";
	var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";";

	cn.Open( connectionString );

	schema = cn.OpenSchema( 20, [,,,] );

}

// ******************************
// jQuery でテーブル作成
// https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/schemaenum?view=sql-server-2017
// ******************************
function buildTable( ){

	while( !schema.EOF ) {

		var table_name = schema.Fields("TABLE_NAME").Value;
		if ( table_name.indexOf("MSys") == 0 ) {
			schema.MoveNext();
			continue;
		}

		var tr = $("<tr class='rowdata'></tr>")
			.appendTo("#tbl");

		$("<td></td>")
			.appendTo(tr)
			.css({
				"color": "#007bff",
				"text-decoration": "underline",
				"cursor": "pointer",
				"width": "250px"
			})
			.text(schema.Fields("TABLE_NAME").Value)
			// セルにイベントを作成
			.on("click", function(){

				console.log( $(this).text() );

			})
			;

		$("<td></td>")
			.appendTo(tr)
			.text(schema.Fields("TABLE_TYPE").Value);


		schema.MoveNext();
	}

	cn.Close();

}

$(function(){

	$("#action").on("click", function(){

		// ロード時の全ての行の表示
		connectDb();
		buildTable( );

	});


});
</script>
</head>
<body>
	<div id="head">
		<input type="button" value="実行" id="action">
	</div>

	<div id="extend">
		<table class="table">
		<tbody id="tbl">

		</tbody>
		</table>

	</div>

</body>
</html>


関連する記事

下半分がスクロールするページ【 height: calc( 100% - 120px ) 】



posted by at 2019-08-14 21:09 | IE | このブログの読者になる | 更新情報をチェックする

IE11 + jQuery で、select( リスト)をタブルクリックした時に OPTION 要素の処理を行うコード

Google Chrome では、OPTION 要素に直接 dblclick イベントを作成できましたが、IE11 では無視されたので以下のようにして実装しました

select でイベントを作成して、その後選択されている場所が対象なので $(this).find(":selected") で参照します

※ デモページ
$(function(){

	// **************************************
	// 対象追加
	// **************************************
	$("#target").on("dblclick", function(){

		var target = $(this).val();

		$("#code option").each(function( idx ){

			if ( $(this).val() == target ) {
				alert( "この対象は既にセットされています" );
				target = null;
				return;
			}

		});

		if ( target != null ) {
			$("<option></option>")
				.val( target )
				.text( $(this).find(":selected").text() )
				.appendTo("#code")
			;
		}

	});

	// **************************************
	// メンバ削除
	// **************************************
	$("#code").on("dblclick", function(event){

		console.log("dblclick");

		$(this).find(":selected").remove();

	});

});



posted by at 2019-08-14 19:48 | IE | このブログの読者になる | 更新情報をチェックする

ActiveXObject("WScript.Shell" ) でコマンドプロンプトベースの外部プログラムより情報を取得

wscript.Run で、同期処理でコマンドプロンプトを表示せずに cmd.exe を呼び出して、標準出力に結果を出力するアプリを実行させてリダイレクトでファイルに書き込みます。

すぐにそのテキストを読み込んで、IE11 内の処理で使用します。

var wscript = new ActiveXObject("WScript.Shell" );

wscript.Run("cmd /c ipconfig > " + getFullPath("log.txt"),0 , true);
var infile = fs.OpenTextFile( getFullPath("log.txt"), 1 );
var text = infile.ReadAll();
infile.Close();







posted by at 2019-08-14 17:55 | IE | このブログの読者になる | 更新情報をチェックする

ActiveXObject("CDO.Message") でメール送信

ほぼほぼ IE11 での利用となります。





var cdo = new ActiveXObject("CDO.Message");

var server = "SMTPサーバー";
var port = 587; // または 465
var user = "ユーザ";
var from = "メールアドレス";
var pass = "パスワード";

// ***************************
// メール送信
// ***************************
function cdo_mail_send(to, subject, text_body) {

	// ***************************
	// 自分のアドレスと宛先
	// ***************************
	cdo.From = from
	cdo.To = to

	// ***************************
	// 件名と本文
	// ***************************
	cdo.Subject	= subject;
	cdo.Textbody = text_body;

	// ***************************
	// 設定
	// ***************************
	cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2;
	cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = server;
	cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = port;

	// ポートが 465 の場合は true に変更
	cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = false;

	cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
	cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = user;
	cdo.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = pass;

	// ***************************
	// 設定
	// ***************************
	cdo.Configuration.Fields.Update();

	// ***************************
	// 送信
	// ***************************
	try {
		cdo.Send();

		console.log( "cdo.Send() : " + to + ":" + subject);
	}
	catch (e) {
		console.dir(e);
		alert("cdo.Send() でエラーが発生しました");
	}

}

// http://logicalerror.seesaa.net/article/312259839.html




posted by at 2019-08-14 15:50 | IE | このブログの読者になる | 更新情報をチェックする

C# : Microsoft Access の接続で、他の RDBMS( ここでは MySQL ) にエクスポートを行う

OleDb で接続し、select 〜 into 構文の出力先を [ODBC; ... ] を使用した接続文字列の記述で SQL 上で直接参照してエクスポートを実現します。この際、キーは設定されないので2回目以降の insert 〜 select 構文で追加エクスポートが可能です

using System;
using System.Data.OleDb;

namespace Export_MySQL
{
	class Program
	{
		static void Main(string[] args)
		{
			OleDbConnection accdb;
			bool bError = false;
			string mysql_connection_string = "[ODBC;Driver={MySQL ODBC 5.3 Unicode Driver};server=localhost;database=lightbox;uid=root;pwd=]";

			using (accdb = new OleDbConnection())
			using (OleDbCommand command = new OleDbCommand())
			{
				string file_path = @"C:\Users\sworc\Documents\hanbaic-set\hanbaic.accdb";
				accdb.ConnectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={file_path};";
				try
				{
					accdb.Open();
					Console.WriteLine($"{file_path} で接続されました");
				}
				catch (Exception ex)
				{
					Console.WriteLine("接続エラーです:" + ex.Message);
					bError = true;
				}

				if (bError)
				{
					return;
				}

				// テーブルを新規作成してエクスポート
				string query = 
$@"select * into {mysql_connection_string}.社員マスタ_accdb
	from 社員マスタ";

				Console.WriteLine(query);

				try
				{
					// コマンドオブジェクトに接続をセット
					command.Connection = accdb;
					command.CommandText = query;
					command.ExecuteNonQuery();

					Console.WriteLine("エクスポートされました");
				}
				catch (Exception ex)
				{
					Console.WriteLine("SQL 実行エラーです:" + ex.Message);
					
					bError = true;
				}

				if (bError)
				{
					// 既存テーブルにエクスポート
					query = 
$@"insert into {mysql_connection_string}.社員マスタ_accdb
	select * from 社員マスタ";

					Console.WriteLine(query);

					try
					{
						// コマンドオブジェクトに接続をセット
						command.Connection = accdb;
						command.CommandText = query;
						command.ExecuteNonQuery();

						Console.WriteLine("エクスポートされました");
					}
					catch (Exception ex)
					{
						Console.WriteLine(query);
						Console.WriteLine("SQL 実行エラーです:" + ex.Message);
					}
				}
			}

			Console.ReadLine();
		}
	}
}


関連する記事

System.Data.OleDb で select into 構文を使って簡単に Microsoft Access のデータを他の データベースにエクスポートする

データーベース間 テーブルアクセス




posted by at 2019-08-14 01:35 | C# | このブログの読者になる | 更新情報をチェックする

2019年08月12日

C# : TKMP.DLLを使った、Gmail 用メール送信テンプレート

Gmail 用テンプレート




Gmail は、安全性の低いアプリの許可を『有効』にする必要があります。( 使用した後は無効にしましょう )
using System;
using System.Windows.Forms;
using TKMP.Net;

namespace TKMP_SendMail_Gmail
{
	public partial class Form1 : Form
	{
		public Form1()
		{
			InitializeComponent();
		}

		private void button1_Click(object sender, EventArgs e)
		{

			MailClass mc = new MailClass()
			{
				SmtpServer = "smtp.gmail.com",
				Port = 587,
				User = "アカウント",
				Pass = password.Text,
				Protocol = AuthenticationProtocols.TLS
			};

			var result = mc.SendMail(
				"宛先",
				"自メールアドレス",
				this.subject.Text,
				this.body.Text,
				null,   // 必要な場合、宛先を日本語で
				null,   // 必要な場合、差出人を日本語で
				(MailClass.MailClassErrorArg _e) =>
				{
					this.error.Text = _e.Message;
				}
			);

			if (result)
			{
				MessageBox.Show("メールを送信しました");
			}

		}

	}
}


TKMP を使用した MailClass
using System;
using TKMP.Writer;
using TKMP.Net;

namespace TKMP_SendMail_Gmail
{
	class MailClass
	{
		private MailWriter mailWriter = null;

		public string SmtpServer { get; set; }
		public int Port { get; set; }
		public string User { get; set; }
		public string Pass { get; set; }
		public AuthenticationProtocols Protocol { get; set; }

		private string err_message = "";

		public class MailClassErrorArg
		{
			public string Message { get; set; }
		}

		public delegate void MailClassError(MailClassErrorArg e);

		public bool SendMail(string To, string From, string Subject, string Body, string To_J, string From_J, MailClassError mailClassError)
		{
			bool bResult = true;

			mailWriter = new MailWriter();

			try
			{
				mailWriter.ToAddressList.Add(To);
			}
			catch (Exception ex)
			{
				bResult = false;
			}

			// エラー処理
			if (!bResult)
			{
				if (mailClassError != null)
				{
					MailClassErrorArg e = new MailClassErrorArg() { Message = "宛先が正しくありません" };
					mailClassError(e);
				}
				return bResult;
			}

			// From が未指定や正しくない文字列の場合
			try
			{
				mailWriter.FromAddress = From;
			}
			catch (Exception ex)
			{
				mailWriter.FromAddress = "______@gmail.com";
			}

			TextPart textPart = new TextPart(Body);
			mailWriter.MainPart = textPart;

			if (To_J != null)
			{
				mailWriter.Headers.Add("To", To_J + " <" + To + ">");
			}
			else
			{
				mailWriter.Headers.Add("To", To);
			}

			if (From_J != null)
			{
				mailWriter.Headers.Add("From", From_J + " <" + From + ">");
			}
			else
			{
				mailWriter.Headers.Add("From", From);
			}

			mailWriter.Headers.Add("Subject", Subject);
			mailWriter.Headers.Add("X-Mailer", "TKMP Version 3.1.2");

			var logon = new TKMP.Net.AuthLogin(User, Pass);
			SmtpClient smtpClient = new SmtpClient(SmtpServer, Port, logon);
			smtpClient.AuthenticationProtocol = Protocol;

			try
			{
				if (!smtpClient.Connect())
				{
					err_message = "接続に失敗しました";
					bResult = false;
				}
				else
				{
					smtpClient.SendMail(mailWriter);
					smtpClient.Close();
				}
			}
			catch (Exception ex)
			{
				err_message = ex.Message;
				bResult = false;
			}

			// エラー処理
			if (!bResult)
			{
				if (mailClassError != null)
				{
					MailClassErrorArg e = new MailClassErrorArg() { Message = err_message };
					// このメソッドの引数である、ErrorHandler デリゲートを呼び出す
					mailClassError(e);
				}
			}

			return bResult;
		}

		// エラー処理なし
		public bool SendMail(string To, string From, string Subject, string Body, string To_J, string From_J)
		{
			return SendMail(To, From, Subject, Body, To_J, From_J, null);
		}

		// 日本語なし、エラー処理なし
		public bool SendMail(string To, string From, string Subject, string Body)
		{
			return SendMail(To, From, Subject, Body, null, null, null);
		}

	}

}




posted by at 2019-08-12 21:59 | C# | このブログの読者になる | 更新情報をチェックする

C# : DataGridView を使用したナチュラルな行データの更新

DataGridView のセルをダブルクリックして編集可能にして、編集後更新ボタンで更新されます。







using System;
using System.Data;
using System.Data.Odbc;
using System.Windows.Forms;

namespace MySQL_DataGridView
{
	public partial class Form1 : Form
	{
		// *****************************
		// SQL文字列格納用
		// *****************************
		private string query = "select * from 社員マスタ";

		// *****************************
		// 接続文字列作成用
		// *****************************
		private OdbcConnectionStringBuilder builder = new OdbcConnectionStringBuilder();

		// *****************************
		// コンストラクタ
		// *****************************
		public Form1()
		{
			InitializeComponent();

			setBuilderData();
		}

		// *****************************
		// 接続文字列の準備
		// *****************************
		private void setBuilderData()
		{
			// ドライバ文字列をセット ( 波型括弧{} は必要ありません ) 
			// builder.Driver = "MySQL ODBC 8.0 Unicode Driver";
			builder.Driver = "MySQL ODBC 5.3 Unicode Driver";

			// 接続用のパラメータを追加
			builder.Add("server", "localhost");
			builder.Add("database", "lightbox");
			builder.Add("uid", "root");
			builder.Add("pwd", "");
		}

		// *****************************
		// 参照実行用クリックイベント
		// *****************************
		private void select_Click(object sender, EventArgs e)
		{
			loadMySQL();
		}

		// *****************************
		// SELECT 文よりデータ表示
		// *****************************
		private void loadMySQL()
		{

			// 接続と実行用のクラス
			using (OdbcConnection connection = new OdbcConnection())
			using (OdbcCommand command = new OdbcCommand())
			{
				// 接続文字列
				connection.ConnectionString = builder.ConnectionString;

				try
				{
					// 接続文字列を使用して接続
					connection.Open();
				}
				catch (Exception ex)
				{
					MessageBox.Show(ex.Message);
					return;
				}

				// コマンドオブジェクトに接続をセット
				command.Connection = connection;
				// コマンドを通常 SQL用に変更
				command.CommandType = CommandType.Text;

				// *****************************
				// 実行 SQL
				// *****************************
				command.CommandText = query;

				try
				{
					// レコードセット取得
					using (OdbcDataReader reader = command.ExecuteReader())
					{
						// データを格納するテーブルクラス
						DataTable dataTable = new DataTable();
						// DataReader よりデータを格納
						dataTable.Load(reader);

						// 画面の一覧表示用コントロールにセット
						dataGridView_Syain.DataSource = dataTable;

						// データがあった場合は更新ボタンを使用可能にする
						if ( dataTable.Rows.Count != 0 )
						{
							// 更新ボタン
							update.Enabled = true;
						}

						// リーダを使い終わったので閉じる
						reader.Close();
					}

				}
				catch (Exception ex)
				{
					// 接続解除
					connection.Close();
					MessageBox.Show(ex.Message);
					return;
				}

				// 接続解除
				connection.Close();
			}

			// カラム幅の自動調整
			dataGridView_Syain.AutoResizeColumns();
		}


		// *****************************
		// 更新実行用クリックイベント
		// *****************************
		private void update_Click(object sender, EventArgs e)
		{
			using (OdbcConnection connection = new OdbcConnection())
			{
				// 接続文字列
				connection.ConnectionString = builder.ConnectionString;

				// 更新を管理するクラス
				// ※ 更新するには、テーブルに主キーが必要です
				OdbcDataAdapter adapter = new OdbcDataAdapter();
				// 参照用のマップを追加
				adapter.TableMappings.Add("Table", "社員マスタ");
				// 接続とコマンド( コマンドは更新用のレコードを取得した SQL ) 
				adapter.SelectCommand = new OdbcCommand(query, connection);

				// 更新用のオブジェクトを準備
				OdbcCommandBuilder commandBuilder = new OdbcCommandBuilder(adapter);
				// 更新用のコマンドを取得
				adapter.UpdateCommand = commandBuilder.GetUpdateCommand();

				// 更新用 SQL のベース文字列
				Console.WriteLine(adapter.UpdateCommand.CommandText);

				// *****************************
				// 更新
				// *****************************
				try
				{
					// DataGridView の内容を使用して更新
					// ※ 他で更新されてしまった行は更新エラーとなります
					// ※ 内部で管理された更新予定行を対象として更新します
					adapter.Update((DataTable)dataGridView_Syain.DataSource);

					MessageBox.Show("更新を終了しました");
				}
				catch (Exception ex)
				{
					MessageBox.Show(ex.Message);
				}
			}
		}
	}
}


列定義を自分で作成する場合は以下を参照してください

Microsoft Access に対してSQLを入力してその結果を DataGridView に表示する最も簡単なコード




posted by at 2019-08-12 19:49 | C# | このブログの読者になる | 更新情報をチェックする

2019年07月02日

家に持ち帰った mdb で簡単に php からアクセスしてテストプログラムを作る( MDBクラス付き )

もう、いまどき PHP + MDB なんてのは、仕事でしか書かないですが・・・

こんなことする人もまれだとは思いますが、知ってると結構便利だと思いますよ。
<?php
header( "Content-Type: text/html; charset=utf-8" );
session_cache_limiter('nocache');
session_start();

require_once("db.php");

$connect_string = "Provider=MSDASQL;";
$connect_string .= "Driver={Microsoft Access Driver (*.mdb, *.accdb)};";
$connect_string .= "dbq=C:\\Users\\sworc\\Downloads\\hanbaic_masters.mdb;";

$db = new MDB( $connect_string, "UTF-8" );

$query = "select * from [社員マスタ]";

$column = $db->query_ex( $query );

while ( $column ) {
	print "<pre>";
	print_r( $column );
	print "</pre>";

	$column = $db->query_ex( );
};

$db->close();

?>


db.php
<?php
// ***************************
// データベースクラス
// ***************************
class MDB {
 
	var $connect;
	var $result;
	var $encoding;
 
// ***************************
// コンストラクタ
// ***************************
	function MDB( $connect_string, $encoding="MS932", $user='', $password='' ) {

		$this->encoding = $encoding;

		$this->connect = odbc_connect($connect_string, $user, $password);
	}
 
// ***************************
// 接続解除
// ***************************
	function close( ) {
		odbc_close( $this->connect );
	}
 
// ***************************
// クエリー
// ***************************
	function query( $sql_query ) {

		if ( $this->encoding != "MS932" ) {
			$sql_query = mb_convert_encoding($sql_query,"MS932",$this->encoding);
		}

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

		$ret = odbc_fetch_array( $result );
		if ($ret) {
			if ( $this->encoding != "MS932" ) {
				foreach($ret as $_key => $_value) {
					$ret2[mb_convert_encoding($_key,$this->encoding,"MS932")] = mb_convert_encoding($_value,$this->encoding,"MS932");
				}
			}
			else {
				$ret2 = $ret;
			}
			$cnt = 0;
			foreach($ret as $_key => $_value) {
				if ( $this->encoding != "MS932" ) {
					$ret2[$cnt] = mb_convert_encoding($_value,$this->encoding,"MS932");
				}
				else {
					$ret2[$cnt] = $_value;
				}
				$cnt++;
			}
			return $ret2;
		}
		else {
			return false;
		}
	}
 
// ***************************
// クエリーとフェッチ
// ***************************
	function query_ex( $sql_query='' ) {
 
		if ( $sql_query != '' ) {
			$this->result = $this->query( $sql_query );
			if ( !$this->result ) {
				return false;
			}
			return $this->fetch( $this->result );
		}
		else {
			return $this->fetch( $this->result );
		}
 
	}
 
// ***************************
// 実行
// ***************************
	function Execute( $sql_exec ) {
		if ( $this->encoding != "MS932" ) {
			$sql_exec = mb_convert_encoding($sql_exec,"MS932",$this->encoding);
		}

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


▼ 出力結果の例
Array
(
    [社員コード] => 0001
    [氏名] => 浦岡 友也
    [フリガナ] => ウラオカ トモヤ
    [所属] => 0003
    [性別] => 0
    [作成日] => 2005-09-12 00:00:00
    [更新日] => 2005-11-28 00:00:00
    [給与] => 270000
    [手当] => 9000
    [管理者] => 
    [生年月日] => 2000-01-01 00:00:00
    [社員区分] => 0
    [年代] => A
    [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] => 2000-01-01 00:00:00
    [11] => 0
    [12] => A
)
Array
(
    [社員コード] => 0002
    [氏名] => 山村 洋代
    [フリガナ] => ヤマムラ ヒロヨ
    [所属] => 0003
    [性別] => 1
    [作成日] => 2005-06-17 00:00:00
    [更新日] => 2005-09-18 00:00:00
    [給与] => 300000
    [手当] => 
    [管理者] => 
    [生年月日] => 2000-01-02 00:00:00
    [社員区分] => 0
    [年代] => A
    [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] => 2000-01-02 00:00:00
    [11] => 0
    [12] => A
)
昔仕事場の古い SQLServer がぶっ壊れた時、新しい OS やら新しい SQLServer やらで結局 PHP からアクセスする DB のドライバは ODBC で総とっかえしました。これが一番簡単で安全だという結果になっています





posted by at 2019-07-02 23:57 | PHP+DB | このブログの読者になる | 更新情報をチェックする

2019年06月28日

IE や Firefox の開発者ツールのコンソールで簡単に localStorage を見る為の1行コード

Google Chrome では、Application のタブで見る事も消す事もできますが、IE や Firefox ではコンソールから JavaScript を実行します
for(i=0;i<localStorage.length;i++){console.log(localStorage.key(i)+":"+localStorage[localStorage.key(i)])}




タグ:IE Firefox
posted by at 2019-06-28 23:02 | JavaScript | このブログの読者になる | 更新情報をチェックする

復活してました => ゾウフォントの配布元のサイトが閉鎖されたようです

2019/03/25 に ver2 で復活していました。

いろいろ事情があったようですが、良かったですね





アクセスすると、ロリポップのレンタルサーバの 404 エラーが表示されます。検索しても、他のサイトがみつかりませんし、インターネットアーカイブにもありませんでした。

元々、アーカイブには『002zou-Regular.otf』が入っていただけで、ライセンス等はサイトに記述されていたと記憶しています。
配布している素材やフォントは商用OK・著作者表記不要・無料でご利用いただけますが、著作権は放棄しておりません。再配布、素材の販売、画像の直リンク・公序良俗に反する利用はおやめください。本サイトの素材やフォントをDL・使用した場合に発生した事故や障害等は、一切責任を負いません。

利用報告やクレジット表記・リンク等は不要ではありますが、していただけるととてもうれしいです。
フォントファイルは所有していますが、再配布不可なのでどうにもなりませんね、残念です。
posted by at 2019-06-28 18:22 | フリーフォントで... | このブログの読者になる | 更新情報をチェックする

2019年06月27日

複数行のグループデータを1行にまとめるSQL

縦のデータを



case で行毎の表示列を作成する
select 
	コード

	,case 行 
		when 1 then 内容
		else null
	end as 内容1

	,case 行 
		when 2 then 内容
		else null
	end as 内容2

	,case 行 
		when 3 then 内容
		else null
	end as 内容3

 from data



後は、group と max で一つの行に
select 
	コード

	,max(case 行 
		when 1 then 内容
		else null
	end) as 内容1

	,max(case 行 
		when 2 then 内容
		else null
	end) as 内容2

	,max(case 行 
		when 3 then 内容
		else null
	end) as 内容3

 from data
 group by コード





CREATE TABLE `data` (
  `コード` int(11) NOT NULL DEFAULT '0',
  `行` int(11) NOT NULL DEFAULT '0',
  `内容` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`コード`,`行`)
)


MySQL でのサンプルですが、SQLServer、PostgreSQL、Oracle でも可能です。

各構文のサンプルはこちらから

※ 分解には、UNION を使います。



posted by at 2019-06-27 23:09 | DB関連 | このブログの読者になる | 更新情報をチェックする

C# の delegate : メソッドの引数にメソッドを渡して使用する方法と、JavaScript の function(){} と同じ使用方法( 匿名 )

要するに関数型の変数の宣言。

private delegate void func(string a);

で、func という型が定義されて、func a という変数 a は、『引数が string 型で、戻り値が無い』という定義がされているメソッドであればなんでも良いという事。

メソッドを代入された変数はそのメソッドの代用になり、そのままメソッドとして使用できるようになるが、変数なので、内容を変更もできるし(他のメソッドとして入れ替え可能)、引数にも使用できる。( もちろん最初のメソッド名も引数として渡せるが、変数では無いので中身を変更はできない )

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace WindowsFormsApplication1
{

    public partial class Form1 : Form
    {
        // ▼ 宣言
        private delegate void func(string a);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            // ▼ 呼び出しタイプ1( 特定メソッド型変数にメソッド名を代入 )
            func _ptr = debug_string;
            button_action(_ptr);

            // ▼ 呼び出しタイプ2( 古い方法 )
            button_action(new func(debug_string));

            // ▼ 匿名処理1( ラムダ式 ) : button_action 内より呼び出される
            button_action((string a) => { Debug.WriteLine(a); });

            // ▼ 匿名処理2: button_action 内より呼び出される
            button_action(delegate(string a) { Debug.WriteLine(a); });
           
        }

        private void button_action(func ptr)
        {
            // 変数を使ってメソッドを呼び出す
            // ( 呼び出しタイプ1と2では debug_string が呼び出される )
            // ( 匿名処理1と2では そこに書いた別々のコードが呼び出される )
            ptr("デバッグを呼び出す");
        }

        private void debug_string(string a)
        {
            Debug.WriteLine(a);
        }
    }
}

※ 呼び出しタイプ2/匿名処理1/匿名処理2
方法 : デリゲートを宣言し、インスタンス化して使用する

リンク先によると、『new func(debug_string)』は一番古い書き方で、その次に『debug_string』というメソッド名を直接セットするようになっていますが、さらに『delegate』を使って匿名の処理をその場で書く事ができるようになっています。

そしてさらに最新の書き方が『ラムダ式』で、 (引数) => {処理;処理;} というような書き方が可能になっています。

ラムダ式 (C# プログラミング ガイド)


posted by at 2019-06-27 19:32 | C# | このブログの読者になる | 更新情報をチェックする

2019年04月05日

DF.exe ( テキストファイル差分表示 ) の設定

1) Terapad を外部エディタとして使用する
"インストールパス\TeraPad.exe" /j=%L "%P"



2) キャラクタセットの設定

Auto でうまくいかない時は固定で正しいキャラクタセットに変更します



ダウンロード( Vector )
Terapad ダウンロード( Vector )



中のウインドウ表示を空にして、比較したいファイルを順にウインドウへドラッグ&ドロップします(フォルダごと比較も可)





posted by at 2019-04-05 22:21 | フリーソフト | このブログの読者になる | 更新情報をチェックする

2019年02月11日

【VBS + Excel】シンプルな詳細設計書のフォーマット。1) Excel のダウンロード、2) VBScript で作成するサンプル

▼ B4 基本設計書セット


これは、Excle(2010) ブックをダウンロードします。
( ※ プログラム一覧、概要書、テーブル一覧、テーブル設計、画面設計、入力設計、出力設計 )

PDF サンプル 


▼ スクリプトによる詳細設計書作成

Microsoft Excel がインストールされている必要があります

Excel 2007 以降の場合、.xls で保存する形式として 97-2003 として保存するようにしています。VBScript のライブラリはWEB上にあり、それらを参照して実行しています

実行すると、ドキュメントフォルダに作成されます
作成されるのは、非常にシンプルな4種類の設計書フォーマットです。
1) 概要書
 処理を中心とした入出力をオートシェイプの
 フローチャートで示し、概要を記述して正確
 な入出力エントリ列挙します
2) 画面設計書
 最近では画面の画像をはりつける事がほとん
 どです
3) 入力設計書
 入力チェックを中心とした GUI の操作手順を
 ベースとしてアプリケーションの定義をして
 いきます。入力フィールドの属性も通常示さ
 れます
4) 出力設計書
 更新処理はここで記述されます。最近では、
 DBテーブルの更新仕様と考えて良いでしょう。
 但し例外として、印刷処理のフォーマット指示
 である事もあります
作成するのは、詳細設計書書式なのですが、もし、VBScript を書く事ができるのであれば、Excel にアクセスしている部分は WEB 上のライブラリですが、常に Hosting しているので利用していただいて結構です。

ライブラリそのものは、テキストとして Hosting しているので、都合上 UTF-8 で書かれています。以下からダウンロード可能です。

baseFunction.vbs
excelFunction.vbs

※ 以下は仕様を書き込んだ作成イメージです

<JOB>
<COMMENT>
************************************************************
 WSH 実行スケルトン
************************************************************
</COMMENT>

<COMMENT>
************************************************************
 外部スクリプト定義
************************************************************
</COMMENT>
<SCRIPT
	language="VBScript"
	src="http://lightbox.in.coocan.jp/laylaClass.vbs">
</SCRIPT>

<SCRIPT language=VBScript>
' ***********************************************************
' 処理開始
' ***********************************************************
Call laylaFunctionTarget( "http://lightbox.in.coocan.jp/" )
Call laylaLoadFunction( "baseFunction.vbs" )
Call laylaLoadFunction( "excelFunction.vbs" )

Crun

str = InputBox( MyDocDir & " に作成されるExcelブック名を指定します",, _
	"簡易詳細設計書フォーマット" )
if str = "" then
	Wscript.Quit
end if

strTarget = MyDocDir & "\" & str & ".xls"

Set MyBook = CreateBook( strTarget )
' Call ExcelVisible( True )

' ******************************************************
' 画面設計書フォーマット作成
' ******************************************************
strSheetName = "画面設計書"
Wscript.Echo strSheetName & " を作成しています"

Call AddSheetTop(MyBook, strSheetName)
Call ExcelSelectSheet(MyBook, strSheetName)
on error resume next
Call DeleteSheet( MyBook, "Sheet1" )
Call DeleteSheet( MyBook, "Sheet2" )
Call DeleteSheet( MyBook, "Sheet3" )
on error goto 0

Call Format_Page(MyBook)

Call ExcelSize_Disp(MyBook, strSheetName)
Call ExcelLine_Disp(MyBook, strSheetName)
Call ExcelSetText_Disp(MyBook, strSheetName)

' ******************************************************
' 概要書
' ******************************************************
strSheetName = "概要書"
Wscript.Echo strSheetName & " を作成しています"

Call AddSheetTop(MyBook, strSheetName)
Call ExcelSelectSheet(MyBook, strSheetName)
Call Format_Page(MyBook)
Call ExcelSize_Plan(MyBook, strSheetName)
Call ExcelLine_Plan(MyBook, strSheetName)
Call ExcelSetText_Plan(MyBook, strSheetName)

' ******************************************************
' 入力設計書
' ******************************************************
strSheetName = "入力設計書"
Wscript.Echo strSheetName & " を作成しています"

Call AddSheetLast(MyBook, strSheetName)
Call ExcelSelectSheet(MyBook, strSheetName)
Call Format_Page(MyBook)
Call ExcelSize_Plan(MyBook, strSheetName)
Call ExcelLine_Plan(MyBook, strSheetName)
Call ExcelSetText_Plan(MyBook, strSheetName)

' ******************************************************
' 出力設計書
' ******************************************************
strSheetName = "出力設計書"
Wscript.Echo strSheetName & " を作成しています"

Call AddSheetLast(MyBook, strSheetName)
Call ExcelSelectSheet(MyBook, strSheetName)
Call Format_Page(MyBook)
Call ExcelSize_Plan(MyBook, strSheetName)
Call ExcelLine_Plan(MyBook, strSheetName)
Call ExcelSetText_Plan(MyBook, strSheetName)


' ******************************************************
' 終了処理
' ******************************************************
Call ExcelSave( MyBook )
Call ExcelQuit( MyBook )
Call ExcelLoad( Dd(strTarget) )

' ******************************************************
' セルサイズの設定
' ******************************************************
Function ExcelSize_Disp(MyBook, Target)

	'セルの高さ合わせ
	Call ExcelSetRowHeight(MyBook, Target, 1, 13.50)
	Call ExcelSetRowHeight(MyBook, Target, 2, 24.50)
	Call ExcelSetRowHeight(MyBook, Target, 3, 13.50)
	Call ExcelSetRowHeight(MyBook, Target, 4, 24.50)

	For i = 5 To 25
		Call ExcelSetRowHeight(MyBook, Target, i, 24.75)
	Next

	For i = 26 To 38
		Call ExcelSetRowHeight(MyBook, Target, i, 19.00)
	Next

	'セルの幅合わせ
	Call ExcelSetColumnWidth(MyBook, Target, 1, 3.50)
	Call ExcelSetColumnWidth(MyBook, Target, 2, 22.38)
	Call ExcelSetColumnWidth(MyBook, Target, 3, 7.50)
	Call ExcelSetColumnWidth(MyBook, Target, 4, 6.00)
	Call ExcelSetColumnWidth(MyBook, Target, 5, 6.00)
	Call ExcelSetColumnWidth(MyBook, Target, 6, 11.50)
	Call ExcelSetColumnWidth(MyBook, Target, 7, 25.00)
	Call ExcelSetColumnWidth(MyBook, Target, 8, 12.00)

End Function

' ******************************************************
' 罫線の設定
' ******************************************************
Function ExcelLine_Disp(MyBook, Target)

	' BOX罫線
	Call ExcelRange(MyBook, Target, 1, 1, 8, 38 )
	Call ExcelBox(xlContinuous, xlMedium)

	' 上罫線
	Call ExcelRange(MyBook, Target, 1, 2, 8, 2 )
	Call ExcelLine(xlDot, xlThin)

	Call ExcelRange(MyBook, Target, 1, 3, 8, 3 )
	Call ExcelLine(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 1, 4, 8, 4 )
	Call ExcelLine(xlDot, xlThin)

	Call ExcelRange(MyBook, Target, 1, 5, 8, 5 )
	Call ExcelLine(xlContinuous, xlMedium)

	Call ExcelRange(MyBook, Target, 1, 26, 8, 26 )
	Call ExcelLine(xlContinuous, xlMedium)

	for i = 27 to 38
		Call ExcelRange(MyBook, Target, 1, i, 8, i )
		Call ExcelLine(xlDot, xlThin)
	Next

	' 右罫線
	Call ExcelRange(MyBook, Target, 2, 1, 2, 4 )
	Call ExcelLineRight(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 6, 1, 6, 4 )
	Call ExcelLineRight(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 7, 1, 7, 4 )
	Call ExcelLineRight(xlContinuous, xlThin)

End Function

' ******************************************************
' セルのテキストの設定
' ******************************************************
Function ExcelSetText_Disp(MyBook, Target)

	Call ExcelRange(MyBook, Target, 1, 1, 7, 49 )
	Call ExcelVAlign()

	' 1行目
	Call ExcelSetCell(MyBook, Target, 1, 1, " システム名")
	Call ExcelSetCell(MyBook, Target, 3, 1, " サブシステム名")
	Call ExcelSetCell(MyBook, Target, 7, 1, " プログラムID")
	Call ExcelSetCell(MyBook, Target, 8, 1, "ページ")
	Call ExcelRange(MyBook, Target, 8, 1, 8, 1 )
	Call ExcelHAlign()

	' 2行目
	Call ExcelSetCell(MyBook, Target, 8, 2, "/")
	Call ExcelRange(MyBook, Target, 8, 2, 8, 2 )
	Call ExcelHAlign()

	' 3行目
	Call ExcelSetCell(MyBook, Target, 1, 3, " 画面ID")
	Call ExcelSetCell(MyBook, Target, 3, 3, " 画面名")

	Call ExcelSetCell(MyBook, Target, 7, 3, "作成日")
	Call ExcelRange(MyBook, Target, 7, 3, 7, 3 )
	Call ExcelHAlign()

	Call ExcelSetCell(MyBook, Target, 8, 3, "作成者")
	Call ExcelRange(MyBook, Target, 8, 3, 8, 3 )
	Call ExcelHAlign()

	' 4行目
	Call ExcelRange(MyBook, Target, 7, 4, 7, 4 )
	Call ExcelHAlign()

	Call ExcelRange(MyBook, Target, 8, 4, 8, 4 )
	Call ExcelHAlign()

End Function

' ******************************************************
' セルサイズの設定
' ******************************************************
Function ExcelSize_Plan(MyBook, Target)

	if Target = "概要書" then

		'セルの高さ合わせ
		Call ExcelSetRowHeight(MyBook, Target, 1, 13.50)
		Call ExcelSetRowHeight(MyBook, Target, 2, 24.50)
		Call ExcelSetRowHeight(MyBook, Target, 3, 13.50)
		Call ExcelSetRowHeight(MyBook, Target, 4, 24.50)
		Call ExcelSetRowHeight(MyBook, Target, 5, 24.50)
		Call ExcelSetRowHeight(MyBook, Target, 34, 20.25)

		For i = 6 To 49
			if 6 <= i AND i <= 33then
				Call ExcelSetRowHeight(MyBook, Target, i, 13.50)
			elseif 35 <=  i AND i  <= 44 then
				Call ExcelSetRowHeight(MyBook, Target, i, 24.50)
			elseif 45 <=  i AND i  <= 49 then
				Call ExcelSetRowHeight(MyBook, Target, i, 18.50)
			end if
		Next

		'セルの幅合わせ
		Call ExcelSetColumnWidth(MyBook, Target, 1, 3.50)
		Call ExcelSetColumnWidth(MyBook, Target, 2, 22.38)
		Call ExcelSetColumnWidth(MyBook, Target, 3, 12.38)
		Call ExcelSetColumnWidth(MyBook, Target, 4, 8.25)
		Call ExcelSetColumnWidth(MyBook, Target, 5, 11.50)
		Call ExcelSetColumnWidth(MyBook, Target, 6, 25.00)
		Call ExcelSetColumnWidth(MyBook, Target, 7, 12.00)

	elseif Target = "入力設計書" then

		'セルの高さ合わせ
		Call ExcelSetRowHeight(MyBook, Target, 1, 13.50)
		Call ExcelSetRowHeight(MyBook, Target, 2, 24.50)
		Call ExcelSetRowHeight(MyBook, Target, 3, 13.50)
		Call ExcelSetRowHeight(MyBook, Target, 4, 24.50)
		Call ExcelSetRowHeight(MyBook, Target, 5, 20.25)

		For i = 6 To 38
			if 6 <= i AND i <= 25then
				Call ExcelSetRowHeight(MyBook, Target, i, 24.75)
			elseif 26 <=  i AND i  <= 38 then
				Call ExcelSetRowHeight(MyBook, Target, i, 19.00)
			end if
		Next

		'セルの幅合わせ
		Call ExcelSetColumnWidth(MyBook, Target, 1, 3.50)
		Call ExcelSetColumnWidth(MyBook, Target, 2, 22.38)
		Call ExcelSetColumnWidth(MyBook, Target, 3, 7.50)
		Call ExcelSetColumnWidth(MyBook, Target, 4, 6.00)
		Call ExcelSetColumnWidth(MyBook, Target, 5, 6.00)
		Call ExcelSetColumnWidth(MyBook, Target, 6, 11.50)
		Call ExcelSetColumnWidth(MyBook, Target, 7, 25.00)
		Call ExcelSetColumnWidth(MyBook, Target, 8, 12.00)

	elseif Target = "出力設計書" then

		'セルの高さ合わせ
		Call ExcelSetRowHeight(MyBook, Target, 1, 13.50)
		Call ExcelSetRowHeight(MyBook, Target, 2, 24.50)
		Call ExcelSetRowHeight(MyBook, Target, 3, 13.50)
		Call ExcelSetRowHeight(MyBook, Target, 4, 24.50)
		Call ExcelSetRowHeight(MyBook, Target, 5, 20.25)

		For i = 6 To 38
			if 6 <= i AND i <= 25then
				Call ExcelSetRowHeight(MyBook, Target, i, 24.75)
			elseif 26 <=  i AND i  <= 38 then
				Call ExcelSetRowHeight(MyBook, Target, i, 19.00)
			end if
		Next

		'セルの幅合わせ
		Call ExcelSetColumnWidth(MyBook, Target, 1, 3.50)
		Call ExcelSetColumnWidth(MyBook, Target, 2, 22.38)
		Call ExcelSetColumnWidth(MyBook, Target, 3, 7.50)
		Call ExcelSetColumnWidth(MyBook, Target, 4, 6.00)
		Call ExcelSetColumnWidth(MyBook, Target, 5, 6.00)
		Call ExcelSetColumnWidth(MyBook, Target, 6, 11.50)
		Call ExcelSetColumnWidth(MyBook, Target, 7, 25.00)
		Call ExcelSetColumnWidth(MyBook, Target, 8, 12.00)

	end if

End Function

' ******************************************************
' 罫線の設定
' ******************************************************
Function ExcelLine_Plan(MyBook, Target)

	if Target = "概要書" then
		' BOX罫線
		Call ExcelRange(MyBook, Target, 1, 1, 7, 49 )
		Call ExcelBox(xlContinuous, xlMedium)

		' 上罫線
		Call ExcelRange(MyBook, Target, 1, 2, 7, 2 )
		Call ExcelLine(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 1, 3, 7, 3 )
		Call ExcelLine(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 1, 4, 7, 4 )
		Call ExcelLine(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 1, 5, 7, 5 )
		Call ExcelLine(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 5, 6, 7, 6 )
		Call ExcelLine(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 1, 34, 7, 34 )
		Call ExcelLine(xlContinuous, xlMedium)

		Call ExcelRange(MyBook, Target, 1, 35, 7, 35 )
		Call ExcelLine(xlContinuous, xlMedium)

		for i = 36 to 44
			' 線種→点線, 太さ→標準
			Call ExcelRange(MyBook, Target, 1, i, 7, i )
			Call ExcelLine(xlDot, xlThin)
		Next

		Call ExcelRange(MyBook, Target, 1, 45, 7, 45 )
		Call ExcelLine(xlContinuous, xlMedium)

		for i = 46 to 49
			' 線種→点線, 太さ→標準
			Call ExcelRange(MyBook, Target, 1, i, 7, i )
			Call ExcelLine(xlDot, xlThin)
		Next

		' 右罫線
		Call ExcelRange(MyBook, Target, 1, 35, 1, 44 )
		Call ExcelLineRight(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 4, 3, 4, 33 )
		Call ExcelLineRight(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 5, 1, 5, 4 )
		Call ExcelLineRight(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 6, 1, 6, 4 )
		Call ExcelLineRight(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 2, 34, 2, 44 )
		Call ExcelLineRight(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 3, 34, 3, 44 )
		Call ExcelLineRight(xlContinuous, xlThin)

	elseif Target = "入力設計書" then

		' BOX罫線
		Call ExcelRange(MyBook, Target, 1, 1, 8, 38 )
		Call ExcelBox(xlContinuous, xlMedium)

		' 上罫線
		Call ExcelRange(MyBook, Target, 1, 2, 8, 2 )
		Call ExcelLine(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 1, 3, 8, 3 )
		Call ExcelLine(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 1, 4, 8, 4 )
		Call ExcelLine(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 1, 5, 8, 5 )
		Call ExcelLine(xlContinuous, xlMedium)

		Call ExcelRange(MyBook, Target, 1, 6, 8, 6 )
		Call ExcelLine(xlContinuous, xlMedium)

		for i = 7 to 25
			Call ExcelRange(MyBook, Target, 1, i, 8, i )
			Call ExcelLine(xlDot, xlThin)
		Next

		Call ExcelRange(MyBook, Target, 1, 26, 8, 26 )
		Call ExcelLine(xlContinuous, xlMedium)

		for i = 27 to 38
			Call ExcelRange(MyBook, Target, 1, i, 8, i )
			Call ExcelLine(xlDot, xlThin)
		Next

		' 右罫線
		Call ExcelRange(MyBook, Target, 1, 6, 1, 25 )
		Call ExcelLineRight(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 2, 1, 2, 2 )
		Call ExcelLineRight(1, 2)

		Call ExcelRange(MyBook, Target, 2, 5, 2, 25 )
		Call ExcelLineRight(1, 2)

		Call ExcelRange(MyBook, Target, 3, 5, 3, 25 )
		Call ExcelLineRight(1, 2)

		Call ExcelRange(MyBook, Target, 4, 5, 4, 25 )
		Call ExcelLineRight(1, 2)

		Call ExcelRange(MyBook, Target, 5, 3, 5, 25 )
		Call ExcelLineRight(1, 2)

		Call ExcelRange(MyBook, Target, 6, 1, 6, 25 )
		Call ExcelLineRight(1, 2)

		Call ExcelRange(MyBook, Target, 7, 1, 7, 4 )
		Call ExcelLineRight(1, 2)

	elseif Target = "出力設計書" then

		' BOX罫線
		Call ExcelRange(MyBook, Target, 1, 1, 8, 38 )
		Call ExcelBox(xlContinuous, xlMedium)

		' 上罫線
		Call ExcelRange(MyBook, Target, 1, 2, 8, 2 )
		Call ExcelLine(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 1, 3, 8, 3 )
		Call ExcelLine(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 1, 4, 8, 4 )
		Call ExcelLine(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 1, 5, 8, 5 )
		Call ExcelLine(xlContinuous, xlMedium)

		Call ExcelRange(MyBook, Target, 1, 6, 8, 6 )
		Call ExcelLine(xlContinuous, xlMedium)

		for i = 7 to 25
			Call ExcelRange(MyBook, Target, 1, i, 8, i )
			Call ExcelLine(xlDot, xlThin)
		Next

		Call ExcelRange(MyBook, Target, 1, 26, 8, 26 )
		Call ExcelLine(xlContinuous, xlMedium)

		for i = 27 to 38
			Call ExcelRange(MyBook, Target, 1, i, 8, i )
			Call ExcelLine(xlDot, xlThin)
		Next

		' 右罫線
		Call ExcelRange(MyBook, Target, 1, 6, 1, 25 )
		Call ExcelLineRight(xlDot, xlThin)

		Call ExcelRange(MyBook, Target, 2, 1, 2, 2 )
		Call ExcelLineRight(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 2, 5, 2, 25 )
		Call ExcelLineRight(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 5, 3, 5, 4 )
		Call ExcelLineRight(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 6, 1, 6, 4 )
		Call ExcelLineRight(xlContinuous, xlThin)

		Call ExcelRange(MyBook, Target, 7, 1, 7, 25 )
		Call ExcelLineRight(xlContinuous, xlThin)
	end if

End Function

' ******************************************************
' セルのテキストの設定
' ******************************************************
Function ExcelSetText_Plan(MyBook, Target)

	if Target = "概要書" then

		Call ExcelRange(MyBook, Target, 1, 1, 7, 49 )
		Call ExcelVAlign()

		Call ExcelSetCell(MyBook, Target, 1, 1, " システム名")
		Call ExcelSetCell(MyBook, Target, 3, 1, " サブシステム名")
		Call ExcelSetCell(MyBook, Target, 6, 1, " プログラムID")
		Call ExcelSetCell(MyBook, Target, 1, 3, " プログラム名")
		Call ExcelSetCell(MyBook, Target, 1, 34, " テーブル名")

		Call ExcelSetCell(MyBook, Target, 7, 1, "ページ")
		Call ExcelRange(MyBook, Target, 7, 1, 7, 1 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 7, 2, "/")
		Call ExcelRange(MyBook, Target, 7, 2, 7, 2 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 5, 3, "種別")
		Call ExcelRange(MyBook, Target, 5, 3, 5, 3 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 6, 3, "作成日")
		Call ExcelRange(MyBook, Target, 6, 3, 6, 3 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 7, 3, "作成者")
		Call ExcelRange(MyBook, Target, 7, 3, 7, 3 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 5, 5, "処理概要")
		Call ExcelRange(MyBook, Target, 5, 5, 7, 5 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 3, 34, "入出力")
		Call ExcelRange(MyBook, Target, 3, 34, 3, 34 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 4, 34, "備考")
		Call ExcelRange(MyBook, Target, 4, 34, 7, 34 )
		Call ExcelHAlign()

		for i = 35 to 44
			Call ExcelSetCell(MyBook, Target, 1, i, i - 34)
			Call ExcelRange(MyBook, Target, 1, i, 1, i )

			' 配置
			Call ExcelHAlign()
			' 書式設定
			Call ExcelSetFont("太字", 12)
		next

	elseif Target = "入力設計書" then

		Call ExcelRange(MyBook, Target, 1, 1, 8, 38 )
		Call ExcelVAlign()

		Call ExcelSetCell(MyBook, Target, 1, 1, " システム名")

		Call ExcelSetCell(MyBook, Target, 3, 1, " サブシステム名")

		Call ExcelSetCell(MyBook, Target, 7, 1, " プログラムID")

		Call ExcelSetCell(MyBook, Target, 8, 1, "ページ")
		Call ExcelRange(MyBook, Target, 8, 1, 8, 1 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 8, 2, "/")
		Call ExcelRange(MyBook, Target, 8, 2, 8, 2 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 1, 3, " プログラム名")

		Call ExcelSetCell(MyBook, Target, 6, 3, "種別")
		Call ExcelRange(MyBook, Target, 6, 3, 6, 4 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 7, 3, "作成日")
		Call ExcelRange(MyBook, Target, 7, 3, 7, 4 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 8, 3, "作成者")
		Call ExcelRange(MyBook, Target, 8, 3, 8, 4 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 1, 5, " 項目名")

		Call ExcelSetCell(MyBook, Target, 3, 5, "型式")
		Call ExcelRange(MyBook, Target, 3, 5, 3, 5 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 4, 5, "桁数")
		Call ExcelRange(MyBook, Target, 4, 5, 4, 5 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 5, 5, "I/O")
		Call ExcelRange(MyBook, Target, 5, 5, 5, 5 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 6, 5, "種別")
		Call ExcelRange(MyBook, Target, 6, 5, 6, 5 )
		Call ExcelHAlign()

		For i = 6 to 25
			Call ExcelSetCell(MyBook, Target, 1, i, i - 5 )
			Call ExcelRange(MyBook, Target, 1, i, 1, i )
			Call ExcelHAlign()
		Next

	elseif Target = "出力設計書" then

		Call ExcelRange(MyBook, Target, 1, 1, 8, 38 )
		Call ExcelVAlign()

		Call ExcelSetCell(MyBook, Target, 1, 1, " システム名")

		Call ExcelSetCell(MyBook, Target, 3, 1, " サブシステム名")

		Call ExcelSetCell(MyBook, Target, 7, 1, " プログラムID")

		Call ExcelSetCell(MyBook, Target, 8, 1, "ページ")
		Call ExcelRange(MyBook, Target, 8, 1, 8, 1 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 8, 2, "/")
		Call ExcelRange(MyBook, Target, 8, 2, 8, 2 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 1, 3, " プログラム名")

		Call ExcelSetCell(MyBook, Target, 6, 3, "種別")
		Call ExcelRange(MyBook, Target, 6, 3, 6, 4 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 7, 3, "作成日")
		Call ExcelRange(MyBook, Target, 7, 3, 7, 4 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 8, 3, "作成者")
		Call ExcelRange(MyBook, Target, 8, 3, 8, 4 )
		Call ExcelHAlign()

		Call ExcelSetCell(MyBook, Target, 1, 5, " 列名")

		Call ExcelSetCell(MyBook, Target, 3, 5, " 更新説明")

		Call ExcelSetCell(MyBook, Target, 8, 5, "対象")
		Call ExcelRange(MyBook, Target, 8, 5, 8, 5 )
		Call ExcelHAlign()

		For i = 6 to 25
			Call ExcelSetCell(MyBook, Target, 1, i, i - 5 )
			Call ExcelRange(MyBook, Target, 1, i, 1, i )
			Call ExcelHAlign()
		Next

	end if

End Function

' ******************************************************
' ヘッダー,余白の指定
' ******************************************************
Function Format_Page(MyBook)

	on error resume next
	With MyBook.ActiveSheet.PageSetup
		.CenterHeader = "&18&A"
		.LeftMargin = ExcelApp.InchesToPoints(0.393700787401575)
		.RightMargin = ExcelApp.InchesToPoints(0.196850393700787)
		.TopMargin = ExcelApp.InchesToPoints(0.551181102362205)
		.BottomMargin = ExcelApp.InchesToPoints(0.393700787401575)
		.HeaderMargin = ExcelApp.InchesToPoints(0.196850393700787)
		.FooterMargin = ExcelApp.InchesToPoints(0.196850393700787)
	End With
	on error goto 0

End Function
</SCRIPT>
</JOB>




posted by at 2019-02-11 10:45 | VBScript | このブログの読者になる | 更新情報をチェックする

テーブル設計書作成 : VBScript + Excel.Application + SQLServer

『作成される Excel ブック』のコメントの下で、table_spec_ss.xlsx となっていますが、拡張子を .xls で作成するには Call CreateBook.SaveAs( BookPath ) を Call CreateBook.SaveAs( BookPath, 56 ) に変更する必要があります

※ 実行はコマンドプロンプトから、cscript table-spec.wsf として下さい。
※ Excel でテーブル設計書を作成する部分は他のデータベースでも可能ですが、それ用の SQL を考える必要があります。

関連する記事

VBScript : Excel の新しいBookを作成する
SQLExpress 2005( および 2008 ) の接続設定

1) 対象テーブルリストにテーブル名を列挙する
<RESOURCE id="TableList">
 
社員マスタ
商品マスタ
 
</RESOURCE>

2) table_spec_ss.xls が作成される Excel ブックです
   実行毎に上書きされるので注意して下さい

3) 作成される場所は、このスクリプトが置かれているディレクトリです

4) データベース接続情報には、自分の環境を記述してください
' **********************************************************
' データベース接続情報
' **********************************************************
strSERVER = ".\sqlexpress"
strDATABASE = "lightbox"
strUSER = "sa"
strPASS = "password"

5) Excel に対する処理経過を見たい場合は
   ExcelApp.Visible = True にして下さい

6) strSystemName を変更してタイトルの「システム名」を変更

7) strSubName を変更してタイトルの「サブシステム名」を変更

8) xlPaperB4 は B4 フォーマットです
table-spec.wsf
<JOB>
<RUNTIME>
<DESCRIPTION>
*******************************************************************
 プログラム名 : SQLServer 用表情報のレポート (複数実行)
*******************************************************************
</DESCRIPTION>
<EXAMPLE>

引数無し
</EXAMPLE>
</RUNTIME>

<COMMENT>
************************************************************
 対象テーブルリスト
************************************************************
</COMMENT>
<RESOURCE id="TableList">

社員マスタ
商品マスタ

</RESOURCE>

<COMMENT>
************************************************************
 オブジェクト定義
************************************************************
</COMMENT>
<REFERENCE object="ADODB.Connection" />
<OBJECT id="Cn" progid="ADODB.Connection" />
<OBJECT id="Rs" progid="ADODB.Recordset" />
<OBJECT id="ExcelApp" progid="Excel.Application" />
<OBJECT id="WshShell" progid="WScript.Shell" />
<OBJECT id="Fso" progid="Scripting.FileSystemObject" />

<COMMENT>
************************************************************
 外部スクリプト定義
************************************************************
</COMMENT>

<COMMENT>
************************************************************
 カレントスクリプト
************************************************************
</COMMENT>

<SCRIPT language=VBScript>

Dim str,strMessage,Target,strCurDir

' **********************************************************
' 作成される Excel ブック
' **********************************************************
Target = "table_spec_ss.xlsx"
strCurDir = WScript.ScriptFullName
strCurDir = Replace( strCurDir, WScript.ScriptName, "" )
Target = strCurDir & Target

Dim strSERVER,strDATABASE,strUSER,strPASS

' **********************************************************
' データベース接続情報
' **********************************************************
strSERVER = ".\sqlexpress"
strDATABASE = "lightbox"
strUSER = "sa"
strPASS = "password"

' **********************************************************
' コマンドプロンプトより起動される為の処理
' **********************************************************
str = WScript.FullName
str = Right( str, 11 )
str = Ucase( str )
if str <> "CSCRIPT.EXE" then
	strMessage = "コマンドプロンプトより cscript " & WScript.ScriptFullName
	strMessage = strMessage & " と指定して実行して下さい   " & vbCrLf & vbCrLf
	strMessage = strMessage & "( この文字列をクリップボードにコピーしたい場合は"
	strMessage = strMessage & " ctrl+c です )"
	WScript.Echo strMessage
	WScript.Quit
end if

' **********************************************************
' Excel 用定数
' **********************************************************
' https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.office.interop.excel.xlpapersize?view=excel-pia
Const xlPaperB4 = 12

Const xlContinuous = 1
Const xlDash = -4115
Const xlDashDot = 4
Const xlDashDotDot = 5
Const xlDot = -4118
Const xlDouble = -4119
Const xlSlantDashDot = 13
Const xlLineStyleNone = -4142

Const xlHairline = 1
Const xlMedium = -4138
Const xlThick = 4
Const xlThin = 2

Const xlInsideHorizontal = 12
Const xlInsideVertical = 11
Const xlDiagonalDown = 5
Const xlDiagonalUp = 6
Const xlEdgeBottom = 9
Const xlEdgeLeft = 7
Const xlEdgeRight = 10
Const xlEdgeTop = 8

Const xlAutomatic = -4105

Const xlMaximized = -4137
Const xlMinimized = -4140
Const xlNormal = -4143

Const xlGeneral = 1
Const xlLeft = -4131
Const xlCenter = -4108
Const xlRight = -4152
Const xlFill = 5
Const xlJustify = -4130
Const xlCenterAcrossSelection = 7
Const xlDistributed = -4117
Const xlTop = -4160
Const xlBottom = -4107

Dim aTable,Result,Query,Query2,nCnt,strCol,aCol,nRows,nRowHeight
Dim MyBook,bAction,strSystemName,strSubName
Dim nColX,nColY,strSheetName,strBaseSheet
Dim aData

ExcelApp.Visible = False
strBaseSheet = "テーブル設計雛形"
strSystemName = "販売管理システム"
strSubName = "売上管理"
Query = "sp_columns "

' **********************************************************
' Excel 初期処理
' **********************************************************
aTable = Split( getResource("TableList"), vbCrLf )

' **********************************************************
' ブック作成
' **********************************************************
Set MyBook = CreateBook(Target)
if not IsObject( MyBook ) then
	' 初期処理エラーの為、直接終了
	ExcelApp.Quit
	' エラーメッセージの表示
	Wscript.Echo MyBook
	Wscript.Quit
end if

' **********************************************************
' DB 接続
' **********************************************************
Result = SQS_DBConnect( Cn, strSERVER, strDATABASE, strUSER, strPASS )
if Result <> "" then
	Wscript.Echo Result
	Wscript.Quit
end if

' **********************************************************
' 読み出し
' **********************************************************
Wscript.Echo "処理を開始しました。しばらくお待ち下さい"
bAction = False
For i = 0 to Ubound( aTable )
	if Trim( aTable(i) ) <> "" then
		if DBGet( Cn, Rs, Query & Ss( aTable(i) ), False ) then
			' ************************************************
			' Excel 処理
			' ************************************************
			nColX = 2
			nColY = 6
			if not bAction then
				bAction = True
				Call AddSheetLast( MyBook, strBaseSheet )
				Call DeleteSheet(MyBook,"Sheet1" )
				Call ColumnInit(MyBook,strBaseSheet)
				Wscript.Echo strBaseSheet & " を追加しました"
			end if
			strSheetName = ExcelCopySheet( MyBook, strBaseSheet, aTable(i) )
			strSaveSheetName = strSheetName
			Call ExcelSetCell(MyBook, strSheetName, 2, 2, strSystemName )
			Call ExcelSetCell(MyBook, strSheetName, 4, 2, strSubName )
			Call ExcelSetCell(MyBook, strSheetName, 10, 2, aTable(i) )
			Call ExcelSetCell(MyBook, strSheetName, 2, 4, aTable(i) )

			nCnt = 1
			nRowCnt = 1
			nSheetCount = 1
			Redim aData(0)
			Do While not Rs.EOF
				Redim Preserve aData(nCnt)
				aData(nCnt) = Rs.Fields("COLUMN_NAME").value & ""
				' ************************************************
				' Excel 処理
				' ************************************************
				Call ExcelSetCell(MyBook, strSheetName, nColX, nColY, Rs.Fields("COLUMN_NAME").value & "")
				Call ExcelSetCell(MyBook, strSheetName, nColX+2, nColY, Ucase(Rs.Fields("TYPE_NAME").value & "") )
				if Ucase( Rs.Fields("TYPE_NAME").value & "" ) = "VARCHAR" or _
					Ucase( Rs.Fields("TYPE_NAME").value & "" ) = "CHAR" or _
					Ucase( Rs.Fields("TYPE_NAME").value & "" ) = "NVARCHAR"or _ 
					Ucase( Rs.Fields("TYPE_NAME").value & "" ) = "NCHAR" then
					Call ExcelSetCell(MyBook, strSheetName, nColX+3, nColY, Rs.Fields("PRECISION").value & "")
				end if
				if Ucase( Rs.Fields("TYPE_NAME").value & "" ) = "DECIMAL" then
					Call ExcelSetCell(MyBook, strSheetName, nColX+3, nColY, Rs.Fields("PRECISION") & "")
					Call ExcelSetCell(MyBook, strSheetName, nColX+4, nColY, Rs.Fields("SCALE").value & "")
				end if
				nColY = nColY + 1

				Rs.MoveNext
				nCnt = nCnt + 1
				nRowCnt = nRowCnt + 1
				if nRowCnt > 65 then
					nRowCnt = 1
					nColX = 2
					nColY = 6
					nSheetCount = nSheetCount + 1
					strSheetName = ExcelCopySheet( MyBook, strBaseSheet, aTable(i) & "(" & nSheetCount & ")" )
					Call ExcelSetCell(MyBook, strSheetName, 2, 4, aTable(i) )
				end if
			Loop
			strSheetName = strSaveSheetName

			Result = ""
			Query2 = "sp_helpindex "
			if DBGet( Cn, Rs, Query2 & Ss( aTable(i) ), False ) then
				Do While not Rs.EOF
					if Left( Rs.Fields("index_name").value & "", 1 ) <> "_" then
						if InStr( Rs.Fields("index_description").value & "" , "primary key" ) > 0 then

							nCnt = 1
							strCol = Rs.Fields("index_keys").value & ""
							aCol = Split( strCol, ", " )

							For j = 0 to Ubound( aCol )
								For k = 1 to Ubound( aData )
									if aCol( j ) = aData( k ) then
										Call ExcelSetCell(MyBook, strSheetName, 11, 5 + k, j + 1 )
									end if
								Next
							Next

							Exit Do

						end if

					end if
					Rs.MoveNext
				Loop
			end if

			Wscript.Echo strSheetName & " を追加しました"
		end if
	end if

Next


' **********************************************************
' 接続解除
' **********************************************************
Call DBClose( Rs )
Call DBClose( Cn )

' **********************************************************
' 処理終了
' **********************************************************
Call ExcelSave(MyBook)
Call ExcelQuit(MyBook)

Wscript.Echo "処理が完了しました"

Call ExcelLoad(Target)


' **********************************************************
' Excel 出力用 初期処理
' **********************************************************
Function ColumnInit(MyBook,SheetName)

	' 行数
	nRows = 65
	nRowHeight = 13.5

	Call Format_Table(MyBook,SheetName)
	Call Format_Page(MyBook)

End Function

' **********************************************************
' Excel 処理関数
' **********************************************************
' ******************************************************
' シート名によるシート複写
' ******************************************************
Function ExcelCopySheet(MyBook, strSheetName, strNewSheetName)

	MyBook.Sheets(strSheetName).Copy (MyBook.Sheets(strSheetName))

	on error resume next
	MyBook.ActiveSheet.Name = strNewSheetName
	on error goto 0

	ExcelCopySheet = MyBook.ActiveSheet.Name

End Function

' ************************************************
' Excel ブック作成
' ************************************************
function CreateBook(BookPath)

	ExcelApp.DisplayAlerts = False

	ExcelApp.Workbooks.Add
	nBooks = ExcelApp.Workbooks.Count
	Set CreateBook = ExcelApp.Workbooks( nBooks )
	CreateBook.Activate

	on error resume next
	Call CreateBook.SaveAs( BookPath )
	if Err.Number <> 0 then
		CreateBook = "ERROR:" & Err.Description
	end if
	on error goto 0

End Function

' ******************************************************
' 終了
' ******************************************************
Function ExcelQuit(WorkBook)

	If TypeName(WorkBook) = "Workbook" Then
		' 保存した事にする
		WorkBook.Saved = True
	End If
	If IsObject(ExcelApp) Then
		ExcelApp.Quit
	End If

End Function

' ******************************************************
' セルへのデータセット
' ******************************************************
Function ExcelSetCell(MyBook, strSheetName, x, y, Data)

	MyBook.Sheets(strSheetName).Cells(y, x) = Data

End Function

' ******************************************************
' 先頭にシートを追加
' ******************************************************
function AddSheetTop( MyBook, SheetName )

	Dim Worksheet
	Dim Worksheet2

	Set Worksheet = MyBook.Worksheets( 1 )
	Worksheet.Activate
	Workbook.Worksheets.Add
	Set Worksheet2 = Workbook.ActiveSheet
	on error resume next
	Worksheet2.Name = SheetName
	on error goto 0

	AddSheetTop = Worksheet2.Name

end function

' ******************************************************
' 最後にシートを追加
' ******************************************************
function AddSheetLast( MyBook, SheetName )

	Dim Worksheet
	Dim Worksheet2
	Dim nSheets

	nSheets = MyBook.Worksheets.Count
	Set Worksheet = MyBook.Worksheets( nSheets )
	Worksheet.Activate
	Call MyBook.Worksheets.Add(,Worksheet)
	Set Worksheet2 = MyBook.ActiveSheet
	on error resume next
	Worksheet2.Name = SheetName
	on error goto 0

	AddSheetLast = Worksheet2.Name

end function

' ******************************************************
' Excel 実行 ( NT5.0 以上 )
' ******************************************************
Function ExcelLoad(strPath)

	Call WshShell.Run( "RunDLL32.EXE shell32.dll,ShellExec_RunDLL " & _
		strPath )

End Function

' ******************************************************
' 上書き保存
' ******************************************************
Function ExcelSave(MyBook)

	MyBook.Save

End Function

' ******************************************************
' シートを削除
' ******************************************************
function DeleteSheet( MyBook, SheetName )

	Dim Worksheet

	Set Worksheet = MyBook.Worksheets( SheetName )

	on error resume next
	Worksheet.Delete
	on error goto 0

end function

' ******************************************************
' 指定行の高さを設定
' ******************************************************
Function ExcelSetRowHeight(MyBook, strSheetName, row, Height)

	MyBook.Sheets(strSheetName).Rows(row).RowHeight = _
	Height

End Function

' ******************************************************
' 指定列の幅を設定
' ******************************************************
Function ExcelSetColumnWidth(MyBook, strSheetName, column, Width)

	Dim strColumn

	strColumn = Chr(Asc("A") + column - 1)

	MyBook.Sheets(strSheetName).Columns(strColumn).ColumnWidth = _
	Width

End Function

' ******************************************************
' 範囲選択
' ******************************************************
Function ExcelRange(MyBook, strSheetName, nX1, nY1, nX2, nY2 )

	Dim Sheet,strRange

	Set Sheet = MyBook.Sheets(strSheetName)
	Sheet.Select
	strRange = Chr(Asc("A") + nX1 - 1) & nY1 & ":"
	strRange = strRange & Chr(Asc("A") + nX2 - 1) & nY2
	Sheet.Range(strRange).Select

End Function

' ******************************************************
' 範囲の上に罫線
' ******************************************************
Function ExcelLine( nLineType, nWeight )

	With ExcelApp.Selection.Borders(xlEdgeTop)
		.LineStyle = nLineType
		.ColorIndex = xlAutomatic
		.Weight = nWeight
	End With

End Function

' ******************************************************
' 範囲の右に罫線(*追加*)
' ******************************************************
Function ExcelLineRight( nLineType, nWeight )

	With ExcelApp.Selection.Borders(xlEdgeRight)
		.LineStyle = nLineType
		.ColorIndex = xlAutomatic
		.Weight = nWeight
	End With

End Function

' ******************************************************
' 範囲に罫線
' ******************************************************
Function ExcelBox( nLineType, nWeight )

	With ExcelApp.Selection.Borders(xlEdgeTop)
		.LineStyle = nLineType
		.ColorIndex = xlAutomatic
		.Weight = nWeight
	End With
	With ExcelApp.Selection.Borders(xlEdgeLeft)
		.LineStyle = nLineType
		.ColorIndex = xlAutomatic
		.Weight = nWeight
	End With
	With ExcelApp.Selection.Borders(xlEdgeRight)
		.LineStyle = nLineType
		.ColorIndex = xlAutomatic
		.Weight = nWeight
	End With
	With ExcelApp.Selection.Borders(xlEdgeBottom)
		.LineStyle = nLineType
		.ColorIndex = xlAutomatic
		.Weight = nWeight
	End With

End Function

' ******************************************************
' 文字列の横位置を指定(*追加*)
' ******************************************************
Function ExcelHAlign()

	ExcelApp.Selection.HorizontalAlignment = xlCenterAcrossSelection

End Function
Function ExcelHAlign2()

	ExcelApp.Selection.HorizontalAlignment = xlCenter

End Function

' ******************************************************
' 文字列の縦位置を指定(*追加*)
' ******************************************************
Function ExcelVAlign()

	ExcelApp.Selection.VerticalAlignment = xlCenter

End Function

' ******************************************************
' シート名によるシート選択
' ******************************************************
Function ExcelSelectSheet(MyBook, strSheetName)

	MyBook.Sheets(strSheetName).Select

End Function

' ******************************************************
' テーブル設計書用フォーマット
' ******************************************************
Function Format_Table(MyBook,SheetName)

	'テーブル設計書フォーマット作成
	Call ExcelSelectSheet(MyBook, SheetName)
'	Call Format_Page(MyBook)

	Call ExcelSize_Table(MyBook, SheetName)
	Call ExcelLine_Table(MyBook, SheetName)
	Call ExcelSetText_Table(MyBook, SheetName)

End Function

' ******************************************************
' セルサイズの設定
' ******************************************************
Function ExcelSize_Table(MyBook, Target)

	Dim i

	'セルの高さ合わせ
	Call ExcelSetRowHeight(MyBook, Target, 1, 13.50)
	Call ExcelSetRowHeight(MyBook, Target, 2, 24.50)
	Call ExcelSetRowHeight(MyBook, Target, 3, 13.50)
	Call ExcelSetRowHeight(MyBook, Target, 4, 24.50)
	Call ExcelSetRowHeight(MyBook, Target, 5, 20.25)

	For i = 6 To nRows + 5
		Call ExcelSetRowHeight(MyBook, Target, i, nRowHeight)
	Next

	'セルの幅合わせ
	Call ExcelSetColumnWidth(MyBook, Target, 1, 3.50)
	Call ExcelSetColumnWidth(MyBook, Target, 2, 27.00)
	Call ExcelSetColumnWidth(MyBook, Target, 3, 0.75)
	Call ExcelSetColumnWidth(MyBook, Target, 4, 15.00)
	Call ExcelSetColumnWidth(MyBook, Target, 5, 4.50)
	Call ExcelSetColumnWidth(MyBook, Target, 6, 3.00)
	Call ExcelSetColumnWidth(MyBook, Target, 7, 0.75)
	Call ExcelSetColumnWidth(MyBook, Target, 8, 13.50)
	Call ExcelSetColumnWidth(MyBook, Target, 9, 0.75)
	Call ExcelSetColumnWidth(MyBook, Target, 10, 24.00)
	Call ExcelSetColumnWidth(MyBook, Target, 11, 12.00)

End Function

' ******************************************************
' 罫線の設定
' ******************************************************
Function ExcelLine_Table(MyBook, Target)

	Dim i

	' BOX罫線
	Call ExcelRange(MyBook, Target, 1, 1, 11, nRows + 5 )
	Call ExcelBox(xlContinuous, xlMedium)

	' 上罫線
	Call ExcelRange(MyBook, Target, 1, 2, 11, 2 )
	Call ExcelLine(xlDot, xlThin)

	Call ExcelRange(MyBook, Target, 1, 3, 11, 3 )
	Call ExcelLine(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 1, 4, 11, 4 )
	Call ExcelLine(xlDot, xlThin)

	Call ExcelRange(MyBook, Target, 1, 5, 11, 5 )
	Call ExcelLine(xlContinuous, xlMedium)

	Call ExcelRange(MyBook, Target, 1, 6, 11, 6 )
	Call ExcelLine(xlContinuous, xlMedium)

	for i = 7 to nRows + 5
		Call ExcelRange(MyBook, Target, 1, i, 11, i )
		Call ExcelLine(xlDot, xlThin)
	Next

	' 右罫線
	Call ExcelRange(MyBook, Target, 1, 6, 1, nRows + 5 )
	Call ExcelLineRight(xlDot, xlThin)

	Call ExcelRange(MyBook, Target, 2, 1, 2, 2 )
	Call ExcelLineRight(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 2, 5, 2, nRows + 5 )
	Call ExcelLineRight(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 4, 5, 4, nRows + 5 )
	Call ExcelLineRight(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 5, 6, 5, nRows + 5 )
	Call ExcelLineRight(xlDot, xlThin)

	Call ExcelRange(MyBook, Target, 6, 3, 6, nRows + 5 )
	Call ExcelLineRight(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 8, 1, 8, 4 )
	Call ExcelLineRight(xlContinuous, xlThin)

	Call ExcelRange(MyBook, Target, 10, 1, 10, nRows + 5 )
	Call ExcelLineRight(xlContinuous, xlThin)

End Function

' ******************************************************
' セルのテキストの設定
' ******************************************************
Function ExcelSetText_Table(MyBook, Target)

	Dim i

	Call ExcelRange(MyBook, Target, 1, 1, 7, 49 )
	Call ExcelVAlign()

	' 1行目
	Call ExcelSetCell(MyBook, Target, 1, 1, " システム名")

	Call ExcelSetCell(MyBook, Target, 3, 1, " サブシステム名")

	Call ExcelSetCell(MyBook, Target, 9, 1, " テーブルID")
	Call ExcelRange(MyBook, Target, 9, 1, 10, 1 )
	Call ExcelHAlign()
	Call ExcelRange(MyBook, Target, 9, 2, 10, 1 )
	Call ExcelVAlign()

	Call ExcelSetCell(MyBook, Target, 11, 1, "ページ")
	Call ExcelRange(MyBook, Target, 11, 1, 11, 1 )
	Call ExcelHAlign()
	Call ExcelRange(MyBook, Target, 11, 2, 11, 2 )
	Call ExcelHAlign()
	Call ExcelRange(MyBook, Target, 11, 2, 11, 2 )
	Call ExcelVAlign()

	' 2行目
	Call ExcelSetCell(MyBook, Target, 11, 2, "/")
	Call ExcelRange(MyBook, Target, 11, 2, 11, 2 )

	' 3行目
	Call ExcelSetCell(MyBook, Target, 1, 3, " テーブル名")

	Call ExcelSetCell(MyBook, Target, 7, 3, "種別")
	Call ExcelRange(MyBook, Target, 7, 3, 8, 3 )
	Call ExcelHAlign()

	Call ExcelSetCell(MyBook, Target, 9, 3, "作成日")
	Call ExcelRange(MyBook, Target, 9, 3, 10, 3 )
	Call ExcelHAlign()

	Call ExcelSetCell(MyBook, Target, 11, 3, "作成者")
	Call ExcelRange(MyBook, Target, 11, 3, 11, 3 )
	Call ExcelHAlign()

	' 4行目
	Call ExcelRange(MyBook, Target, 8, 4, 8, 4 )
	Call ExcelHAlign2()
	Call ExcelVAlign()

	Call ExcelRange(MyBook, Target, 10, 4, 10, 4 )
	Call ExcelHAlign2()
	Call ExcelVAlign()

	Call ExcelRange(MyBook, Target, 11, 4, 11, 4 )
	Call ExcelHAlign2()
	Call ExcelVAlign()

	' 5行目
	Call ExcelSetCell(MyBook, Target, 1, 5, " 列名")

	Call ExcelSetCell(MyBook, Target, 3, 5, "データ型")
	Call ExcelRange(MyBook, Target, 3, 5, 4, 5 )
	Call ExcelHAlign()

	Call ExcelSetCell(MyBook, Target, 5, 5, "サイズ")
	Call ExcelRange(MyBook, Target, 5, 5, 6, 5 )
	Call ExcelHAlign()

	Call ExcelSetCell(MyBook, Target, 7, 5, " 説明")

	Call ExcelSetCell(MyBook, Target, 11, 5, "主キー")
	Call ExcelRange(MyBook, Target, 11, 5, 11, 5 )
	Call ExcelHAlign()
	Call ExcelVAlign()

	for i = 6 to nRows + 5
		Call ExcelSetCell(MyBook, Target, 1, i, i - 5)
		Call ExcelRange(MyBook, Target, 1, i, 1, i )
		Call ExcelHAlign()
		Call ExcelRange(MyBook, Target, 11, i, 11, i )
		Call ExcelHAlign()
	next

	Call ExcelRange(MyBook, Target, 1, 1, 1, 1 )

End Function

' ******************************************************
' ヘッダー,余白の指定
' ******************************************************
Function Format_Page(MyBook)

	on error resume next

	With MyBook.ActiveSheet.PageSetup
		.CenterHeader = "&18&A"
		.PaperSize = xlPaperB4
'		.LeftMargin = ExcelApp.InchesToPoints(0.393700787401575)
'		.RightMargin = ExcelApp.InchesToPoints(0.196850393700787)
'		.TopMargin = ExcelApp.InchesToPoints(0.551181102362205)
'		.BottomMargin = ExcelApp.InchesToPoints(0.393700787401575)
'		.HeaderMargin = ExcelApp.InchesToPoints(0.196850393700787)
'		.FooterMargin = ExcelApp.InchesToPoints(0.196850393700787)
	End With

	on error goto 0

End Function

' ******************************************************
' シングルクォートで囲む
' ******************************************************
Function Ss( strValue )

	Ss = "'" & strValue & "'"

End Function

' ******************************************************
' DB接続(SQLServer)
' ******************************************************
Function SQS_DBConnect( _
	Connection, _
	Server, _
	DB, _
	User, _
	Pass _
)

	Dim ConnectionString

	ConnectionString = _
		"Provider=SQLOLEDB;" & _
		"Data Source=" & Server & ";" & _
		"Initial Catalog=" & DB & ";" & _
		"User ID=" & User & ";" & _
		"Password=" & Pass & ";"
	
	if IsEmpty( Connection ) then
		Set Connection = CreateObject( "ADODB.Connection" )
	end if

	on error resume next
	Connection.Open ConnectionString
	if Err.Number <> 0 then
		SQS_DBConnect = "ERROR:" & Err.Description
	else
		SQS_DBConnect = ""
	end if
	on error goto 0

End Function

' ******************************************************
' DB終了処理(接続を閉じる)
' ******************************************************
Function DBClose( _
	CnRs _
)
	
	On Error Resume Next
	If CnRs.State >= 1 Then
		CnRs.Close
	End If
	On Error Goto 0

	DBClose = True

End Function

' ******************************************************
' DB読込み
' 【戻り値】: True(データ有り),False(データ無し)
' ******************************************************
Function DBGet( _
	Connection, _
	Record, _
	SqlQuery, _
	bUpadateFlg _
)
	if IsEmpty( Record ) then
		Set Record = CreateObject( "ADODB.Recordset" )
	end if

	Dim ConstCheck

	' 閉じていない時は閉じる
	If Record.State >= 1 Then
		Record.Close
	End If

	' 更新処理に使用する場合は、レコード単位の共有的ロック
	If bUpadateFlg Then
		ConstCheck = adLockOptimistic
		if IsEmpty( ConstCheck ) then
			Record.LockType = 3
		else
			Record.LockType = adLockOptimistic
		end if
	else
		ConstCheck = adLockOptimistic
		if IsEmpty( ConstCheck ) then
			Record.LockType = 1
		else 
			Record.LockType = adLockReadOnly
		end if
	End If
	
	' レコードセット作成
	Record.Open SqlQuery, Connection
	If Record.State >= 1 Then
		If Record.EOF Then
			DBGet = False
		Else
			DBGet = True
		End If
	else
		DBGet = False
	end if

End Function

</SCRIPT>
</JOB>





posted by at 2019-02-11 10:11 | DB関連 | このブログの読者になる | 更新情報をチェックする

2019年01月11日

VBScript : CAPICOM を使った通常文字列の Base64エンコードと SHA1 と MD5 と SHA256/384/512

Windows10 でCAPICOM.Utilities を使用するには、こちらからダウンロードしてインストールが必要です。

但し 32 ビットでインストールされるので、VBScript で実行する際に、『C:\Windows\SysWOW64\cscript.exe』で実行する必要があります。
( または C:\Windows\SysWOW64\wscript.exe )

ドキュメント

以下の方法と同様で、バイナリファイルの変換に使う事が可能です。(PHPの文字列はバイナリ扱いです)

結果は PHP の関数で同じになる事を確かめています。
( php -r "print hash('sha256','変換する文字列');" )

変換する種類は、こちらの定数を使用します(HashedData.Algorithm)( VBscript で最後に小文字に変換してますが、PHP の結果と合わす為です )

Base64 の変換では、本来良く使われて来た用途としてバイナリデータのテキスト表現で、メールの添付ファイルに使用する際に改行を含めて76文字になるようになっています。CAPIUtil.Base64Encode の仕様もそうなっているので、PHP と比較する為に、ここではわざわざ改行を取り除いています。

それと、CAPICOM.HashedData で作成したオブジェクトを使いまわすとエラーになる事があったので、毎回作成して処理しました。
Set CAPIUtil = Wscript.CreateObject( "CAPICOM.Utilities" )
Set Stream = Wscript.CreateObject("ADODB.Stream")
Set StreamBin = Wscript.CreateObject("ADODB.Stream")

'***********************************
' Base64
'***********************************
Stream.Open
Stream.Charset = "shift_jis"
' shift_jis で入力文字を書き込む
Stream.WriteText "日本語表示OK日本語表示OK日本語表示OK日本語表示OK日本語表示OK"
Stream.Position = 0

' バイナリで開く
StreamBin.Open
StreamBin.Type = 1

' テキストをバイナリに変換
Stream.CopyTo StreamBin
Stream.Close

' 読み込みの為にデータポインタを先頭にセット
StreamBin.Position = 0

str = CAPIUtil.ByteArrayToBinaryString( StreamBin.Read )
str2 = CAPIUtil.Base64Encode( str )
' ' 長い文字列は仕様として、(\r\n を含めて 76文字で) 改行されます
str2 = Replace(str2,vbCrLf,"")

Wscript.Echo str2

'***********************************
' SHA1,SHA256,SHA384,SHA512 と MD5
'***********************************
' SHA1
Set HashedData = Wscript.CreateObject( "CAPICOM.HashedData" )
HashedData.Algorithm = 0
HashedData.Hash(str)

Wscript.Echo LCase(HashedData.Value)

' SHA256
Set HashedData = Wscript.CreateObject( "CAPICOM.HashedData" )
HashedData.Algorithm = 4
HashedData.Hash(str)

Wscript.Echo LCase(HashedData.Value)

' SHA384
Set HashedData = Wscript.CreateObject( "CAPICOM.HashedData" )
HashedData.Algorithm = 5
HashedData.Hash(str)

Wscript.Echo LCase(HashedData.Value)

' SHA512
Set HashedData = Wscript.CreateObject( "CAPICOM.HashedData" )
HashedData.Algorithm = 6
HashedData.Hash(str)

Wscript.Echo LCase(HashedData.Value)

' MD5
Set HashedData = Wscript.CreateObject( "CAPICOM.HashedData" )
HashedData.Algorithm = 3
HashedData.Hash(str)

Wscript.Echo LCase(HashedData.Value)







posted by at 2019-01-11 16:41 | VBScript | このブログの読者になる | 更新情報をチェックする

2019年01月08日

BEASTARS 11 : 決着ついた




いろんな事に決着付いて『しまった』と言わざるを得ない展開で溜息が出た。

ここからどうなるのかは想像も付かないけれど、レゴシが主役でルイが戻って来た以上どこかへ向かって物語は狼煙を上げるんだろうなぁ...

世の中も、自分的にもこれから数年は大きな変化が起きる事が『決まっている』だけに、とても感慨深いお話でした。


凄い・すごい・スゴイ





posted by at 2019-01-08 22:20 | 漫画 | このブログの読者になる | 更新情報をチェックする

2019年01月05日

DAZ3D : このブログのタイトル画像の Iray 化 ( 元は 3Delight )

Iray 化したからといって、良くなるとは限らないですね。



もうちょっとライティングで明暗のメリハリが必要ですね。




仕方無いので、カメラ位置変えて髪を風で流れるようにしてごまかしました






posted by at 2019-01-05 01:07 | Iray DAZ3D DAZStudio イラスト | このブログの読者になる | 更新情報をチェックする

DAZ3D : ツリーハウスの夜

プロトタイプ

ツリーハウスのプロダクトですが、たしか無料で手にいれたものでおせじにも『良いもの』とは言えないのですが、Iray 使った夜の照明ならいろいろごまかせるだろうとやってみました。



これはこれでいいんですが、雰囲気の比較の為に GIMP でスクリーンで明るくしたのが以下の画像。



この時点では木のテクスチャがさすがにちょっとクオリティが悪いです。背景は森の hdri を暗〜〜くして他のプロダクトの街灯みたいなのをくっつけてエミッションでライティングしてます。全体の明るさ調整に球を頭上において Emission でライト化して照明として使用しています。

以下の画像だと、背景の HDRI の様子がより解ります。



イラストAC に投稿したもの



投稿にあたって、壁と扉のシェーダを変更して、基本的な明るさを少し上げています。それでも暗いのは暗いですが、壁紙として使うぶんにはこのくらいでもいいはずです。

猫のポーズテスト



猫のプロダクト(Millennium Cat)は古いものなので、猫単体ではなかなかしんどいので、風景の中に溶け込ませる事をテストしたシーンです。早くに購入していたのになかなか試す機会が無かった専用の拡張ポーズ(Purrfect Poses for the Millennium Cat)のお試しです。





posted by at 2019-01-05 00:41 | Iray DAZ3D DAZStudio イラスト | このブログの読者になる | 更新情報をチェックする

2019年01月04日

Seesaa(またはさくらのブログ) の記事の一括編集内で、各種の設定を一括変更する為のブックマークレット

※ さくらのブログに広告の表示はありません

一括編集状態で実行する必要があります




Sessaa 一括変更

一括編集タブで使用します。検索結果でもいいですし、単純に200件表示でもいいです。

カテゴリの一括変更では、記事一覧を検索で絞ってから一括変更するといいと思います。カテゴリ番号は、そのカテゴリを表示した時の URL の最後の文字列( 例 : 7154748-1.html )のハイフン以降を除いた数字です。
( カテゴリID を数字に変更してカテゴリ変更をクリックします )


javascript:var wnd=document.createElement('iframe');wnd.setAttribute('id','if');wnd.frameBorder=0;document.body.appendChild(wnd);wnd.contentWindow.document.write('<script src=\'https://winofsql.jp/s01.js\' charset=\'shift_jis\'></script>')

// plugin Bookmarklet
// by lightbox

parent.document.getElementById("if").style.position='absolute';
parent.document.getElementById("if").style.width='300px';
parent.document.getElementById("if").style.height='34px';
parent.document.getElementById("if").style.left='0px';
parent.document.getElementById("if").style.top='0px';
parent.document.getElementById("if").style.zIndex=100;
var sLocation = parent.location.host;
var sUrl = parent.location.href;
var doc = parent.document;
var tds = doc.getElementsByTagName("form");
var len = tds.length;
var cnt = 0;
var add = null;
for( i = 0; i < len; i++ ) {
	if ( tds[i].name == 'search_form' ) {
//		cnt++;
//		if ( cnt == 2 ) {
			add = tds[i];
//		}
	}
}
var place = doc.createElement('div');
add.appendChild(place);
str="";
str+="<select id=changetype style=margin-left:5px;> \n";
str+="<option value=\"0\" title=\"受付×/表示×\">×/×</option> \n";
str+="<option value=\"1\" title=\"受付○/表示○\">○/○</option> \n";
str+="<option value=\"2\" title=\"受付×/表示○\">×/○</option> \n";
str+="<option value=\"3\" title=\"受付○(承認制)\">承認制</option> \n";
str+="</select> ";

str+="<select id=changetype2> \n";
str+="<option value=\"0\" selected=\"selected\">無効 / 公開</option> \n";
str+="<option value=\"1\" >有効 / 非公開</option> \n";
str+="</select> ";

str+="<INPUT type=button value='コメント' onClick='wnd.contentWindow.changeTarget(0)'>";
str+="&nbsp;<INPUT type=button value='公開設定' onClick='wnd.contentWindow.changeTarget(1)'>";
str+="&nbsp;<INPUT type=button value='広告の表示' onClick='wnd.contentWindow.changeTarget2()'>";
str+="&nbsp;<INPUT id='target_cat' type=text value='カテゴリID' onclick='this.select();' style='width:80px;'>";
str+="&nbsp;<INPUT type=button value='カテゴリ変更' onClick='wnd.contentWindow.changeTarget3()'>";
place.innerHTML = str


str="";
str+="<head> \n";
str+="<META http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\" /> \n";
str+="<style type=text/css> \n";
str+="body { margin:0;background-color:forestgreen;color:white; } \n";
str+="</style> \n";
str+="</head> \n";
str+="<body> \n";

str+=" plugin Bookmarklet by lightbox\n";

str+="</body> \n";

document.write( str );
document.close();

var userAgent = window.navigator.userAgent.toLowerCase();
var appVersion = window.navigator.appVersion.toLowerCase();

function changeTarget(type) {

	var sels = doc.getElementsByTagName("select");
	var len = sels.length;
	var name,namelen,target;
	var value = doc.getElementById("changetype").value;

	// コメント
	if( type == 0 ) {

		for( i = 0; i < len; i++ ) {
			name = sels[i].name;
			namelen = name.length;
			target = name.substr(namelen-7,7)
			if ( target == 'comment' ) {
				doc.getElementsByName(name)[0].value = value;
			}
		}

	}
	// 公開・非公開
	if( type == 1 ) {

		value = doc.getElementById("changetype2").value;
		if ( value == 0 ) {
			value = 1;
		}
		else {
			value = 0;
		}

		for( i = 0; i < len; i++ ) {
			name = sels[i].name;
			namelen = name.length;
			target = name.substr(namelen-4,4)
			if ( target == 'flag' ) {
				doc.getElementsByName(name)[0].value = value;
			}
		}

	}

}
function changeTarget2() {

	var sels = doc.getElementsByTagName("select");
	var len = sels.length;
	var name,namelen,target;
	var value = doc.getElementById("changetype2").value;

	for( i = 0; i < len; i++ ) {
		name = sels[i].name;
		namelen = name.length;
		target = name.substr(namelen-4,4)
		if ( target == 'link' ) {
			doc.getElementsByName(name)[0].value = value;
		}
	}
}


function changeTarget3() {

	var sels = doc.getElementsByTagName("select");
	var len = sels.length;
	var name,namelen,target;
	var value = doc.getElementById("target_cat").value;

	for( i = 0; i < len; i++ ) {
		name = sels[i].name;
		namelen = name.length;
		target = name.substr(namelen-12,4)
		if ( target == '_cat' ) {
			doc.getElementsByName(name)[0].value = value;
		}
	}
}



更新履歴
2012-02-29 : カテゴリID を追加してからの初回投稿
2013-08-23 : 最新の Seesaa と さくらのブログで動作チェック
2015-07-06 : Seesaa と さくらが同じになっていたので、さくら専用を削除
2019-01-04 : 最新の Seesaa と さくらのブログで動作チェック




posted by at 2019-01-04 10:38 | ブックマークレット | このブログの読者になる | 更新情報をチェックする

2019年01月03日

DAZ3D : Juliette Hair の調整

この髪( Juliette Hair )は、$19.95 を $5.39 で買っています。一度使いましたが良くなかったので放置してましたが、他の人が使ってるのを見て調整してみようと思いました。

 出来上がったのが以下の画像です



正直そのまま使うととても印象がイマイチなものが出来上がるのでモーフで調整を入れようとするといいのが無く、本来使わないキャラクタのアジャストがあるにはありますが、正攻法ではありません。

▼ ノーマルの状態


▼ 調整した状態との差



そこで、General なパラメータでサイズ調整をしようとすると、本体を選択しているとえらい事になります...

DAZ の製品ではタマにあるのですが、やりたいモーフがパーツに存在する事があります。そこで今回は head を選択して General のパラメータ調整を行いました。




その他の結果






補足

この衣装は、Doctor Coat Outfit for Genesis 3 Female(s) ですが、H&C Nurse Uniform for Genesis 3 Female(s) と同じくクオリティが低いです。

どちらも Fitting に問題があり、G3 用のプロダクトとは思えないぐらいの調整が必要となります。特に、ポースによって服のシワが破綻するのが腹立つのでほぼつかってません。

イラストAC 用として医療関係のイラストに使おうと思ったんですけど...


ちなみに、以下が Aiko7 でのプロトタイプです。ドクターコートの下のシャツが表に出てしまっています。これは Iray プレビューしないと解りません。単純に専用モーフに Ajust Fit があるのでそれで調整しました。これは、ドクターコートの Fit 先を シャツにする方法もありますが、部分的に破綻する可能性があります( 破綻がカメラの範囲になければ そのほうが確実ですけど )






posted by at 2019-01-03 22:27 | Iray DAZ3D DAZStudio イラスト | このブログの読者になる | 更新情報をチェックする

2019年01月02日

DAZ3D : とてもアニメっぽいデザインの 戦艦 Dominator は作ってて楽しい



以前から戦艦が欲しかったのですが、年末のディスカウントで $6.36 で手に入れたプロダクトです。

Dominator

回りの小型機は、一つ作ってノードインスタンスで量産して角度と位置を調整したものですが、なかなか楽しいレンダレング具合です。( 最後に GIMP で オーバレイ+スクリーン )



ついついこの手のシーンは暗くなりがちですが、イザとなればこのように GIMP でレタッチすればいいのです。

以下の画像は Haze で雰囲気出そうとしてみたものですが、戦艦メインならレンダリング時間を犠牲にしてまで使う効果ではなかったようです。



動力部分のエミッション効果がとてもいい感じです。









posted by at 2019-01-02 23:32 | Iray DAZ3D DAZStudio イラスト | このブログの読者になる | 更新情報をチェックする