IT
【Oracle】【バッチ】PCにインストールされているOracleのバージョンをバッチで取得する方法
2017/1/26 執筆
オラクルメモ
私の場合Oracle 11gとOracle 12cの2種類がクライアントのPCにインストールされており、
バージョンによって動かすVBのexeを変更しなければいけませんでした。
VBからバッチ生成→結果取得で分岐の条件にしようと思いましたが、面倒だったので結局レジストリから取得しています
以下のコマンドで確認できます。
以下のSQLを発行
参考にしたサイト
https://oracle.programmer-reference.com/oracle-get-version/
オラクルメモ
私の場合Oracle 11gとOracle 12cの2種類がクライアントのPCにインストールされており、
バージョンによって動かすVBのexeを変更しなければいけませんでした。
VBからバッチ生成→結果取得で分岐の条件にしようと思いましたが、面倒だったので結局レジストリから取得しています
クライアントPCのオラクルのバージョンを取得
以下のコマンドで確認できます。sqlplus -version
Oracleのサーバーのバージョンも確認できる (使い道不明)
以下のSQLを発行select * from v$version
参考にしたサイト
https://oracle.programmer-reference.com/oracle-get-version/
【TortoiseSVN】バッチでSVN命令コマンドを実行し更新等の処理を自動でかける方法
2018/1/17 執筆
TortoiseSVNをインストールしている端末からバッチを利用して、
SVNファイルのupdate、clean等の処理を自動で行う。
SVNのサーバからソースの実ファイルのバックアップを取る為に、毎朝指定のディレクトリにファイル更新する必要が出てきたので、バッチを作成するまでに悩んだ内容を記載する。
まず色々なサイトから確認できたコマンドはこれ
「TortoiseProc.exe」でSVNのコマンドを動かします。
「/command:****」でコマンドを指定し、その後ろにオプションを指定します。
「/path:****」パスを指定
「/closeonend:1」エラーがなければダイアログを閉じる
上記の場合「D\SVN」フォルダに、更新の処理を実行し、エラーがなければダイアログを閉じる
コマンドの詳細はこのサイトを参考に
https://tortoisesvn.net/docs/release/TortoiseSVN_ja/tsvn-automation.html
正直これで動くかわからない。
更新は問題なく動くのだが、ダイアログが消えないときがある。
この記事を書いているときに色々試したが元々動かなかったのに動いてしまうw
何なんだこいつ
悩んだ内容
・更新のダイアログが表示され、更新完了後にダイアログが閉じない時が稀にある。
更新される内容によって閉じたり閉じなかったり?
動いたなと思ったら数日後ダイアログが上がりっぱなしになり次に実行したバッチがエラーになってたりでよくわからない。
SVNのコマンドをバッチで自動起動する
TortoiseSVNをインストールしている端末からバッチを利用して、SVNファイルのupdate、clean等の処理を自動で行う。
SVNのサーバからソースの実ファイルのバックアップを取る為に、毎朝指定のディレクトリにファイル更新する必要が出てきたので、バッチを作成するまでに悩んだ内容を記載する。
SVNコマンド
まず色々なサイトから確認できたコマンドはこれTortoiseProc.exe /command:update /path:"D:\SVN" /closeonend:1
「TortoiseProc.exe」でSVNのコマンドを動かします。
「/command:****」でコマンドを指定し、その後ろにオプションを指定します。
「/path:****」パスを指定
「/closeonend:1」エラーがなければダイアログを閉じる
上記の場合「D\SVN」フォルダに、更新の処理を実行し、エラーがなければダイアログを閉じる
コマンドの詳細はこのサイトを参考に
https://tortoisesvn.net/docs/release/TortoiseSVN_ja/tsvn-automation.html
正直これで動くかわからない。
更新は問題なく動くのだが、ダイアログが消えないときがある。
この記事を書いているときに色々試したが元々動かなかったのに動いてしまうw
何なんだこいつ
悩んだ内容
・更新のダイアログが表示され、更新完了後にダイアログが閉じない時が稀にある。
更新される内容によって閉じたり閉じなかったり?
動いたなと思ったら数日後ダイアログが上がりっぱなしになり次に実行したバッチがエラーになってたりでよくわからない。
【VB.NET】C1FlexGridからファンクション1つで既存のExcelを開いてデータをぺっと出力する方法①
IT 2018/1/12 執筆
GrapeCityのComponentOne Studio for WinForms
C1.Win.C1FlexGrid.4
C1FlexGrid control for .NET Windows Forms JPN.
ランタイム:v4.0.30319
VB.NET(6.0からマイグレしたやつ)
C1FlexGridから既存のExcelを開いてぺっと出力して表示するメモ
開発環境:
Microsoft Visual Studio Professional 2013 Version 12.0.40629.00 Update 5
DLL:Microsoft Visual Studio Professional 2013 Version 12.0.40629.00 Update 5
GrapeCityのComponentOne Studio for WinForms
C1.Win.C1FlexGrid.4
C1FlexGrid control for .NET Windows Forms JPN.
ランタイム:v4.0.30319
C1FlexGridから既存のExcelに出力する方法①
簡単に説明するとGridのDataSourceから2次元配列に変換して、
Excelの指定の範囲をRenge指定して代入するだけ。
引数1 Gridのインスタンス
引数2 Excelのパス
range1に(11:1) = A11
range2に(要素数 + 11 - 1:要素数 + 1 - 1) =
仮に配列のRow,Col共に要素数を5とすると
5+11-1 = 15
5+1-1 = 5
変換すると = E15
ExcelのRangeに(A11,E15)見たいな形で範囲指定し、2次元配列に変換したデータを全て代入します。
ぶっちゃけこの指定は無くてもいけます。
その内容はこの次に説明します。
画面上にExcelを表示さえるので開放はしていないです。
Private Function Func_ExcelOut(Grd As C1FlexGrid, ExcelPath As String)
Dim dt As DataTable = Grd.DataSource
'DataTableを二次元配列に格納する
Dim data(dt.Rows.Count - 1, dt.Columns.Count - 1) As Object
For y As Integer = 0 To dt.Rows.Count - 1
For x As Integer = 0 To dt.Columns.Count - 1
data(y, x) = dt.Rows(y)(x).ToString
Next
Next
Dim xlsApp As Excel.Application
Dim xlsBook As Excel.Workbook
Dim xlsSheet As Excel.Worksheet
Try
'Excelを起動する
xlsApp = New Excel.Application
xlsBook = xlsApp.Workbooks.Open(ExcelPath, [ReadOnly]:=True)
xlsSheet = DirectCast(xlsBook.Worksheets(1), Excel.Worksheet)
'Excelの開始位置
Dim xlsRowS As Integer = 11
Dim xlsColS As Integer = 1
Dim range1 As Excel.Range = xlsSheet.Cells(xlsRowS, xlsColS)
Dim range2 As Excel.Range = xlsSheet.Cells(dt.Rows.Count - 1 + xlsRowS, dt.Columns.Count - 1 + xlsColS)
'データ代入
xlsSheet.Range(range1, range2).Value = data
'表示
xlsApp.Visible = True
Catch
Finally
xlsSheet = Nothing
xlsBook = Nothing
xlsApp = Nothing
End Try
End Function
range1に(11:1) = A11
range2に(要素数 + 11 - 1:要素数 + 1 - 1) =
仮に配列のRow,Col共に要素数を5とすると
5+11-1 = 15
5+1-1 = 5
変換すると = E15
ExcelのRangeに(A11,E15)見たいな形で範囲指定し、2次元配列に変換したデータを全て代入します。
ぶっちゃけこの指定は無くてもいけます。
その内容はこの次に説明します。
画面上にExcelを表示さえるので開放はしていないです。
【Oracle】Oracleで文字列切り取り LEFT,RIGHT関数を使用したい場合のSUBSTR代替方法
2017/12/22 執筆
Oracleメモ
VBにあるLEFT関数やRIGHT関数(右,左から指定文字数切り取る関数)は
Oracleには存在しないようだ。
なので、SUBSTRでの代替案を解説する。
◆LEFT代替案
Oracleメモ
OracleにLEFT, RIGHT関数が無い・・・
VBにあるLEFT関数やRIGHT関数(右,左から指定文字数切り取る関数)はOracleには存在しないようだ。
なので、SUBSTRでの代替案を解説する。
SUBSTRを使ってLEFT, RIGHT関数のような動きをさせる
◆LEFT代替案SUBSTR(文字列, 1, 5)
【VBA】ExcelでADOを使用したデータの取得方法 エラー回避方法
VBA-1 2017/12/4 執筆
ADOを使用したデータ取得方法(ざっくり)
※赤字を適当な分に変更して使用下さい。
ここでよくはまるのが
ソースをコピーし、データ取得マクロ実行しようとすると下記のエラーが表示される。
コンパイルエラー:ユーザ定義型は定義されていません。
Dim adoCon As ADODB.Connection
この定義名でエラーになる
エラーの原因は単純で参照が抜けている為。
解決方法は以下。
ツール → 参照設定
「Microsoft ActiveX Data Objects 2.8 Library」にチェックをいれ参照を追加するだけ。
※2.8の部分はバージョンによって変わる。
ADOを使用してDBからExcelにデータを引くOracleのADOを使いこなす方法
ADOを使用したデータ取得方法(ざっくり)'定義
Dim adoConn As ADODB.Connection
Dim adoRS As ADODB.Recordset
'Oracle接続
Set adoConn = New ADODB.Connection
adoConn.ConnectionString = "DSN=****;UID=****;PWD=****;"
adoConn.Open
Dim mySQL As String
mySQL = "SELECT ******** "
'SQL発行
Set adoRS = New ADODB.Recordset
Set adoRS = adoConn.Execute(mySQL)
'A1にべたっと貼り付ける
sheet1.Range("A1").CopyFromRecordset adoRS
A1から列と行にデータがあるだけ貼り付ける (この方法では列名は貼り付けられない)※赤字を適当な分に変更して使用下さい。
実行すると定義エラーになる
ここでよくはまるのがソースをコピーし、データ取得マクロ実行しようとすると下記のエラーが表示される。
コンパイルエラー:ユーザ定義型は定義されていません。
Dim adoCon As ADODB.Connection
この定義名でエラーになる
エラーの原因は単純で参照が抜けている為。
解決方法は以下。
ツール → 参照設定
「Microsoft ActiveX Data Objects 2.8 Library」にチェックをいれ参照を追加するだけ。
※2.8の部分はバージョンによって変わる。
【Excel】INDIRECT関数 別シートを動的参照 空白を含むシート名のエラー対処方法
EX-1 2017/11/20 執筆
記述が間違っているのかと若干はまりました。
INDIRECTを使用して別シートのデータを参照する場合の具体的な使い方を説明します。
上記3つのシートからINDIRECTを使用してセルを参照します。
SheetNo2のA1には「シート2」
Sheet No3のA1には「シート 3」が入力されています。
Aにシート名、BにAのシート名を参照したデータを取得したい場合
=INDIRECT("SheetNO2!A1")
=INDIRECT("Sheet NO3!A1")
"Sheet NO3"を参照したINDIRECTがエラーになってしまう。
これはシート名に空白が含まれていることが原因
シート名を'シングルコート'で囲む必要がある。
=INDIRECT("'Sheet NO3'!A1")
エラー無く表示できました。
W4セルのシート名からD5セルの文字列にマッチする行のデータを合計します。
INDIRECT関数を使用して別シートのデータを参照
記述が間違っているのかと若干はまりました。INDIRECTを使用して別シートのデータを参照する場合の具体的な使い方を説明します。
上記3つのシートからINDIRECTを使用してセルを参照します。
SheetNo2のA1には「シート2」
Sheet No3のA1には「シート 3」が入力されています。
Aにシート名、BにAのシート名を参照したデータを取得したい場合
=INDIRECT(A1&"!A1")
=INDIRECT(A2&"!A1")
↓ 内部的にこのように変換され表示される=INDIRECT("SheetNO2!A1")
=INDIRECT("Sheet NO3!A1")
"Sheet NO3"を参照したINDIRECTがエラーになってしまう。
これはシート名に空白が含まれていることが原因
空白を含むシート名を参照する場合のエラーの回避方法は?
シート名を'シングルコート'で囲む必要がある。=INDIRECT("'"&A2&"'!A1")
↓ 内部的にこのように変換され表示される=INDIRECT("'Sheet NO3'!A1")
エラー無く表示できました。
SUMIFなどの関数で合計を出す場合でも使用できる。
W4セルのシート名からD5セルの文字列にマッチする行のデータを合計します。=SUMIF(INDIRECT("'"&W$4&"'!$I$5:$N$200"),$D5,INDIRECT("'"&W$4&"'!$N$5:$N$200"))
【FastCopy】Windows10でFastCopyをコマンドで実行時エラー Ver3.06
2017/11/6 執筆
Win7,8,8.1では問題なく動いていたバッチ(コマンド)がWin10で動かなくなった対応メモ
※Exeを起動して手動で実行すると動く
バッチの記述内容
Win7,8,8.1の実行結果
Win10の実行結果
「異常が発生したため、例外情報を以下に保存しました。・・・・」
ファイルの中身は英数字の羅列なので割愛
ヘルプには対応していると記載されているが・・・・
Ver3.32 64bit
①ダウンロードしたらファイルを解凍
②Ver3.06のフォルダから設定ファイル「FastCopy2.ini」をVer3.32のフォルダにコピー (設定が全て移行される)
③バッチのファイルパスを変更
④バッチ実行
何事も無く正常終了
データもコピーされています。
Win10でFastCopyをコマンド実行するとエラーになる Ver3.06
Win7,8,8.1では問題なく動いていたバッチ(コマンド)がWin10で動かなくなった対応メモ※Exeを起動して手動で実行すると動く
フォルダの構成
D\FastCopyTest
┣01_Document1 バックアップ元フォルダ
┣02_DocBackup バックアップ先フォルダ
┣FastCopy306 FastCopyのExeファイル
┗BackupTest.bat FastCopy用のバッチ
バッチの記述内容
@ECHO OFF
ECHO FastCopyによる同期を開始
pause
ECHO 同期開始 %date% %time%
path D:\FastCopyTest\FastCopy306
fastcopy.exe /job="backup1" /force_close
ECHO 同期完了 %date% %time%
pause
Win7,8,8.1の実行結果
Win10の実行結果
「異常が発生したため、例外情報を以下に保存しました。・・・・」
ファイルの中身は英数字の羅列なので割愛
ヘルプには対応していると記載されているが・・・・
解決方法 Ver3.06→3.32更新
Googleで検索したが解決しなかったので、
バージョンVer3.32 64bit
①ダウンロードしたらファイルを解凍
②Ver3.06のフォルダから設定ファイル「FastCopy2.ini」をVer3.32のフォルダにコピー (設定が全て移行される)
③バッチのファイルパスを変更
④バッチ実行
何事も無く正常終了
データもコピーされています。
【展開PC自動化】Win10既定がエッジの状態でURLショートカットをIEで起動させる方法
2017/10/20 執筆
動作確認 Win10, 7
私の会社でもとうとうWin10に切替える検討に入りました。
Win10では既定のブラウザがエッジになり、
デスクトップに置いたURLのショートカットからではエッジ起動しパッケージが軒並み動かない。
バッチ等で既定のブラウザをIEに変更しようとしてもエッジに設定されるようMicrosoftが何かを仕組んでいるようだ。
Sysprepもダメ
※17/12/14追記 一部Sysprep後にカスタマイズするといけるらしい? 手段は不明
数百台のPCを展開する上で1台ずつ設定するのは面倒なので、何か方法が無いか考えた。
昔eclipceを環境によって2種類起動したい際にexeの後ろに引数を持たせたのを思い出し、IEでも出来るのを確認した。
これにより通常使うブラウザは「エッジ」ですが、ショートカットから各パッケージをIEで起動できます。
以下設定の方法
デスクトップで右クリック→ショートカット
※Win10も同じパスでした。
ショートカット名はつけたい名前(パッケージ名など)適当に設定
出来上がったショートカットを右クリック→プロパティ
リンク先の「~.exe"」の後に起動したいURLを入力→OK
作成したショートカットアイコンをダブルクリックするとGoogleが表示されます。
Win10で試験しても同じくエッジが起動ではなくIEで起動してきます。
(既定がエッジでも)
既定のブラウザの設定が省略できました。
動作確認 Win10, 7
Win10の既定のブラウザ 「エッジ」
私の会社でもとうとうWin10に切替える検討に入りました。Win10では既定のブラウザがエッジになり、
デスクトップに置いたURLのショートカットからではエッジ起動しパッケージが軒並み動かない。
バッチ等で既定のブラウザをIEに変更しようとしてもエッジに設定されるようMicrosoftが何かを仕組んでいるようだ。
Sysprepもダメ
※17/12/14追記 一部Sysprep後にカスタマイズするといけるらしい? 手段は不明
数百台のPCを展開する上で1台ずつ設定するのは面倒なので、何か方法が無いか考えた。
IE起動のショートカットにURLの引数を追加
昔eclipceを環境によって2種類起動したい際にexeの後ろに引数を持たせたのを思い出し、IEでも出来るのを確認した。これにより通常使うブラウザは「エッジ」ですが、ショートカットから各パッケージをIEで起動できます。
以下設定の方法
①IEのショートカット作成
デスクトップで右クリック→ショートカット
C:\Program Files\Internet Explorer\iexplore.exe
上記をコピペ※Win10も同じパスでした。
ショートカット名はつけたい名前(パッケージ名など)適当に設定
②ショートカットのプロパティ変更
出来上がったショートカットを右クリック→プロパティ
リンク先の「~.exe"」の後に起動したいURLを入力→OK
"C:\Program Files\Internet Explorer\iexplore.exe" google.com
※サンプルは「google.com」作成したショートカットアイコンをダブルクリックするとGoogleが表示されます。
Win10で試験しても同じくエッジが起動ではなくIEで起動してきます。
(既定がエッジでも)
既定のブラウザの設定が省略できました。
【Oracle】Oracle IN句の指定1000件までの回避策 ORA-01795: リストに指定できる式の最大数は1000です。
17/10/19執筆
Oraleメモ
VBAにて簡単なデータ検索機能を作成していてはまりかけた事象
・機能はA列に製品番号を記入して、
ボタンを押すとその在庫がB列に表示されるといったもの
【ボタン】
・内部的には製品番号をSQLのINに指定しADODB.Connection.Executeで発行し、
Excelに貼り付けるかなりシンプルなもの。
◆A列に1000件以上の製品番号を入れてボタンを押すと
エラー「ORA-01795: リストに指定できる式の最大数は1000です。」
初めはADODBの問題かと思ったが、ググるとSQLのINと判明。
ORACLEの場合IN句に1000件までの指定しか出来ないようだ。
★回避策
①INに1000件以上入れる場合 ORで区切る・・・・なんとも不細工な策・・・
WHERE 製品番号 IN ('1','2','3'.......'1000') OR 製品番号 IN ('1001','1002'.......)
②EXISTSを指定
未確認
③複合条件のIN?
WHERE (製品番号,1) IN ( ('AAA',1), ('BBB',1), ('CCC',1) )
でいけるっぽい。というかこれでいける。
Oraleメモ
VBAにて簡単なデータ検索機能を作成していてはまりかけた事象
・機能はA列に製品番号を記入して、
ボタンを押すとその在庫がB列に表示されるといったもの
【ボタン】
A列 製品番号 | B列 在庫 |
---|---|
AAA | 0 |
BBB | 0 |
CCC | 0 |
・内部的には製品番号をSQLのINに指定しADODB.Connection.Executeで発行し、
Excelに貼り付けるかなりシンプルなもの。
Dim myArray() As Variant
myArray = sheet1.Range("A2", sheet1.Cells(sheet1.Rows.Count, 1).End(xlUp)).Value
'配列の縦方向と横方向のセル範囲の変換
myArray = WorksheetFunction.Transpose(myArray)
'配列をカンマ区切り文字列に変換
Dim mySQLIN As String
mySQLIN = "'" & Join(myArray, "','") & "'"
'~~~~~~省略~~~~~~~
mySQL = "WHERE 製品番号 IN (" & mySQLIN & ") "
◆A列に1000件以上の製品番号を入れてボタンを押すと
エラー「ORA-01795: リストに指定できる式の最大数は1000です。」
初めはADODBの問題かと思ったが、ググるとSQLのINと判明。
ORACLEの場合IN句に1000件までの指定しか出来ないようだ。
★回避策
①INに1000件以上入れる場合 ORで区切る・・・・なんとも不細工な策・・・
WHERE 製品番号 IN ('1','2','3'.......'1000') OR 製品番号 IN ('1001','1002'.......)
②EXISTSを指定
未確認
③複合条件のIN?
WHERE (製品番号,1) IN ( ('AAA',1), ('BBB',1), ('CCC',1) )
でいけるっぽい。というかこれでいける。
'配列をカンマ区切り文字列に変換
Dim mySQLIN As String
mySQLIN = "('" & Join(myArray, "',1),('") & "',1)"
'~~~~~~省略~~~~~~~
mySQL = "WHERE (製品番号,1) IN (" & mySQLIN & ") "