線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:885
推到 Plurk!
推到 Facebook!

請教Query設計問題

尚未結案
paulch
一般會員


發表:35
回覆:14
積分:9
註冊:2002-10-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-16 09:56:41 IP:61.59.xxx.xxx 未訂閱
需求 : 假設單據編號前4碼是年月 , 第5碼是dash “-“ , 6、7、8碼是流水號 , 例如9302-098?今年2月份第98張單據 , 我要做一個查詢的程式 , 輸入年月即可取得該年月的最後一個號碼 ( 可能查9312 , 或9401 , 或….任何的年月) 一. 操作介面 1. 我在Form上貼 Edit1 , 可以輸入年月 2.再貼button1 , 點擊後將該年月的最後一個單據號碼show在Label2的Caption上 二. 實作 : 1.edit1.MaxLength設 = 4 //只能輸入年月4碼 2.Botton1的Click事件 1)先把符合年月的過濾出來 例外處理 2)再把最大的Query出來 procedure TForm1.Button1Click(Sender: TObject); begin Query1.Close; Query1.SQL.Clear; Query1.Open; end; 3)Query1的SQL Statement Select MAX(Bill_NO) from tbOrder WHERE (Oder_ID='Ord') and (Bill_NO=:A) // 訂單與採購單同一table , 以Order_ID區隔 3.把Query結果Caption在Lebel2 4.做一個清除Edit1.text的Button procedure TForm1.Button2Click(Sender: TObject); begin edit1.Clear; edit1.SetFocus; end; end. 5.做一個結束的button procedure TForm1.Button3Click(Sender: TObject); begin close(); end; end. 請問 : 1.我要如何設計 , 當user輸入前4碼時 , 可以倒出符合此條件的訂單編號 , 並query出其中最大號 ? 因第5碼是dash “-“ , 我上面的SQL Statement中有一個變數 A , 就是要抓user在edit1中輸入的資料 , 請問這如何設計 2.當user輸入的並非類似9312 , 9401…..的值時 (訂單號碼是string type) , 我要如何控制他輸入的值會自動轉換成string , 以及輸錯或找不到的例外處理 謝謝
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-16 10:43:23 IP:210.65.xxx.xxx 未訂閱
Hi paulch,    1.Query1的SQL Statement 更改為
    Select  isnull(max(id),'NULL') as max_id //若是 Oracle 更改為 nvl(max(id),'NULL')
    from    tbOrder
    WHERE   (Oder_ID='Ord')
    and     (Bill_NO LIKE :A   '%') //若是 Oracle 更改為 (Bill_NO LIKE :A || '%')
2.
Button1.OnClick 事件
procedure TForm1.Button1Click(Sender: TObject);
begin
  Query1.Close;
  Query1.ParamByName('A').AsString := Edit1.Text;
  Query1.Open;
  if Query1.FieldByName('max_id').AsString = 'NULL' then
    showmessage('無資料!請確認參數是否正確,或是新年度!')
  else
    Label2.Caption := Query1.FieldByName('max_id').AsString;
end;    Edit1.OnChange 事件
procedure TForm1.Edit1Change(Sender: TObject);
begin
  If Length(TEdit(Sender).Text) = 4 then
    Button1.OnClick(NIL);
end;
3.要控制user的輸入可以考慮改用 MaskEdit,並設定其 EditMask 屬性 ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-16 10:55:58 IP:202.62.xxx.xxx 未訂閱
您好﹗
答一﹕
procedure TForm1.Button1Click(Sender: TObject);
begin
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('Select MAX(Bill_NO) From tbOrder
WHERE (Oder_ID=''Ord'') and (Bill_NO Like :A)');
  Query1.ParamByName('A').AsString := Edit1.Text '%';
  Query1.Open;
end;    答二﹕
若使用者的輸入皆為數字的0~9﹐您可先行控制此Edit﹐讓使用者只能輸入數字0~9﹐方法如下﹕
在Edit的OnKeyPress事件中﹕
begin
  if Not (Key In ['0'..'9', #8]) then
    Key := #0;
end;
然后再對其做控制﹐若查詢的結果為空的﹐則代表沒有此筆對應資料﹒
========================= 我是您的朋友﹐有您真好﹗ =========================
------
忻晟
paulch
一般會員


發表:35
回覆:14
積分:9
註冊:2002-10-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-20 14:18:31 IP:61.59.xxx.xxx 未訂閱
謝謝二位協助 , 我寫這樣 , 但會出現此訊息(附圖檔 ),敬請協助 , 謝謝 另外 , 單引號與雙引號的差異是 ?    procedure TForm1.Button1Click(Sender: TObject);    begin   Query1.Close;   Query1.SQL.Clear;   Query1.SQL.Add('Select Max(OS_NO) from MF_POS WHERE (OS_ID="SO")   and (os_no like:A)' );//OS_NO是訂單編號欄位(正確的) ,MF_POS 是訂單主檔(正確的) ,OS_ID是識別採購單或訂單    Query1.ParamByName('A').AsString := Edit1.Text+'%';   Query1.Open;   if Query1.FieldByName('OS_NO').AsString= 'NULL'  then      showmessage('無資料!請確認參數是否正確,或是新年度!')   else      Label2.Caption := Query1.FieldByName('os_no').AsString; end;
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-20 15:42:02 IP:210.65.xxx.xxx 未訂閱
Hi paulch,    不是雙引號,應該是兩個單引號才對!     ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-20 16:02:23 IP:218.15.xxx.xxx 未訂閱
引言: 謝謝二位協助 , 我寫這樣 , 但會出現此訊息(附圖檔 ),敬請協助 , 謝謝 另外 , 單引號與雙引號的差異是 ?
procedure TForm1.Button1Click(Sender: TObject);
begin
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('Select Max(OS_NO)as MaxNo from MF_POS WHERE (OS_ID="SO")  
and (os_no like:A)' );
//OS_NO是訂單編號欄位(正確的) ,MF_POS 是訂單主檔(正確的) ,OS_ID是識別採購單或訂單 
  Query1.ParamByName('A').AsString := Edit1.Text '%';
  Query1.Open;
  if Query1.FieldByName('OS_NO').AsString= 'NULL'  then
if Query1.FieldByName('MaxNO').AsString=''then //为空写成''
     showmessage('無資料!請確認參數是否正確,或是新年度!')
  else
     Label2.Caption := Query1.FieldByName('os_no').AsString;
   Label2.Caption := Query1.FieldByName('MaxNo').AsString;
end;
插个花: paulch您好,看不到您所PO的错误信息的图解,有可能搞错,请查看相关上传图的说明; 不过,您在Query1中只是筛选出OS_NO的最大值,所以您后面Query1.FieldByName('OS_NO').AsString这句中,会提示说不存在'OS_NO'这一字段,当然Label2.Caption := Query1.FieldByName('os_no').AsString;这句也会报错,稍做改变,您试试看 ~~~行径窄处,留一步与人行~~~
paulch
一般會員


發表:35
回覆:14
積分:9
註冊:2002-10-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-20 17:20:24 IP:61.59.xxx.xxx 未訂閱
一 . 謝謝, 我改成deity兄指導的 就可以了 , 另外請教fishman , 我在編譯 時 二個單引號都不能過 , 改成單引號就可以 , 請問這二者有什麼差別 ? 二. 另外請教 , 我若想設計這個小程式的使用期限是12/25 , 請問如何著手 ? 謝謝
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-21 00:07:38 IP:59.32.xxx.xxx 未訂閱
引言: 一 . 謝謝, 我改成deity兄指導的 就可以了 , 另外請教fishman , 我在編譯 時 二個單引號都不能過 , 改成單引號就可以 , 請問這二者有什麼差別 ? 我想您可以去看看相关SQL语句的语法,您在指哪个地方用了二个单引号还是双引号?WHERE (OS_ID="SO")就这里的话指的是筛选OS_ID字段值为SO的记录来,不是很明白您的意思 二. 另外請教 , 我若想設計這個小程式的使用期限是> 供一个参考方向 【問題】下載有使用期限之軟體於試用期限後即無法再安裝,其做法為何? > < face="Verdana, Arial, Helvetica"> ~~~行径窄处,留一步与人行~~~
paulch
一般會員


發表:35
回覆:14
積分:9
註冊:2002-10-29

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-12-27 12:03:37 IP:61.59.xxx.xxx 未訂閱
三位對我都有幫助 , 給分很難抉擇 , 我就按先後順序來結案 , 敬請見諒
系統時間:2024-07-01 3:01:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!