SQLの窓

2018年06月19日


Pleiades All in One で、Windows アプリを作成する手順( WindowBuilder + Swing デザイナー or SWT デザイナー[JFace] )

関連する記事

Pleiades Eclipse 4.7 Oxygen 2 Windows 64bit Ultimate Full Edition のインストールといろいろな準備
Pythonの開発環境、Ruby( 本体は別インストール ) の開発環境、XAMPP が同梱されます
2018年05月15日 時点 Eclipse 4.7 Oxygen3 が最新バージョンなので、64bit版の Java Full Edition をダウンロードします。 ※ jface のプラグインの修正が必要ありません 2017年04月15日 時点 Eclipse 4.6 Neon 3 が最新バージョンなので、64bit版の Java Full Edition をダウンロードします。 Java だけではなく、Tomcat(6,7,8)JDK(6u48,7u80,8u121) も同梱されており、いろいろ便利に使えます。 解凍 Pleiades のダウンロードファイル(1.01G)はとても名前が長いので、Pleiades.zip に変更し、c:\ に移動してから 7-zip で解凍します。(昔から Pleiades で注意がうながされている、パスの長さの制限に対するものです) jface プラグインの手動整備 Oxygen : 必要ありません Neon : 必要です Mars : ? Luna : 必要ありません ファイルをリネームするだけです。理由は解りませんが、本来の正しいファイルが .backup となっているので、.backup の無いファイルは適当なファイル名にして、.backup の付いたファイルを正式なファイルにします。 ▼ リネーム前 ▼ リネーム後 これは、Eclipse 4.4 Luna では必要無いのですが、たしか、Eclipse 4.5 Mars でも必要があると思います。これをしないと、実行時にエラーが発生します。(フォント用のプロパティファイルが、存在しないため) 最初の実行 Pleiades は、最初と、環境が変わった際に、以下を実行するように強く推奨されています。 eclipse.exe -clean.cmd WindowBuilder のインストール WindowBuilder のサイトよりインストール用の URL を取得します。 ▼ Oxygen ▼ Neon リンク先の URL をクリップボードにコピーします。そして、HELP => 新規ソフトウェアのインストール で、『作業対象』に URL を貼り付けて Enter キーを押して下さい。 WindowBuilder が表示されたら、チェックしてインストールを進めます。 SWT デザイナー[JFace] を使う場合 プロジェクトは専用のものを使いますので、『その他』から以下を選択して下さい。 プロジェクトを作成したら、CTRL+N でその他より、以下を選択して下さい。 実行してウインドウが表示されたら準備完了です。 Swing デザイナー を使う場合 この場合は、プラグインのリネームは必要ありません。プロジェクトも通常の Java プロジェクトで以下を選択します。 これも、実行してウインドウが表示されたら準備完了です。
posted by lightbox at 2018-06-19 11:02 | java : WindowBuilder | このブログの読者になる | 更新情報をチェックする

2018年06月18日


Pleiades Oxygen の XAMPP の TOMCAT を Pleiades の JDK8 で動作させる

PC に JDK がインストールされていない場合、Pleiades 内の JDK で起動できます。

XAMPP の TOMCATは、pleiades\xampp にあって、実際起動しているのは pleiades\xampp\catalina_start.bat です。その中でレジストリのチェックをして 『HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit』が無いと起動できません。

▼ 以下を手動で登録します。
[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit]
"JavaHome"="C:\pleiades\java\8"
※ 実際のバッチファイルでは、以下の4種類をチェックして、それぞれについて処理分岐しています
set JDKKeyName64=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit
set JDKKeyName32=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Java Development Kit
set JREKeyName64=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment
set JREKeyName32=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Java Runtime Environment
▼ バッチファイルのチェック部分
:JDKRUN
echo.
echo [XAMPP]: Using JDK
set "CURRENT_DIR=%cd%"
set "CATALINA_HOME=%CURRENT_DIR%\tomcat"

set Cmd=reg query "%KeyName%" /s
for /f "tokens=2*" %%i in ('%Cmd% ^| find "JavaHome"') do set JAVA_HOME=%%j

echo.
echo [XAMPP]: Seems fine!
echo [XAMPP]: Set JAVA_HOME : %JAVA_HOME%
echo [XAMPP]: Set CATALINA_HOME : %CATALINA_HOME%
echo.

if %ERRORLEVEL% == 0 (
	echo %MyPID% > tomcat\logs\catalina.pid
)

"%CATALINA_HOME%\bin\catalina.bat" run
goto END

:JRERUN
echo.
echo [XAMPP]: Using JRE
set "CURRENT_DIR=%cd%"
set "CATALINA_HOME=%CURRENT_DIR%\tomcat"

set Cmd=reg query "%KeyName%" /s
for /f "tokens=2*" %%i in ('%Cmd% ^| find "JavaHome"') do set JRE_HOME=%%j

echo.
echo [XAMPP]: Seems fine!
echo [XAMPP]: Set JRE_HOME : %JRE_HOME%
echo [XAMPP]: Set CATALINA_HOME : %CATALINA_HOME%
echo.

if %ERRORLEVEL% == 0 (
	echo %MyPID% > tomcat\logs\catalina.pid
)

"%CATALINA_HOME%\bin\catalina.bat" run
goto END

reg query /s は、レジストリのツリーの下位を全て再帰的に検索します。そして、JDK の場合は JavaHome が見つかったらその値を環境変数の JAVA_HOME にセットして "%CATALINA_HOME%\bin\catalina.bat" を実行します。



posted by lightbox at 2018-06-18 23:24 | Pleiades | このブログの読者になる | 更新情報をチェックする

MySQL で、Group by して合算された行内で最新データの明細を再び取り出す SQL

MySQL のドキュメントでは、『3.6.4 特定のカラムのグループごとの最大値が格納されている行』 として解説されていますが、それとは違ったアプローチで。( 全ての元の列を取り出します )

目的の SQL を実行する為に以下のようなテーブルを作成しました。

1) 同一取引先で、複数の日付で明細が存在します。
2) それぞれの行は code というユニークな主キーをもっています。
3) 取引先コードで group by すると、MySQL の拡張仕様で取得されるデータはどのような値になるか解りません
列名 型名 最大桁 NULL 主キー
1 code int N 1
2 取引日付 datetime
3 取引先コード varchar 4
4 明細 varchar 100
5 数量 int
set @@session.sql_mode='PIPES_AS_CONCAT' で連結を容易にできるようにします

日付を文字列として考えると、常に10桁で、その後にキーを結合しても max である事には変わりが無いので、インラインビューとしての結果を分割してキーを得ます。

そして、それに対して再び本体を結合させて全ての列データを取得します。
set @@session.sql_mode='PIPES_AS_CONCAT';
select
 * from
	(select
		最大日付とキー.取引先コード,
		substring_index(target, ',', -1) as key_data
		from
		(select
			取引先コード,max(取引日付||','||code) as target from
			一行伝票
			group by 取引先コード
		) 最大日付とキー
	) キーを取り出す

inner join 一行伝票

on key_data = code

order by キーを取り出す.取引先コード

取引先コード key_data code 取引日付 取引先コード 明細 数量
1 476 476 2005/8/17 1 この日が最新 14
2 997 997 2005/9/8 2 この日が最新 12
3 521 521 2005/9/8 3 この日が最新 9
4 820 820 2005/8/24 4 この日が最新 16



posted by lightbox at 2018-06-18 17:19 | MySQL | このブログの読者になる | 更新情報をチェックする

2018年06月12日


C# でDataTable と DataSource を使用して、DataGridView にデータを表示するテンプレート( 行をダブルクリックしてダイアログを表示して行データを処理 )



画面はメインとなる DataGridView を最初に作成して Dock を Fill にします。Fill を設定したコントロールの上下にコントロールを使用する場合は、レイアウトは見たままでは無く Fill にしたものを一番上に置いて他のコントロールを下にします。



ステータスバー、ツールバー、メニューバーと順序が見ている位置と逆にして、それぞれの Dock プロパティを設定します。( ステータスとメニューはデフォルトで OK )

DataGridView のプロパティは重要なので以下に設定内容を自動作成されたコードで示します
            this.dataGridView1 = new System.Windows.Forms.DataGridView();

            this.dataGridView1.AllowUserToAddRows = false;
            this.dataGridView1.AllowUserToDeleteRows = false;
            this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.dataGridView1.Location = new System.Drawing.Point(0, 49);
            this.dataGridView1.MultiSelect = false;
            this.dataGridView1.Name = "dataGridView1";
            this.dataGridView1.ReadOnly = true;
            this.dataGridView1.RowTemplate.Height = 21;
            this.dataGridView1.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
            this.dataGridView1.Size = new System.Drawing.Size(813, 407);
            this.dataGridView1.TabIndex = 0;
            this.dataGridView1.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellDoubleClick);

            public System.Windows.Forms.DataGridView dataGridView1;
ハイライトの行は、最初に設定する3つの編集を許可するかどうかのプロパティで、全て使用不可にしています。

1) 選択は単一行にする : MultiSelect = false
2) 選択表示は行全体にする : SelectionMode = FullRowSelect
3) 行のダブルクリックイベントは、CellDoubleClick で行う
4) Form2 から直接参照可能なように、public で定義する( Modifiers = Public )

次に、Form1 のソースコードですが、表示するデータは環境変数の一覧を使用しています( 実際に変更せずに DataGridView にデータを戻すまでの処理を行います )
    public partial class Form1 : Form
    {
        private DataTable table;
        private DataColumn column;
        private DataRow row;
        private Form nextWindow;

        public Form1()
        {
            InitializeComponent();
        }

        // ツールバーのボタンをクリック
        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            // DataTable の作成
            table = new DataTable("EnvironmentVariables");

            // 列情報 の作成
            column = new DataColumn();
            column.DataType = Type.GetType("System.String");
            column.ColumnName = "環境変数";
            table.Columns.Add(column);

            // 列情報 の作成
            column = new DataColumn();
            column.DataType = Type.GetType("System.String");
            column.ColumnName = "値";
            table.Columns.Add(column);

            // 環境変数一覧より、行情報の作成
            foreach (DictionaryEntry dict in Environment.GetEnvironmentVariables())
            {
                row = table.NewRow();
                row["環境変数"] = dict.Key;
                row["値"] = dict.Value;
                table.Rows.Add(row);
            }

            // データーソース経由で DataGridView を表示
            dataGridView1.DataSource = table;
            // 第一カラムでソート
            dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);
            // 自動整列
            dataGridView1.AutoResizeColumns();

        }

        // 行をダブルクリックしてダイアログを表示
        private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            int rowNumber = e.RowIndex;
            if (rowNumber < 0 ){
                return;
            }

            // 行=>列=>からの参照
            string value = dataGridView1.Rows[rowNumber].Cells["値"].Value.ToString();
            Console.WriteLine(value);

            // モーダルダイアログとして開く
            using (nextWindow = new Form2(rowNumber))
            {
                nextWindow.ShowDialog(this);
            }

        }
    }


DataTable の考え方は、SQL 文の cerate tableを実行して列の定義を行った上で、テーブルに行を追加して行くというものです。そのテーブル情報全てを DataSource にセットする事で DataGridView への表示が完了します。

※ 列のタイトルは、ColumnName にセットされた内容が表示されます

そして、行をダブルクリックして 行=>列=>からの参照でデータを取得していますが、ここでは確認の為に表示しているだけで、実際は Form2 から直接に [列,行] という形で参照しています。
    public partial class Form2 : Form
    {
        private int rowNumber;
        private DataGridView grid;

        // コンストラクタで処理する行を渡す
        public Form2(int rowNumber)
        {
            this.rowNumber = rowNumber;
            InitializeComponent();

        }

        // データ変更ボタンで親内の DataGridView を直接変更
        private void button1_Click(object sender, EventArgs e)
        {
            grid["値", rowNumber].Value = textBox2.Text;
            grid["値", rowNumber].Style.BackColor = Color.Pink;

            Console.WriteLine("表示データを書き換えました");
            this.Close();
        }

        // キャンセル( フォームのデフォルトボタン )
        private void button2_Click(object sender, EventArgs e)
        {
            Console.WriteLine("キャンセルされました");
            this.Close();
        }

        // 初期フォーカス
        private void Form2_Shown(object sender, EventArgs e)
        {
            textBox1.Focus();

        }

        // 親フォームからの情報を取得
        private void Form2_Load(object sender, EventArgs e)
        {
            grid = ((Form1)Owner).dataGridView1;
            textBox1.Text = grid["環境変数",rowNumber].Value.ToString();
            textBox2.Text = grid["値",rowNumber].Value.ToString();

        }
    }

親フォームの参照は、Owner プロパティを使用し、初期フォーカスの設定を Shown イベントで行うのが重要です。




posted by lightbox at 2018-06-12 12:42 | VS(C#) | このブログの読者になる | 更新情報をチェックする

PowerShell( 実質C# )を使用して、ファイルの分割を行う

最初に『OpenFileDialog』でファイルを開くダイアログを表示して、そのファイルを1メガバイト(0x100000) のファイルに分割します。( ここでは、初期フォルダは C:\ )



split_file.ps1

readSize はバッファーに読み取られた合計バイト数で。 要求しただけのバイト数を読み取れなかった場合、この値は要求したバイト数より小さくなります。
$code = @"
using System;
using System.IO;
using System.Windows.Forms;
public class MyClass {
	public static void split_file() {


		OpenFileDialog obj = new OpenFileDialog();
		obj.Filter = "全て|*.*";
		obj.InitialDirectory = @"C:\";

		if (obj.ShowDialog() != DialogResult.OK) {
			return;
		}

		// 分割ファイルの拡張子の連番用
		int count = 0;

		// 入力ファイル
		FileStream fsi = new FileStream( obj.FileName, FileMode.Open, FileAccess.Read);

		// オリジナルファイル名
		string FileName = Path.GetFileName(obj.FileName);

		// 1メガバイト
		byte[] buffer = new byte[0x100000];
		// 読み込まれたサイズ
		int readSize;
		while(true) {
			// 読み込み
			readSize = fsi.Read(buffer, 0, buffer.Length);
			if (readSize == 0) {
				break;
			}
			count++;

			// 出力ファイル
			FileStream fso = new FileStream( string.Format("{0}.{1:000}", FileName, count),FileMode.Create,FileAccess.Write);
			fso.Write(buffer, 0, readSize);
			fso.Close();
		}
		fsi.Close();
	}
}
"@

Add-Type -Language CSharp -TypeDefinition $code -ReferencedAssemblies ("System.Windows.Forms")

[MyClass]::split_file()



inter_active.bat
echo off

echo 処理を開始しました

powershell -NoProfile -ExecutionPolicy Unrestricted .\split_file.ps1
実行すると、拡張子が オリジナルファイル名.001、オリジナルファイル名.002 というように連番で分割して作成されます。 結合は、copy コマンドを使用して行う事ができます
copy /b オリジナルファイル名.001 + オリジナルファイル名.002 オリジナルファイル名
関連する記事 PowerShell : ファイルを開くダイアログを使うのに System.Windows.Forms を参照する二つの方法 PowerShell( 実質C# )を使用して、MessageBox の応答でバッチファイルの処理を変化させる
posted by lightbox at 2018-06-12 11:34 | PowerShell | このブログの読者になる | 更新情報をチェックする

2018年06月09日


PowerShell( 実質C# )を使用して、MessageBox の応答でバッチファイルの処理を変化させる

PowerShell は、C# のコードをそのまま実行する事ができるので、MesaageBox を表示させて、そまの応答結果をファイルに書き込んで、バッチファイル内の for で読み込み、内容によって実行先を変化させます

console_message_box.ps1
$code = @"
using System;
using System.IO;
using System.Windows.Forms;
public class MyClass {
	public static void console_message_box() {

		string path = Environment.GetEnvironmentVariable("temp");

		string writePath = string.Format(@"{0}\_check_result",path);

		StreamWriter sw = new StreamWriter(writePath,false);

		DialogResult check = MessageBox.Show("実行しますか?","確認", MessageBoxButtons.OKCancel);
		if (check == DialogResult.OK)
		{
			sw.Write("1");
		}
		else
		{
			sw.Write("0");
		}

		sw.Close();

	}
}
"@

Add-Type -Language CSharp -TypeDefinition $code -ReferencedAssemblies ("System.Windows.Forms")

[MyClass]::console_message_box()



inter_active.bat
echo off

echo 処理を開始しました

powershell -NoProfile -ExecutionPolicy Unrestricted .\console_message_box.ps1

FOR /F %%i IN (%temp%\_check_result) DO (
	if "%%i"=="1" goto :ok
	if "%%i"=="0" goto :cancel
)

:ok
echo OK を選択しました
goto :end

:cancel
echo Cancel を選択しました
goto :end


:end


関連する記事

PowerShell : ファイルを開くダイアログを使うのに System.Windows.Forms を参照する二つの方法

バッチファイル内で、コマンドプロンプトが管理者権限で実行されているかのチェック






posted by lightbox at 2018-06-09 23:05 | PowerShell | このブログの読者になる | 更新情報をチェックする
container 終わり

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

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