%@ CodeTemplate Language="C#" TargetLanguage="Text" Description="This template demonstrates using properties defined in external assemblies." %>
<%@ Property Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema"  Category="Context" Description="Database that the documentation should be based on." %>
<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" Description="The table to use for this sample." %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Import Namespace="SchemaExplorer" %> 
/// 
///Data  Implemention Object 
///BASIC CRUD CLASS FOR TABLE <%=this.SourceTable.Name%>
///By wm 
///on <%= DateTime.Now.ToString("MM/dd/yyyy")%>
/// 
 
using System;
using DeiNiu.Utils;
using System.Data.SqlClient;
using DeiNiu.Data.BaseObject;
using System.Data;
namespace DeiNiu.wms.Data.Model
{
	#region <%= getObjClassName() %>_Imp	
	[Serializable]  class  <%= getObjClassName() %>_Imp: BaseModel_Imp{
 
        protected override void datarowToModel(DataRow dr, BaseModel obj)
           { 
             if (dr != null  )
             {
                  <%= getObjClassName() %>  tmpObj = (<%= getObjClassName() %>)obj;     
                  <% foreach (ColumnSchema column in this.SourceTable.Columns) { %>     
                        if (dr.Table.Columns.Contains("<%= column.Name.ToString() %>") && !(dr["<%= column.Name.ToString() %>"] is DBNull))
                            {
                                tmpObj.<%= column.Name.ToString().ToUpper().Equals("ID") ? column.Name.ToString().ToUpper() : "_"+ column.Name %> = <% if(column.DataType.ToString().Equals("String") || column.DataType.ToString().Equals("AnsiString") || column.DataType.ToString().Equals("DateTime")  || column.DataType.ToString().Equals("Date") ) {%> dr["<%= column.Name.ToString() %>"].ToString() <% } else {%>  Convert.To<%= column.DataType %>(dr["<%= column.Name.ToString() %>"].ToString()); <% } %>;
                               <% if(!isIgnored(column)){%>
                                tmpObj.<%= column.Name.ToString().ToUpper().Equals("ID") ? column.Name.ToString().ToUpper() : "_O"+ column.Name %> = <% if(column.DataType.ToString().Equals("String") || column.DataType.ToString().Equals("AnsiString") || column.DataType.ToString().Equals("DateTime")  || column.DataType.ToString().Equals("Date") ) {%> dr["<%= column.Name.ToString() %>"].ToString() <% } else {%>  Convert.To<%= column.DataType %>(dr["<%= column.Name.ToString() %>"].ToString()); <% } %>;
                               <% }%>  
                            }
                  <%  
                    } 
                  %>  
             }
          }
        protected  override void CmdPrepare(SqlCommand oraCmd)  { 
             <%= getObjClassName() %>  tmpObj = (<%= getObjClassName() %>)modelObj;
            switch (this._op_flag) { 
                case (int)op_flag.add:
				    _strSql = "INSERT INTO dbo.<%= getTableName() %>({0}) VALUES({1} )"; 
                    _strSql = String.Format(_strSql, getFields(tmpObj), getValues(tmpObj));
                    
                    break;
                case (int)op_flag.update:
                   // _strSql = "UPDATE dbo.<%= getTableName() %> SET <%= getColums4update()%>  WHERE ID = @ID";
                    _strSql = "UPDATE dbo.<%= getTableName() %> {0} WHERE ID = @ID"; 
                    _strSql = String.Format(_strSql, getChangedFields(tmpObj) );
                    break;
                case (int)op_flag.delete:
				// _strSql = "UPDATE dbo.<%= getTableName() %>  SET DR =0 WHERE ID = @ID"; 
                 _strSql = "delete from dbo.<%= getTableName() %>  WHERE ID = @ID"; 
					break;
                case (int)op_flag.getObj:
                    _strSql = "SELECT * FROM dbo.<%= getTableName() %>  WHERE ID = @ID";
                    break;
				case (int)op_flag.queryAll:
                    _strSql = "SELECT * FROM dbo.<%= getTableName() %>  WHERE DR =1 ";
                  //   if (this.rownumEnd >0 )
                    {
                  //      _strSql = "SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY ID DESC) as sortNo FROM dbo.<%= getTableName()%> WHERE DR =1 )AS SORTEDTB WHERE DR =1 AND sortNo BETWEEN @START AND @END";
                    }
                 //   _strSql += ";SELECT COUNT(*) FROM <%= getTableName() %>  WHERE DR =1";
					break;
                case (int)op_flag.queryActived:
                    _strSql = "SELECT * FROM dbo.<%= getTableName() %>   WHERE DR =1";
                    _strSql += ";SELECT COUNT(*) FROM <%= getTableName() %>  WHERE DR =1";
					break;
				 case (int)op_flag.getPk:
                    _strSql = "SELECT MAX(ID)  FROM dbo.<%= getTableName() %>   WHERE DR =1";
					break;
                 case (int) op_flag.getCount:
                _strSql = "SELECT COUNT(*) FROM <%= getTableName() %>  WHERE DR =1";
                break;
            }          
            oraCmd.CommandText = _strSql;
            fillParameters(oraCmd,tmpObj);
        }
        
        private string  getFields(<%= getObjClassName() %> tmpObj)
        { 
          String colums ="";
          <%  foreach (ColumnSchema column in this.SourceTable.Columns) {           
                if(!isIgnored(column)){
          %>
             colums+= tmpObj.<%="_"+ column.Name %> == null ? "" : "<%=column.Name.ToUpper()%>"  + ",";
            <%  
           }} 
            %> 
    	 return colums.Substring(0,colums.Length -1) ;
      
        }
         
        private string getValues(<%= getObjClassName() %> tmpObj)
        {
          String values ="";
          <%  foreach (ColumnSchema column in this.SourceTable.Columns) {           
                if(!isIgnored(column)){
          %>
             values+= tmpObj.<%="_"+ column.Name %> == null ? "" : "@<%=column.Name.ToUpper()%>"  + ",";
            <%  
           }} 
            %>  
    	 return values.Substring(0,values.Length -1) ;
 
        }
        
        private string getChangedFields(<%= getObjClassName() %> tmpObj)
        {
            string updateFields = " set ";
            <%  foreach (ColumnSchema column in this.SourceTable.Columns) {           
                
                  if(column.Name.ToString().ToUpper().Equals("LASTMODIFIED")){
                    %> 
             updateFields +="<%=column.Name.ToUpper()%>  = getdate()" ;                     
                    <%  } else if(!isIgnored(column)){%>  
            if (tmpObj.<%="_"+ column.Name %> != tmpObj.<%="_O"+ column.Name %>)
            {
                updateFields +="<%=column.Name.ToUpper()%>  = @<%=column.Name.ToUpper()%>," ; 
            }
            <%  
           }}
            %> 
           return updateFields  ;
 
        }
        private void fillParameters(SqlCommand oraCmd,   <%= getObjClassName() %>  tmpObj) {
			switch (this._op_flag) {
				case (int)op_flag.getObj:
				case (int)op_flag.delete:
                    oraCmd.Parameters.AddWithValue("@ID", tmpObj.ID);
					return;
				case (int)op_flag.getPk:
                    oraCmd.Parameters.AddWithValue("@ID", tmpObj.ID);
					return;
				case (int)op_flag.queryAll:
                 if (this.rownumEnd > 0)
                    {
                        oraCmd.Parameters.AddWithValue("@START", this._rownumStart);
                        oraCmd.Parameters.AddWithValue("@END", this._rownumEnd);
                    }
                    return;
				case 0:
			    case (int)op_flag.queryActived:
               		 return;
				case (int)op_flag.update:
                          oraCmd.Parameters.AddWithValue("@ID", tmpObj.ID); 
                     <%   
                    foreach (ColumnSchema column in this.SourceTable.Columns) { 
                     
                          if(column.Name.ToString().ToUpper().Equals("LASTMODIFIED")){
                    %> 
                         // oraCmd.Parameters.AddWithValue("@<%=column.Name.ToUpper()%>", "getdate()")  ;                     
                    <%  } else  if(!isIgnored(column)){%> 
                          oraCmd.Parameters.AddWithValue("@<%=column.Name.ToUpper()%>",  VerifyDbnull(tmpObj.<%="_"+ column.Name %>))  ;
                    <%          
                    }  } 
                    %>  
					return;
                    case (int)op_flag.add:
                    <%  foreach (ColumnSchema column in this.SourceTable.Columns) {           
                      if(!isIgnored(column)){
                    %>                    
                       if(tmpObj._<%=column.Name %>!=null)
                       oraCmd.Parameters.AddWithValue("@<%=column.Name.ToUpper()%>",  VerifyDbnull(tmpObj.<%="_"+ column.Name %>))  ;
                   <%  
                   }} 
                    %> 
                return;
			}
	             
			} 
            
        protected override enumDbInstance instance
        {
            get
            {
             
                return <%=getDbInstance()%>;
            }
        }    
            
	}
	#endregion
}