SQLの窓

2014年07月14日


SQLServer(SQLExpress) : SQL学習用販売管理データとインポート用スクリプト



■ プログラム名
SQLExpress(SQLServer)用学習用販売管理データ作成

■ 概要

販売管理B.mdb に格納されている販売管理用のテーブルとビューを SQLExpress(SQLServer) にインポートします

■ 実行方法

1) データベースを前もって作成して下さい
2) hanbaiB_ss.vbs の strDb を作成したデータベース名に変更
3) strPwd を正しいパスワードに変更
4) エクスプローラから、hanbaiB_ss.vbs をダブルクリックして下さい

Crun()



' 別名 または SQLServer のインスタンス文字列を指定します
' インスタンス文字列は、PC名\インスタンス名 ですが、
' SQLExpress2005 ならば .\SQLEXPRESS で接続できるかもしれません
' ( 別名が確実です )
' 【以下URLは別名等接続設定参考ページ】
' http://lightbox.matrix.jp/ginpro/patio.cgi?mode=view&no=228
' NIGHT_TCP は別名定義です
strCon = "NIGHT_TCP"

' ▼ SQLExpress2012 / .\sqlexpress or localhost\sqlexpress or pcname\sqlexpress
strCon = ".\sqlexpress"

' データベース
' 事前に create database 文で作成する必要があります
' 上記URLを参考に、sqlcnmd を使って作成します
strDb = "lightbox"

' ユーザ
' 上記URLの設定で、sa が有効になります
strUser = "sa"

' パスワード
' 上記URLの設定で、パスワードを設定できます
strPwd = "passwordpassword"

' 使用する ODBC ドライバです
' SQLServer 2000 より後のバージョンですと、{SQL Native Client} も利用できます
' ODBC アドミニストレータで確認して下さい
strDriver = "{SQL Server}"
' strDriver = "{SQL Native Client}"
' ▼ SQLExpress2012
' strDriver = "{SQL Server Native Client 11.0}"


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

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

strMessage = strMessage & "↓SQLServerの環境です" & vbCrLf
strMessage = strMessage & "SERVER : " & strCon & vbCrLf
strMessage = strMessage & "DB : " & strDb & vbCrLf
strMessage = strMessage & "USER : " & strUser & vbCrLf
strMessage = strMessage & "PASS : " & strPwd & 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 & ";"

strConnectSQLServer = _
" in '' [ODBC;Driver="&strDriver&";SERVER=" & _
strCon & ";Database=" & strDb & ";UID=" & strUser & ";PWD=" & strPwd & "]"

strConnectSQLServer2 = _
"Provider=MSDASQL;Driver="&strDriver&";SERVER=" & _
strCon & ";Database=" & strDb & ";UID=" & strUser & ";PWD=" & strPwd

' ************************************************
' 初期処理
' ************************************************
Set Cn = CreateObject("ADODB.Connection")
Set Cn2 = CreateObject("ADODB.Connection")
Cn.Open strConnectMdb
Cn2.Open strConnectSQLServer2

' ************************************************
' コード名称マスタ
' ************************************************
Query = _
"create table コード名称マスタ (" & _
"	区分 INT" & _
"	,コード VARCHAR(10)" & _
"	,名称 NVARCHAR(50)" & _
"	,数値1 INT" & _
"	,数値2 INT" & _
"	,作成日 DATETIME" & _
"	,更新日 DATETIME" & _
"	,primary key(区分,コード)" & _
")"
Call SSTransfer( "コード名称マスタ", Query )

' ************************************************
' コントロールマスタ
' ************************************************
Query = _
"create table コントロールマスタ (" & _
"	キー VARCHAR(1)" & _
"	,売上日付 DATETIME" & _
"	,売上伝票 INT" & _
"	,primary key(キー)" & _
")"
Call SSTransfer( "コントロールマスタ", Query )

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

' ************************************************
' 取引データ
' ************************************************
Query = _
"create table 取引データ (" & _
"	取引区分 VARCHAR(2)" & _
"	,伝票番号 INT" & _
"	,行 INT" & _
"	,取引日付 DATETIME" & _
"	,取引先コード VARCHAR(4)" & _
"	,商品コード VARCHAR(4)" & _
"	,数量 INT" & _
"	,単価 INT" & _
"	,金額 INT" & _
"	,primary key(取引区分,伝票番号,行)" & _
")"
Call SSTransfer( "取引データ", Query )

' ************************************************
' 商品マスタ
' ************************************************
Query = _
"create table 商品マスタ (" & _
"	商品コード VARCHAR(4)" & _
"	,商品名 NVARCHAR(50)" & _
"	,在庫評価単価 INT" & _
"	,販売単価 INT" & _
"	,商品分類 VARCHAR(3)" & _
"	,商品区分 VARCHAR(1)" & _
"	,作成日 DATETIME" & _
"	,更新日 DATETIME" & _
"	,primary key(商品コード)" & _
")"
Call SSTransfer( "商品マスタ", Query )

' ************************************************
' 商品分類マスタ
' ************************************************
Query = _
"create table 商品分類マスタ (" & _
"	商品分類 VARCHAR(3)" & _
"	,名称 NVARCHAR(50)" & _
"	,作成日 DATETIME" & _
"	,更新日 DATETIME" & _
"	,primary key(商品分類)" & _
")"
Call SSTransfer( "商品分類マスタ", Query )

' ************************************************
' 得意先マスタ
' ************************************************
Query = _
"create table 得意先マスタ (" & _
"	得意先コード VARCHAR(4)" & _
"	,得意先名 NVARCHAR(50)" & _
"	,得意先区分 VARCHAR(1)" & _
"	,担当者 VARCHAR(4)" & _
"	,郵便番号 VARCHAR(7)" & _
"	,住所1 NVARCHAR(100)" & _
"	,住所2 NVARCHAR(100)" & _
"	,作成日 DATETIME" & _
"	,更新日 DATETIME" & _
"	,primary key(得意先コード)" & _
")"
Call SSTransfer( "得意先マスタ", Query )

' ************************************************
' 社員マスタ
' ************************************************
Query = _
"create table 社員マスタ (" & _
"	社員コード VARCHAR(4)" & _
"	,氏名 NVARCHAR(50)" & _
"	,フリガナ NVARCHAR(50)" & _
"	,所属 VARCHAR(4)" & _
"	,性別 INT" & _
"	,作成日 DATETIME" & _
"	,更新日 DATETIME" & _
"	,給与 INT" & _
"	,手当 INT" & _
"	,管理者 VARCHAR(4)" & _
"	,primary key(社員コード)" & _
")"
Call SSTransfer( "社員マスタ", Query )

' ************************************************
' 郵便番号マスタ
' ************************************************
Query = _
"create table 郵便番号マスタ (" & _
"	郵便番号 VARCHAR(7)" & _
"	,都道府県名カナ NVARCHAR(255)" & _
"	,市区町村名カナ NVARCHAR(255)" & _
"	,町域名カナ NVARCHAR(255)" & _
"	,都道府県名 NVARCHAR(255)" & _
"	,市区町村名 NVARCHAR(255)" & _
"	,町域名 NVARCHAR(255)" & _
")"
Call SSTransfer( "郵便番号マスタ", Query )

' ************************************************
' ビュー
' ************************************************
RunSS( "drop view V_商品一覧" )
Query = _
"create view V_商品一覧 as" & _
"	SELECT 商品マスタ.商品コード" & _
"	, 商品マスタ.商品名" & _
"	, 商品マスタ.販売単価" & _
"	, 商品分類マスタ.商品分類" & _
"	, 商品分類マスタ.名称 AS 分類名" & _
"	, 商品マスタ.商品区分" & _
"	, コード名称マスタ.名称 AS 区分名" & _
" from" & _
"	(商品マスタ LEFT JOIN 商品分類マスタ" & _
"	ON 商品マスタ.商品分類 = 商品分類マスタ.商品分類" & _
"	) LEFT JOIN コード名称マスタ" & _
"	ON 商品マスタ.商品区分 = コード名称マスタ.コード" & _
" where" & _
"	コード名称マスタ.区分 = 3"
RunSS( Query )

RunSS( "drop view V_売上日付" )
Query = _
"create view V_売上日付 as" & _
"	SELECT コントロールマスタ.売上日付" & _
"	FROM コントロールマスタ" & _
"	WHERE コントロールマスタ.キー = '1'"
RunSS( Query )

RunSS( "drop view V_得意先台帳" )
Query = _
"create view V_得意先台帳 as" & _
"	SELECT 取引データ.取引先コード" & _
"	, 得意先マスタ.得意先名" & _
"	, 取引データ.取引日付" & _
"	, 取引データ.取引区分" & _
"	, 取引データ.伝票番号" & _
"	, 取引データ.行" & _
"	, 取引データ.商品コード" & _
"	, 商品マスタ.商品名" & _
"	, 取引データ.数量" & _
"	, 取引データ.単価" & _
"	, 取引データ.金額" & _
" from" & _
"	(取引データ INNER JOIN 商品マスタ" & _
"	ON 取引データ.商品コード=商品マスタ.商品コード" & _
"	) INNER JOIN 得意先マスタ" & _
"	ON 取引データ.取引先コード=得意先マスタ.得意先コード" & _
" where" & _
"	取引データ.取引区分 = '10'"
RunSS( Query )

RunSS( "drop view V_社員一覧" )
Query = _
"create view V_社員一覧 as" & _
" select 社員コード" & _
"	,氏名" & _
"	,フリガナ" & _
"	,名称1.名称 as 性別" & _
"	,所属" & _
"	,名称2.名称 as 所属名" & _
" from 社員マスタ" & _
"	,コード名称マスタ 名称1" & _
"	,コード名称マスタ 名称2" & _
" where 性別 = 名称1.コード" & _
"   and 名称1.区分 = 1" & _
"   and 所属 = 名称2.コード" & _
"   and 名称2.区分 = 2"
RunSS( Query )

' ************************************************
' 終了
' ************************************************
Query = "drop table 転送用テーブル"
RunSS( Query )

Cn2.Close
Cn.Close

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

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

	Dim Query

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

	RunSS( QueryCreate )

	Query = "drop table 転送用テーブル"
	RunSS( Query )
	Query = "select * into 転送用テーブル" & strConnectSQLServer & _
	" from " & strTable
	RunMdb( Query )

	Query = "insert into " & strTable & _
	" select * from 転送用テーブル"
	RunSS( Query )

end function

' ************************************************
' MDB 実行
' ************************************************
function RunMdb( Query )

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

end function

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

	on error resume next
	Cn2.Execute Query
	if Err.Number <> 0 then
		if Query <> "drop table 転送用テーブル" then
			Wscript.Echo Err.Description
		end if
	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" )

		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 cscript.exe " & Dd(str) & strParam & " & pause", 3 )
		WScript.Quit
	end if

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

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

End function

Crun は、Cscript.exe(コマンドプロンプト) で実行を強制する処理です。最後に pause で停止するようになっています。

エクスポートに、in 句を使っていますが、参照構文は以下のようになっています。
strConnectSQLServer = _
" in '' [ODBC;Driver="&strDriver&";SERVER=" & _
strCon & ";Database=" & strDb & ";UID=" & strUser & ";PWD=" & strPwd & "]"
これは、結構昔からある ODBC テーブルへのリンク用の構文を使用しています。ODBC テーブルを開く接続文字列は、以下の形式を持ちます。

"ODBC; connectstring"



posted by lightbox at 2014-07-14 14:55 | SQLExpress | このブログの読者になる | 更新情報をチェックする

2014年07月13日


『家に帰ると妻が必ず死んだふりをしています』というブログを発見しました

元々は、Yahoo!知恵袋 の質問内容なんですが、Yahoo!知恵袋 で再現ドラマを制作しているというニュースから辿って行きました。

家に帰ると妻が必ず死んだふりをしています。

この質問内容のタイトルもそうですが、質問の文章がものすごく『うまい』んです。オチもあるし、何回笑ったか解りません。

で、こういう奥さん本当に居るのかなぁ・・・と、質問者さんのデータを見たらブログの URL があったんで、見てみると・・・・居ました。本物の愛すべき奥さんの行動が、2010/9/8 から、2014/7/4 まで続いていました。まだちょっとしか読んで無いですけれど、これから全部読破しようと思います。


ちなみに。

2話目のタイトルが、

『お小遣いを請求すると妻は酔っぱらいます』

本当にかわいい奥さんですね。


※ 正確には、3話目でしようか。2話目はちょっとブログ的な語りだったので。


posted by lightbox at 2014-07-13 20:27 | 記録 | このブログの読者になる | 更新情報をチェックする

2014年07月11日


jQuery/JavaScript : 画像を最初から最大表示する為の window.open

大きい画像は、一般的なツールで表示しようとすると適当な大きさに縮小して表示したりしますが、縦の画像の場合はディスプレイの向きと合わずにあまり大きく表示されなかったりします。ですが、最初から鮮明な画像を参照目的で表示したい場合もあるので、window.open で目的のサイズを作成して、そこへ img 要素を書き込んで表示します
 

<script type="text/javascript">
$(function(){

	$("#image_open")
		.attr("type", "button")
		.val("画像を最初から最大表示")
		.click(function(){
			var w=1000,h=860;

			var hwin=window.open(
				"about:blank",
				"",
				// ウインドウの状態を設定
				"width="+w+
				",height="+h+
				",resizable=1,scrollbars=1"+
				",left="+(screen.width-w)/2+
				",top="+(screen.height-(h+100))/2);

			// ウインドウに書き込み
			hwin.document.write("<img src=\""+$(this).data("url")+"\">");
		});

});

</script>

<input id="image_open" data-url="https://lh4.googleusercontent.com/-Mq-8YkdWapM/U78yGav_zNI/AAAAAAAAVOg/ThULLTH3h0E/s1200/1405013162220598.jpg"> 


posted by lightbox at 2014-07-11 14:04 | jQuery | このブログの読者になる | 更新情報をチェックする

2014年07月07日


2014年7月7日現在。WEBフォントの実際

久しぶりに WEB フォントがどのようになっているか IE11、Google Chrome、Firefox で確認してみました。どういうわけか、WEB 上には『これだ』という情報が無く、現時点でもいろいろ変化の途中なのかな・・・と思った次第ですが、いろいろチェックした結果二つの大きな事が解りました。

1) 3つのブラウザで、WOFF 形式で表示可能
2) WOFF の変換は、ttf to woff converter というオンラインサービスで行う必要がある

最も大きな事は 2番目です。最初、武蔵システムの WOFF コンバータを使ってうまく行かず、既に表示されているサイトからフォントをダウンロードして動作する事を確認し、要するに WOFF ファイルが悪いという事が解って、できるだけ新しい日付の記事等で、コンバータを探してたどり着いたのが Everything Fonts という、このコンバータのサイトです。ここでは、API を有償で公開していますので、ある程度またはかなりの信頼性があります。他のツールを見ても幅広く、余程フォントに関して精通しておられる方のサイトと見受けられます。

結局、元々の ttf ですら厳密にはいろいろな問題のあるファイルが流通している、または自分で作ってしまっている事が考えられます。そこから、WOFF へ変換して、うまく行ったのが Everything Fonts のみという結果です。

クロスドメイン用に Google ドライブ

Google ドライブで誰でも簡単 WEB ページ

Google ドライブですと、Access-Control-Allow-Origin: * を返してくれるので、Ajax のデータや、このようなフォント置き場としてブログ等から利用できます。ただ、フォントとなるとそれなりに大きいので、最初はかならずダウンロードが発生します( フルの日本語フォントならそれなりに時間を要します )。なので、一応ブログでは必要な記事でのみ呼び出す事にします。
<script>
if ( !window[window.location.hostname+'.FancyBalloons'] ) {
	window[window.location.hostname+'.FancyBalloons'] = true;
	(function() {
		var str="";
		str+="<style> \n";
		str+="@font-face { \n";
		str+="    font-family: 'fb'; \n";
		str+="    src: url('https://googledrive.com/host/0B9Jymqpro6gSVlB5Wm52U29wTlE/font/FancyBalloons_x.woff') format('woff'); \n";
		str+="} \n";
		str+="</style> \n";
		document.write(str);
	})();
}
</script>
<style>
#web_font_content {
	font-family: 'fb';
	font-size:60px;
}
</style>
<span id="web_font_content">ファンシーバルーン</span>


ファンシーバルーン



タグ:Webフォント
posted by lightbox at 2014-07-07 20:56 | WEBブラウザ | このブログの読者になる | 更新情報をチェックする

2014年07月06日


jQuery の .contents と .children の違い

メソッドとしては、.children に引数としてセレクタが使えますが、.contents との本来の違いは、.contents には、テキストノードが含まれることです。

▼ 英文ドキュメントの記述
The .contents() and .children() methods are similar, except that the former includes text nodes as well as HTML elements in the resulting jQuery object.
以下のように DIV を対象にして実行すると、.contents では、文章を取り出す事ができます ※ コードのテスト
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script type="text/javascript">

$(function(){

	// テキストノードが含まれる
	$( "#text_div1" )
		.contents()
		.each(function(){
			console.log(this);
		});

	// テキストノードが含まれない(HTMLのみ)
	$( "#text_div2" )
		.children()
		.each(function(){
			console.log(this);
		});

});
</script>
<div id="text_div1">
	今は昔、竹取の翁といふ者ありけり。
	<br><br>
	野山にまじりて竹を取りつつ、よろづのことに 使ひけり。
	<br><br>
	名をば、さぬきの造となむいひける。
</div>

<div id="text_div2">
	今は昔、竹取の翁といふ者ありけり。
	<br><br>
	野山にまじりて竹を取りつつ、よろづのことに 使ひけり。
	<br><br>
	名をば、さぬきの造となむいひける。
</div>




タグ:jquery
posted by lightbox at 2014-07-06 22:12 | メソッド:jQuery | このブログの読者になる | 更新情報をチェックする

2014年07月05日


jQuery の .children で、直近の子要素のみを選択して処理する

一般的には、セレクタを使って、ある特定の要素の中の全ての特定要素を取得できますが、要素内の次のレベルのみ取得したい場合は、.childlen を使用して、引数にセレクタを渡します。以下の例では、一番上のボックスがなにもしない状態で、2番目のボックスで jQuery の最初のセレクタで level-2 内の全ての li 要素を取得しています。

そして、3番目のボックスで次のレベルにある li 要素だけを取り出しています。

※ 最初の検索は、$( "#levelTarget1 .level-2" ).find("li") でも可能です
  • I
  • II
    • A
      • 1
      • 2
      • 3
      1. 1
      2. 2
      3. 3
    • B
  • III
  • I
  • II
    • A
      • 1
      • 2
      • 3
      1. 1
      2. 2
      3. 3
    • B
  • III
  • I
  • II
    • A
      • 1
      • 2
      • 3
      1. 1
      2. 2
      3. 3
    • B
  • III

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script type="text/javascript">

$(function(){

$( "#levelTarget1 .level-2 li" )
	.css( {
		"background-color": "pink",
		"width": "300px",
		"padding": "10px",
		"border": "1px solid #123456",
		"border-radius": "5px"
	});

$( "#levelTarget2 .level-2" )
	.children("li")
	.css( {
		"background-color": "pink",
		"width": "300px",
		"padding": "10px",
		"border": "1px solid #123456",
		"border-radius": "5px"
	});

});
</script>
<style>
.level-1 {
	width:450px;
	border: 1px solid #c0c0c0;
	padding: 10px 0 10px 30px;
	border-radius: 10px;
	box-shadow: 0 15px 30px -15px;
}
</style>
<ul class="level-1">
	<li>I</li>
	<li>II</li>
	<ul class="level-2">
		<li style="background-color:#fff">A</li>
		<ul class="level-3">
			<li style="background-color:#fff">1</li>
			<li style="background-color:#fff">2</li>
			<li style="background-color:#fff">3</li>
		</ul>
		<ol class="level-3">
			<li style="background-color:#fff">1</li>
			<li style="background-color:#fff">2</li>
			<li style="background-color:#fff">3</li>
		</ol>
		<li style="background-color:#fff">B</li>
	</ul>
	<li>III</li>
</ul>
<ul id="levelTarget1" class="level-1">
	<li>I</li>
	<li>II</li>
	<ul class="level-2">
		<li style="background-color:#fff">A</li>
		<ul class="level-3">
			<li style="background-color:#fff">1</li>
			<li style="background-color:#fff">2</li>
			<li style="background-color:#fff">3</li>
		</ul>
		<ol class="level-3">
			<li style="background-color:#fff">1</li>
			<li style="background-color:#fff">2</li>
			<li style="background-color:#fff">3</li>
		</ol>
		<li style="background-color:#fff">B</li>
	</ul>
	<li>III</li>
</ul>
<ul id="levelTarget2" class="level-1">
	<li>I</li>
	<li>II</li>
	<ul class="level-2">
		<li style="background-color:#fff">A</li>
		<ul class="level-3">
			<li style="background-color:#fff">1</li>
			<li style="background-color:#fff">2</li>
			<li style="background-color:#fff">3</li>
		</ul>
		<ol class="level-3">
			<li style="background-color:#fff">1</li>
			<li style="background-color:#fff">2</li>
			<li style="background-color:#fff">3</li>
		</ol>
		<li style="background-color:#fff">B</li>
	</ul>
	<li>III</li>
</ul>



タグ:jquery
posted by lightbox at 2014-07-05 20:53 | メソッド:jQuery | このブログの読者になる | 更新情報をチェックする
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 ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり