About 2011年04月

2011年04月にブログ「sanryuブログ」に投稿されたすべてのエントリーです。過去のものから新しいものへ順番に並んでいます。

前のアーカイブは2011年03月です。

次のアーカイブは2011年05月です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35

« 2011年03月 | メイン | 2011年05月 »

2011年04月 アーカイブ

2011年04月02日

5才の息子は

震災以降、おねしょをするようになりました。
また、甘えてくるようになりました。

理由を聞いてみると、
地震を思い出して怖い。
テレビで見るような事が起こるかもしれない。
怖い夢を見てしまうと言っていました。

今日も、家の前の道路に地震でできた亀裂を見て、
水がでてきそうで怖いといっていました。

4月2日の朝日新聞には、
幼い子に震災を通して命の大切さを教えるのは間違いとあり、
安心感を与えるようにとありました。

まったくその通りだと思いました。

[SPREAD]列ヘッダをクリック(ダブルクリック)時に例外が発生

[現象]
シートに表示がない状態で列ヘッダをクリック(ダブルクリック)した時に
「行インデックスが無効です」例外が発生する。

[原因]
CellClick、CellDoubleClickで処理している場合、
引数 e.Row = 0 と設定されて、シートに行がない場合でも
1行目を処理の対象行としてしまうため。

[対応]
列ヘッダだった場合、処理をキャンセルする。

If e.ColumnHeader = True Then
    e.Cancel = True
End If
'列ヘッダクリック(ダブルクリック)以外の処理

[SPREAD]デザイナの設定が優先される

[現象]
SPREADデザイナでセルのプロパティを設定し
コーディングでもセルのプロパティを設定した場合、
コーディングしたセルの設定が反映されない時がある。

[原因]
コーディングでしたセルのプロパティ設定は、
新たに表示した行にのみ適用される。

[例]
(1)デザイナで1行表示してセルの設定をする。
(2)コーディングで列のプロパティ設定をする。
(3)スプレッドにデータバインド(5行)する。
(4)1行目は、デザイナの設定、2行目はコーディングで設定となる。

[対応]
コーディングして列のプロパティ設定をする場合は、
RowCountを0に設定後にプロパティ設定をする。

'行を0にする。
FpSpread1.ActiveSheet.RowCount=0
'これ以降でプロパティを設定する。


[SPREAD]チェックボックス、コンボボックスセルタイプに不正な値が貼り付けできる

[現象]
CheckBoxCellTypeに0,1(true,false)以外の値、
ComboBoxCellTypeのItemsに設定した以外の値の貼り付け(ctrl + v)ができる。

[対応1]
画面の仕様で貼り付けする必要がなければ、
スプレッドで貼り付けを禁止する。

[対応2]
画面の仕様でCheckBoxCellType、ComboBoxCellType
貼り付けする必要がなければ、ClipboardPastingイベントで
e.Handled=Trueを指定してキャンセルする。

[対応3]
画面の仕様で貼り付けしなくてはいけない場合は、
ClipboardPastingイベントでペーストされた値を検証する。

いずれにせよ、スプレッドでコピー&ペースト、カット&ペーストが
できるか仕様を決める必要がある。

2011年04月03日

[SPREAD]DataTableに編集結果が反映されない

[現象]
セルの編集してもDataRowのRowStateが更新されていない。

[原因]
違うバージョンのスプレッドだが、ナレッジベースに
アクティブセルが他の行に移動したタイミングで更新されるからとある。
しかし、明示的に行を移動してもDataRowのRowStateが
更新されていない場合がある。

[対応]
ナレッジベースの通りにFpSpreadクラスのChangeイベントで
EndEditメソッドを明示的に実行する。

    dt.Rows(e.Row).EndEdit()

[補足]
この現象は、DataTableをバインドすると結構遭遇すると思うので、
現象が発生する前に対応しておいた方がいい。

[SPREAD]イベントによてGetTextとCellsで取得する値が違う

[現象]
ValidatingイベントでGetText(row,col)は変更前の値を取得し、
Cells(row,col).Textは、変更後の値を取得する。

[対応]
この仕様を理解して使用する。
そうしないと意図した結果が得られない。

似た記事あった。
Spread .Net でGetTextとCellsプロパティの動作

2011年04月04日

S2Dao.Netで明示的にロールバックする

マニュアルに、コンポーネントが例外をスローした場合は
トランザクションをロールバックするとあるので、
明示的に例外をスローすることで対応した。

2011年04月06日

S2Dao.Netで複数のテーブルを結合したレコードを取得

複数のテーブルを結合したレコードを取得する場合、
Daoには、Getのみ記述する。
DaoにBean属性の指定は必須なのでダミーのEntityを指定する。

<Bean(GetType(HogeEntity))> _
Public Interface IHogeDao
    <SqlFile()> _
    Function GetHoge(ByVal dto As hogeSearchCondition) As DataTable
End Interface
ダミーのEntityには、属性を指定しない。
Public Class HogeEntity
  '空でOK
End Class

2011年04月08日

[SPREAD]DateTimeCellTypeの日付書式の設定

DateTimeCellTypeの日付書式の設定方法

Dim dtCellType As New Spread.CellType.DateTimeCellType
dtCellType.DateTimeFormat = FarPoint.Win.Spread.CellType.DateTimeFormat.UserDefined
 dtCellType.UserDefinedFormat = "yyyy/MM/dd HH:mm:ss"

_sheet.Columns(0).CellType = dtCellType

[VB.NET]FtpWebRequestで(550)エラー

[現象]
FtpWebRequestで(550)エラーが発生。

550:要求されたリクエストはアクセス権限やファイルシステムの理由で実行できない。

[原因]
ログインユーザーのルートディレクト以外のディレクトリにアクセスしている場合に発生。

[対応]
%2fエスケープをパスの中に含める。

[例]
ftp://hoge.com/%2fbar/test.txt

2011年04月15日

[ORACLE]クエリーのパラレル化

パラレル化する方法は以下のとおり。
今回は、11gr2 EE だったので、初期化パラメータ「parallel_degree_policy」を設定。

今まで1.5時間の処理が1時間になった。

1.表や索引に対してパラレル属性を指定

CREATE TABLE HOGE ( 
  ID       NUMBER(10) , 
  NAME VARCHAR2(10) 
)
PARALLEL (DEGREE 12);

2.セッションに指定

ALTER SESSION FORCE PARALLEL QUERY PARALLEL 12;

3.ヒント句の指定

SELECT /*+ PARALLEL(HOGE,12) */ COUNT(*) FROM HOGE;

4.初期化パラメータ「parallel_degree_policy」を設定

ALTER SYSTEM SET PARALLEL_DEGREE_POLICY=AUTO;

2011年04月18日

[VB.NET]ASP.NET開発サーバーで「リモート サーバーに接続できません。」がでた

[現象]
ローカル環境でWebサービスに接続時に「リモート サーバーに接続できません。」が発生。

System.Net.Sockets.SocketException: 通常、各ソケット アドレスに対してプロトコル、ネットワーク アドレス、またはポートのどれか 1 つのみを使用できます。

[原因]
ループの中でWebサービスに何度もアクセスするようなコーディングになっていた。
ソケット数の上限(ディフォルトで5,000)を超えたたために発生。

[補足]
Windowsのソケット最大数は、ディフォルトで5,000。
次のレジストリ エントリを操作して、最大 0xfffe (65534) まで設定可能。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort

[参考]
Windowsにおけるソケットの最大値とTIME_WAITの時間を修正しよう

netstatコマンドを使いこなす

[ORACLE]DB_FILE_MULTIBLOCK_READ_COUNT初期化パラメータ

Oracle 10g r2以降
DB_FILE_MULTIBLOCK_READ_COUNTが明示的に設定されていない場合、
デフォルト値を使用して自動的にチューニングされるようになった。

[S2Dao.net]Oracleでヒント句の指定方法

Oracleのヒント句の指定方法は、次のとおりです。
S2Dao.netでは、(1)でヒントを指定した場合、
S2DaoのSQLコメントと同じ為、無視されてしまいす。
(2)で指定すれば、ヒントを指定できます。

(1)複数行コメントでヒント指定

select /*+ ヒント*/
  *
from hoge;

(2)単一行コメントでヒント指定

select --+ ヒント 
 *
from hoge;

2011年04月20日

[SPREAD]シート初期状態でコピー、切り取り、貼り付けショートカットキー動作

シート初期状態でコピー、切り取り、貼り付け処理は
次のように動作した。(間違ってたらすいません。)

(1)行、列のヘッダラベルのコピー、切り取り、貼り付けができる。
(2)列を選択してCheckBoxCellType、ComboBoxCellType等のコピー、切り取りができる。
  ただし、セルを選択したとき場合にはできない。
(3)書式(色)のコピー、切り取り、貼り付けができる。
(4)ReadOnlyに設定したTextCellTypeに貼り付けができる。

つまり、初期状態では、ユーザーのコピー、切り取り、貼り付け操作で
自由にシートの外観を変更できてしまう。
なので、スプレッドを初期化するときにいつも画面仕様にあわせ
次のようなコードを書くようになる。

Imports FarPoint.Win.Spread

ClipboardOptionsを指定して、ヘッダのコピペ、カトペを制御

FpSpread1.ClipboardOptions = ClipboardOptions.NoHeaders

'値のみコピペ、カトペできるようにキーマップを設定

Dim im As New InputMap
With FpSpread1
    ' カット[Ctrl]+[X]の入力マップを変更します
    im = .GetInputMap(InputMapMode.WhenFocused) 
    im.Put(New Keystroke(Keys.X, Keys.Control), SpreadActions.ClipboardCutDataOnly)
    ' ペースト[Ctrl]+[V]の入力マップを変更します 
    im = .GetInputMap(InputMapMode.WhenFocused) 
    im.Put(New Keystroke(Keys.V, Keys.Control), SpreadActions.ClipboardPasteValues) 
    ' カット[Shift]+[Delete]の入力マップを変更します 
    im = .GetInputMap(InputMapMode.WhenFocused) 
    im.Put(New Keystroke(Keys.Delete, Keys.Shift), SpreadActions.ClipboardCutDataOnly) 
    ' ペースト[Shift]+[Insert]の入力マップを変更します 
    im = .GetInputMap(InputMapMode.WhenFocused) 
    im.Put(New Keystroke(Keys.Insert, Keys.Shift), SpreadActions.ClipboardPasteValues)
End With

コピーペストを無効にするようにキーマップを設定

Dim im As New InputMap
With FpSpread1
    ' カット[Ctrl]+[X]の入力マップを変更します
    im = .GetInputMap(InputMapMode.WhenFocused)
    im.Put(New Keystroke(Keys.X, Keys.Control), SpreadActions.None)
    ' ペースト[Ctrl]+[V]の入力マップを変更します
    im = .GetInputMap(InputMapMode.WhenFocused)
    im.Put(New Keystroke(Keys.V, Keys.Control), SpreadActions.None)
    ' カット[Shift]+[Delete]の入力マップを変更します
    im = .GetInputMap(InputMapMode.WhenFocused)
    im.Put(New Keystroke(Keys.Delete, Keys.Shift), SpreadActions.None)
    ' ペースト[Shift]+[Insert]の入力マップを変更します
    im = .GetInputMap(InputMapMode.WhenFocused)
    im.Put(New Keystroke(Keys.Insert, Keys.Shift), SpreadActions.None)
End With

今回は、EXCELなどから貼り付けした時の動作や
バインドしている時の動作は割愛します。

また、詳細な仕様に対応するには、
ClipboardPastingイベントで制御する必要があります。


2011年09月
Sun Mon Tue Wed Thu Fri Sat
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30