請教Query設計問題 |
尚未結案
|
paulch
一般會員 ![]() ![]() 發表:35 回覆:14 積分:9 註冊:2002-10-29 發送簡訊給我 |
需求 : 假設單據編號前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 發送簡訊給我 |
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 發送簡訊給我 |
您好﹗
答一﹕ 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 發送簡訊給我 |
謝謝二位協助 , 我寫這樣 , 但會出現此訊息(附圖檔 ),敬請協助 , 謝謝
另外 , 單引號與雙引號的差異是 ? 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 發送簡訊給我 |
|
deity
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
引言: 謝謝二位協助 , 我寫這樣 , 但會出現此訊息(附圖檔 ),敬請協助 , 謝謝 另外 , 單引號與雙引號的差異是 ?插个花: paulch您好,看不到您所PO的错误信息的图解,有可能搞错,请查看相关上传图的说明; 不过,您在Query1中只是筛选出OS_NO的最大值,所以您后面Query1.FieldByName('OS_NO').AsString这句中,会提示说不存在'OS_NO'这一字段,当然Label2.Caption := Query1.FieldByName('os_no').AsString;这句也会报错,稍做改变,您试试看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; |
paulch
一般會員 ![]() ![]() 發表:35 回覆:14 積分:9 註冊:2002-10-29 發送簡訊給我 |
|
deity
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
引言: 一 . 謝謝, 我改成deity兄指導的 就可以了 , 另外請教fishman , 我在編譯 時 二個單引號都不能過 , 改成單引號就可以 , 請問這二者有什麼差別 ? 我想您可以去看看相关SQL语句的语法,您在指哪个地方用了二个单引号还是双引号?WHERE (OS_ID="SO")就这里的话指的是筛选OS_ID字段值为SO的记录来,不是很明白您的意思 |
paulch
一般會員 ![]() ![]() 發表:35 回覆:14 積分:9 註冊:2002-10-29 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |