邏輯判斷的問題(求助)

  •   108 
  • 最後發表   risk  2 週前
risk 發文於   2025/11/08

小弟最近試著用XS寫營益率評分標準(標準如下圖),但結果卻出現兩個問題一直無法解決,一個是分類錯誤,另一個則是分類等級欄是空白,這幾天改了又改雖有改善但問題還是存在,因小弟是自學XS,故想請版上先進高手或XS小編幫小弟看看問題是出在哪裡 ? 謝謝

if trueAll(getField("營業利益率", "Q") <> 0,4)//2025/11/07     結果(1591/1776)
then ret=1;

var:grade("");

grade="";

if average(getField("營業利益率", "Q"),4) < 0
or getField("營業利益率", "Q") < 0
then begin 
  grade=grade+"C";
end 

else if getField("營業利益率", "Q")[1]*0.8 > getField("營業利益率", "Q")
or average(getField("營業利益率", "Q"),4) < 5
then begin 
  grade=grade+"B";
end

else if average(getField("營業利益率", "Q"),4) > 15
and trueAll(getField("營業利益率", "Q")[1]*0.8 < getField("營業利益率", "Q"),3)
or average(getField("營業利益率", "Q"),4) < 15 and average(getField("營業利益率", "Q"),4) > 10
and trueAll(getField("營業利益率", "Q")[1]*0.8 < getField("營業利益率", "Q"),3)
and getField("營業利益率", "Q") > getField("營業利益率", "Q")[1]
then begin 
  grade=grade+"AA";
end 

else if average(getField("營業利益率", "Q"),4) < 15
and average(getField("營業利益率", "Q"),4) > 10
and trueAll(getField("營業利益率", "Q")[1]*0.8 < getField("營業利益率", "Q"),3)
or average(getField("營業利益率", "Q"),4) < 10
and average(getField("營業利益率", "Q"),4) > 5
and trueAll(getField("營業利益率", "Q")[1]*0.8 < getField("營業利益率", "Q"),3)
and getField("營業利益率", "Q") > getField("營業利益率", "Q")[1]
then begin 
  grade=grade+"A";
end

else if average(getField("營業利益率", "Q"),4) > 5 
and countIf(getField("營業利益率", "Q")[1]*0.8 > getField("營業利益率", "Q")[2],2) >= 1 
and getField("營業利益率", "Q") > getField("營業利益率", "Q")[1]*0.8
then begin 
  grade=grade+"BB";
end ;

outputField1(getField("營業利益率", "Q"),2,"營益率0"); 
outputField2(getField("營業利益率", "Q")[1],2,"營益率1"); 
outputField3(getField("營業利益率", "Q")[2],2,"營益率2");
outputField4(getField("營業利益率", "Q")[3],2,"營益率3"); 
outputField7(average(getField("營業利益率", "Q"),4),2,"平均營益率");
outputField8(grade,0,"等級");
outputField9(GetFieldpublishDate("營業利益率", "Q"),0,"最新季度");

排序方式: 標準 | 最新
虎科大許教授 發文於   2025/11/08

(1)既然你的選股結果有兩個問題,應針對個別問題思考程式邏輯哪裡有問題。例如,1110東泥的分類等級欄空白,問題出在你的程式各個等級的條件它都不符合,所以沒有被分類。

(2)這種IF的巢狀結構(IF裡面又有IF),是多選一的結構,使用上要注意,最上層的條件一定要最嚴格。建議你在賦予等級時,從最高等級AA開始判斷,然後A,然後BB...。另外,巢狀結構在閱讀及維護方面較困擾人,多選一的結構最好使用Switch Case結構。

XS小編 發文於   2025/11/12

Hello risk,

 

小編補充,如果您是要將不屬於 AA、A、B、C 的商品全都歸屬於 BB 的話,那麼在BB那邊 (最後一個) 的判斷只要做 else grade = grade+"BB"; 即可。

risk 發文於   2025/11/12

感謝XS小編,馬上點出盲點,不過else grade = grade+"BB";好像要加上"begin"變成else begin grade = grade+"BB"; 才能順利編譯。謝謝協助

risk 發文於   2025/11/12

謝謝許教授提醒~我會試著用Switch Case結構寫看看

XS小編 發文於   2025/11/17

 Hello risk,

 

小編推測您是沒有將後面的end;刪除,所以編譯錯誤。

else begin

grade = grade+"BB";

end;

或是

else grade = grade+"BB";

這兩種寫法都可以正常編譯。

附加文件

risk 發文於   2025/11/18

感謝小編

發表回覆
Close