[JAVASCRIPT] PDFをWebブラウザから自動で印刷する方法

PDFをWebブラウザに簡単に印刷する備忘録です。
仕事では、1)クライアント側で印刷したい旨の情報をサーバ側に伝える。2)サーバ側で動的にPDFを作成して、そのPDFをWebサーバに配置(決まった場所に保存)して、保存したURLをクライアント側(Webブラウザ)に伝え、3)Webブラウザで(自動で)印刷する。というパターンが多いと思います。

今回は、一連の手順を示したいと思います。
1)これは、Jquey.ajaxを使えば簡単にサーバとの連携ができます。
具体的には、

//PDF作成依頼
var fileURLdata ;
fileURLdata = JSON.parse($.ajax({
url: "サーバ側処理URL.aspx?targetid=" + targetid --今回はASP.NETで処理しています
+ "&year=" + year --引数は処理に合わせて適当に
+ "&month=" + month
+ "&kbn=" + kbn
+ "&sub_cd=" + sub_cd
, async: false --ファイルの作成を待つため同期処理で
}).responseText);

2)サーバ側でPDF作成
細々とした部分は割愛して書きます。

try
Dim fileURL As String = "0"

'パラメータ取得
'year, month, targetid, 等々の取得

'定義ファイル指定
ReportViewer1.LocalReport.ReportPath = "xxxxx.aspx.rdlc"

'パラメータセット
param.Add(New ReportParameter("Report_Parameter_0", "パラメータ文言"))
ReportViewer1.LocalReport.SetParameters(param)

'データバインド
Dim oQA As New TableAdapters.xxxxxTableAdapter
Dim oDT As New xxxxx.xxxxxDataTable
oDT = oQA.GetData(year, month, targetid, kbn) 'クライアント側からパラメータで貰ったもの

Dim oRDS As New ReportDataSource
oRDS.Name = "DataSet1_xxxxx"
oRDS.Value = oDT
ReportViewer1.LocalReport.DataSources.Add(oRDS)

'データ再セット
ReportViewer1.LocalReport.Refresh()

Dim warnings As Warning() = Nothing
Dim streamids As String() = Nothing
Dim mineType As String = Nothing
Dim encoding As String = Nothing
Dim extension As String = Nothing
Dim bytes As Byte()

'PDFデータ取得
bytes = ReportViewer1.LocalReport.Render("PDF", Nothing, mineType, encoding, extension, streamids, warnings)

'PDFデータ書き出し
Dim outputfile As String = "指定ディレクトリ"
Dim snt As String = Now().ToString("yyyyMMddHHmmss")
outputfile += snt + "_" + sub_cd + "-" + targetid + ".pdf"

fileURL = "指定URLディレクトリ"
fileURL += snt + "_" + sub_cd + "-" + targetid + ".pdf"
Dim fs As New IO.FileStream(outputfile, IO.FileMode.Create)
fs.Write(bytes, 0, bytes.Length)
fs.Close()

Catch ex As Exception
fileURL = "0"

Finally
Dim result As New List(Of printInfo)
Dim pi As New printInfo()
pi.fileURL = fileURL
pi.alert1 = ""
pi.alert2 = ""
result.Add(pi)

Dim serializer As System.Web.Script.Serialization.JavaScriptSerializer = New System.Web.Script.Serialization.JavaScriptSerializer()
Response.Write(serializer.Serialize(result))
Response.End()

---------------
Public Class printInfo
Public fileURL As String
Public alert1 As String
Public alert2 As String
End Class

3)Webブラウザで(自動で)印刷する

//ファイル作成成否確認
if (fileURLdata[0].fileURL == "0") { alert("印刷用PDF作成に失敗しました"); (window.open('', '_self').opener = window).close(); }

//ファイル名取得
var fileURL = fileURLdata[0].fileURL;

//OBJECTタグを作成
var tid = 'objPdf' + targetid + jQuery.now().toString();
var obj = document.createElement('object');
obj.setAttribute('id', tid);
obj.setAttribute('classid', 'clsid:CA8A9780-280D-11CF-A24D-444553540000'); // PDFのクラスID(固定値)
obj.setAttribute('height', '1');
obj.setAttribute('width', '1');

//PDFのソースを設定
var param = document.createElement('param');
param.setAttribute('name', 'src');
param.setAttribute('value', fileURL);
obj.appendChild(param);

//作成したOBJECTタグをDIVタグの中にセット
$("
<div id="pdfDiv&quot; + i + &quot;" style="border-style: none; height: 1px; width: 1px; background-color: #ffffff;"></div>
").appendTo($("#div_footter"));--差し障りの無い所へ追加
var div = document.getElementById('pdfDiv' + i);
div.appendChild(obj);
div.innerHTML = obj.outerHTML;

document.getElementById(tid).printAll();

以上です。

[SQL Server]SQLServerのNOLOCKロックヒント(ダーティーリードがしたい)

今日はSQLの処理がどこまで進んだか経過を見たい(keyのmax値を取得したい)等の場合、テーブルにロックが掛かってしまい値が取れない時に、ダーティーリードを行う備忘録です。
普段の処理ではあやふやなデータが返ってくるためほとんど使用しません。
そもそもコミット前なので、ロールバックすることも有るし。
で、データの一括修正を行って居て、現在どのへんまで終わったか、全体が終わるのはいつかなどの目安の時間を知るためなどに使用します。

sql文はヒント「NOLOCK」を付けるだけの簡単なものです。
 select * from テーブル名 WITH(NOLOCK)

簡単なテストをシたい場合は、以下のようにすることで確かめられます。
1)まずは、テスト用テーブル作成

create table ##tbl1(
 id int,
 val int 
)

2)次に、SQLの挿入処理・・・時間を稼ぐ為にWAITFOR DELAY 使用

begin tran
  --	delete from ##tbl1
  declare @i int
  set @i=0

  while @i<100
   begin	
    insert into ##tbl1 values(@i,1)
    WAITFOR DELAY '00:00:03'
    set @i=@i+1
   end
commit tran

3)select文の発行
上の挿入SQLと異なるクエリウィンドウを立ち上げてチェック実施
また、下のSQLの個別のクエリウィンドウで確認した方がわかりやすい。

select max(id) from ##tbl1                        --・・・・commit されるまで返って来ない
select max(id) from ##tbl1 WITH(NOLOCK) --・・・・直ぐに返って来る

※)注意
 NOLOCKヒントを付けても、テーブルのスキーマ変更やSQLServerが内部で統計情報を更新するときに発生するスキーマロックが掛かっていると、待たされます。
 なので、必ず想定する処理時間内に戻ってくるとは限りませんので、重要な仕事で使用時にはタイムアウト等考えておきましょう。

以上です。

[SQL SERVER] 1回のSQL発行で複数レコードをINSERTする方法

SQL SERVERで簡単なロジックテストを行う際、仮のテーブルを作成して動作を確認したい場合が有ります。
そんな時、今までは、
  declare @tbl1 table(id int, val int)
  insert into @tbl1 values(1,10)
  insert into @tbl1 values(1,20)
  insert into @tbl1 values(2,10)
  select * from @tbl1

のようにデータを作成していました。
それが、知らぬ間にSQL SERVER 2008から次のようなSQLでできるようになったそうです!
えー、ちなみに確認は、SQL SERVER 2012でしか行なっていません。。。

  declare @tbl1 table(id int, val int)
  insert into @tbl1 values(1,10)
  , (1,20)
  , (2,10)
  select * from @tbl1

元々コピペをすれば大した手間では無いですが、なんとなく損していた気がしています^^;

ではでは。