SQLの窓

2017年09月28日


jQuery を使用してサーバから取得した JSON データを元にテーブルを作成し、その後から列を加工する

HTML 部分は、タイトル部分と thead のみ作成し、JSON データを取り出す毎に作り直すようになっています。

$.each でループ処理している対象のデータは row です。これは JSON オブジェクトで、1行1行のデータを保持したデータセットの配列です。

▼ フォーマット
[
        {
            "社員コード": "0001",
            "氏名": "浦岡 友也",
            "フリガナ": "ウラオカ トモヤ",
            "所属": "0003",
            "性別": "0",
            "給与": "270000",
            "手当": "9000",
            "管理者": "",
            "生年月日": "2000-01-01 00:00:00",
            "性別2": "男",
            "所属名": "営業部第三",
            "手当2": "9000"
        },
        {
            "社員コード": "0002",
            "氏名": "山村 洋代",
            "フリガナ": "ヤマムラ ヒロヨ",
            "所属": "0003",
            "性別": "1",
            "給与": "300000",
            "手当": "",
            "管理者": "",
            "生年月日": "",
            "性別2": "女",
            "所属名": "営業部第三",
            "手当2": "0"
        }
]

※ number_format() は、String.prototype.number_format として定義済みです
※ text-right は、twitter-bootstrap で定義されています
	// テーブル表示リセット
	$("#data .row_data").remove();

	// データ用
	var row_data;
	var col_data;

	// 行のループ  ( <tr></tr> )
	$.each(row, function( index, obj ) {

		// テーブルに行を追加	
		row_data = $("<tr class=\"row_data\"></tr>").appendTo( "#data" );
	
		// 行に列を追加	
		col_data = $("<td></td>").appendTo( row_data );
		col_data.text( obj["社員コード"] );

		col_data = $("<td></td>").appendTo( row_data );
		col_data.text( obj["氏名"] );

		col_data = $("<td></td>").appendTo( row_data );
		col_data.text( obj["フリガナ"] );

		col_data = $("<td></td>").appendTo( row_data );
		col_data.text( obj["性別2"] );

		col_data = $("<td></td>").appendTo( row_data );
		col_data.text( obj["所属"] );

		col_data = $("<td></td>").appendTo( row_data );
		col_data.text( obj["所属名"] );

		col_data = $("<td></td>").appendTo( row_data );
		col_data.attr("class","text-right")
		// head-js.view で String.prototype に定義
		col_data.text( obj["給与"].number_format() );

		col_data = $("<td></td>").appendTo( row_data );
		col_data.attr("class","text-right")
		// head-js.view で String.prototype に定義
		col_data.text( obj["手当2"].number_format() );

		col_data = $("<td></td>").appendTo( row_data );
		col_data.text( obj["生年月日"] != null ? obj["生年月日"].substr(0,10) : "" );
	
	});


1 列目をコード、2列目を氏名として、2列目のテキストにリンクを設定するには以下のよう記述します。
	$("#data .row_data").each(function(i){

		var code = $(this).find("td").eq(0).text();
		var name = $(this).find("td").eq(1).text();

		var link = '<a href="https://ドメイン/?code=' + code  +  '" target="_blank">' + name + '</a>';

		$(this).find("td").eq(1).html( link );

	});



TD の中の文字列にスタイルを適用してクリックした時のイベントを登録する(条件付)には、以下のように記述します

※ ここでは、特定の行のみ処理しています
	$("#data .row_data").each(function(i){

		var type = $(this).find("td").eq(1).text();
		var td = $(this).find("td").eq(0);

		if ( type == "特定の文字列" ) {
			td.css( 
				{ "text-decoration":"underline", "cursor":"pointer" }
			);
			td.on("click", function(){ 
				alert( $(this).text() );
			});
		}

	});



以下は対象となる HTML の記述です
<div id="req">
	<table id="data" class="table table-condensed table-hover">
	<thead>
		<tr>
		<th>コード</th>
		<th>氏名</th>
		<th>フリガナ</th>
		<th>性別</th>
		<th>所属</th>
		<th>所属名</th>
		<th class="text-right">給与</th>
		<th class="text-right">手当</th>
		<th>生年月日</th>
		</tr>
	</thead>
	</table>
</div>




posted by lightbox at 2017-09-28 20:18 | Comment(0) | jQuery | このブログの読者になる | 更新情報をチェックする

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



最初に .accdb か .mdb を選択しておいて、自由な SQL をタイプしてその結果をそのまま Excel のごとく DataGridView に表示します。

DataGridView に表示するデータは全て文字列扱いとして、ArrayList に随時行を追加して、Rows.Add に、ToArray() したものをセットします。

一応表示のみを想定しているので、以下の設定を最初にします


表示件数は多すぎると時間がかかりすきるので、固定で 100 件にしています。
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinApp1 {
	public partial class Form1 : Form {

		private OpenFileDialog ofd = new OpenFileDialog();

		public Form1() {
			InitializeComponent();
		}

		private void button1_Click(object sender, EventArgs e) {

			using (OleDbConnection myCon = new OleDbConnection())
			using (OleDbCommand myCommand = new OleDbCommand()) {

				// *********************
				// 接続文字列の作成
				// *********************
				myCon.ConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};", ofd.FileName);
				Debug.WriteLine(myCon.ConnectionString);

				// *********************
				// 接続
				// *********************
				try {
					// 接続文字列を使用して接続
					myCon.Open();
					// コマンドオブジェクトに接続をセット
					myCommand.Connection = myCon;
					// コマンドを通常 SQL用に変更
					myCommand.CommandType = System.Data.CommandType.Text;
				}
				catch (Exception ex) {
					MessageBox.Show(this,ex.Message);
					return;
				}

				// *********************
				// 実行 SQL
				// *********************
				myCommand.CommandText = textBox1.Text;

				// *********************
				// レコードセット取得
				// *********************
				try {
					using (OleDbDataReader myReader = myCommand.ExecuteReader()) {

						// *********************
						// 列数
						// *********************
						int nCols = myReader.FieldCount;

						// DataGridView 初期化
						dataGridView1.Columns.Clear();
						dataGridView1.ColumnCount = nCols;		// カラム数

						Type fldType;
						ArrayList rowData = new ArrayList();

						// データ取得と表示
						int maxCount = 0;
						while (myReader.Read()) {

							// 行データをセットする ArrayList をクリア
							rowData.Clear();

							maxCount++;
							if ( maxCount > 100 ) {
								break;
							}

							// 初回のみ、タイトル文字列を設定
							if (maxCount == 1) {
								for (int idx = 0; idx < nCols; idx++) {
									dataGridView1.Columns[idx].Name = myReader.GetName(idx);
								}
							}

							// 行データの作成( ArrayList で作成して ToArray() したものを Rows.Add )
							for (int idx = 0; idx <nCols; idx++) {

								// NULL でない場合
								if (!myReader.IsDBNull(idx)) {
									// 列のデータ型を取得
									fldType = myReader.GetFieldType(idx);

									// 文字列
									if (fldType.Name == "String") {
										rowData.Add(myReader.GetValue(idx).ToString());
									}
									else if (fldType.Name == "Int32") {
										rowData.Add(myReader.GetInt32(idx).ToString());
									}
									else if (fldType.Name == "DateTime") {
										rowData.Add(myReader.GetDateTime(idx).ToString());
									}
									else {
										rowData.Add(myReader.GetValue(idx).ToString());
									}

								}
								else {
									rowData.Add("");
								}
							}

							// 行追加 ( BuildArray() は配列を作成する為のメソッド )
							dataGridView1.Rows.Add(rowData.ToArray());

						}

						// リーダを使い終わったので閉じる
						myReader.Close();
					}
				}
				catch (Exception ex) {
					myCon.Close();
					MessageBox.Show(this, ex.Message);
					return;
				}

				myCon.Close();

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

			}		// 最外の using の終わり

		}

		private void button2_Click(object sender, EventArgs e) {

			// *********************
			// ファイル選択
			// *********************
			ofd.Filter = "Excel(*.mdb;*.accdb)|*.mdb;*.accdb|すべてのファイル(*.*)|*.*";
			ofd.FilterIndex = 1;
			ofd.Title = "Access データベースを選択してください";
			ofd.RestoreDirectory = true;

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


		}		// click イベントの終わり

	}		// class の終わり
}


※ テーブル・ビュー一覧は以下のようにして簡単に表示できます
			using (OleDbConnection myCon = new OleDbConnection())
			using (OleDbCommand myCommand = new OleDbCommand()) {

				// *********************
				// 接続文字列の作成
				// *********************
				myCon.ConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};", ofd.FileName);
				Debug.WriteLine(myCon.ConnectionString);

				// *********************
				// 接続
				// *********************
				try {
					// 接続文字列を使用して接続
					myCon.Open();
					// コマンドオブジェクトに接続をセット
					myCommand.Connection = myCon;
					// コマンドを通常 SQL用に変更
					myCommand.CommandType = System.Data.CommandType.Text;
				}
				catch (Exception ex) {
					MessageBox.Show(this,ex.Message);
					return;
				}

				DataTable dataTable = myCon.GetOleDbSchemaTable(
					OleDbSchemaGuid.Tables,
					new object[] { null, null, null, null }
				);
				// TABLE のみの場合は以下( 上記は 全て )
				//	new object[] { null, null, null, "TABLE" }

				dataGridView1.DataSource = dataTable;

				myCon.Close();

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

			}		// 最外の using の終わり

さらに SQL の実行結果は、データの途中加工が全くできなくなりますが、DataTable を使って以下のようにさらに短く記述する事ができます
				// *********************
				// 実行 SQL
				// *********************
				myCommand.CommandText = textBox1.Text;

				try
				{
					using (OleDbDataReader myReader = myCommand.ExecuteReader())
					{
						DataTable dataTable = new DataTable();

						dataTable.Load(myReader);

						dataGridView1.DataSource = dataTable;
		
						myReader.Close();
					}

				}
				catch (Exception ex)
				{
					myCon.Close();
					MessageBox.Show(this, ex.Message);
					return;
				}

DataSource プロパティを使用した場合、新たに直接データをセットしていきたい場合は、いったん DataSource プロパティに null を設定しておく必要があります。


Microsoft.ACE.OLEDB.12.0 がインストールされていない場合

Microsoft Access データベース エンジン 2010 再頒布可能コンポーネントをダウンロードしてインストールします。


( 32ビット版と64ビット版があるので選択してダウンロードします )



posted by lightbox at 2017-09-28 19:53 | Comment(0) | VS(C#) | このブログの読者になる | 更新情報をチェックする

2017年09月26日


MDB 接続から、MySQL と SQLServer を外部参照として結合して、Group By を使用して複雑な SQL を作成して Excel にエクスポートする SQL 文



※ SQLの窓では、Microsoft.Jet.OLEDB.4.0 使用しているので、最新の Access( .accdb ) への外部参照はできません。( C#、VB、VBScript、PHP で Microsoft.ACE.OLEDB.12.0 を使用すれば .accdb と下位の MDB 両方にアクセスできます  )

関連する記事

MDB 接続で、MySQL と SQLServer の表を結合表示する
System.Data.OleDb で select into 構文を使って簡単に Microsoft Access のデータを他の データベースにエクスポートする

SQL文全体

この SQL 文の最も大きな目的は、得意先毎の金額の集計です。その為のベースとなる取引先データは、売上伝票のデータで、伝票番号毎に売り上げた商品と金額が複数記録されています。

取引データには、得意先名や担当者名が無いので他のテーブルから参照する為に結合していますが、group by で指定した取引先コード以外は結果に表示出来ないので( MySQL は可能なようですが、通常は不可 )、max 関数を使用して得意先名と担当者の情報と住所を表示しています。

全て、取引先コードに対して必ず一つの値しか無いのでこのような記述で取り出す事ができます。
select 
	取引先コード,
	max(得意先名) as 得意先名,
	sum(金額) as 売上金額, 
	max(社員コード) as 社員コード, 
	max(氏名) as 担当者, 
	left(max(住所1) & max(住所2),30) as 住所

from 
	([ODBC;Driver={MySQL ODBC 5.3 Unicode Driver};server=localhost;database=lightbox;uid=root;pwd=password].取引データ left outer join [ODBC;Driver={MySQL ODBC 5.3 Unicode Driver};server=localhost;database=lightbox;uid=root;pwd=password].得意先マスタ on 取引データ.取引先コード = 得意先マスタ.得意先コード)
	left outer join [ODBC;Driver={SQL Server Native Client 11.0};server=localhost;database=lightbox;uid=sa;pwd=password].社員マスタ on 得意先マスタ.担当者 = 社員マスタ.社員コード

where
	Format(取引日付, 'yyyy/MM/dd') between '2005/06/01' and '2005/06/30'

group by 取引先コード

having
	max(得意先名) like '%商店%'




Microsoft Access ベースの記述

ここでは、SQL で使える関数は、Microsoft Access のルールに従う必要があるので、left 関数や、文字列の連結と日付との比較の為に Format 関数を使用しています。

このような SQL は、Microsoft の仕様に基づいて実行されて動作するので、from の 前に into [外部参照].表名 と書く事で、ある特定の RDBMS に対するエクスポートを容易に実行する事ができます。

ここでは、解りやすく Excel に出力する書式として以下のようになります
select 
	取引先コード,
	max(得意先名) as 得意先名,
	sum(金額) as 売上金額, 
	max(社員コード) as 社員コード, 
	max(氏名) as 担当者, 
	left(max(住所1) & max(住所2),30) as 住所

into [Excel 8.0;DATABASE=c:\tmp\集計関数結果出力.xls].取引先別売上

from 
	([ODBC;Driver={MySQL ODBC 5.3 Unicode Driver};server=localhost;database=lightbox;uid=root;pwd=password].取引データ left outer join [ODBC;Driver={MySQL ODBC 5.3 Unicode Driver};server=localhost;database=lightbox;uid=root;pwd=password].得意先マスタ on 取引データ.取引先コード = 得意先マスタ.得意先コード)
	left outer join [ODBC;Driver={SQL Server Native Client 11.0};server=localhost;database=lightbox;uid=sa;pwd=password].社員マスタ on 得意先マスタ.担当者 = 社員マスタ.社員コード

where
	Format(取引日付, 'yyyy/MM/dd') between '2005/06/01' and '2005/06/30'

group by 取引先コード

having
	max(得意先名) like '%商店%'




出力先のテーブルが既に存在している場合は、前もって削除しておいて下さい。Excel の場合は、テーブル名はシート名となり、ブックが無い場合は新規に作成されます。

SQL を MDB のビューとして登録

into によるエクスポートが無い SQL 文の場合は ビューとして登録が可能です。トンカチ + V のアイコンで、ビューの名前を入力するダイアログが表示されるので、その時に接続している MDB の中にビューが登録されて、後から容易に実行する事ができます。

SQL を 各 RDBMS のビューとして登録

例えば、MySQL で今回の SQL を記述すると以下のようになります。
select 
	取引先コード,
	得意先名,
	sum(金額) as 売上金額, 
	社員コード, 
	氏名 as 担当者, 
	left(concat(max(住所1),max(住所2)),30) as 住所

from 
	取引データ left outer join 得意先マスタ on 取引先コード = 得意先コード
	left outer join 社員マスタ on 担当者 = 社員コード

where
	取引日付 between '2005/06/01' and '2005/06/30'

group by 取引先コード

having
	得意先名 like '%商店%'

これを MySQL に ビューとして登録してしまえば、SQLの窓では『処理』メニューからエクスポートが各 RDBMS に対して容易に実行できるようになっています。


posted by lightbox at 2017-09-26 17:48 | Comment(0) | SQLの窓 Build C++ | このブログの読者になる | 更新情報をチェックする

Microsoft Access SQL では、DISTINCT 集計関数の参照がサポートされていません

Microsoft ドキュメント

Microsoft Access SQL と ANSI SQL の比較

代替として副問合せである、いわゆる『インラインビュー』を使用 2つ目と3つ目が『インラインビュー』ですが、これは Oracle では正式に使用される呼び名です。
select count(distinct 商品分類) from 商品マスタ
;
select count(商品分類) from (select distinct 商品分類 from 商品マスタ) A
;
select count(*) from (select distinct 商品分類 from 商品マスタ) A
;
select '----------','----------','----------','----------'
;
select * from コード名称マスタ

一つ目の実行が、Microsoft Access SQL で失敗します( MySQL や SQLServer等 では成功します )
Syntax error (missing operator) in query expression 'count(distinct 商品分類)'
ですから、distinct を使ったSQL 全体を括弧で囲んで、from の後ろに置いて別名を付けて実行します。 NULL を含むデータ ここでは、商品分類に NULL を含む場合があるので、集計関数を商品分類に使用した場合はカウントから除外されます。但し、行全体の数を取る count(*) では含まれます。 SQLの窓のコマンドエリアでのセミコロン act ボタンで実行した場合、セミコロンは SQL の実行単位の区切りとみなされ、全ての実行を行って下段に全て表示します MySQL SQL Express SQLの窓 Build C++ のダウンロード
タグ:MDB access DISTINCT
posted by lightbox at 2017-09-26 13:38 | Comment(0) | SQLの窓 Build C++ | このブログの読者になる | 更新情報をチェックする

MDB 接続で、MySQL と SQLServer の表を結合表示する



select

	*

from

	[ODBC;DSN=SQS32;Database=lightbox;UID=sa;PWD=password].得意先マスタ

left outer join 

	[ODBC;DSN=MYSQL32;Database=lightbox;UID=root;PWD=password].社員マスタ

on 

	得意先マスタ.担当者 = 社員マスタ.社員コード


where Format(生年月日, 'yyyy/MM/dd') = '2000/01/01'



ADO や OleDb 接続では、外部のデーターベースを容易に参照する事が可能です
関連する記事

System.Data.OleDb で select into 構文を使って簡単に Microsoft Access のデータを他の データベースにエクスポートする
SQLの窓では、同梱の販売管理C.MDB をテーブル一覧部分にドラッグ&ドロップすると容易に接続可能です。
関連する記事

SQLの窓 Build C++ : 準備不要の 2000 〜 2003 の .MDB へのアクセス
MDB への接続状態で、サンプルのような SQL をコマンドエリアに入力して、『コマンドエリアの左下の実行ボタン』をクリックして下さい。そうすると、下のエリアに結果が表示されます。 (actボタンは、セミコロンを複数のSQLの分割に使用するので、実行ボタンを使用します) 但し、この SQL は、Microsoft Access の SQL の構文で書く必要があるので、サンプルとして付加した条件部分は、Format 関数が使用されています。 また、さらに、into を付加して、他のデータベースにエクスポートする事ができます(キーはエクスポートされません) この SQL の処理は、C# ゃ VB、VBScript(ADO)、PHP(ADO) でアプリケーションとして実行可能です(SQLの窓内では ADO を使用しています) Microsoft Access の外部データ Microsoft Access では、外部データとして ODBC 経由である程度のデータベースは直接リンクする事ができます。書き方のドキュメントはありませんが、mdb 時代のシステムテーブルには、接続情報としてこのような記述が使われており、現在でもある程度ものは取得できます。(MSysObjects より) ※ SQLの窓は古いアプリケーションなので、MDB 接続ですが、.accdb 接続でも同じです SQLの窓 Build C++ のダウンロード
posted by lightbox at 2017-09-26 01:55 | Comment(0) | SQLの窓 Build C++ | このブログの読者になる | 更新情報をチェックする

2017年09月23日


ViewSwitcher を使用した2画面アプリ (5) : SQLiteデータを更新する

この内容は、ViewSwitcher を使用した2画面アプリ (4) : SQLiteデータをインポートしてリストビューに表示するより続いています。
更新部分に特化したコードにする為に、MainControl をさらに継承して、マニフェストの初期画面を新しいクラス( MainUpdate ) に変更します。 特別な部分は特に無く、更新ボタンをクリックすると更新するだけです。但し、新規と修正の二通りがあるので、textViewCode の表示状態を取得して、どちらを実行するか決定しています。
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;

public class MainUpdate extends MainControl {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				Log.i("lightbox","タップされました");

				String scode = arrayList.get(position);
				helper.getTextView(R.id.textViewCode).setText(scode);

				// キーを渡して SQLite にアクセスする
				loadData(scode);

				// 画面を切り替える
				helper.showEditView();

			}
		});

		// 更新ボタンの処理
		MainUpdate.this.findViewById(R.id.buttonUpdate).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Log.i("lightbox","更新ボタンがクリックされました");

				//alertDialog.show();
				helper.showDialog("更新してよろしいですか?", new Helper.OnDialogOkListener() {

					@Override
					public void onDialogOkListener() {
						Log.i("lightbox","ダイアログで、OK ボタンがクリックされました");

						if (  helper.getTextView(R.id.textViewCode).getVisibility() == View.VISIBLE  ) {
							updateData();
						}
						else {
							insertData();
						}

					}

				});

			}
		});
	}

	// *******************************
	// データの更新
	// *******************************
	private void updateData() {

		Log.i("lightbox","updateData");

		String scode = helper.getTextViewString(R.id.textViewCode);
		String sname = helper.getEditTextString(R.id.editText1);
		String furi = helper.getEditTextString(R.id.editText2);

		values.clear();
		values.put("sname", sname);
		values.put("furi", furi);
		db.update("syain", values, String.format("scode='%s'", scode), null);

		loadView();
		helper.showFirstView();
	}

	// *******************************
	// データの登録
	// *******************************
	private void insertData() {

		Log.i("lightbox","insertData");

		String scode = helper.getTextViewString(R.id.editTextCode);
		String sname = helper.getTextViewString(R.id.editText1);
		String furi = helper.getTextViewString(R.id.editText2);

		values.clear();
		values.put("scode", scode);
		values.put("sname", sname);
		values.put("furi", furi);
		db.insert("syain", null, values);

		loadView();
		helper.showFirstView();

	}

	// *******************************
	// 編集用データの表示
	// *******************************
	private void loadData(String scode) {

		String sql = String.format("select * from %s where scode='%s' ", "syain", scode);
		Cursor cursor = mySQLite.getReadableDatabase().rawQuery(sql, null);
		Boolean isData = null;
		isData = cursor.moveToFirst();

		String sname = cursor.getString(cursor.getColumnIndex("sname"));
		helper.setEditTextString(R.id.editText1,sname);
		String furi = cursor.getString(cursor.getColumnIndex("furi"));
		helper.setEditTextString(R.id.editText2,furi);

		cursor.close();

	}

}




