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

Function裡的SQL欄位如何重新讀取呢?

尚未結案
goodjimmy
一般會員


發表:20
回覆:26
積分:9
註冊:2004-02-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-25 16:00:41 IP:218.162.xxx.xxx 未訂閱
請問各位高手,我現在正在做條件判斷時,有著不同欄位要讀進FUNCTION以便分析圖表的組合,可是呢~第一次判斷「平均住院日」是成功的,如果再一次選擇其他判斷「病人性別比率」,functio裡的sql欄位,卻仍停留在上一次判斷,會出現錯誤訊息    
//以下是function
  function TForm2.mSQL(mitem: string; str: string): string;
begin
    DataModule1.ADOQuery2.Close;
    DataModule1.ADOQuery2.SQL.Clear;
    DataModule1.ADOQuery2.SQL.Text:='Select '   pk   ','   mitem   ' from '   table   ' where '   str   ' and '   pk   ' between '   ''''   startday   ''''   '  and  '   ''''   endday   ''''   ' group by '   pk;
    DataModule1.ADOQuery2.Open;
end;    function TForm2.dSQL(ditem: string): string;
begin
    DataModule1.ADOQuery3.Close;
    DataModule1.ADOQuery3.sql.Clear;
    DataModule1.ADOQuery3.SQL.Text:='Select '   pk   ','   ditem   ' from '   table   ' where '   pk   ' between '   ''''   startday   ''''   '  and  '   ''''   endday   ''''   ' group by '   pk;
    DataModule1.ADOQuery3.Open;
end;    //以下是判斷的程式,放置在button物件中
 if (Node.Text = '平均住院日') then
          begin
            table := 'INH ';
            pk := 'INH_YYYMM';
            mitem := 'SUM(INH_SUMDAY)';
            str := 'INH_SEX ='   '1';
            ditem := 'SUM(INH_PTCT)';
            mSQL(mitem, str);
            dSQL(ditem);
            start := 'INH_SEX';
            add := 'SUM(INH_SUMDAY) , SUM(INH_PTCT) ';
            FormSQL(start, add);              end
        else if (Node.Text = '病人性別比率') then
          begin
            table := 'INH ';
            pk := 'INH_YYYMM';
            mitem := 'SUM(INH_PTCT)';
            str := 'INH_SEX ='   '1';
            ditem := 'SUM(INH_PTCT)';
            mSQL(mitem, str);
            dSQL(ditem);
            start := 'INH_SEX';
            add := 'SUM(INH_PTCT)';
            FormSQL(start, add);
          end;
//以下是主FormSQL的分析圖表程式
function TForm2.FormSQL(start: string; add: string): string;
var I, SUM: Integer;
    AddVal: Double;    begin
    if (PageControl2.ActivePageIndex = 1) then
        begin
          DBChart2.LeftAxis.Title.Caption := '¤ñ²v';
          DBChart2.BottomAxis.Title.Caption := '¤é´Á';
          DBChart2.Title.Text.Text := Node.Text '  ¨k©Ê¤ÀªR';
           if (Node.Text = '¥­§¡¦í°|¤é') then
            begin
            DBChart2.LeftAxis.Title.Caption := '¤Ñ¼Æ';
            Series4.ValueFormat := '#,##0.###¤Ñ';
            Series5.ValueFormat := '#,##0.###¤Ñ';
            Series6.ValueFormat := '#,##0.###¤Ñ';
            end;
           Series4.XLabelsSource:='';
            Series4.YValues.ValueSource :='';
        while not DataModule1.ADOQuery2.EOF do
        begin
            Series4.DataSource := DataModule1.ADOQuery2;
            Series4.XLabelsSource := DataModule1.ADOQuery2.Fields[0].FieldName;
            Series4.YValues.ValueSource := DataModule1.ADOQuery2.Fields[1].FieldName;
            DataModule1.ADOQuery2.Next;            end;
           Series5.XLabelsSource :='';
           Series5.YValues.ValueSource :='';
        while not DataModule1.ADOQuery3.EOF do
        begin
            Series5.DataSource := DataModule1.ADOQuery3;
            Series5.XLabelsSource := DataModule1.ADOQuery3.Fields[0].FieldName;
            Series5.YValues.ValueSource := DataModule1.ADOQuery3.Fields[1].FieldName;
            DataModule1.ADOQuery3.Next;
        end;
           
         for I := 0 to DBChart2.Series[0].Count - 1 do
        begin
            if  (Node.Text = '¥­§¡¦í°|¤é') then
                 AddVal := Series4.YValue[I] / Series5.YValue[I]
            else
                AddVal := (Series4.YValue[I] / Series5.YValue[I])*100;
            if (I = 0) then
                SUM := 0
            else if (I > 0) then
                SUM := SUM   1;
            if ((StrToInt(showmonth)   I) > 12) then
            begin
                showmonth := '01';
                SUM := 0;
                if (StrToInt(showyear)   1 > 092) then
                    showyear := '093'
                else if (StrToInt(showyear)   1 > 091) then
                    showyear := '092'
            end;
            Series6.addxy(I, AddVal, showyear   '¦~'   IntToStr(StrToInt(showmonth)   SUM)   '¤ë', clDefault);
        end;
         Series4.Active := false;
         Series5.Active := false;
        end;
end;
timhuang
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-25 21:00:34 IP:61.62.xxx.xxx 未訂閱
Hi, 不太容易看出來問題的所在, 請問你有使用中斷點來確認是否有執行正確的 sql command 嗎? 弟猜測你的     
if (Node.Text = '平均住院日') then
begin
 ....
end
else if (Node.Text = '病人性別比率') then
begin
 ....
end;
這段程式碼有問題, 可能兩個條件都不對, 而導致你所謂的 sql 欄位保持為上一次的查詢, 試看加上一個中斷點來確認 [病人性別比率] 的這段程式碼有被執行到!! 或最後加上一個 else ShowMessage(Node.Text + 'is not in my code'); 讓兩個條件皆不成功時, 也能得到回應! 另外錯誤訊息為何呢?
goodjimmy
一般會員


發表:20
回覆:26
積分:9
註冊:2004-02-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-26 09:15:58 IP:218.162.xxx.xxx 未訂閱
嗯!!有,我有測試過,判斷式都可以正確執行,出現的錯誤的訊息 Project PHiseis.exe raised exception class EDatabase Error with message 'ADOQuery2:Field 'SUM(INH_PTCT)'not fount'.Process Stopped 它會告訴我ADOQUERY物件中的上一個欄位值找不到而中斷點停留在 mSQL(mitem, str);使用ADOQuery2物件 dSQL(ditem);使用ADOQuery3的物件 謝謝您的討論,我想有可能是SQL的值,無法動態更新,才會導致查詢的值無法動態更動,在FormSQL中ADOQUERY2,ADOQuery3的陣列迴圈無法找到正確的欄位,這是我的想法方向,提供大家參考
timhuang
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-26 10:32:35 IP:203.95.xxx.xxx 未訂閱
由你的錯誤訊息看來, 可能是組合好的 SQL Command 有問題, 方便的話, 建議你在 mSQL 中, 在 open 之前, 先秀出來或存成文字檔來看, 確認 sql command 無誤, 如,    
function TForm2.mSQL(mitem: string; str: string): string;
begin
    ...
    ShowMessage(DataModule1.ADOQuery2.Text);
    DataModule1.ADOQuery2.Open;
end;    
另外一個有可能原因則是 FieldName 的關係造成, 也請你先將有 sum(xxx) 的欄位, 給定一個 alias name, 如 SUM(INH_PTCT) 改為 SUM(INH_PTCT) as INH_PTCP_SUM 這樣, 以確認是否為 FieldName 造成. 另外請問一下你的資料庫種類為何?
goodjimmy
一般會員


發表:20
回覆:26
積分:9
註冊:2004-02-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-26 15:44:37 IP:218.162.xxx.xxx 未訂閱
我是使用ORACLE 9I 呵呵,謝謝t大的解答,我已經解決了,是fieldname的問題,使用as的sql語法就可以了,雖然我的老師常提醒我可以使用,我卻都忘了有這一招,呵呵呵
系統時間:2024-06-29 4:31:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!