スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

VB:Notesのデータベースを読み込むAPI

Notesからデータを直接吸い出したかったのですが、やっとそのやり方がわかりました。
なのでメモ。

特に、「いついつ以降に新規作成・更新になったデータ」の吸出しができずに悩んでました。
Searchメソッドを使えば解決しました。





Dim wkNotesSsn As Object
Dim wkNotesDB As Object
Dim wkNotesDocs As Object, NDoc As Object

dim svr as string
dim nm as string
svr = "サーバー名"
nm = "ファイル名"

Set wkNotesSsn = CreateObject("Notes.NotesSession")
Set wkNotesDB = wkNotesSsn.GetDatabase(svr, nm)

'-- 全部のデータを取ってきたいときは、コレ --
Set wkNotesDocs = wkNotesDB.AllDocuments

'-- 期間を区切って取ってきたい場合は、コレ --
Set wkNotesDocs = wkNotesDB.Search("@all", wkNotesSsn.CreateDateTime("12/31/2013"), 0)




Dim データ As String, sval As String
Dim n As Long
Dim i As Integer
Dim bar As String

bar = Application.StatusBar


'-- データ取得 -------------
n = 0
ReDim results(1000)
Set NDoc = wkNotesDocs.GetFirstDocument

Do Until NDoc Is Nothing

If NDoc.NoteID <> "" Then

id = NDoc.NoteID
dt = NDoc.LastModified
sval = NDoc.GetItemValue(Split(columns(i), ",")(1))(0)

If n Mod 1000 = 0 Then
ReDim Preserve results(UBound(results) + 1000)
End If

End If

Set NDoc = wkNotesDocs.GetNextDocument(NDoc)
Loop

'配列の微調整
For i = UBound(results) To 0 Step -1
If results(i) <> "" Then
ReDim Preserve results(i)
Exit For
End If
Next i

スポンサーサイト

ExcelからAccessを起動する

Option Explicit

Private Sub Workbook_Open()

Accessモジュール実行 "C:\temp\aaa.mdb", "モジュールの名前"

End Sub


Public Sub Accessモジュール実行(mdb As String, mdl As String)

Dim acApp As Object
Set acApp = CreateObject("Access.Application")

With acApp
.OpenCurrentDatabase mdb
.Visible = True
.Run mdl
.Quit
End With

Set acApp = Nothing ' オブジェクト開放

End Sub

Windowsにログインしているユーザー名を取得する方法

★Windowsにログインしているユーザー名を取得する方法


Private Declare Function WNetGetUser Lib "mpr" Alias "WNetGetUserA" _
(ByVal lpName As String, ByVal lpUserName As String, lpnLength As Long) _
As Long

Public Function GetUserName() As String

Dim strUserName As String * 255

'WindowsAPIをコールして、ネットワークユーザー名を取得します。
If WNetGetUser("", strUserName, 255) = 0 Then
'APIの返り値が正常なら、後続のNullを取り除きます。
'(これはAPIの関数から値を取得する場合にしばしば使用する定型的な処理です)
GetUserName = Left$(strUserName, InStr(strUserName, Chr$(&H0)) - 1)
Else
GetUserName = ""
End If

End Function

Google APIのサンプル

GoogleのカレンダーやToDo(Tasks)をコントロールするAPI群の使い方まとめです。
※ VB6です

HTTP操作をするため、以下のライブラリを参照設定する必要があります。
「Microsoft WinHTTP Services」

手順は、まずログインプロセスでトークンを取得し、そのトークンを使って必要なAPIをHTTP経由で操作するといった感じです。
なので、したい操作によって接続先アドレスがちょいちょい変わります。

スケジュールやタスクを登録する際はPOST、登録されている情報を取得する際はGETですが、その際、JSONというデータ形式を使ってやりとりします。
※ JSONをデコードするクラスも記事投稿していますので、ご参照ください。
記事

日付・時間形式など、Google APIのヘルプページには載ってない気がするんですよね。。試行錯誤で形式を探り当てたので、形式で困ってらっしゃる方は以下ご参考。


● ログイン & トークン・承認コード取得
以下のような感じでログインし、APIをコントロールする際のトークンなどを取得します。
なお、接続先アドレスは、
Private Const URI_GOOGLE_LOGIN As String = "https://www.google.com/accounts/ClientLogin"
です。

Private http As WinHttp.WinHttpRequest

'*--------------------------------------------------------------------*
'*-- Google へのログイン ---------------------------------------------*
'*--------------------------------------------------------------------*
Public Function login(email As String, password As String) As Boolean
Dim Body As String

login = False

Body = "Email=" & email & "&Passwd=" & password & "&service=cl&source=Microsoft-VisualBasic-6.0"
Set http = New WinHttp.WinHttpRequest
http.Open "POST", URI_GOOGLE_LOGIN, False
http.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
http.Send CVar(Body)

If http.Status <> HTTP_STATUS_OK Then
login = False
ErrMsg = http.StatusText
Exit Function
End If
If InStr(1, http.ResponseText, "Auth=") = 0 Then
login = False
ErrMsg = http.StatusText
Exit Function
End If

token = Right(http.ResponseText, Len(http.ResponseText) - InStrRev(http.ResponseText, "Auth=") - 4)
authorization = "GoogleLogin auth=" & token

login = True
ErrMsg = ""
End Function


●Tasksのコントロール(リスト取得)

ログインする際に取得したトークンを利用して、以下のような感じでアクセスします。
以下は、Tasksのリストを取得するためのものです。
※ RepStrは文字置換関数です。ググるとヒットしますので、そちらをご参照ください。

Private Const URI_GOOGLE_TASKS_TASKLISTID As String = "https://www.googleapis.com/tasks/v1/users/@me/lists?key=<>"


uri = RepStr(URI_GOOGLE_TASKS_TASKLISTID, "<>", API_KEY)
http.Open "GET", uri, False
http.Option(WinHttpRequestOption_EnableRedirects) = False
http.SetRequestHeader "Authorization", authorization
http.SetRequestHeader "Content-Type", "application/json"
http.Send


●Tasksのコントロール(Taskの取得)
同じく、リスト内にあるTaskを取得するための接続先です。
なお、TaskListIDは、上の「リスト取得」で取ることができる、リスト固有のIDです。

uri = RepStr(RepStr(URI_GOOGLE_TASKS, "<>", API_KEY), "<>", TaskListID)
http.Open "GET", uri, False
http.Option(WinHttpRequestOption_EnableRedirects) = False
http.SetRequestHeader "Authorization", authorization
http.SetRequestHeader "Content-Type", "application/json"
http.Send


●カレンダーの種類の取得

Private Const URI_GOOGLE_CALENDARLIST As String = "https://www.googleapis.com/calendar/v3/users/me/calendarList?key=<>"

uri = RepStr(URI_GOOGLE_CALENDARLIST, "<>", API_KEY)
http.Open "GET", uri, False
http.Option(WinHttpRequestOption_EnableRedirects) = False
http.SetRequestHeader "Authorization", authorization
http.SetRequestHeader "Content-Type", "application/json"
http.Send


●スケジュールの取得
スケジュールを普通に読み込むと、大量にデータが流れ込んでくると思うので、そこで固まります。(一回、大泣きしました。。)

なので、日付指定オプション(timeMin, timeMax)で期間を指定してあげましょう。
また、念のため、maxResults(とってくる上限個数)も指定しておいた方がいいかも。

指定する日付は、yyyy-MM-ddT00:00:00Z というようにTだのZだのが付きます。
2012/4/1だったら、2012-04-01T00:00:00Zですね。時間部分は省けないようでした。

Private Const URI_GOOGLE_CALENDAR As String = "https://www.googleapis.com/calendar/v3/calendars/<>/events?key=<>"

uri = RepStr(RepStr(URI_GOOGLE_CALENDAR, "<>", API_KEY), "<>", CalendarID)
http.Open "GET", uri _
& "&timeMin=" & Format(dt_from, "yyyy-MM-dd") & "T" & Format(dt_from, "HH:mm:ss") & "Z" _
& "&timeMax=" & Format(dt_to, "yyyy-MM-dd") & "T" & Format(dt_to, "HH:mm:ss") & "Z" _
& "&maxResults=100" _
, False
http.Option(WinHttpRequestOption_EnableRedirects) = False
http.SetRequestHeader "Authorization", authorization
http.SetRequestHeader "Content-Type", "application/json"
http.Send


● カレンダー登録
アクセス自体は上のような感じですが、渡すデータの形式でちょっと悩みました。
要はJSON形式なのですが、日付指定がちょっと変わった感じ。
 {・・・, "start":{"dateTime":"2012-04-01T12:00:00+09:00"}, ・・・}
といった感じです。詳細は以下ご参考。


Private Const URI_GOOGLE_CALENDAR As String = "https://www.googleapis.com/calendar/v3/calendars/<>/events?key=<>"


Dim sCmd As String
sCmd = "{ ""summary"":""" & Title & """,""description"":""" & Content & """,""location"":""" & Location & """,""start"": {""dateTime"": ""2012-04-27T12:00:00+09:00""}, ""end"": {""dateTime"": ""2012-04-27T12:30:00+09:00""}}"
' If DueDate <> 0 _
Then sCmd = sCmd & ",""due"": """ & Format(DueDate, "yyyy-MM-dd") & "T" & Format(DueDate, "HH:nn:ss") & ".000Z"" }" _
Else sCmd = sCmd & " }"

uri = RepStr(RepStr(URI_GOOGLE_CALENDAR, "<>", API_KEY), "<>", CalendarID)

http.Open "POST", uri, False
http.Option(WinHttpRequestOption_EnableRedirects) = False
http.SetRequestHeader "Authorization", authorization
http.SetRequestHeader "Content-Type", "application/json"
http.Send CVar(sCmd)


後ほどサンプルエクセルを掲載予定です。


VB6でJSONもどき

GoogleAPIやNOZBEのAPIを使う際、JSONのハンドリングは必須。

で、JSONをVB6で扱うためのクラスなりライブラリなりが見つからなかったので、自作。
特にJSONをデコード?デシリアリズ?(データを抽出)するのが難航。

以下サンプルです。
大カッコや中カッコの“くくり”を判定するロジックの部分が、InStrなどを駆使してもっとスマートに記述できるとおもうのですが、断念。もしうまく書き直していただける方がいらっしゃいましたら、是非フィードバックをお願いします。


Excel Sample
class file



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。