ApplyUpdatesでハングする。


MKA  2005-04-28 11:49:51  No: 14523  IP: 192.*.*.*

データベースは、SQLSERVER2000を利用しています。
8行あり5行目を削除し、ApplyUpdatesを行うとハングする。
削除を行わなければ正しく更新される。
他にもほとんど同様なプログラムがありそれは正常に動作しています。
UPDATEOBJCTを利用しDELETE,INSERT,UPDATEのSQLを記述してます。
sp_lockでは  WAITになっています。
ハングする付近のSRC
                        QryBody.UpdateRecordTypes := [rtModified, rtInserted, rtUnmodified];
                        QryHead.UpdateRecordTypes := [rtModified, rtInserted, rtUnmodified];
                        QryBody.First;
                        QryHead.First;
                        SQL_SVR.StartTransaction;
                        bTra      := 2;
                        QryBody.ApplyUpdates;
                        QryHead.ApplyUpdates;
                        SQL_SVR.Commit;
                        QryBody.CommitUpdates;
                        QryHead.CommitUpdates;

編集 削除
HOta  2005-04-28 14:58:50  No: 14524  IP: 192.*.*.*

これだけでは、何も判りません。

StartTransaction;とCommit;の間で編集しましょう。

>bTra      := 2;
は何ですか?

編集 削除
MKA  2005-04-28 16:36:02  No: 14525  IP: 192.*.*.*

SQL_SVR.StartTransaction;
これは、関係のない変数です。       bTra      := 2;  
エラーの場合ロールバックをする為の変数

ここでハングアップします。      QryBody.ApplyUpdates; 


                                QryHead.ApplyUpdates;
                                SQL_SVR.Commit;



■QryBodyのSQL
  if :Sikibetu = '0'
    begin
      SELECT a.年度,
           a.期,
           a.伝票NO,
           a.伝票行NO,
           a.単品コード,
           a.ロットNO,
           数量 = CONVERT(MONEY, a.数量),
           a.JDNET受注数,
           a.重量,
           a.単価,
           a.金額,
           a.納期,
           a.???工数,
           a.受注日,
           a.JDNET発注日,
           a.JDNET納期指定,
           a.JDNET発注NO,
           a.明細摘要,
           a.同一ロット指定,
           a.ロット管理不可,
           h.使用期限,
           a.承認合格,
           a.輸出納入先,
           a.購入品区分,
           a.品切保留区分,
           a.評価区分,
           a.復活品区分,
           a.入目,
           a.試用品区分,
           a.ロット管理有無,
           a.在庫更新区分,
           a.実在庫更新サイン,
           b.包装区分,
           b.容量,
           b.単位,
           単品重量 = b.重量,
           b.規格,
           b.製造区分,
           元箱ロケ = b.元箱ロケーション,
           元箱ロケ動線 = b.元箱ロケーション動線,
           b.品名コード,
           c.品名,
           移動年度 = 0,
           移動期 = 0,
           移動NO = convert(char(6), ' '),
           移動行NO = 0,
           旧伝票行NO = a.伝票行NO
      FROM 入出庫明細 a,
           単品 b,
           品名 c,
           入出庫 e,
           ロット別品質保持 h
     WHERE a.年度 = :Nendo
       AND a.期 = :Ki
       AND a.伝票NO = :DenpyoNo
       AND a.年度 = e.年度
       AND a.期 = e.期
       AND a.伝票NO = e.伝票NO
       AND e.エントリー区分 = '2'
       AND e.識別区分 = :Sikibetu
       AND a.単品コード = b.単品コード
       AND b.品名コード *= c.品名コード
       AND a.単品コード *= h.単品コード
       AND a.ロットNO *= h.ロットNO
  end
else
  begin
    SELECT a.年度,
           a.期,
           a.伝票NO,
           a.伝票行NO,
           a.単品コード,
           a.ロットNO,
           数量 = CONVERT(MONEY, a.数量),
           a.JDNET受注数,
           a.重量,
           a.単価,
           a.金額,
           a.納期,
           a.???工数,
           a.受注日,
           a.JDNET発注日,
           a.JDNET納期指定,
           a.JDNET発注NO,
           a.明細摘要,
           a.同一ロット指定,
           a.ロット管理不可,
           h.使用期限,
           a.承認合格,
           a.輸出納入先,
           a.購入品区分,
           a.品切保留区分,
           a.評価区分,
           a.復活品区分,
           a.入目,
           a.試用品区分,
           a.ロット管理有無,
           a.在庫更新区分,
           a.実在庫更新サイン,
           b.包装区分,
           b.容量,
           b.単位,
           単品重量 = b.重量,
           b.規格,
           b.製造区分,
           元箱ロケ = CONVERT(char(6), ' '),
           元箱ロケ動線 = 0,
           b.品名コード,
           c.品名,
           移動年度 = 0,
           移動期 = 0,
           移動NO = convert(char(6), ' '),
           移動行NO = 0,
           旧伝票行NO = a.伝票行NO
      FROM 入出庫明細 a,
           食品単品 b,
           品名 c,
           入出庫 e,
           ロット別品質保持 h
     WHERE a.年度 = :Nendo
       AND a.期 = :Ki
       AND a.伝票NO = :DenpyoNo
       AND a.年度 = e.年度
       AND a.期 = e.期
       AND a.伝票NO = e.伝票NO
       AND e.エントリー区分 = '2'
       AND e.日次更新サイン = '0'
       AND e.識別区分 = :Sikibetu
       AND a.単品コード = b.単品コード
       AND b.品名コード *= c.品名コード
       AND a.単品コード *= h.単品コード
       AND a.ロットNO *= h.ロットNO
    end


■UPDATEOBJCTのSQL

  delete from 入出庫明細
where
  年度 = :OLD_年度 and
  期 = :OLD_期 and
  伝票NO = :OLD_伝票NO
  and
 伝票行NO = :OLD_旧伝票行NO


insert into 入出庫明細
  (年度, 期, 伝票NO, 伝票行NO, 単品コード, ロットNO, 数量, JDNET受注数, 
   重量, 単価, 金額, 納期, ???工数, 受注日, JDNET発注日,
   JDNET納期指定, JDNET発注NO, 明細摘要, 同一ロット指定,
   ロット管理不可, 使用期限, 承認合格, 輸出納入先, 購入品区分,
   品切保留区分, 評価区分, 復活品区分, 入目, 試用品区分,
   ロット管理有無, 在庫更新区分, 実在庫更新サイン)
values
  (:年度, :期, :伝票NO, :伝票行NO, :単品コード, :ロットNO, :数量, 0, 
   :重量, 0, 0, Null, 0, Null, 0, 
   0, ' ', :明細摘要, '0', 
   '0', :使用期限, ' ', ' ', :購入品区分,
   '0', :評価区分, :復活品区分, :入目, :試用品区分,
   :ロット管理有無, :在庫更新区分, :実在庫更新サイン)


update 入出庫明細
set
  年度 = :年度,
  期 = :期,
  伝票NO = :伝票NO,
  伝票行NO = :伝票行NO,
  単品コード = :単品コード,
  ロットNO = :ロットNO,
  数量 = :数量,
  重量 = :重量,
  明細摘要 = :明細摘要,
  使用期限 = :使用期限,
  購入品区分 = :購入品区分,
  評価区分 = :評価区分,
  復活品区分 = :復活品区分,
  入目 = :入目,
  試用品区分 = :試用品区分,
  ロット管理有無 = :ロット管理有無,
  在庫更新区分 = :在庫更新区分,
  実在庫更新サイン = :実在庫更新サイン
where
  年度 = :OLD_年度 and
  期 = :OLD_期 and
  伝票NO = :OLD_伝票NO and
  伝票行NO = :OLD_旧伝票行NO

UPADTEのSET項目は3項目ぐらいにしても同様でした。


関係しそうなソースをのせます。

編集 削除
HOta  2005-04-28 17:18:44  No: 14526  IP: 192.*.*.*

直接Transact-SQL では、削除できますか?
申し越し、不要な部分を省いて実行しても同じでしょうか?

編集 削除
MKA  2005-04-28 19:32:47  No: 14527  IP: 192.*.*.*

直接Transact-SQL では、削除できますか?

クエリアナライザでは削除OKです。
同処理で全体削除の機能がありそれはOKです。

申し越し、不要な部分を省いて実行しても同じでしょうか?
  UPDATEをダイエットしても同じ
 update 入出庫明細
 set
   年度 = :年度
 where
   年度 = :OLD_年度 and
   期 = :OLD_期 and
   伝票NO = :OLD_伝票NO and
   伝票行NO = :OLD_旧伝票行NO


それと8行目を削除しても同じでした。

編集 削除
HOta  2005-04-29 07:30:20  No: 14528  IP: 192.*.*.*

5つのテーブルとインナージョインしていますが、
これを減らしても同じでしょうか?

編集 削除
MKA  2005-05-06 09:42:42  No: 14529  IP: 192.*.*.*

2ファイル減らしてみたが同じ
   SELECT a.年度,
           a.期,
           a.伝票NO,
           a.伝票行NO,
           a.単品コード,
           a.ロットNO,
           数量 = CONVERT(MONEY, a.数量),
           a.JDNET受注数,
           a.重量,
           a.単価,
           a.金額,
           a.納期,
           a.シオエ工数,
           a.受注日,
           a.JDNET発注日,
           a.JDNET納期指定,
           a.JDNET発注NO,
           a.明細摘要,
           a.同一ロット指定,
           a.ロット管理不可,
           使用期限='',
           a.承認合格,
           a.輸出納入先,
           a.購入品区分,
           a.品切保留区分,
           a.評価区分,
           a.復活品区分,
           a.入目,
           a.試用品区分,
           a.ロット管理有無,
           a.在庫更新区分,
           a.実在庫更新サイン,
           b.包装区分,
           b.容量,
           b.単位,
           単品重量 = b.重量,
           b.規格,
           b.製造区分,
           元箱ロケ = b.元箱ロケーション,
           元箱ロケ動線 = b.元箱ロケーション動線,
           b.品名コード,
           品名='',
           移動年度 = 0,
           移動期 = 0,
           移動NO = convert(char(6), ' '),
           移動行NO = 0,
           旧伝票行NO = a.伝票行NO
      FROM 入出庫明細 a,
           単品 b,
           入出庫 e
     WHERE a.年度 =2005
       AND a.期 =0
       AND a.伝票NO ='M10005'
       AND a.年度 = e.年度
       AND a.期 = e.期
       AND a.伝票NO = e.伝票NO
       AND e.エントリー区分 = '2'
       AND e.識別区分 = 0
       AND a.単品コード = b.単品コード

編集 削除
HOta  2005-05-06 13:34:21  No: 14530  IP: 192.*.*.*

入出庫明細テーブルだけでも同じでしょうか?

編集 削除
MKA  2005-05-06 14:06:09  No: 14531  IP: 192.*.*.*

入出庫明細テーブルだけでも同じです。

    SELECT a.年度,
           a.期,
           a.伝票NO,
           a.伝票行NO,
           a.単品コード,
           a.ロットNO,
           数量 = CONVERT(MONEY, a.数量),
           a.JDNET受注数,
           a.重量,
           a.単価,
           a.金額,
           a.納期,
           a.シオエ工数,
           a.受注日,
           a.JDNET発注日,
           a.JDNET納期指定,
           a.JDNET発注NO,
           a.明細摘要,
           a.同一ロット指定,
           a.ロット管理不可,
           使用期限=CONVERT(DATETIME,'2005/01/01'),
           a.承認合格,
           a.輸出納入先,
           a.購入品区分,
           a.品切保留区分,
           a.評価区分,
           a.復活品区分,
           a.入目,
           a.試用品区分,
           a.ロット管理有無,
           a.在庫更新区分,
           a.実在庫更新サイン,
           包装区分='1',
           容量=0,
           単位='',
           単品重量 = CONVERT(FLOAT,0),
           規格='',
           製造区分='',
           元箱ロケ = '',
           元箱ロケ動線 = 0,
           品名コード=:SIKIBETU,
           品名='',
           移動年度 = 0,
           移動期 = 0,
           移動NO = convert(char(6), ' '),
           移動行NO = 0,
           旧伝票行NO = a.伝票行NO
      FROM 入出庫明細 a
     WHERE a.年度 = :Nendo
       AND a.期 = :Ki
       AND a.伝票NO = :DenpyoNo

編集 削除
HOta  2005-05-06 15:33:32  No: 14532  IP: 192.*.*.*

接続はたぶんBDEをお使いと思いますが、Native,ODBCのどちらでも同じような症状でしょうか?
また、ADOを使って見たらどうでしょうか?MS-SQLServer2000なら、こちらの方が合っているようです。

編集 削除
MKA  2005-05-11 10:08:23  No: 14533  IP: 192.*.*.*

BDE上Nativeのsql-serverがありません、設定方法わかりますでしょうか?  (プロフェショナルなのでないのでしょうか?エンタープライズではある?)

編集 削除
HOta  2005-05-11 21:34:45  No: 14534  IP: 192.*.*.*

Nativeのsql-serverはEnt版ですね。Delphi 6からは、ADOが付いていますので、
こちらの場合はどうでしょう?

編集 削除
MKA  2005-05-16 12:14:31  No: 14535  IP: 192.*.*.*

CommitUpdatesの説明文
を読むとApplyupdateもやってくれるような記述があり
ためしにApplyupdateを削除したら正常に動作するようになりました。
CommitUpdatesではApplyupdateもやってくれているのでしょうか?

編集 削除
HOta  2005-05-16 13:51:09  No: 14536  IP: 192.*.*.*

そのようですね。
すでにApplyupdateが終わっているので、Commitだけでよかったのでしょう。もしくはCommitUpdatesでしょう。

ただ、Transactionはデーターベース単位で使った方が、一貫性ができるようです。

編集 削除