全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1690
推到 Plurk!
推到 Facebook!

關於庫存量vs安全存量的問題

尚未結案
NILSAN
一般會員


發表:5
回覆:11
積分:3
註冊:2003-11-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-25 02:10:11 IP:203.204.xxx.xxx 未訂閱
各位大大: 我的問題是當有入庫量但沒有出庫量時要結算庫存量.並且與安全存量做出庫存警戒.我去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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-27 18:41:13 IP:203.95.xxx.xxx 未訂閱
hi, 若你的資料庫為 access 可以利用 isnull 判斷, 加上 iif 來處理即可, 如 select iif( isnull ( myComputeResult ), 0, myComputeResult ) ....
NILSAN
一般會員


發表:5
回覆:11
積分:3
註冊:2003-11-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-27 23:08:07 IP:203.204.xxx.xxx 未訂閱
感謝timhuang大大的回覆...我已測試ok了... 不過仍有一些問題尚未解決...故未將此問題結案!! --------------------------------------------------- 就是關於如何控管出庫品號一定必須為入庫品號阿?? 是在qry3之beforepost上作控制ㄇ?? 因為我試過了...但沒有其效果... 因為qry3是指向出庫明細...非入庫明細... 那還是要請問各位大大可否再指點高明... ----------------------------------------------------- 感謝大大的協助!!~~~程式設計真的學無止境阿~~~~thanks
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-28 00:37:39 IP:61.62.xxx.xxx 未訂閱
寫在 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-28 21:55:33 IP:203.204.xxx.xxx 未訂閱
timhuang大大.你好: 我去test了.結果如上圖所示... 真是不曉得問題出在哪裡??因為qry3之"出庫日期"欄位.明明就存在... 而我再把qry3-beforepost裡的語法子句刪掉...又回復正常了... 我也是嘗試用我的語法在qry3-beforepost...是入庫明細.dbf不存在.. 會不會是因為qry3指向出庫明細.table...所以無法查詢入庫明細.table阿? 還是怪怪ㄉ... -----------------------------------------------------------------
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-29 00:02:52 IP:61.62.xxx.xxx 未訂閱
看起來問題應該不是出在 beforepost, 請下中斷點並 step by step 執行, 確認一下是那一行程式碼造成的. 另外你的 beforepost 可以貼上來嗎? 剛好錯誤訊息視窗擋到了!
NILSAN
一般會員


發表:5
回覆:11
積分:3
註冊:2003-11-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-29 18:59:59 IP:203.204.xxx.xxx 未訂閱
我的錯誤訊息如上圖...就是將大大你的語法套入後ㄉ結果... 麻請再指點迷津阿...thx,,
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-07-30 09:57:59 IP:203.95.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-07-30 19:23:46 IP:203.204.xxx.xxx 未訂閱
感謝timhuang大大的重點提示... 問題解決了...卡在tmpQry未指向Qry3之相同DATABASE... 謝謝嚕~~缸溫拉!!
NILSAN
一般會員


發表:5
回覆:11
積分:3
註冊:2003-11-18

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-07-30 23:43:10 IP:203.204.xxx.xxx 未訂閱
timhuang大大你好:     我想再請問你最後一個問題,可否麻煩你再提示一下重點... 問題是當某品號之總出庫數量>總入庫數量時...則終止其領料作業阿... 如何用sql語法完成之阿~~因為我不會用sim(x)-sum(y)<0之語法.. 故再麻煩你一下... --------------------------------------------------------------
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-07-31 00:28:31 IP:61.62.xxx.xxx 未訂閱
在 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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-07-31 08:39:13 IP:203.204.xxx.xxx 未訂閱
你好:       取出sum(x)-sum(y)的值...可否直接下條件式來完成ㄇ?? ex:select sum(x)-sum(y) from table where sum(x)-sum(y)<0 可以這樣ㄇ?? 不然又要用什麼辦法來判定sum(x)-sum(y)<0... 可否寫一段語法參考一下...因為我是卡在取出值來判定<0的地方... -------------------------------------可以再給個提示ㄇ??thanks..
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-07-31 22:42:27 IP:61.62.xxx.xxx 未訂閱
當然是可以囉, 不過弟上面提示的語法就可以取出相減後的值啦, 如何判斷, 就看你的取用方式啊, 如,    
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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-08-01 13:45:06 IP:203.204.xxx.xxx 未訂閱
ya...我測試完成...沒問題了... 真的很謝謝你的大力幫助啦... timhuang大大~~...thanks ----------------------------------------- 學無止盡...學如逆水行舟...不進則退!!自勉之...
NILSAN
一般會員


發表:5
回覆:11
積分:3
註冊:2003-11-18

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-08-02 00:11:01 IP:203.204.xxx.xxx 未訂閱
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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-08-03 00:51:22 IP:61.62.xxx.xxx 未訂閱
diff 取出的值只是在你這筆尚未 post 進資料庫前的可用庫存, 所以你還得自行檢查目前的這筆資料的 取貨量 和 diff 來比較是否超過! 像你的 case , 應該再加上一些處理會比較理想, 如, if DataSet.FieldByName('出庫數量').AsInteger > diff then .....
系統時間:2024-05-13 19:19:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!