ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Lotus Notes/DominoコミュのCSVファイルのデータの読み込みについて教えて下さい

  • mixiチェック
  • このエントリーをはてなブックマークに追加
トピ立て失礼します。

ノーツの開発は初めてなので簡単な質問だったらすみません。

ノーツ&ドミノのバージョン6.0.4を使用してCSVファイルのデータを読み込んで各店舗の売掛金の発生と回収を管理するエージェントを作成しております。

自分で勉強すれば住む内容なのかもしれないですが、コンピューターが専門ではない私が来週中には完成しないと会社の業務が回らないので質問いたします。

CSVファイルの中身は下記の通りです。

<各店舗の売掛金の明細のCSV>
 店舗コード、請求書番号、発生内容(商品の分類等)、発生金額

CSVファイルの各列の型を定義した後、取り込み用フォーム内の各フィールドに取り込む別のエージェントを作成しています。

【質問】
1.CSVファイルには1つの請求書番号に対して複数行の発生内容がありますが、
  請求書番号1つにつき1文書となるようにする事は出来ますか?

2.CSVファイル内で請求書番号が空白(未請求の物)は文書を作成しないようにすることはできま
  すか?

3.エクセルでVBAを作成する時は実行を途中で止めて、どの部分まで正常に動いているか確かめる
  事ができますが、ノーツエージェントは途中で止めることができないので、実行しない部分は切り
  取ってメモ帳等に残しておくか、文字列にするしかないのでしょうか?

ノーツどころかVBA事態初心者なので、質問している自分自身も上記の質問の仕方で皆さんに伝わるか不安ですが、意味が分からないとうございましたら色々とご指摘いただければと思います。

以上、乱文で失礼ですがご回答いただければ幸いです。

コメント(14)

書いているスクリプトがnotes Scriptであれば、私が経験した事でご回答します。

1.可能ですね。ファイルを行で読み込み、その内容を書き出す事が可能です。
2.こちらも可能です。取り込んだのち、条件式でふるい分けしてあげれば良いと思います。
3.もし、NotesLogの参照権限があるならば、printで書いてあげれば、ログに出力
 しますのでそこで動作検証を行えば問題ありません。

ファイルの読み込みは、下記のサイトにあるファイルを一行読み込むみていただければ
わかると思いますよ。
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/vb_t06.htm
>風のジョニーver2.2さん
早急に回答ありがとうございます!!!
添付していただいたURLを参考に作成してみようと思います。
まだ素人なものでVBの意味がよく分かっていなかったりもしますががんばります。。。
補足的に。。。

1. 可能
Line Input を使って1行ずつ読み込む場合で、Domino6以降であるならば、
Split関数が便利です。
セパレート文字をカンマで指定すれば、配列で取得できます。

2. 可能
Splitした結果取得できる配列の二つ目(つまり請求書番号)が空白でなければ、文書を作成する。
とすれば、請求書番号の無いものは文書の作成をしないとできます。
#配列は基本的に「0」から数えますので、二つ目という事は配列番号で言えば「1」になります。

3. やりようによってはデバッガの使用も可能
エージェントは、右クリックから単独で実行できるので、デバッガを使う事もできます。
ただし、ローカルのPCでデバッグする事になると思いますが、
その場合はCSVもローカルにおいておく必要があります。
動きの確認であれば、ローカルで検証しても問題ないと思われます。

CSVの読み込み/文書作成ロジックが完成してから、
Dominoサーバー上CSVファイルを取得しにいけるかを検証するのも、
作り方の一つだと思います。

まぁ、その辺は作りやすいやり方はどれか、になると思います。

# VBAは Visual BASIC for Application の略で、MS Office向け(マクロなど)のものですが、
# Lotus Scriptは記述方法がVBAとほぼ同じなので、参考になると思います。
# VBとなると、マクロのようなものではなく、インターフェースから全て作る。つまり、
# ウィンドウ枠からボタンやフィールドなども自分で作るものを指します。
# マクロ的なものを指しているのであれば、それはVBAです。
# とは言っても、記述ルールは同じです。
>きょーさん

補足説明ありがとうございます。

指摘いただいた内容でエージェントを実行したところ、
読み込みと書き込みはうまく動いているようなのですが、肝心のフォームやフィールドに値が入りません。

もっとNotesの仕組みを勉強しないといけないと実感しております・・・・
すみません、たびたび質問です。

取り込むファイルは添付の画像のようなCSVファイルです。

区分と請求書番号が同じれれば発生金額の合計をフィールドに取り込むということは可能でしょうか?

あと、CSVファイルの特定の項目が空白だとエラー「N003 resumeがありません」の表示が出て取り込みができないので空白のセルに「1」を入れてから取り込んでいますが、空白のままでも取り込めるのでしょうか?

> 区分と請求書番号が同じれれば発生金額の合計をフィールドに取り込むということは可能でしょうか?
できます。
請求書番号で検索して合計すればいいです。
検索しても文書が見つからなければ、文書を新規作成。
検索に引っかかれば、発生金額を足しこめばいいです。

csvの項目が空白でエラーなのは、「空白」を代入しようとして失敗しているからだと思います。
代入前に空白か否かをチェックして、空白ならば代入しないとすれば良いのではないでしょうか。
>きょーさん
ありがとうございます。

検索に引っ掛かれば発生金額に足しこむのはCSVファイル自体を別ファイルにする方法なら知っていますが、同一ファイルで行う場合は具体的にどのような式を記入したらできますか?

空白か否かのチェックについても、できれば式を教えて下さい。

初歩的な質問ですみません・・・・
別ファイルで足す方法を実現できていれば、同じような処理を書けばいいですよ。
上でも書きましたが、

> 検索しても文書が見つからなければ、文書を新規作成。
> 検索に引っかかれば、発生金額を足しこむ。

という条件分岐で対応できます。
例えば、GetDocumentByKeyメソッドで文書が取得できない場合、戻り値はNothingです。
詳しくはヘルプを参照ください。

空白か否かのチェックも、
If xx = "" then
 処理
End If
でいけますよ。

…ところで、、
「式」とおっしゃってますけど、@関数ではないですよね?
今回、LotusScriptであること前提で話を進めています。
式だとCSVの操作ができないと思いますので、LotusScriptだとは思いますが。。
>きょーさん
度々恐れ入ります。
「式」ではなくて、LotusScriptです。

空白か否かのチェックはできました。
空白でも文書が作られてしまっておかしいと思ったのですが、AndやOrの使い方を間違っていました・・・

足す方法は同一ファイル内だとうまくいかないです、Do〜Loopの間でGetDocumentByKeyを記入しているせいでしょうか?

ヘルプ見てやってみます。
> ヒコにゃんさん
レス遅くなってしまって。。
その後いかがでしょうか。

区分と請求書番号が同じであれば、同じフィールドに取り込む
という事ですが、その後いかがでしょうか。

方法はいくつかありますが、例えば、

1.まず、既に作成されている文書を表示するビューを作成する。
1列目: 区分でソートされた列
2列目: 発生金額でソートされた列
3列目以降 … あとは見やすいように(ソート列を多くすると、表示が遅くなるので注意)

2.スクリプトを作成

Dim intFF as Integer
Dim FName as String
Dim vtmp as Variant
Dim Arr as Variant
Dim KeyArr(1) as String

FName = "ファイルパス"

intFF = FreeFile ' FreeFile値の取得
Open FName For Input As intFF

Do Until EOF(intFF)

Line Input intFF, vtmp
Arr = Split(vtmp, ",")

KeyArr(0) = Arr(2) ' "区分"を検索の0要素目として設定
KeyArr(1) = Arr(6) ' "請求書番号"を検索の1要素目として設定

Set doc = vw.GetDocumentByKey(KeyArr)

If doc Is Nothing Then
' 文書が見つからない - 新規作成の処理

else
' 文書が既に存在 - 発生金額を加算する処理

End If

Loop

オブジェクト変数の宣言、インスタンス化は、適宜してください。
今回のコードは、その部分を省略しています。

注: デバッグしていません。机上だけのコードなので検証してください。


GetDocumentByKeyのkeyの部分は、配列を渡す事ができます。
配列で渡した場合、その配列にならって検索をしにいきます。
今回KeyArrとして、要素が2つある配列を用意しているので、
1列目と2列目を検索の対象として見にいく事になります。

ご参考になれば幸いです。
>きょーさん

ありがとうございます。
こちらこそレス遅くなりまして申し訳ありません。

素人であまり意味が分からない部分もありますが自分の作成したスクリプトに付け加えていこうと思います。

2点質問です。

?Arr()の数字は取り込み元ファイルの列数でしょうか?
?vtmpは上記のスクリプトでどのような用途で使用されていますか?

レス遅くなりましてスミマセン。
最近、Dominoサーバーばかり見ていて、プログラムが考えられません(ぇ


> (1) Arr()の数字は取り込み元ファイルの列数でしょうか?
はい。そうです。
ただし、取りこんでSplitした配列要素番号は 0(零)から始まりますので、
見た目、一つずれているように見えます。

> (2)vtmpは上記のスクリプトでどのような用途で使用されていますか?
csvファイルから1行取り出すために、仮の置き場として使用しています。
Stringで宣言してもいいですが、念のためVariantで宣言しています。

こんな感じでよろしいですかね?
不明点あれば、またどうぞ(笑

# ?や?は機種依存文字なので、(1)のように書くのがいいですよー 老婆心ながら。。
>きょーさん

またまたレス遅くなって申し訳ありません・・・
ようやく思っていた通りエージェントが動きましたわーい(嬉しい顔)

本当にいろいろとご指摘ありがとうございました。

携帯でmixiの文書を見た時?が表示されるのが何故かと思っていたのですが、機種依存文字なのですね。

今後書き込みする際は注意しますあせあせ(飛び散る汗)
> ヒコにゃんさん
思い通りのエージェントができてよかったですわーい(嬉しい顔)

ではまた手(パー)

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Lotus Notes/Domino 更新情報

Lotus Notes/Dominoのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング