關於庫存量vs安全存量的問題 |
尚未結案
|
NILSAN
一般會員 發表:5 回覆:11 積分:3 註冊:2003-11-18 發送簡訊給我 |
各位大大:
我的問題是當有入庫量但沒有出庫量時要結算庫存量.並且與安全存量做出庫存警戒.我去sql指令去查詢發生結果如圖示.明明有入庫數量卻沒有顯示出來.另外就是沒有管制安全存量的品號可以讓它的安全庫存自動填入'0'嗎?
我的sql語法:SELECT 入庫明細.品號 AS 管控項目, Sum(入庫數量)-(select sum(out.出庫數量) from out where out.品號 = 入庫明細.品號) AS 庫存狀況, (select 安全存量 from 安全存量 where 安全存量.品號=入庫明細.品號) AS 安全庫存, Sum(入庫數量)-(select sum(out.出庫數量) from out where out.品號 =入庫明細.品號)-(select sum(安全存量) from 安全存量 where 安全存量.品號=入庫明細.品號) AS 庫存警戒 FROM 入庫明細 GROUP BY 入庫明細.品號, 入庫明細.入庫數量
--------------------------------------------------------------------
此外要管制出庫的品號必須為入庫品號的其中之一.是要用delphi的哪裡做機制阿?我的db為access.delphi6..設定為qry1-安全存量.qry2-入庫明細.qry3-out.是要在qry3.beforepostㄇ??
--------------------------------------------------------------------
煩請各位大大解答一下...最近在寫一個簡單的庫存管制程式.卻遇到上述之問題..希望藉由大大的幫忙.使自己再進步一些...thanks!
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
NILSAN
一般會員 發表:5 回覆:11 積分:3 註冊:2003-11-18 發送簡訊給我 |
感謝timhuang大大的回覆...我已測試ok了...
不過仍有一些問題尚未解決...故未將此問題結案!!
---------------------------------------------------
就是關於如何控管出庫品號一定必須為入庫品號阿??
是在qry3之beforepost上作控制ㄇ??
因為我試過了...但沒有其效果...
因為qry3是指向出庫明細...非入庫明細...
那還是要請問各位大大可否再指點高明...
-----------------------------------------------------
感謝大大的協助!!~~~程式設計真的學無止境阿~~~~thanks
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
寫在 qry3 的 beforepost 是其中一種方式沒錯, 不過你得要再利用另一個 query 來進行查詢以判斷是否可以 post, 舉例如下,
procedure TForm1.qry3BeforePost(DataSet: TDataSet); begin tmpQry.Close; tmpQry.SQL.Text := 'select top 1 * from 入庫明細 where 品號 = ''' qry3.FieldByName('品號').AsString ''' '; tmpQry.Open; if not tmpQry.IsEmpty then begin ShowMessage('非在入庫明細的品號 ' qry3.FieldByName('品號').AsString); Abort; end; end; |
NILSAN
一般會員 發表:5 回覆:11 積分:3 註冊:2003-11-18 發送簡訊給我 |
timhuang大大.你好:
我去test了.結果如上圖所示...
真是不曉得問題出在哪裡??因為qry3之"出庫日期"欄位.明明就存在...
而我再把qry3-beforepost裡的語法子句刪掉...又回復正常了...
我也是嘗試用我的語法在qry3-beforepost...是入庫明細.dbf不存在..
會不會是因為qry3指向出庫明細.table...所以無法查詢入庫明細.table阿?
還是怪怪ㄉ...
-----------------------------------------------------------------
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
NILSAN
一般會員 發表:5 回覆:11 積分:3 註冊:2003-11-18 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
1. 若你的 tmpQry 是在 beforepost 內的 local variable, 你必須自行建立該 tmpQry 的 instance, 並給定和 qry3 一樣的 databasename , 用完後要自行 free 如:
tmpQry := TQuery.Create(self); //self 會指向這個 form, 當然, 用 nil 亦可, 記得要自行 free 掉即可 tmpQry.DatabaseName := qry3.DatabaseName; .... tmpQry.Free;2. 你下在 tmpQry 中的 sql command 是不是太多 ' (單引號) 啦, 我前面寫的有這麼多嗎? |
NILSAN
一般會員 發表:5 回覆:11 積分:3 註冊:2003-11-18 發送簡訊給我 |
|
NILSAN
一般會員 發表:5 回覆:11 積分:3 註冊:2003-11-18 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
在 access 中可以利用一種方式來達成, 兩個子查詢相減即可, 如 select top 1 (select sum(入庫數量) from 入庫明細 where 品號='xxx') - (select sum(出庫數量) from out where 品號='xxx') as total from 入庫名細 其中紅色部分請隨意代入任一已存在表皆可, 但必須有一筆以上資料即可.
接下來取回的 total 值, 就可以來判斷是否可以允許出庫, 要注意的地方是修改時, 要考慮目前正在修改的那筆品號的修改前後值的比較以及與剩餘量的關係!!
|
NILSAN
一般會員 發表:5 回覆:11 積分:3 註冊:2003-11-18 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
當然是可以囉, 不過弟上面提示的語法就可以取出相減後的值啦, 如何判斷, 就看你的取用方式啊, 如,
var diff: integer; begin ... tmpQuery.SQL.Text := 'select top 1 (select sum(入庫數量) from 入庫明細 where 品號='xxx') - (select sum(出庫數量) from out where 品號='xxx') as total from 入庫名細'; tmpQuery.Open; diff := tmpQuery.FieldByName('total').AsInteger; if diff < 0 then ... diff |
NILSAN
一般會員 發表:5 回覆:11 積分:3 註冊:2003-11-18 發送簡訊給我 |
|
NILSAN
一般會員 發表:5 回覆:11 積分:3 註冊:2003-11-18 發送簡訊給我 |
timhuang大大:
以下是我Qry3之befroepost之語法.奇怪的地方是diff有時候會失去判斷的功能
.如果某品號之庫存量已經為負值時,則下次領料時diff就會發揮功用,...
如果某品號庫存量為正值時.則diff就不會發揮功用了...一直不解阿
原本想說已ok了..結果又測試時..又發現此漏洞...再指點一下ㄅ...thanks
--------------------------------------------------------------------
var
tmpQry: TQuery;
diff: integer;
Qrya: TQuery;
begin
if (dbedit2.Text = '') then Exit;
tmpQry := TQuery.Create(nil);
tmpQry.DatabaseName := qry3.DatabaseName;
if (dbedit3.Text = '') then Exit;
Qrya := TQuery.Create(nil);
Qrya.DatabaseName := qry3.DatabaseName;
with tmpQry do
begin
close;
SQL.Clear;
SQL.Add(' SELECT * FROM 入庫明細 '
' WHERE 品號 = ''' dbedit2.Text ''' ');
open;
end;
if tmpQry.IsEmpty then
begin
MessageDlg('此物料無庫存品!請查證', mtError, [mbOK], 0);
tmpQry.Free;
tmpQry := nil;
Abort;
end
else if not tmpQry.IsEmpty then
begin
with Qrya do
begin
close;
SQL.Clear;
SQL.Add('select (select sum(入庫數量) from 入庫明細 where 品號=''' dbedit3.Text ''') - (select sum(出庫數量) from out where 品號=''' dbedit3.Text ''') as total from 入庫明細');
open;
diff := Qrya.FieldByName('total').AsInteger;
if diff < 0 then
begin
MessageDlg('此物料庫存量不足!無法提領', mtError, [mbOK], 0);
Qrya.Free;
Qrya := nil;
Abort;
end;
end;
end;
tmpQry.Free;
tmpQry := nil;
end;
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |