■閉鎖した昔のブログの記事復活
[2025/05/12] Oracle:OracleでのPostgreSQLの「generate_series」(連続値の生成関数)的な方法 (No.427)
[2025/05/12] PostgreSQL:PostgreSQLではオラクルの様なDUAL表は存在しません (No.426)
[2025/05/12] VB.NET:SATOラベルプリンタ・Multi LABELIST Component(MLComponent.dll)を使った印刷:レイアウトファイル・プリンタドライバを使用 (No.425)
[2025/05/12] VB.NET:SATOラベルプリンタ・Multi LABELIST Component(MLComponent.dll)を使った印刷:接続確認 (No.424)
[2025/05/12] 福井について:「天空の城・竹田城」と缶コーヒーのCMからの「大野城」 (No.423)
[2025/05/12] PostgreSQL:PostgreSQLではオラクルの様なDUAL表は存在しません (No.426)
[2025/05/12] VB.NET:SATOラベルプリンタ・Multi LABELIST Component(MLComponent.dll)を使った印刷:レイアウトファイル・プリンタドライバを使用 (No.425)
[2025/05/12] VB.NET:SATOラベルプリンタ・Multi LABELIST Component(MLComponent.dll)を使った印刷:接続確認 (No.424)
[2025/05/12] 福井について:「天空の城・竹田城」と缶コーヒーのCMからの「大野城」 (No.423)
-
前回、PostgreSQLにおいて、複数行の整数を返すことができる関数「generate_series」を紹介しましたが、 Oracleでは関数ではなく階層問合せ用の「LEVEL疑似列」を使うことで可能になります。
以下のSQLの実行を見てください。(SQLコマンドラインから実行しています)
SQL> SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 5; LEVEL ---------- 1 2 3 4 5
階層問合せにおいて「CONNECT BY」句は親子関係の条件を指定するのですが、この場合は 「LEVEL疑似列」自身がそのまま、それ自体として条件づけられるので、 「LEVEL <= 5」により5個以下のレベル値が返るようです。 私自身もよくわかっていないのですが...
さらにこのSQL文をテーブルとして扱えば、以下の様にもできます。
SQL> SELECT CURRENT_DATE + X.LVL FROM 2 (SELECT LEVEL AS LVL FROM DUAL CONNECT BY LEVEL <= 5) X; CURRENT_ -------- 16-03-13 16-03-14 16-03-15 16-03-16 16-03-17
=====
2016/03/12:の時の情報
PR -
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:の時の情報
-
ラベルプリンタメーカ「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:の時の情報