posted by lightbox at 2017-09-23 17:38 | Comment(0) | 2017 Android Studio | このブログの読者になる | 更新情報をチェックする

ViewSwitcher を使用した2画面アプリ (4) : SQLiteデータをインポートしてリストビューに表示する

この内容は、ViewSwitcher を使用した2画面アプリ (3) : 画面部分の作成と画面切り替えテスト『画面をコントロールする Helper クラスの作成』より続いています。
表示するデータはなんでもいいのですが、他の環境に依存しないように、SQLIte3 の出来上がったデータを Android Studio にインポート(Push) して使用します。MainActivity もそのまま使わずに、MainControl というクラスを作成して MainActivity を継承し、メニュー部分の記述は見なくてもいいようにしています。 ※ AndroidManifest.xml の記述は、MainActivity を MainControl に変更すれば動作します データは、以下をダウンロードして、hanbai.sqlite3 を使用して下さい。 ※ 中のスクリプトに関しては、『Android Studio にインポートして使用する SQLite データベースを MDB より作成する VBScript』 を参照して下さい インポート前の準備 Android に、初期データベースを作成させて、それを上書きします。場所は data/data/パッケージ名/databases/hanbai.sqlite3 になります。 初期データベースを作成するには、SQLite 用の ヘルパークラスを作成して以下のように onStart と onStop に処理を書いて下さい。
public class MainControl extends MainActivity {

	// *******************************
	// SQLite用
	// *******************************
	public MySQLite mySQLite;
	public SQLiteDatabase db;
	public ContentValues values;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

	}

	// *******************************
	// SQLite用 初期処理
	// *******************************
	@Override
	protected void onStart() {
		super.onStart();

		Log.i("lightbox", "onStart");

		// hanbai.sqlite3 というファイル名で SQLite を作成
		mySQLite = new MySQLite(MainControl.this,"hanbai.sqlite3",1);
		// 更新用のデータベース・オブジェクトを取得
		db = mySQLite.getWritableDatabase();


	}

	// *******************************
	// SQLite用 終了処理
	// *******************************
	@Override
	protected void onStop() {
		super.onStop();

		Log.i("lightbox", "onStop");

		// 終了処理
		db.close();
		mySQLite.close();

	}

}


SQLite ヘルパークラス( MySQLite )
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MySQLite extends SQLiteOpenHelper {

	// *********************************
	// コンストラクタ
	// *********************************
	public MySQLite(Context context, String dbfile, int dbversion) {
		super(context, dbfile, null, dbversion);
	}

	@Override
	public void onCreate(SQLiteDatabase sqLiteDatabase) {

	}

	@Override
	public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

	}
}


データのインポート

前述のコードをエミュレータで実行するだけです。実行したら、エミュレータの実行を停止して、Tools メニューの Android から、Android Device Monitor を起動して、data/data/パッケージ名/databases/hanbai.sqlite3 を選択し、右上の Push アイコンでインポートします。

今回は、syain を使用しますが、テーブルには以下のようなものがあります。


データの読み出しとリストビューへの表示

loadView というメソッドを作成して、onStart 内で呼び出しています。リストビューは、カスタマイズ無しの単純リストビューなので、リストの付加データーは ArrayList に保存して使用します。( Syain クラスを作成すればその必要はありません )
public class MainControl extends MainActivity {

	// *******************************
	// SQLite用
	// *******************************
	public MySQLite mySQLite;
	public SQLiteDatabase db;
	public ContentValues values;

	// *******************************
	// ListView用
	// *******************************
	public ListView listView;
	public ArrayAdapter<String> arrayAdapter;	// 名前を格納
	public ArrayList<String> arrayList;	// コードを格納

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// ListView
		listView = (ListView) MainControl.this.findViewById(R.id.listView);
		arrayAdapter = new ArrayAdapter<String>(MainControl.this,android.R.layout.simple_list_item_1);
		listView.setAdapter(arrayAdapter);
		arrayList = new ArrayList<String>();

	}

	// *******************************
	// リストビューの表示
	// *******************************
	public void loadView() {

		String sql = String.format("select * from %s order by scode desc", "syain");
		Cursor cursor = mySQLite.getReadableDatabase().rawQuery(sql, null);

		Boolean isData = null;
		// 何度も呼び出されるので一覧を初期化
		arrayList.clear();
		arrayAdapter.clear();

		// SQLite のレコードセットの読み込みループ
		while ( isData == null ? (isData = cursor.moveToFirst()) : (isData = cursor.moveToNext()) ) {

			// 社員コード
			String scode = cursor.getString(cursor.getColumnIndex("scode"));
			arrayList.add(scode);
			// 氏名
			String sname = cursor.getString(cursor.getColumnIndex("sname"));
			arrayAdapter.add(sname);

			Log.i("lightbox", String.format("%s : %s",scode,sname));

		}
		cursor.close();
	}

	// *******************************
	// SQLite用 初期処理
	// *******************************
	@Override
	protected void onStart() {
		super.onStart();

		Log.i("lightbox", "onStart");

		// hanbai.sqlite3 というファイル名で SQLite を作成
		mySQLite = new MySQLite(MainControl.this,"hanbai.sqlite3",1);
		// 更新用のデータベース・オブジェクトを取得
		db = mySQLite.getWritableDatabase();

		// データを ListView に表示
		loadView();

	}

	// *******************************
	// SQLite用 終了処理
	// *******************************
	@Override
	protected void onStop() {
		super.onStop();

		Log.i("lightbox", "onStop");

		// 終了処理
		db.close();
		mySQLite.close();

	}

}




posted by lightbox at 2017-09-23 16:22 | Comment(0) | 2017 Android Studio | このブログの読者になる | 更新情報をチェックする

Android Studio にインポートして使用する SQLite データベースを MDB より作成する VBScript



Windows 64bit 用です。
( ソースを変更すれば、32ビットでももちろん動作します )


Android 内でいろいろするのは大変なので、2005年に作成してずっと使っているテスト用データを SQLite3 に変換する VBScript を改めて最新にしました。

最初の実行で、pragma auto_vacuum = full を実行しているので、いろいろやっても肥大はしないと思います。MDB のアクセスに Microsoft.Jet.OLEDB.4.0 を使用しており、32ビット用の cscript.exe を実行する必要があるので、内部で SysWOW64 を参照しています
( strWinDir と SysWOW64 を省けば 32ビット用になります )

SQLite3 ODBC Driver が必要です

32ビット用の ODBC ドライバが必要になります。ですが、後々の事を考えれば 64 と 32 を両方インストールするのが良いと思います

ODBC ドライバ

ソースコード
Crun()


' 使用する ODBC ドライバです
strDriver = "{SQLite3 ODBC Driver}"

strMDBFile = "販売管理B.mdb"
strSQLiteFile = "hanbai.sqlite3"


' ************************************************
' 基本設定
' ************************************************
' このスクリプトが存在するディレクトリを取得
strCurDir = WScript.ScriptFullName
strCurDir = Replace( strCurDir, WScript.ScriptName, "" )
strMdbPath = strCurDir & strMDBFile
strSQLite3Path = strCurDir & strSQLiteFile

strMessage = "対象 MDB は " & strMdbPath & "です" & vbCrLf & vbCrLf

strMessage = strMessage & "↓SQLiteの環境です" & vbCrLf
strMessage = strMessage & "DB : " & strSQLite3Path & vbCrLf & vbCrLf

strMessage = strMessage & "既にテーブルが存在する場合はメッセージが出ません" & vbCrLf
strMessage = strMessage & "それ以外ではエラーメッセージが出ますが、問題ありません"
if vbCancel = MsgBox( strMessage, vbOkCancel ) then
	Wscript.Quit
end if

' ************************************************
' 処理用文字列設定
' ************************************************
' MDB の接続文字列
strConnectMdb = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strMdbPath & ";"

strConnectSQLite3 = _
"Provider=MSDASQL;Driver="&strDriver&";DATABASE=" & strSQLite3Path & ";"

' ************************************************
' 初期処理
' ************************************************
Set Cn = CreateObject("ADODB.Connection")
Cn.CursorLocation = 3
Set Rs = CreateObject( "ADODB.Recordset" )

Set Cn2 = CreateObject("ADODB.Connection")
Cn2.CursorLocation = 3
Set Rs2 = CreateObject( "ADODB.Recordset" )
Rs2.LockType = 3

Cn.Open strConnectMdb
Cn2.Open strConnectSQLite3

RunSS( "pragma auto_vacuum = full" )

' ************************************************
' コード名称マスタ
' ************************************************
Query = _
"create table コード名称マスタ (" & _
"	kubun INT" & _
"	,code VARCHAR(10)" & _
"	,name NVARCHAR(50)" & _
"	,num1 INT" & _
"	,num2 INT" & _
"	,cdate DATETIME" & _
"	,udate DATETIME" & _
"	,primary key(kubun,code)" & _
")"
Call SSTransfer( "コード名称マスタ", Query )

' ************************************************
' コントロールマスタ
' ************************************************
Query = _
"create table コントロールマスタ (" & _
"	ckey VARCHAR(1)" & _
"	,udate DATETIME" & _
"	,uno INT" & _
"	,primary key(ckey)" & _
")"
Call SSTransfer( "コントロールマスタ", Query )

' ************************************************
' メッセージマスタ
' ************************************************
Query = _
"create table メッセージマスタ (" & _
"	code VARCHAR(4)" & _
"	,message NVARCHAR(100)" & _
"	,primary key(code)" & _
")"
Call SSTransfer( "メッセージマスタ", Query )

' ************************************************
' 取引データ
' ************************************************
Query = _
"create table 取引データ (" & _
"	tkubun VARCHAR(2)" & _
"	,uno INT" & _
"	,row INT" & _
"	,tdate DATETIME" & _
"	,tcode VARCHAR(4)" & _
"	,scode VARCHAR(4)" & _
"	,su INT" & _
"	,tanka単価 INT" & _
"	,kin INT" & _
"	,primary key(tkubun,uno,row)" & _
")"
Call SSTransfer( "取引データ", Query )

' ************************************************
' 商品マスタ
' ************************************************
Query = _
"create table 商品マスタ (" & _
"	scode VARCHAR(4)" & _
"	,sname NVARCHAR(50)" & _
"	,ztanka INT" & _
"	,htanka INT" & _
"	,sbun VARCHAR(3)" & _
"	,skubun VARCHAR(1)" & _
"	,cdate DATETIME" & _
"	,udate DATETIME" & _
"	,primary key(scode)" & _
")"
Call SSTransfer( "商品マスタ", Query )

' ************************************************
' 商品分類マスタ
' ************************************************
Query = _
"create table 商品分類マスタ (" & _
"	sbun VARCHAR(3)" & _
"	,name NVARCHAR(50)" & _
"	,cdate DATETIME" & _
"	,udate DATETIME" & _
"	,primary key(sbun)" & _
")"
Call SSTransfer( "商品分類マスタ", Query )

' ************************************************
' 得意先マスタ
' ************************************************
Query = _
"create table 得意先マスタ (" & _
"	tcode VARCHAR(4)" & _
"	,tname NVARCHAR(50)" & _
"	,tkubun VARCHAR(1)" & _
"	,tanto VARCHAR(4)" & _
"	,zip VARCHAR(7)" & _
"	,ad1 NVARCHAR(100)" & _
"	,ad2 NVARCHAR(100)" & _
"	,cdate DATETIME" & _
"	,udate DATETIME" & _
"	,primary key(tcode)" & _
")"
Call SSTransfer( "得意先マスタ", Query )

' ************************************************
' 社員マスタ
' ************************************************
Query = _
"create table 社員マスタ (" & _
"	scode VARCHAR(4)" & _
"	,sname NVARCHAR(50)" & _
"	,furi NVARCHAR(50)" & _
"	,syozoku VARCHAR(4)" & _
"	,sex INT" & _
"	,cdate DATETIME" & _
"	,udate DATETIME" & _
"	,kyuyo INT" & _
"	,teate INT" & _
"	,kanri VARCHAR(4)" & _
"	,primary key(scode)" & _
")"
Call SSTransfer( "社員マスタ", Query )

' ************************************************
' 郵便番号マスタ
' ************************************************
Query = _
"create table 郵便番号マスタ (" & _
"	zip VARCHAR(7)" & _
"	,kana1 NVARCHAR(255)" & _
"	,kana2 NVARCHAR(255)" & _
"	,kana3 NVARCHAR(255)" & _
"	,name1 NVARCHAR(255)" & _
"	,name2 NVARCHAR(255)" & _
"	,name3 NVARCHAR(255)" & _
")"
Call SSTransfer( "郵便番号マスタ", Query )

RunSS( "drop table codename" )
RunSS("alter table コード名称マスタ rename to codename")
RunSS( "drop table control" )
RunSS("alter table コントロールマスタ rename to control")
RunSS( "drop table message" )
RunSS("alter table メッセージマスタ rename to message")
RunSS( "drop table tdata" )
RunSS("alter table 取引データ rename to tdata")
RunSS( "drop table goods" )
RunSS("alter table 商品マスタ rename to goods")
RunSS( "drop table sbun" )
RunSS("alter table 商品分類マスタ rename to sbun")
RunSS( "drop table tokui" )
RunSS("alter table 得意先マスタ rename to tokui")
RunSS( "drop table syain" )
RunSS("alter table 社員マスタ rename to syain")
RunSS( "drop table zip" )
RunSS("alter table 郵便番号マスタ rename to zip")

RunSS( "drop view v_goods" )
Query = _
"create view v_goods as" & _
"	SELECT goods.scode" & _
"	, goods.sname" & _
"	, goods.htanka" & _
"	, sbun.sbun" & _
"	, sbun.name AS bunrui_name" & _
"	, goods.skubun" & _
"	, codename.name AS kubun_name" & _
" from" & _
"	(goods LEFT JOIN sbun" & _
"	ON goods.sbun = sbun.sbun" & _
"	) LEFT JOIN codename" & _
"	ON goods.skubun = codename.code" & _
" where" & _
"	codename.kubun = 3"
RunSS( Query )

' ************************************************
' 終了
' ************************************************

Cn2.Close
Cn.Close

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

' ************************************************
' 転送
' ************************************************
function SSTransfer( strTable, QueryCreate )

	Wscript.Echo strTable & " の作成を開始します"

	Dim Query

	Query = "drop table " & strTable
	RunSS( Query )

	RunSS( QueryCreate )

	Query = "select * from " & strTable
	Rs.Open Query, Cn
	Rs2.Open Query, Cn2

	nCount = Rs.Fields.Count
	Do While not Rs.EOF
		Rs2.AddNew

		For I = 0 to nCount - 1
			Rs2.Fields(I).Value = Rs.Fields(I).value
		Next
		Rs2.Update

		' 更新
		Rs.MoveNext
	Loop

	Rs2.Close
	Rs.Close

	Wscript.Echo strTable & " の作成が終了しました"

end function

' ************************************************
' SQLLite 実行
' ************************************************
function RunSS( Query )

	on error resume next
	Cn2.Execute Query
	if Err.Number <> 0 then
		Wscript.Echo Err.Description
	end if
	on error goto 0

end function


' **********************************************************
' Cscript.exe で実行を強制
' ウィンドウをアクティブにし、最大化ウィンドウとして表示(3)
' Cscript.exe の実行終了後 pause で一時停止
' **********************************************************
Function Crun( )

	Dim str,WshShell

	str = WScript.FullName
	str = Right( str, 11 )
	str = Ucase( str )
	if str <> "CSCRIPT.EXE" then
		str = WScript.ScriptFullName

		Set WshShell = CreateObject( "WScript.Shell" )
		strWinDir = WshShell.ExpandEnvironmentStrings("%windir%")

		strParam = " "
		For I = 0 to Wscript.Arguments.Count - 1
			if instr(Wscript.Arguments(I), " ") < 1 then
				strParam = strParam & Wscript.Arguments(I) & " "
			else
				strParam = strParam & Dd(Wscript.Arguments(I)) & " "
			end if
		Next
		Call WshShell.Run( "cmd.exe /c " & strWinDir & "\SysWOW64\cscript.exe " & Dd(str) & strParam & " & pause", 3 )
		WScript.Quit
	end if

End Function
' **********************************************************
' 文字列を " で囲む関数
' **********************************************************
Function Dd( strValue )

	Dd = """" & strValue & """"

End function


Androd には、初回データベースを一つ作成してデータベース用のフォルダを作成させて Push するといいです。

SQLite 用クラス
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MySQLite extends SQLiteOpenHelper {

	// *********************************
	// コンストラクタ
	// *********************************
	public MySQLite(Context context, String dbfile, int dbversion) {
		super(context, dbfile, null, dbversion);
	}

	@Override
	public void onCreate(SQLiteDatabase sqLiteDatabase) {

	}

	@Override
	public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

	}
}


db 作成およびテスト用コード
public class MainActivity extends AppCompatActivity {

	private MySQLite mySQLite;
	private SQLiteDatabase db;
	private ContentValues values;
	int counter;

	@Override
	protected void onStart() {
		super.onStart();
		Log.i("lightbox", "onStart");

		mySQLite = new MySQLite(MainActivity.this,"hanbai.sqlite3",1);
		// 書き込み用
		db = mySQLite.getWritableDatabase();
		// データ書き込み用
		values = new ContentValues();
		counter = 50;

	}

	@Override
	protected void onStop() {
		super.onStop();
		Log.i("lightbox", "onStop");

		db.close();
		mySQLite.close();

	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);


		MainActivity.this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				counter++;
				values.put("scode", String.format("%04d", counter));
				values.put("sname", String.format("氏名%d", counter));
				values.put("kyuyo", counter*1000);
				db.insert("syain", null, values);

				Log.i("lightbox", String.format("%d",counter));

			}
		});

		MainActivity.this.findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				String sql = String.format("select * from %s order by scode desc", "syain");
				Cursor cursor = mySQLite.getReadableDatabase().rawQuery(sql, null);
				Boolean isData = null;
				while ( isData == null ? (isData = cursor.moveToFirst()) : (isData = cursor.moveToNext()) ) {

					String scode = cursor.getString(cursor.getColumnIndex("scode"));
					String sname = cursor.getString(cursor.getColumnIndex("sname"));

					Log.i("lightbox", String.format("%s : %s",scode,sname));

				}
				cursor.close();

			}
		});



	}
}




posted by lightbox at 2017-09-23 16:14 | Comment(0) | 2017 Android Studio | このブログの読者になる | 更新情報をチェックする

ViewSwitcher を使用した2画面アプリ (3) : 画面部分の作成と画面切り替えテスト『画面をコントロールする Helper クラスの作成』

この内容は、ViewSwitcher を使用した2画面アプリ (2) : 画面部分の作成と画面切り替えテスト『画面の作成』より続いています。
Helper クラスはその名の通り、『お助けクラス』です。一般的には『標準化』の為の部品です。名称はなんでもいいですが、ここでは一般名として『Helper』と名乗っています。 通常、省略せずに画面まわりのコードを書こうとすると指定しているのは id だけなのに、やたらと長いコードを書くはめになります。また、アプリが完成してから眺めてみると、相当無駄が多いことも多くなります。 ここでは、まず最初からその無駄を省くための画面周りのメソッドを作成した Helper クラスをプロジェクトに追加します。 Helper クラスを作成すると、画面切り替えのテストは以下の MainActivity で行えます
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

	public Helper helper;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		helper = new Helper(MainActivity.this);

	}

	// *******************************
	// メニュー
	// *******************************
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.menu_main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();

		if (id == R.id.action_1) {
			Log.i("lightbox","処理1");

			helper.showFirstView();

			return true;
		}

		if (id == R.id.action_2) {
			Log.i("lightbox","処理2");

			helper.showInsertView();

			return true;
		}

		return super.onOptionsItemSelected(item);
	}
}

※ メニュー部分も省略したい場合は、MainActivity を継承したクラス( 例えば、MainControl )を作って、それをマニフェストで初期画面にするといいです。

Helper.java

※ コピペしやすいように、先頭のパッケージ部分を省いています

とても単純なコードが並んでいます。これらは本来 MainActivity で記述していたものを引越ししただけのものです。なので、このプロジェクトでしか使えませんが、『標準化』のサンプルにはなると思います。

確認ダイアログ処理に関しても、MainActivity に書くと、『ただ確認したいだけで機能とは関係無い』のに、とても多くの行数を必要とします。ただ、処理的には、確認後の処理は MainActivity で記述したいので、OnDialogOkListener を作って使用しています。(ボタンのクリック処理と同じです)

※ 商品では無いので(テストしたいだけなので)、フラグメントとかも無しです
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.ViewSwitcher;

public class Helper {

	private MainActivity mainActivity;
	private ViewSwitcher viewSwitcher;

	// *******************************
	// 確認ダイアログ用
	// *******************************
	private AlertDialog.Builder alertDialogBuilder;

	// *******************************
	// 確認ダイアログ用インターフェイス
	// *******************************
	public interface OnDialogOkListener {
		abstract public void onDialogOkListener();
	}

	// *******************************
	// コンストラクタ
	// *******************************
	public Helper(MainActivity mainActivity) {

		this.mainActivity = mainActivity;
		this.viewSwitcher = (ViewSwitcher) mainActivity.findViewById(R.id.viewSwitcher);

		initSettings();
	}

	// *******************************
	// 初期処理
	// ******************************
	public void initSettings() {

		mainActivity.setTitle("社員一覧");

	}

	// *******************************
	// 確認ダイアログ処理
	// ******************************
	public void showDialog( String message, final OnDialogOkListener listener ) {

		Log.i("lightbox", "showDialog");

		alertDialogBuilder = new AlertDialog.Builder(mainActivity);
		alertDialogBuilder.setTitle("確認");
		alertDialogBuilder.setMessage(message);

		alertDialogBuilder.setPositiveButton("OK",
				new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						Log.i("lightbox", "OK");

						listener.onDialogOkListener();

					}
				});

		alertDialogBuilder.setOnCancelListener(new DialogInterface.OnCancelListener() {
			@Override
			public void onCancel(DialogInterface dialog) {
				Log.i("lightbox", "CANCEL");
			}
		});

		// キャンセル可能
		alertDialogBuilder.setCancelable(true);
		alertDialogBuilder.show();

	}

	// *******************************
	// 初期画面
	// *******************************
	public void showFirstView() {

		// コード表示部分の表示
		Helper.this.getTextView(R.id.textViewCode).setVisibility(View.VISIBLE);
		// コード入力部分の非表示
		Helper.this.getEditText(R.id.editTextCode).setVisibility(View.GONE);
		mainActivity.setTitle("社員一覧");
		viewSwitcher.setDisplayedChild(0);

	}

	// *******************************
	// 修正画面
	// *******************************
	public void showEditView() {

		// コード表示部分の表示
		Helper.this.getTextView(R.id.textViewCode).setVisibility(View.VISIBLE);
		// コード入力部分の非表示
		Helper.this.getEditText(R.id.editTextCode).setVisibility(View.GONE);
		mainActivity.setTitle("社員修正");
		viewSwitcher.setDisplayedChild(1);

	}

	// *******************************
	// 新規画面
	// *******************************
	public void showInsertView() {

		// コード表示部分の表示
		Helper.this.getTextView(R.id.textViewCode).setVisibility(View.GONE);
		// コード入力部分の非表示
		Helper.this.getEditText(R.id.editTextCode).setVisibility(View.VISIBLE);
		mainActivity.setTitle("社員登録");
		Helper.this.setEditTextString(R.id.editTextCode,"");
		Helper.this.setEditTextString(R.id.editText1,"");
		Helper.this.setEditTextString(R.id.editText2,"");
		viewSwitcher.setDisplayedChild(1);

	}

	// *******************************
	// EditText 取得
	// *******************************
	public EditText getEditText(int id) {
		return (EditText)mainActivity.findViewById(id);
	}

	// *******************************
	// TextView 取得
	// *******************************
	public TextView getTextView(int id) {
		return (TextView)mainActivity.findViewById(id);
	}

	// *******************************
	// TextView より値取得
	// *******************************
	public String getTextViewString(int id) {
		return ((TextView)mainActivity.findViewById(id)).getText().toString();
	}

	// *******************************
	// EditText より入力値取得
	// *******************************
	public String getEditTextString(int id) {
		return ((EditText)mainActivity.findViewById(id)).getText().toString();
	}

	// *******************************
	// EditText に値セット
	// *******************************
	public void setEditTextString(int id,String text) {
		((EditText)mainActivity.findViewById(id)).setText(text);
	}

}





posted by lightbox at 2017-09-23 15:07 | Comment(0) | 2017 Android Studio | このブログの読者になる | 更新情報をチェックする

ViewSwitcher を使用した2画面アプリ (2) : 画面部分の作成と画面切り替えテスト『画面の作成』

この内容は、ViewSwitcher を使用した2画面アプリ (1) : 画面部分の作成と画面切り替えテスト『メニューの作成』より続いています。
ViewSwitcher 上で二つのレイアウトを作成し、ViewSwitcher のメソッドを使用してそのレイアウトを切り替えます。そのまま全てを一つの画面定義に記述してもいいのでが、そうすると2画面目の内容を『デザイナ』で確認する事ができません。 ですから、2画面目は別の画面定義で作成して、include で ViewSwitcher の中から呼び出すようにします。 activity_main.xml 画面の切り替えは、一般的には ViewAnimator クラスの showNext() と showPrevious() を使うのですが、実行するのがメニューなので、どこで実行しても正しい画面が表示されるように、setDisplayedChild(int whichChild) を使用します( whichChild は 0 かまたは 1 ) 多少無駄な動きは存在しますが、簡単に正しく動作するはずです。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:padding="16dp">

    <ViewSwitcher
        android:id="@+id/viewSwitcher"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

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

        </LinearLayout>

        <include
            android:id="@+id/entry"
            layout="@layout/entry"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    </ViewSwitcher>

</LinearLayout>





entry.xml

editTextCode と textViewCode と  は、社員マスタのキー部分に使用します。機能としては、修正処理と新規登録処理の二つあるので、それぞれ editTextCode と textViewCode を使い、使用しないほうは setVisibility(View.GONE); で非表示にします
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <TextView
        android:id="@+id/textViewCode"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="4dp"
        android:textSize="30sp"/>

    <EditText
        android:id="@+id/editTextCode"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"/>

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"/>

    <EditText
        android:id="@+id/editText2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"/>

    <Button
        android:id="@+id/buttonUpdate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="更新"/>

</LinearLayout>





posted by lightbox at 2017-09-23 14:33 | Comment(0) | 2017 Android Studio | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

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

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