SQLserver バックアップ 復元 バッチファイル

SQLEXPRESSなので、バッチファイルで動かさなければならない。
実際に動かしてみたが、バックアップも復元も数秒で処理は終わった。

★バックアップのバッチファイル

echo off
rem
rem SQL Serverのバックアップ
rem

rem 日付の取得
set TODAY=%date:~-10,4%%date:~-5,2%%date:~-2,2%
rem echo %TODAY%

rem SQLServerの再起動
echo SQLServerを再起動します…..
net stop localhost$SQLEXPRESS
net start localhost$SQLEXPRESS

rem バックアップの実行
echo バックアップしています…..
sqlcmd -S localhost\SQLEXPRESS -Q “BACKUP DATABASE takezawa TO DISK = N’C:\TKH\sqlbackup\%TODAY%_DATABASE.bak’ WITH INIT”

★復元のバッチファイル

cho off
rem
rem SQL Serverのリストア
rem

rem 日付の取得
rem set TODAY=%date:~-10,4%%date:~-5,2%%date:~-2,2%
SET /P TODAY=復元するbakファイルの日付(YYYYMMDD)を入力して下さい。⇒
rem echo %TODAY%

rem SQLServerの再起動
echo SQLServerを再起動します…..
net stop localhost$SQLEXPRESS
net start localhost$SQLEXPRESS

rem リストアの実行
echo リストアしています…..
sqlcmd -S localhost\SQLEXPRESS -Q “RESTORE DATABASE takezawa FROM DISK = N’C:\TKH\sqlbackup\%TODAY%_DATABASE.bak’ WITH RECOVERY”

Access 一覧表示フォームでの検索

抽出じゃなくて、そのレコードまで移動する場合の方法

Private Sub MNO検索_AfterUpdate()

DoCmd.GoToControl “txt_MNO”
DoCmd.FindRecord MNO検索

If InStr(Me!txt_MNO, MNO検索) = 0 Or Null Then
MsgBox “該当レコードはありません。”
End If

MNO検索 = Null
End Sub

ちなみにテキストのあいまい検索の場合は、

Private Sub メーカー名検索_AfterUpdate()
DoCmd.GoToControl “txt_メーカー名”
DoCmd.FindRecord “*” & メーカー名検索 & “*”

メーカー名検索 = Null
End Sub

レコードない場合の表示機能は調べる時間が無かった。

Access Dlookup 非連結テキストボックスに表示

レポートにて、あるテーブルからDlookupである条件のレコードフィールドを引っ張ってきたかったが、なかなかできなかった。

=DLookUp(“月次処理年月”,”dbo_mst_月次”,[終了確認]=”作業中”)

dbo_mst_月次 テーブル

JNO 月次処理年月 終了確認
1   2017/01/01   終了
2 2017/02/01 終了
3 2017/03/01 作業中
4 2017/04/01

2017/03/01 を出したいのに、2017/01/01がでます。そして、結論は?

=DLookUp(“[月次処理年月]”,”dbo_mst_月次”,”[終了確認]=’作業中'”)

ポイントは、
1.条件式部分全体をダブルクォーテーションでくくる
2.=の後は、数値ならそのまま、文字列ならシングルクォーテーションでくくる
3.変数で指定する場合は”[終了確認]=” & 変数 & “)”
となります。

Access 更新で少数点以下が削除される

VBAにて、あるテーブルの値にて、更新したら、小数点以下が削除された。

結局は、更新する側のテーブルのフィールドが、floatじゃなかったということだけ。

int形式は、整数だけなので、少数まで扱いたい場合は、floatにする。

Access 並び替えが変わるのを防ぐ方法

フォームでテーブルのデータを表示していて、なにかVBA処理のボタンなどを押して更新すると、並びが、変わってしまう場合がある。よくあるのが、主キーの順番になってしまう場合がある。

それを指定した並び替えにプロパティーなどで設定しているにも関わらず、並びが変わってしまう。

VBAの処理の中に、下記の1行を最後に入れておけば最後に並びを戻すことができる。

DoCmd.SetOrderBy “JNO DESC”

Access フォーカスが移動できない

レコードセットを使った処理ののち、コントロールを移動させようと頑張ったが、行方不明になり、テキストボックスをクリックしないとカーソルが戻ってこない。自動で移動させたいのだができなかった。
調べてやっとできた。
このような情報がAccessの開発には必要なんですよね。

レコードセットをつかったVBAが書かれているとする。  
Set Me.Recordset = rs

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
DoCmd.ShowAllRecords ※これの前に入れてしまうとコントロールは移動できない。

#####ここ以下にいれることで移動できるようになった######
If IsNull(call_受注番号) Then
受注番号検索 = Null
Me.Visible = False  ※これが必要
Me.Visible = True  ※これが必要
Me.受注番号検索.SetFocus
Else
受注番号検索 = Null
Me.Visible = False
Me.Visible = True
Me.input_納品日入力.SetFocus ※これでやっとコントロールが移動できた。
End If

Null と ”” は違うようなのでで、注意してください。

Access エラー処理

簡単そうだけど、忘れてしまう。
なので、記載しておきます。3か所の部分が必要です。

Private Sub 製品名コード検索_AfterUpdate()
On Error GoTo Err_check  ※この部分。

DoCmd.ShowAllRecords
製品名コード検索 = Null
DoCmd.GoToControl “在庫数”

Exit_Err_check: ※この部分
Exit Sub

Err_check:  ※この部分
MsgBox “検索するデータが存在しないか、エラーが発生しました。”
Resume Exit_Err_check

End Sub

Access テキストボックスのロック

入力ミスを防ぐためと、データの不一致をさせないために、あるタイミングで、テキストボックスに編集ロックをかけたい時がある。その方法。

Sub Form_Current()
If Me.[社員ID] = “0001” Then
Me.[旅費明細].Enabled = True  ※テキストボックス変化なし。
Me.[旅費明細].Locked = False  ※ロックを外す
Else
Me.[旅費明細].Enabled = False ※テキストボックスグレーになり、フォーカス移動できない。
Me.[旅費明細].Locked = True  ※ロックをする。
End If
End Sub

EnableとLockedはセットで使用しなくてもOK
編集だけできないようにさせる場合は、LockedだけでOKである。

Access レコードセットを2つ使いたい場合

本当は、1つのVBAの中で、2つのレコードセットを使う方法があるのかもしれないが、今回はこの方法で処理して解決しました。callで別のVBAにして処理をさせた。

Private Sub B在庫処理_Click()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String

On Error GoTo ErrRtn

SQL = “SELECT * FROM dbo_stock_parts WHERE HNO =” & Me!call_HNO & “”
Set cn = CurrentProject.Connection
rs.Open SQL, cn, adOpenKeyset, adLockOptimistic

cn.BeginTrans

While Not rs.EOF
If IsNull(call_在庫確認) Then

If IsNull(rs!在庫数) Then
rs!在庫数 = call_数量
Else
rs!在庫数 = rs!在庫数 + call_数量
End If
Else
rs!在庫数 = rs!在庫数 – call_数量
End If
rs.Update
rs.MoveNext
Wend

cn.CommitTrans

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing

ExitErrRtn:

Call stock
Exit Sub

ErrRtn:
MsgBox “エラー: ” & Err.Description

cn.RollbackTrans
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
End Sub

※callで下記のVBAを呼ばせて処理をさせている。

Sub stock()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQL As String

On Error GoTo ErrRtn

SQL = “SELECT * FROM dbo_receiving_materials WHERE JNO =” & Me!call_JNO & “”

Set cn = CurrentProject.Connection
rs.Open SQL, cn, adOpenKeyset, adLockOptimistic

cn.BeginTrans

While Not rs.EOF
If IsNull(call_在庫確認) Then
rs!在庫確認 = “在庫済”
MsgBox (“在庫更新しました。”)
Else
rs!在庫確認 = Null
MsgBox (“在庫取消しました。”)
End If
rs.Update
rs.MoveNext
Wend

cn.CommitTrans

rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing

ExitErrRtn:

DoCmd.ShowAllRecords
Exit Sub

ErrRtn:
MsgBox “エラー: ” & Err.Description

cn.RollbackTrans
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing

End Sub