データベースは、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;
これだけでは、何も判りません。
StartTransaction;とCommit;の間で編集しましょう。
>bTra := 2;
は何ですか?
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項目ぐらいにしても同様でした。
関係しそうなソースをのせます。
直接Transact-SQL では、削除できますか?
申し越し、不要な部分を省いて実行しても同じでしょうか?
直接Transact-SQL では、削除できますか?
クエリアナライザでは削除OKです。
同処理で全体削除の機能がありそれはOKです。
申し越し、不要な部分を省いて実行しても同じでしょうか?
UPDATEをダイエットしても同じ
update 入出庫明細
set
年度 = :年度
where
年度 = :OLD_年度 and
期 = :OLD_期 and
伝票NO = :OLD_伝票NO and
伝票行NO = :OLD_旧伝票行NO
それと8行目を削除しても同じでした。
5つのテーブルとインナージョインしていますが、
これを減らしても同じでしょうか?
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.単品コード
入出庫明細テーブルだけでも同じでしょうか?
入出庫明細テーブルだけでも同じです。
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
接続はたぶんBDEをお使いと思いますが、Native,ODBCのどちらでも同じような症状でしょうか?
また、ADOを使って見たらどうでしょうか?MS-SQLServer2000なら、こちらの方が合っているようです。
BDE上Nativeのsql-serverがありません、設定方法わかりますでしょうか? (プロフェショナルなのでないのでしょうか?エンタープライズではある?)
Nativeのsql-serverはEnt版ですね。Delphi 6からは、ADOが付いていますので、
こちらの場合はどうでしょう?
CommitUpdatesの説明文
を読むとApplyupdateもやってくれるような記述があり
ためしにApplyupdateを削除したら正常に動作するようになりました。
CommitUpdatesではApplyupdateもやってくれているのでしょうか?
そのようですね。
すでにApplyupdateが終わっているので、Commitだけでよかったのでしょう。もしくはCommitUpdatesでしょう。
ただ、Transactionはデーターベース単位で使った方が、一貫性ができるようです。
ツイート | ![]() |