2015年11月26日 星期四

[EEP]Srvtools.WebDataSource元件Master發生錯誤,無法找到欄位:XXX的值

有些欄位作為Index, 又不想讓使用者看到時, 有很多種作法
像是用「System.Data.*」操作或是ViewState等狀態管理

這篇介紹兩個簡單的方法,各有其特色




  • HiddenField:還想利用JQuery或在Client端對其有動態影響時
  • Visible=False:Client看不到, 一定要PostBack
習慣用VS編寫的話,通常會直覺的利用Visible=False
但有可能導致使用者在操作WebFormView時出現
Srvtools.WebDataSource元件Master發生錯誤,無法找到欄位:XXX的值

這時先檢查一下該控制項的Bind設定
(錯誤)  <asp:Label ID="Label1" runat="server" Text='<%# Eval("CustID") %>'  Visible="False"></asp:Label>
(正確)  <asp:Label ID="Label1" runat="server" Text='<%# Bind("CustID") %>'  Visible="False"></asp:Label>

如果連這樣都無法解決,對於該欄位又沒有資安考量時,可以考慮使用HiddenField
HiddenField是VS內建的控制項

將其插入ItemTemplate的樣板(或其他有需求的樣板模式)
<asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Bind("CustID") %>' />

由於該程式碼經編譯後,在Client端看的到
會轉換成「<input type="hidden" name="WebFormView1$HiddenField1" id="WebFormView1_HiddenField1" value="1">
與利用JQuery的hide();有相同的缺點,如果是資安考量的欄位,請勿直接使用「HiddenField」

2015年11月24日 星期二

[JQuery]視條件隱藏GridView中同列首欄的內容


功能的訴求,是送出後仍能檢視,但不能再做修改(除非被更高權限的退回)
(大致上如下圖, 點下「to QC」後,會變成「Keyin OK!」,且轉為唯讀模式)

$(".AR_OK").css("color",
  function () {
        if ($(this).text() > 0) {
            $(this).prev().hide();
            $(this).text("Keyin OK!");

            $(this).parents("tr").first().find(":image").hide();
            return "green";
        }
        else {
            $(this).hide();
            return "black";
        }
    }
 )



這功能的實作,是利用class為「AR_OK」觸發
原本應該是「$(selector).css(attr, value)」,在給value值時,可以利用function(){}做變化
因為不是統一變化, 故有用到「$(this)」,對於選擇性變化的很好用
是沒用each()的另一種遍歷

【Step欄位】
先做if判斷, 是true則轉為唯讀並用綠色的「Keyin OK!」提示使用者, 並隱藏「to QC」的按鈕
如果判斷false, 則不顯示文字,留著「to QC」的按鈕

【第一欄】
四個選一個用吧, 越上面是越土法煉鋼
由於我要隱藏的剛好都是「input type=image」
Selector的部分可以用「:image」直接撈

$(this).parent().prev().prev().prev().prev().prev().prev().prev().children().hide();
$(this).parent().parent().first().children().children(":image").hide();
$(this).parents("tr").first().children().children(":image").hide();
$(this).parents("tr").first().find(":image").hide();

利用.parents("tr")一直退到<tr>
.first()表示要第一個
然後用find(":image")省略n次的children()直接到元素
至於.hide()就隨喜好了, 要改變style或繼續串燒都可以直接接

2015年11月12日 星期四

[DNS]網域未正常跳轉至新伺服器 - Name Server解析異常 / 錯亂

案件狀況

M公司的網頁伺服器,是由U公司的伺服器暫時代管
但是網頁更新後,使用者反映網頁仍然是顯示時為新的時為舊

當下就馬上用nslookup測試,還真的某些DNS解析伺服器如預期,部分不同

  • nslookup "測試網址" [測試DNS(不填則用預設DNS Server)]

果然在不同的dns server,部分會指向新的伺服器,部分卻指回舊的伺服器
測試過的DNS Server:
  • dns.hinet.net
  • 61.63.0.67
  • dns.wifly.com.tw




網域是向TISNet申請,設定為「自管DNS」
DNS Server中的設定只是在相應的「正向對應區域」,增加一個
名稱「www」, 類型「別名(CNAME)」, 資料「(U公司提供的伺服器網址)」

解決方法

這類的情況,可往幾個方向想
  • 自管的DNS Server設定異常(檢查「主機(A), 別名(CNAME)」這兩承接與轉出的設定)
  • 各層的NAME SERVERS尚未同步完成,導致部分是舊的(等愛24~48, 快則8小時)
  • A紀錄設定錯誤(本身非使用Unix, 只能朝「A紀錄」類似作用的想)
  1. 首先確認DNS Server中的設定沒有錯
  2. 再來是「等待NAME SERVER同步」... 經過了一週,原本可以看到新網頁的卻跳回就網頁,那肯定不是這個的問題了

最後發現是TISNet中,設定的問題
由於重複設定www,導致BIND的錯亂,移除原先的第一個就正常了


2015年11月5日 星期四

[T-SQL]類似Excel的VLOOKUP(或EEP的RefVal效果)

類似Excel的VLOOKUP (或是有人用find + index + match拼起來)

大致上的思路是:
  1. 利用子查詢來產生參照後的值
  2. 由於我是用一個Base的Table放所有的List, 所以還要再加上WHERE篩分類
  3. 將兩者LEFT JOIN
  4. SELECT不顯示索引而是選擇參照過去的值
↓上排是before, 下排是after。


這方法會產生大量的子查詢, 請視需求使用
應該有更好的方法, 只是T-SQL的語法待精進


【原本】
SELECT  
Design.PNo, Design.DesignVer
      ,[Drawal1]
      ,[Drawal2]
(中略)
      ,[Drawaln]
FROM  dbo.eCRF_Design
left JOIN (SELECT PNo,DesignVer ,[State] FROM eCRFProj) as ProjDesc ON ProjDesc.PNo = eCRF_Design.PNo AND ProjDesc.DesignVer=eCRF_Design.DesignVer

【模擬RefVal】
SELECT  
Design.PNo, Design.DesignVer,
D1.Desc_en AS w1,
D2.Desc_en AS w2,
(中略)
Dn.Desc_en AS wn

FROM         Design
left JOIN (SELECT PNo,DesignVer ,[State] FROM Proj) as ProjDesc ON ProjDesc.PNo = Design.PNo AND ProjDesc.DesignVer=Design.DesignVer
left JOIN (SELECT Code, Desc_en FROM Base AS Base WHERE (Category = 'Design_drawal')) AS D1 ON D1.Code = Design.Drawal1
left JOIN (SELECT Code, Desc_en FROM Base AS Base WHERE (Category = 'Design_drawal')) AS D2 ON D2.Code = Design.Drawal2
(中略)
left JOIN (SELECT Code, Desc_en FROM Base AS Base WHERE (Category = 'Design_drawal')) AS Dn ON Dn.Code = Design.Drawaln