またまたformat関数

四捨五入もしてくれるformatですが
VBAで
format(446/10,”0″)=45
なのですが
SQLserverでは
format(446/10,’0′)=44
なのです。

かなり慌てましたが
format(cast(446 as decimal)/10,’0′)=45 で 事なきを得ました。

VBAで配列をソート Quicksort

quicksortも作ってみました
無限ループに何度もはまりました
コード表示のプラグインも入れてみました

ちなみにquicksortのアルゴリズムはここ
再帰プロシージャはここを参考にさせてもらいました。

最速です

integer と long 続

たとえば
VBAのinteger -32,768 ~ 32,767
216=65536 だが
負数もあるので半分になっているらしい
.NET Framework の16 ビット符号付き整数と同じ?
符号付きは負数あり

VBAのLong -2,147,483,648 ~ 2,147,483,647
.NET Framework の32 ビット符号付き整数ということになるかな?
では
Long(VBA)=integer(VB.NET)=System.Int32=int(SqlServer)

SQL Serverにおいてtinyintだけは
符号なしなので
.NET Framework 風に言えば8ビット符号なし整数
0 ~ 255 

新元号 Access

5/1夜だがまだwin10_1809は新元号和暦表示できない
LANの半分は表示できるのでなんとか業務は可能だがこのままGW明けまでMicrosoft未対応を想定して可及的にパッチみたいな物を・・
うちの業務システムでは和暦表示は gee/mm/dd 形式だけだから

Public Function FormatZ(paramA As Variant, paramB As Variant)

If IsDate(CStr(paramA)) = True Then
 If paramB Like “gee/mm/dd*” And CDate(paramA) >= CDate(“2019-5-1”) Then
  FormatZ = Replace(Format(paramA, paramB), “H3”, “R0”)
 Else
  FormatZ = Format(paramA, paramB)
 End If
Else
 FormatZ = Format(paramA, paramB)
End If

これで良いかな?

とりあえずしばらくしのげれば良いので関数作って
moduleで必要な物はFormatZに変えておく
クエリも令和が出そうなものは捜して置換
フォームのソースがクエリのものがあるはずだが面倒なので現場で対応しよう

新元号 windows WSUS

先月から気になっていたのですがWSUSサーバで新元号対応更新プログラムのKB4493473がインストール済みまたは該当なしになっていたのですがインストールはされてません
今日確認するとやはり新元号表示不能です
マニュアルで対応必要でした 以下参照
https://sccm.jp/2019/04/27/post-1484/

windows10 1809 は今日5/1調べたけどまだ未対応のようです
windows10でupdate最新状態にしておけば大丈夫とあちこちで見るけど
最新状態だと1809になってるはずなのでほとんどのPCが表示できない
ということになってないのかなあ

文字

文字は良くわからないです

VBAのasc関数で asc(“文字”) は 文字のshift_jisコードを返すようですがなぜそれがascなのかよくわかりません

甘んじて受け入れて
SQLserverにはasc関数はない、ascii関数がある。ではこれはutf8かutf16コードを返すのだろうと妄想するとこれは間違い
アスキーコードを返す

SQLserverにはunicode関数がある。調べると文字のunicodeを返すと出てくる。unicodeは文字の集合でコードではないと覚えたけどと混乱

SQLserverで
unicode(‘、’)は12289
VBAで
ascw(“、”)は12289
12289は16進数にすると3001でコード表では「、」のutf16コード
ますます混乱

うちの環境では
VBAのasc関数はsjisのコード ascw関数はutf16のコードが返ってくる
SQLserverのascii関数はunicodeを返すらしいがutf16のコードと同じ値が返ってくる
ではunicode=utf16なのかというとそうではないと覚えていたのだが・・
宿題にします。

VBAでSQLクエリを書くとき

VBAからデータベースへ向かってクエリを書くときいろいろと忖度してあげる必要がある

SQLserverのbit型はaccessで見るとbitの0はAccessの0でありfalse、bitの1はAccessの-1でありtrue
そこを踏まえて
Accessのフォームから・・

cn.execute “update sqlTable set BitColumn=case when ” & AccessForm.checkbox & “=-1 then 1 else ・・

となんだかおかしいようだがおかしくない

日付型を扱う時も

cn.execute “update sqltable set DateColumn=cast(format(日付,’yyyy/MM/dd’) as dattetime)・・・

MMを忖度せねばいけないがAccess側にいると忘れてしまう事がある。気がつけば良いが久しぶりに遭遇してmmと書いてしまうと気がつかないで慌ててしまう

VBAから#table 続き

TableAのADODBレコードセットを取ってデータ取得
TableBの複製を一時テーブルにexecuteメソッドでselect into
tableAのデータをパラメータに
update #table・・・

一時テーブルできないとき
レコードセットのcursorlocationがaduseserver でかつ
レコードセットを閉じないまま
一時テーブル作成
これがエラー

作成前に変数に代入してレコードセット閉じれば可
cursorlocationがaduseclientなら閉じないままでも作成できる

できる時の方が多い
できないときはcursorlocationをチェック