C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■30018  Re[4]: イベント取得
□投稿者/ 渋木宏明(ひどり) -(2008/12/17(Wed) 14:58:38)
>
    > DLLはActiveX DLLでVB6で作成しています。用途は外部端末からの通信待ちうけで、外部から電文を受信したら、.NETアプリに対しRaiseEventして通知しています。

    「ActiveX コントロール」ではなく、ActiveX DLL なんですね?

    てことは、ActiveX DLL 側で、ワーカースレッドを起してるってことですか?

    であれば、ActiveX DLL が公開するイベントにイベントハンドラを関連付けてやった上で、Main で単純ループさせていれば、イベントハンドラは呼び出されるはずです。
    (ただし、スレッドコンテキストは ActiveX DLL 側のものになるはず)

    ただ、それでも ActiveX DLL 側の作りこみ次第でうまくいかない場合もあり得るし、イベントハンドラがワーカースレッドのコンテキストで呼び出されるとまずいような場合、対処はめんどくさいです。
記事No.29845 のレス /過去ログ54より / 関連記事表示
削除チェック/

■94935  SQLServer でのデータの取り方を教えてください。
□投稿者/ ファイター -(2020/06/04(Thu) 15:07:58)

    分類:[.NET 全般] 

    2020/06/04(Thu) 16:01:38 編集(投稿者)
    2020/06/04(Thu) 16:00:45 編集(投稿者)

    <pre><pre>SQLServer を使用しています。

    Name Code STime ETime MINUTES
    name1 4 2020-04-13 11:20:49.153 2020-04-13 12:09:10.733 49
    name1 7 2020-04-13 12:53:43.697 2020-04-13 13:37:59.773 44
    name2 4 2020-04-09 12:04:06.270 2020-04-09 12:09:18.353 5
    name2 4 2020-04-09 12:53:51.683 2020-04-09 13:04:03.547 11
    name2 7 2020-04-13 11:13:15.313 2020-04-13 11:20:48.140 7
    name3 4 2020-04-20 15:05:56.470 2020-04-20 15:32:07.353 27

    Name別に、STime順で並べて以下のようにしたいのですが
    同一Nameの開始時間(Stime)が最終時間の時の Code です。
    MINUTES STime, ETime の差(分)で同一Nameで合計します。

    name1 7 2020-04-13 12:53:43.697 2020-04-13 13:37:59.773 93
    name2 7 2020-04-13 11:13:15.313 2020-04-13 11:20:48.140 23
    name3 4 2020-04-20 15:05:56.470 2020-04-20 15:32:07.353 27

    MINUTES は Group を使って SUM をすれば取得できると思うのですが
    Code を取得する方法がわかりません。
    </pre></pre>
親記事 /過去ログ164より / 関連記事表示
削除チェック/

■94945  Re[1]: SQLServer でのデータの取り方を教えてください。
□投稿者/ KOZ -(2020/06/05(Fri) 10:04:31)
    No94935 (ファイター さん) に返信
    > 同一Nameの開始時間(Stime)が最終時間の時の Code です。
    
    Name が同一で重複する STime が無いとしたとき、こういう場合のアプローチとしては
    
    (1) Name が同一で STime に大きいものが無いレコードを抜き出す
    
    SELECT
        Name
    ,   Code
    ,   STime
    ,   ETime
    ,   (
            SELECT
                SUM(T2.MINUTES)
            FROM
                Table_1 T2
            WHERE
                T2.Name =   T1.Name
        )
    FROM
        Table_1 T1
    WHERE
        NOT EXISTS (
            SELECT
                *
            FROM
                Table_1 T3
            WHERE
                T3.Name     =   T1.Name
            AND T3.STime    >   T1.STime
        )
    
    (2) Name でグルーピング
    
    SELECT
        Name
    ,   (
            SELECT
                Code
            FROM
                Table_1             T2
            WHERE
                T2.Name                 =   T1.Name
            AND T2.STime                =   MAX(T1.STime)
        )                   Code
    ,   MAX(T1.STime)       STime
    ,   MAX(T1.ETime)       ETime
    ,   SUM(T1.MINUTES)     MINUTES
    FROM
        Table_1 T1
    GROUP BY
        Name
    
    
    が考えられます。
    
    STime が重複する場合、(1) のパターンは使えないのでストアドでぶん回すとか
    (2) のパターンで Min(Code) か Max(Code) とすればよいかと。
    
    
    
記事No.94935 のレス /過去ログ164より / 関連記事表示
削除チェック/

■95003  Re[2]: SQLServer でのデータの取り方を教えてください。
□投稿者/ ファイター -(2020/06/10(Wed) 16:53:08)
    No94945 (KOZ さん) に返信
    No94969 (YuO さん) に返信

    ありがとうございました。
    サブクエリにしたのですが、データ数が多くてなかなか戻ってきませんでした。
    いろいろ調べてみたのですが、

    FIRST_VALUE,LAST_VALUE というのを使うとうまくいくみたいなので
    試してみたいと思います。
記事No.94935 のレス / END /過去ログ164より / 関連記事表示
削除チェック/

■94969  Re[1]: SQLServer でのデータの取り方を教えてください。
□投稿者/ YuO -(2020/06/07(Sun) 15:14:32)
    No94935 (ファイター さん) に返信
    > Name別に、STime順で並べて以下のようにしたいのですが
    > 同一Nameの開始時間(Stime)が最終時間の時の Code です。
    > MINUTES STime, ETime の差(分)で同一Nameで合計します。
    
    Window関数を使うのがわかりやすいかな、と思います。
    
    まず、提示されたデータ
    
    DECLARE @table TABLE (
      [Name] VARCHAR(8) NOT NULL,
      [Code] INT NOT NULL,
      [STime] DATETIME2 NOT NULL,
      [ETime] DATETIME2 NOT NULL,
      [MINUTES] INT NOT NULL
    );
    
    INSERT INTO @table ( [Name], [Code], [STime], [ETime], [MINUTES] ) VALUES
      ( 'name1', 4, '2020-04-13 11:20:49.153', '2020-04-13 12:09:10.733', 49 ),
      ( 'name1', 7, '2020-04-13 12:53:43.697', '2020-04-13 13:37:59.773', 44 ),
      ( 'name2', 4, '2020-04-09 12:04:06.270', '2020-04-09 12:09:18.353', 5 ),
      ( 'name2', 4, '2020-04-09 12:53:51.683', '2020-04-09 13:04:03.547', 11 ),
      ( 'name2', 7, '2020-04-13 11:13:15.313', '2020-04-13 11:20:48.140', 7 ),
      ( 'name3', 4, '2020-04-20 15:05:56.470', '2020-04-20 15:32:07.353', 27 )
    ;
    
    に対して、
    ・[Name]ごとの[MINUTES]の合計
    ・[Name]ごとの[STime]逆順に並べた場合の行番号
    を取得します。
    
    SELECT
      [Name], [Code], [STime], [ETime],
      SUM([MINUTES]) OVER ( PARTITION BY [Name] ) [SUM_MINUTES], -- [Name]単位で[MINUTES]をSUM
      ROW_NUMBER() OVER ( PARTITION BY [Name] ORDER BY [STime] DESC ) [ROWNUM] -- [Name]単位で[STime]逆順に並べた時のROW_NUMBER
    FROM @table;
    
    とすると、
    
    Name     Code        STime                       ETime                       SUM_MINUTES ROWNUM
    -------- ----------- --------------------------- --------------------------- ----------- --------------------
    name1    7           2020-04-13 12:53:43.6970000 2020-04-13 13:37:59.7730000 93          1
    name1    4           2020-04-13 11:20:49.1530000 2020-04-13 12:09:10.7330000 93          2
    name2    7           2020-04-13 11:13:15.3130000 2020-04-13 11:20:48.1400000 23          1
    name2    4           2020-04-09 12:53:51.6830000 2020-04-09 13:04:03.5470000 23          2
    name2    4           2020-04-09 12:04:06.2700000 2020-04-09 12:09:18.3530000 23          3
    name3    4           2020-04-20 15:05:56.4700000 2020-04-20 15:32:07.3530000 27          1
    
    が得られます。
    あとは必要なのがROWNUM = 1のものだけなので、先のSQLをWITHに放り込むかサブクエリにしてやれば出来上がりです。
    
    WITH [TARGET] AS (
      SELECT
        [Name], [Code], [STime], [ETime],
        SUM([MINUTES]) OVER ( PARTITION BY [Name] ) [SUM_MINUTES],
        ROW_NUMBER() OVER ( PARTITION BY [Name] ORDER BY [STime] DESC ) [ROWNUM]
      FROM @table
    )
    SELECT
      [Name], [Code], [STime], [ETime], [SUM_MINUTES] [MINUTES]
    FROM
      [TARGET]
    WHERE
      [ROWNUM] = 1
    ORDER BY
      [Name];
    
    Name     Code        STime                       ETime                       MINUTES
    -------- ----------- --------------------------- --------------------------- -----------
    name1    7           2020-04-13 12:53:43.6970000 2020-04-13 13:37:59.7730000 93
    name2    7           2020-04-13 11:13:15.3130000 2020-04-13 11:20:48.1400000 23
    name3    4           2020-04-20 15:05:56.4700000 2020-04-20 15:32:07.3530000 27
    
記事No.94935 のレス /過去ログ164より / 関連記事表示
削除チェック/

■97690  Re[3]: DB接続更新時におけるエラー
□投稿者/ WebSurfer -(2021/06/29(Tue) 15:49:13)
    No97689 (か さん) に返信

    > DBはSQLサーバーで、開発環境は.NET Frameworkです。

    ×: SQLサーバー
    〇: SQL Server

    >>そもそもどういう順番で番号を振るのですか?
    >
    > 無条件に一番上の行から順に1番から200番まで振っています。

    「上から」ってなんですか? SQL Server のレコードに上も下もありませんけど。
記事No.97686 のレス /過去ログ169より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -