ApplyUpdatesでハングする。


MKA  2005-04-28 20:49:51  No: 14523

データベースは、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 23:58:50  No: 14524

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

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

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


MKA  2005-04-29 01:36:02  No: 14525

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-29 02:18:44  No: 14526

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


MKA  2005-04-29 04:32:47  No: 14527

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

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

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

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


HOta  2005-04-29 16:30:20  No: 14528

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


MKA  2005-05-06 18:42:42  No: 14529

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 22:34:21  No: 14530

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


MKA  2005-05-06 23:06:09  No: 14531

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

    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-07 00:33:32  No: 14532

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


MKA  2005-05-11 19:08:23  No: 14533

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


HOta  2005-05-12 06:34:45  No: 14534

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


MKA  2005-05-16 21:14:31  No: 14535

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


HOta  2005-05-16 22:51:09  No: 14536

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加