-
PostgreSQLでシステム日付を取得する場合には、以下の様なFROMの無いSQL文で行います。 PostgreSQLではFROMが必要なければ記述することはありません。
PostgreSQLの「SQL Shell(psql)」で実行します。
postgres=# SELECT NOW(); now ---------------------------- 2016-03-10 14:44:20.369+09 (1 行)
定数を同時にSELECT取得することもできます。
postgres=# SELECT NOW() AS DATETIME, 1 AS NumberTest, 'TEST' AS StringTest; datetime | numbertest | stringtest ----------------------------+------------+------------ 2016-03-10 14:47:16.987+09 | 1 | TEST (1 行)
ここで、PostgreSQLの面白い関数について紹介します。 それが「generate_series」で複数行の整数を返すことができます。
関数 動作内容 generate_series(start, stop)グラフィックstartからstopまでの刻み1で連続する値を生成 generate_series(start, stop, step)startからstopまでの刻みstepで連続する値を生成
以下にその例を示します。
postgres=# SELECT generate_series(1, 3); generate_series ----------------- 1 2 3 (3 行) postgres=# SELECT * FROM generate_series(1, 3); generate_series ----------------- 1 2 3 (3 行) postgres=# SELECT NumTbl.NumVal FROM generate_series(1, 3) AS NumTbl(NumVal); numval -------- 1 2 3 (3 行)
1番目の様にSELECT文のなかのカラムを記述するところにいれてもいいですし、 また、2番目の様にFROM句でテーブル扱いにしてもOKです。 さらに、3番目ではテーブルの別名として「NumTbl(NumVal)」(仮にここでの命名)とすると 生成される数値を「NumTbl」テーブルのカラム名「NumVal」で参照ができます。
この3番目の方法を使うことでいろいろ応用が利くと思います。 以下は、今日からの3日間を羅列するSQL文になります。
postgres=# SELECT current_date + N.V FROM generate_series(1, 3) AS N(V); ?column? ------------ 2016-03-11 2016-03-12 2016-03-13 (3 行)
=====
2016/03/05:の時の情報
PR -
ラベルプリンタメーカ「SATO」のラベル発行コンポーネント(MLComponent.dll)を使ったラベル印刷の紹介ですが、 レイアウトファイルとプリンタドライバを利用して行います。 USBへの直接出力もできるようですが、制御が難しい様なので、プリンタドライバへの出力で印刷します。
■印刷用レイアウトファイル
ラベル印刷を簡単に行うにはレイアウトファイルが必要になります。 このレイアウトファイルですがSATOが提供する「SATO Multi LABELIST V5 [MLデザイン]」で作成します。 Trail(試用)のままでも1個のファイルは生成が可能ですので、以下のURLからダウンロードしてみてください。
・Multi LABELIST V5
今回使用するレイアウトファイルの編集中の画面を以下に示します。 連番(NO)、日付、品番、QRコードのみを印刷する簡単なレイアウトで、デザインを作成したところです。
また、下図は印刷の定義順の設定の画面です。
定義順は1:連番(NO)、2:日付、3:品番、4:QRコード となっています。
実際のプログラムでのデータ設定の順番は、定義順に行います。
■プリンタ状態チェック関数
関数内の処理は以下の手順で行います。
(1)「MLComponent」のインスタンスを生成します。
(2)レイアウトファイルの設定
「MLComponent」の「LayoutFile」プロパティに、[MLデザイン]で作成されたレイアウトファイルを設定します。
(3)印刷データの設定
「MLComponent」の「PrnData」プロパティに、印刷データを設定します。
印刷データは印刷定義順に従って、各データを「タブ」文字を挟んで文字列で連結します。
最後に「印刷枚数」をさらに「タブ」文字を挟んで追加連結します。(今回は1枚なので"1"を連結)
(4)出力先の設定
「MLComponent」の「Setting」プロパティに、プリンタドライバ名を指定します。 (今回は「Lesprit412v」プリンタなので"DRV:SATO Lesprit412v")
(5)接続処理
「MLComponent」の「OpenPort」メソッドで接続します。
(6)発行処理
「MLComponent」の「Output」メソッドでラベル印刷の発行を行います。
(7)切断処理
「MLComponent」の「ClosePort」メソッドで切断します。
Module Module1 'SATOプリンタの印刷テスト Public Sub Main() Dim str As String = "" Dim fChk As Boolean = PrintLabel(1, "10001", str) MsgBox(str) End Sub ''' <summary>ラベル印刷</summary> ''' <param name="nNo">NO</param> ''' <param name="strHinban">品番</param> ''' <returns>印刷結果(True:OK, False:NG)</returns> Private Function PrintLabel(ByVal nNo As Integer, _ ByVal strHinban As String, ByRef strErr As String) As Boolean '戻り値初期化 PrintLabel = False 'MLComponentの宣言 Dim MLComponent As SATO.MLComponent.MLComponent = New SATO.MLComponent.MLComponent Try 'レイアウトファイルの設定 MLComponent.LayoutFile = "Layout.mllayx" '設定データ生成 Dim strData As String = "" 'ヘッダ strData &= nNo.ToString("00000000") 'NO strData &= vbTab & Now.ToString("yyyy/MM/dd") '日付 strData &= vbTab & strHinban '品番 'QRバーコードデータ(NO,日付,日付を設定) Dim strQR As String = "" strQR = "NO=" & nNo.ToString("00000000") 'NO strQR &= ",DATE=" & Now.ToString("yyyy/MM/dd") '日付 strQR &= ",HIN=" & strHinban '日付 'QRバーコードデータを設定データに付加 strData &= vbTab & strQR '発行枚数を設定データに付加 strData &= vbTab & "1" 'データの設定 MLComponent.PrnData = strData '出力先の設定(プリンタドライバ名を指定します。) MLComponent.Setting = "DRV:SATO Lesprit412v" '接続 Dim Result As Integer Result = MLComponent.OpenPort(1) If Result <> 0 Then strErr = "接続エラー No." & Result.ToString Exit Function End If '発行 Result = MLComponent.Output If Result <> 0 Then strErr = "発行エラー No." & Result.ToString Exit Function End If '切断 Result = MLComponent.ClosePort If Result <> 0 Then strErr = "切断エラー No." & Result.ToString Exit Function End If '戻り値OK PrintLabel = True Catch ex As Exception strErr = "その他エラー :" & ex.ToString Finally MLComponent = Nothing End Try End Function End Module
■プリンタドライバ
プリンタドライバのプロパティでUSBでの接続にしてあります。
プリンタドライバは以下のURLでダウンロードできます。
・プリンタドライバ・マニュアル
=====
2016/03/09:の時の情報
-
ラベルプリンタメーカ「SATO」のラベル発行コンポーネント(MLComponent.dll)を使ったラベル印刷の 紹介ですが、まず最初にラベルプリンタの接続確認を行います。今回仕事で使ったプリンタがUSB接続でしたので 例としてUSBのみとなります。
■MLComponent.dllのインストール
以下のURLのページの真ん中あたりに「Multi LABELIST Component」のダウンロードファイルが在りますので、 必要なものをダウンロードし、インストールします。
・Multi LABELIST Component / Component Plus
デフォルトでインストールすると「MLComponent.dll」が「C:\Program Files\SATO\ML Component」に在るはずです。
VB.NETの参照設定で「MLComponent.dll」を追加します。
このコンポーネントですが、.NET Framework 4.0または4.5または4.6に対応している開発環境でしか使えないので Visual Studio 2010以降限定です。Visual Studio 2005/2008では使用できません。
■プリンタ状態チェック関数
関数内ではまず「MLComponent」のインスタンスを生成します。
その後「Setting」プロパティによって通信パラメータを設定します。 プリンタとの接続方法が、LAN、USB、RS232C、Bluetooth、プリンタドライバなどがありますが 今回はUSBですので、"USB:"の設定値となります。その他の設定はマニアルを見てください。
「Protocol」プロパティはUSBですので、「Protocols.Status4」となります。
その後、「OpenPort」メソッドにより接続を開始しますが、 結果が0ではない場合は、電源が入っていないかケーブルが抜けているかの原因になります。
接続後は、プリンタの状態を「GetStatus」メソッドにより行います。 返されるStatus文字列の3文字目にエラー判別文字がありますので、それによってメッセージを付けています。 尚、このメソッドが0以外を返す場合は、メソッドエラーになります。
Module Module1 'SATOプリンタの接続テスト Public Sub Main() Dim str As String = "" Dim fChk As Boolean = CheckPrinter(str) MsgBox(str) End Sub ''' <summary>プリンタ状態チェック</summary> ''' <param name="strErr">エラーメッセージ</param> ''' <returns>状態結果(True:OK, False:NG)</returns> Private Function CheckPrinter(ByRef strErr As String) As Boolean '戻り値初期化 CheckPrinter = False 'MLComponentの宣言 Dim MLComponent As SATO.MLComponent.MLComponent = New SATO.MLComponent.MLComponent Try '出⼒先の設定(USBを指定します。) MLComponent.Setting = "USB:" MLComponent.Protocol = SATO.MLComponent.Protocols.Status4 '接続 Dim Result As Integer = MLComponent.OpenPort(1) If Result <> 0 Then strErr = "プリンタの電源等(ケーブル)を確認してください。(" & Result.ToString & ")" Exit Function End If 'プリンタの状態確認 Dim Status As String = "" Result = MLComponent.GetStatus(Status) ' ステータス取得 If Result <> 0 Then strErr = "プリンタ状態取得エラー No." & Result.ToString Exit Function End If 'エラーコードの確認 Dim strCode As String = Mid$(Status, 3, 1) Select Case strCode Case "0", "1", "2", "3" strErr = "オフライン状態" Case "A", "B", "G", "H", "M", "N", "S", "T" 'オンライン状態・送信可 strErr = "" Case "C", "D" strErr = "オンライン状態・受信待ち" Case "I", "J" strErr = "オンライン状態・印字中" Case "O", "P" strErr = "オンライン状態・待機中" Case "U", "V" strErr = "オンライン状態・解析・編集中" Case "a" strErr = "エラー検出・受信バッファフル" Case "b" strErr = "エラー検出・ヘッドオープン" Case "c" strErr = "エラー検出・ペーパーエンド" Case "d" strErr = "エラー検出・リボンエンド" Case "e" strErr = "エラー検出・メディアエラー" Case "f" strErr = "エラー検出・センサーエラー" Case "g" strErr = "エラー検出・ヘッドエラー" Case "h" strErr = "エラー検出・カバーオープン" Case "i" strErr = "エラー検出・カードエラー" Case "j" strErr = "エラー検出・カッタエラー" Case "k" strErr = "エラー検出・その他のエラー" Case "l" strErr = "エラー検出・カッタセンサーエラー" Case "m" strErr = "エラー検出・スタッカフル&リファインダフル" Case "o" strErr = "エラー検出・IC タグエラー" Case Else strErr = "その他" End Select If strErr = "" Then strErr = "接続正常" CheckPrinter = True Else 'エラー strErr = "プリンタエラー:(" & strCode & ") " & strErr End If '切断 Result = MLComponent.ClosePort If Result <> 0 Then strErr = "切断エラー No." & Result.ToString CheckPrinter = False End If Catch ex As Exception strErr = "PGエラー:" & ex.ToString Finally MLComponent = Nothing End Try End Function End Module
=====
2016/03/08:の時の情報
-
缶コーヒーBOSのCMで最近までは北海道新幹線にちなんだものでしたが、ここ1週間ぐらいは兵庫県朝来市の「竹田城」が舞台で、霧にかすんだ城址からジョーンズさん、タモリさん、満嶋さんが空に歩き出すユニークな感じです。
「竹田城」の入場が3月1日からの公開の再開に併せてCMを仕掛けたようです。大野市の「大野城」関係者にしてみれば、最近「天空の城」で売り出しているだけに、やられた感じがすのではないでしょうか。やはりこれぐらいのインパクトがあるとちょっと興味がわきます。大野市も何か仕掛けていかないと、観光での振興はままならないのでは。
「天空の城」もジブリのアニメ映画のラピュタからとったものですが、アニメ?漫画つながりということで、福井県のあわら市も「ちはやふる」で結構集客があったようです。
大野市も幕末の名君「土井利忠」やその家臣「内山良休・隆佐」兄弟を題材にした漫画を描いてもらったらどうでしょうか。「ちはやふる」の様に週刊誌の連載物で掲載後、人気が出れば映画や大河ドラマなどを目指して。
大河ドラマは福井県も「由利公正」を推していますが、幕末大野藩の歴史も福井藩に負けず劣らず、面白いものになると思います。
幕末の大野藩では、藩政改革を行い、直営の面谷鉱山を発展させ銅の産出でのもうけをもとに藩校明倫館・洋学館を建て大坂の適塾塾頭の伊藤慎蔵を招いた講義を行ったり、オランダ語の翻訳本を出していたそうです。また、軍制改革を行い洋式軍隊への転換や、大砲の鋳造をなどを行っています。さらに、「大野丸」という2本マストの帆船を建造し北海道との交易を行い、今のサハリン(北蝦夷地)開拓にも乗り出し、サハリンの一部を大野藩準領地としていました。
このあたりの史実を繋げていけば長編になりそうですが、漫画家のかた如何でしょうか?福井に北陸新幹線ができるころまでに盛り上がっていればいいとは思います。■天空の城・越前大野城
■結の故郷・越前大野
■大野市
=====2016/03/08:の時の情報
-
SPREADには、シートのそのままをPDFに出力する機能が備わっています。 「SheetView」クラスの「PrintInfo」のPDF出力の指示を行えば、「SheetView」の印刷メソッドでPDF出力ができます。
以下のソースですが、「Button1_Click」の前までは以前のソースを踏襲していまして、 単に単一行選択表示で1000行3カラムのテストデータを表示しています。
「Button1_Click」の中で、PDFファイルへの出力処理を行っています。 「ActiveSheet.PrintInfo」の「PrintToPdf」をTrueに設定し、「PdfFileName」にPDF出力ファイル名を設定しています。 その後、SPREADコントロールの「PrintSheet」メソッドで「ActiveSheet」の印刷処理を行います。
ここで注意点があります。「PrintSheet」メソッドの直後でのPDFファイルの表示処理がコメントになっていますが、 コメント部分を実行に戻して処理すると、「AcrobatReader」は起動するのですがPDFファイルが見つからないとエラーになります。 「PrintSheet」メソッドの直後ではタイミング的に、まだPDFファイルの出力が終了していないので、エラーになる様です。
そこで解決方法として、「PrintSheet」メソッドの終了時点で「AcrobatReader」を起動することになります。 ちょうど「PrintMessageBox」イベントがそれに当たります。引数の「e」の「BeginPrinting」が「False」になった時が 「PrintSheet」が終わったことを通知してくれますので、そのタイミングで「AcrobatReader」起動の関数をコールします。
Imports FarPoint.Win.Spread Public Class Form1 'フォームロード時にSPREADの初期化 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'SPREADの初期化 Call InitilayzeSpread(Me.FpSpread1) '一覧データ表示 Call Me.DisplayData() End Sub 'SPREADの初期化 Private Sub InitilayzeSpread(ByVal spd As FpSpread) 'SPREADの設定 With spd 'スクロールバーの設定 .HorizontalScrollBarPolicy = ScrollBarPolicy.AsNeeded .VerticalScrollBarPolicy = ScrollBarPolicy.AsNeeded '分割ボックスの設定 .ColumnSplitBoxPolicy = SplitBoxPolicy.Never .RowSplitBoxPolicy = SplitBoxPolicy.Never 'カーソル設定 .SetCursor(CursorType.Normal, Windows.Forms.Cursors.Arrow) .SetCursor(CursorType.LockedCell, Windows.Forms.Cursors.Arrow) 'セルがアクティブ時に編集モードにしない .EditModePermanent = False 'セルがアクティブ時に既存の内容を選択しない .EditModeReplace = False End With 'アクティブシートの設定 With spd.ActiveSheet '選択状態 .SelectionStyle = SelectionStyles.SelectionRenderer '編集モードの設定 .OperationMode = OperationMode.SingleSelect '列のサイズ変更可、行のサイズ変更不可に設定する。 .Columns.Default.Resizable = True .Rows.Default.Resizable = False 'SPREADのアクティブシートのカラム数を3に設定 .ColumnCount = 3 'SPREADの行クリア .RowCount = 0 End With End Sub '一覧データ表示 Private Sub DisplayData() 'ソースが長くなるのでWith宣言 With Me.FpSpread1.ActiveSheet '描画を停止させる Me.FpSpread1.SuspendLayout() 'データの行数分の処理 For i As Integer = 0 To 999 '行数を増やす .RowCount += 1 '各セルへのデータ設定 .SetText(i, 0, "A" & i.ToString("000")) .SetText(i, 1, "B" & (i Mod 100).ToString("000")) '100で割った余り .SetText(i, 2, "C" & (i Mod 10).ToString("000")) '10で割った余り Next End With '描画を再開させる Me.FpSpread1.ResumeLayout(True) '先頭行を選択設定(1行目が選択色になる) Me.FpSpread1.ActiveSheet.AddSelection(0, 0, 1, 1) End Sub 'PDF出力ボタン Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'アクティブシートをPDFとして出力 Me.FpSpread1.ActiveSheet.PrintInfo.PrintToPdf = True 'PDFファイル名 Me.FpSpread1.ActiveSheet.PrintInfo.PdfFileName = "test.pdf" 'アクティブシートをPDFとして印刷 Me.FpSpread1.PrintSheet(Me.FpSpread1.ActiveSheet) ''PDF表示 'Call DispPdf("test.pdf") End Sub Private Sub FpSpread1_PrintMessageBox(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.PrintMessageBoxEventArgs) Handles FpSpread1.PrintMessageBox '印刷終了タイミングか?? If e.BeginPrinting = False Then 'PDF表示 Call DispPdf("test.pdf") End If End Sub '拡張子PDFに関連付けられているAcrobatReader起動 Private Sub DispPdf(ByVal strFileName As String) Dim pStartInfo As New ProcessStartInfo Dim p As New Process With pStartInfo .FileName = strFileName .CreateNoWindow = False .WindowStyle = ProcessWindowStyle.Normal End With 'プロセスのStartInfoプロパティに設定 p.StartInfo = pStartInfo If p.Start() = True Then 'AcrobatReaderの終了を待つ p.WaitForExit() Else MsgBox("起動に失敗しました。") End If End Sub End Class
下図は、プログラムが起動しした時の表示です。
下図は、「Button1」をクリックした時の表示です。
=====
2016/03/07:の時の情報