2019年6月5日水曜日

Googleカレンダのほんのちょっとしたマネ

Googleカレンダは 確かに素晴らしいと思いますよ。

しかしねえ、そのために カレンダーへ改めて入力するというのもナンダカナというわけです。

というのも、SQLで予定管理は すでに そっちへ、何年先の分も入力済みなのです。

パソコンを覗いてる分には なんの問題もないが、 なんとか 「本日の予定」が、スマホ上に 自動的に表れてくれないかなあ、、、が長年の夢。

それを なんとか実現しました。

1 AccessのFormにある タイマーイベントを利用する。
一定程度の間隔値を設定しておくと、自動で実行するようにするわけです。
間隔値は ミリセコンドで設定可のようです。
すなわち、1000と設定すると 1秒ごとに 実行してくれる。
まさか1秒ごとに等は必要ないので、6 12時間ごとにした。
値=60×60× 6 12 ×1000 
Acceseの実行時(=Form開始時)から 6  12時間ごと となるので 実行開始に気を使う。
たとえば、 夜10時に 開始すると 明け方4:00 次 10:00 次16:00 次22:00・・・という具合に 永遠に送り続ける。もちろん where 文にて 実行時の本日分 と記述することが(下記参照)必要です。

2 どんなコードを書くか
手順
 イ SQLへの接続文字列記述
 ロ ADODBにて テーブルからデータ抽出を記述
   例えば select 誰、日時、予定内容1、予定内容2、予定内容3 from 予定テーブル where 日時=DATE() こんな感じ
 ハ そのrecordset を do until eof で繰り返して読取り、 html文書に作り替える
 ニ その際 テーブルタグを使用して作ると Google風になる
 ホ htmlができたら、スマフォのe-mailアドレスへ 送信する・・・
   メール送信は window cdo を利用。outlookを利用すると、送信直前で動きが止まってしまう(ヨウナキガスル)

3 今回はAccess VBAにて作成したが 同じ発想で作成すればいいのでjavascript や vbascriptでもかけそうな気がする。

うむ、
officeアプリがなくとも 動くとすると もっと 素敵な世界が開けるかもしれない、なはは。









2019年5月28日火曜日

Outlookを利用して外出先からSQLへつないでみた

OutlookのVBAを利用するとSQLへの読み書きができそうとの感触を得たの挑戦。
Outlookの受信イベントを利用するものだ。

outlookメーラには、 ThisOutlookSessonというものがあって、そこに

Sub Application_NewMailEx(ByVal EntryIDCollection As String)
・・・
End Sub
を記述すると実行してくれるらしい。とどいたメールの件名や本文を解析できるらしいのだ。

手順
1 出先から スマホにて 件名を 
  Select * From 顧問先tbl
としてメールを送信する

2 メーラは受け取ったとたんに、LAN内SQLに接続を開始し、「件名」がそのまま SQL構文となってるので それをSQLへ発行する

3 SQLがデータを回答。outlookは、そのデータを HTML化する
4 outlookは HTML化したデータを スマホあて送信する
5 出先にてスマホにとどいたメールで 内容を確認する

実験成功。

selectに限らずinsertやupdate構文も送ることができるだろうから、
素敵な使い方ができそうだ。


これまで出先から接続するには、
VPN等でいったん接続してから、SQLToolProなどを使うしかなかったが、
(Office系VBAは使えないよねえ、アンドロイド)いまいち接続作業などがわずらわしいんだよね。

次回は、
Sub Application_NewMailEx(ByVal EntryIDCollection As String)
・・・
End Sub

この中身をご紹介。









 

2018年10月14日日曜日

ん?e-govのXML、、、、(3)



わかる人にはわかるコード(の一端)です。

 
でもなあ。
入れ子構造 同一のタグを使用してる場合がある。例えば <年></年>などだ。
これへの対応はチト頭が痛い。今後の課題。



Dim CsvModel      As Object
Dim NittaData As String
mypath = CreateObject("WScript.Shell").specialfolders("MyDocuments")
iFile = mypath & "\ひな型XML\csv総括票ひな型"oFile = mypath & "\A電子申請前_保存\csv総括票XML_" & jobmode



Set CsvModel = CreateObject("ADODB.Stream") CsvModel.Mode = 3 '読み取り/書き込みモードCsvModel.Type = 2 'テキスト

CsvModel.Charset = "UTF-8" '文字コードCsvModel.Open '開くCsvModel.LoadFromFile (iFile) '読み込むCsvModel.Position = 0 'ポインタを先頭へNittaData = CsvModel.ReadText() 'データ読み込みCsvModel.Close '閉じるSet CsvModel = Nothing '解放








' kw=Kensaku Word の意 
kw = "<様式ID": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d様式ID & "</" & Mid(kw, 2) & ">")kw = "", kw & ">" & dID & ".xls" & "</" & Mid(kw, 2) & ">")

kw = "<識別情報x提出元ID": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d提出元ID & "</" & Mid(kw, 2) & ">") kw = "<識別情報x通番": NittaData = Replace(NittaData, kw & "/>", kw & ">" &

d通番 & "</" & Mid(kw, 2) & ">")

kw = "<社会保険労務士の提出代行者名": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d社労士氏名 & "</" & Mid(kw, 2) & ">")

 

kw = "<作成年月日></>" & Chr(10) & "</>" & Chr(10) & "</>": NittaData = Replace(NittaData, kw, "<作成年月日><>" & d & "</><>" & d & "</><>" & d & "</>")

kw = "<提出年月日></>" & Chr(10) & "</>" & Chr(10) & "</>": NittaData = Replace(NittaData, kw, "<提出年月日><>" & d & "</><>" & d & "</><>" & d & "</>")

 

kw = "<事業所整理記号x郡市区記号": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d郡市区記号 & "</" & Mid(kw, 2) & ">") kw = "<事業所整理記号x事業所記号": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d事業所記号 & "</" & Mid(kw, 2) & ">")

kw = "<事業所番号":NittaData = Replace(NittaData, kw & "/>",kw & ">" & d事業所番号 & "</" & Mid(kw, 2) & ">") kw = "<届書総件数x資格取得届70歳以上被用者該当届": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d件数1 & "</" & Mid(kw, 2) & ">")

 

kw = "<届書数x被扶養者異動国年3号被保険者関係届": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d件数2 & "</" & Mid(kw, 2) & ">") kw = "<届書数x資格喪失届70歳以上被用者不該当届": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d件数3 & "</" & Mid(kw, 2) & ">") kw = "<届書数x月額変更届70歳以上被用者月額変更届": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d件数4 & "</" & Mid(kw, 2) & ">") kw = "<届書数x算定基礎届70歳以上被用者算定基礎届": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d件数5 & "</" & Mid(kw, 2) & ">") kw = "<届書数x賞与支払届70歳以上被用者賞与支払届": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d件数6 & "</" & Mid(kw, 2) & ">")

kw = "<届書総件数x届書合計":NittaData =Replace(NittaData, kw & "/>", kw & ">" & d件数k & "</" & Mid(kw, 2) & ">") kw = "<事業所所在地x郵便番号x親番号": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d親番号 & "</" & Mid(kw, 2) & ">") kw = "<事業所所在地x郵便番号x子番号": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d子番号 & "</" & Mid(kw, 2) & ">")

 

kw = "<事業所所在地": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d事業所所在地 & "</" & Mid(kw, 2) & ">")kw = "<事業所名称": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d業所名称 & "</" & Mid(kw, 2) & ">")

kw = "<事業主氏名": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d業主氏名 & "</" & Mid(kw, 2) & ">")

kw = "<市外局番": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d市外局番 & "</" & Mid(kw, 2) & ">")

kw = "<局番": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d局番 & "</" & Mid(kw, 2) & ">") kw = "<番号": NittaData = Replace(NittaData, kw & "/>", kw & ">" & d番号 & "</" & Mid(kw, 2) & ">")


Dim NittaObj As Object

Set NittaObj = CreateObject("ADODB.Stream") NittaObj.Mode = 3 '読み取り/書き込みモードNittaObj.Type = 2 'テキストNittaObj.Charset = "UTF-8" '文字コードNittaObj.Open 'Stream開くNittaObj.WriteText NittaData, 0NittaObj.SaveToFile oFile, 2NittaObj.Close 'Stream閉じるSet NittaObj = Nothing '解放MsgBox jobmode & "データが整いました 電子申請urlを開きます"









Shell "c:\Program Files\internet explorer\iexplore.exe " & URL, vbNormalFocus

ん?e-govのXML、、、、(2)

ちょいとおっちょこちょいで。


どうやら ボクが間違っていた模様。e-govさんは、何も細工をしてませんでした。
早く送信を終わらせたくて急いでコーディングをしていたせいでしょうか、いわゆる「手順前後」となるようなことをしていたがために 前回の投稿となってしまいました。


ご安心あれ、vbaなどで直接XMLファイルを作成して、指定のweb入力フォームにて読み込ませることは可能でした。
まあ、今にして思えば 当たり前のハナシですが。


でも、ヒョウタンからコマよろしく、急いで考えた対応策が こっちも行けるじゃんということでこれからは(来年の元号変更時には相当大幅な変更が、というか 全XMLファイルでしょう、これらが「予想されますので、これからは こっちの新方式でつくることとしよう。




なぜ間違えたかの解説を ちょっくら。
CSV総括票の 入力画面は 取得送信であれ、喪失送信であれ 見た目が 同じ入力フォームです。


が、が、
中身は違う。次のように各手続きごとに 様式ID とSTYLESHEETのデータが(微妙に)異なっている。

社保取得
様式ID = "495000020582030137"

社保扶養様式ID = "495000020587030137"

社保喪失様式ID = "495000020583030137"


社保月変様式ID = "495000020585030137"


社保賞与様式ID = "495000020586030137"


STYLESHEETのデータは、上記データの後ろに .xls という文字列を付加したもの。




これらを正しく設定してXMLファイルを作成しないと、読み込ませ時に e-govから叱られることとなる。













2018年10月9日火曜日

今年も「取り入れ」が終わった・・・

いつまで続くかわからないが、今年も 取り入れ を終えた。
? 取り入れ? わからないかもしれない。

こちらでは、 米の収穫をこういう。

あっ、収穫祭、ってもいいそうだから、まったくもってわからないということはななさそ。



こんな 取れた稲穂を神棚に捧げるという習慣はなかったけれど やってみました。

あっ、3人目の孫が生まれてましてネ、上二人は男孫でしたが 初めての孫娘です。




2018年10月6日土曜日

ん?e-govのXML、、、、

CSV系統の申請が今年3月を境に新方式となっていた。旧方式も併存させていたので、そのまま旧で手続きをしてきたところだが、算定も終わり、労働保険2期分の通知書発行も一段落したので Verアップすべく、作業に入ったのだが、、、、、、、、、

どうやら、今度の新方式は、読み込ませ対象のXMLファイルが、 何か 細工?がされてるみたい。

というのは、従来、VBAにて XML記述形式のテキストをはじき出し、それをUTF-8変換して、e\gov上で 読み込ませていたのだが、 これがどうにも うまくいかない。

読んでくれないのだ。

通常、タイプミスしたり、規格に合わないデータだったりすると、それなりのメッセージをだしてくれる
のだが、今回は そうではないのだ。


ヘルプのも電話してみたが どうにも らちが明かない。



e-gov上で 入力したものを保存して、手作業で(メモ帳)で修正して再度保存したものは(なんと、メモ帳はUTF-8で保存してくれる!)読めるんだよなあ。


ここは 致し方ない。
このままでは 業務が滞る。

かくして、次のような方法にした。

1 e-gov上で ひな形データを入力し、保存する。(例 CSV総括_社保取得ひな形)
2  同ファイルを adodb.stream を使って 全文取得する
3 上記取得データに対し replace関数を実施
  <社労士に名前> という文字列を <社労士に名前>大西けんぞう に置き換える
4 置き換わった全文を adodb.streamにて 保存する

面倒だなと思ったが これはこれで 一つの方法かなという気もしてきた。
データの必要なタグを探してきて タグ+実データ にするだけだ。


e-govヘルプで電話応対してくれた彼女、、、カリカリしてごめんね。






2018年2月8日木曜日

Access2010のadpとおさらば(4)

テーブル、 フォーム、 レポート、 マクロ、モジュールをすべて読み込み、欠けているクエリを再作成すれば終わりかというと、さにあらず。ゴールにはもうひと作業。
読み込んだフォーム、レポートにかく格納されているモジュールがそのまま動くとは限らない。

ひとつは、コードに記述する関数などに互換性がない場合がある。これらをaccdb側で動くように置き換えねばならない。

もう一つは、 コード記述内にある テーブル名の修正だ。

実は SQLにODBC接続すると、リンクしたテーブル名の頭に 「dbo_] が付いてしまうのだ。
ここで悩む。
テーブル名をdboを残したまま コードを書き換えるか、テーブル名からdboを削除するか、どっちかにするしかない。
テーブル数が一つや2つなら 手作業にて deleteしてもいいが、数は20を超える。
社保雇保統合データベース
 会社名テーブル 
 社保適用事業所テーブル 
 雇用保険適用事業所テーブル 
 社保被保険者テーブル
 雇用保険保険被保険者テーブル 
 被扶養者テーブル 
 標準報酬テーブル 
 住所変更テーブル 
 電子申請送信済みテーブル
 などなど このほか多数・・・・・

プロジェクト管理データベース
 電話受信簿テーブル
 プロジェクトテーブル
 プロジェクト明細テーブル
 など・・・・

このほか 
労働保険事務組合データベース
FAX受信データベース
給与計算データべース
請求管理データベース、
送付書管理データベース、
職員スキル管理データベース
等々に それぞれ多数のテーブルがある。


結局、dbo削除を選択したのだが、世の中よくしたもので、同じ悩みを抱えている人がいらして、
一括削除のFunctionを作成公開してくれてる、ありがたい人がいるのだ。

ほんの数行のコードで おかげさまで ワンタッチで削除できた。
感謝を込めて ご紹介かたがた掲載

http://mmf.cocolog-nifty.com/fpc/2005/05/sqlserverdbo__c25f.html
Function f_RenameTableName()
    Dim dbs As DAO.Database
    Dim tdf As DAO.TableDef
    Set dbs = CurrentDb   
    For Each tdf In dbs.TableDefs       
        If Left(tdf.Name, 4) = "dbo_" Then
            tdf.Name = Mid(tdf.Name, 5)
        End If       
    Next
Ext:
    Set tdf = Nothing
    Set dbs = Nothing
End Function