#region NameSpaces using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Web; using System.Xml; #endregion #region TstructData Class /// /// TstructData class stores all the field related data like, field Name,value,oldvalue,componentname /// rowno,frameno. Using this fieldvaluexml is constructed and stored in a string. /// [Serializable()] public class TStructData { #region Attributes /// /// Declaration of all attributes related to Tstruct Data Class /// public ArrayList fieldIndexArray = new ArrayList(); public ArrayList fieldName = new ArrayList(); public ArrayList fieldFrameNo = new ArrayList(); public ArrayList fieldControlName = new ArrayList(); public ArrayList fieldRowNo = new ArrayList(); public ArrayList fieldValue = new ArrayList(); public ArrayList fieldOldValue = new ArrayList(); public ArrayList fieldIdValue = new ArrayList(); public ArrayList fieldOldIdValue = new ArrayList(); public ArrayList dcRowCntVals = new ArrayList(); public ArrayList fieldRowValues = new ArrayList(); public ArrayList fldIdCol = new ArrayList(); public ArrayList fldMasterRow = new ArrayList(); public ArrayList fieldDPMVals = new ArrayList(); public ArrayList fieldDPVals = new ArrayList(); public ArrayList ChangedDcs = new ArrayList(); public ArrayList DelRowFldsXml = new ArrayList(); public ArrayList newRowNos = new ArrayList(); public ArrayList oldRowNos = new ArrayList(); // TODO: Get the attachment files from the client and update the attachment array in the object. public ArrayList attachArray = new ArrayList(); public String fieldValueXml = string.Empty; private StringBuilder dsDataXML = new StringBuilder(); public String fgFieldValueXml = string.Empty; public String popFGFieldValueXml = string.Empty; public String transactionID = string.Empty; public String recordID = string.Empty; private string jsonString = string.Empty; private string defaultDateStr = "dd/mm/yyyy"; public ArrayList imageFldNames = new ArrayList(); public ArrayList imageFldSrc = new ArrayList(); ArrayList depFormatDcs = new ArrayList(); public StringBuilder tabJson = new StringBuilder(); public ArrayList AxMasterRowFlds = new ArrayList(); public StringBuilder AxDepArrays = new StringBuilder(); public string project = string.Empty; public string user = string.Empty; public string AxRole = string.Empty; public string sessionid = string.Empty; public string errlog = string.Empty; public string filename = string.Empty; public DataSet dsData; public string ires = string.Empty; public string serviceInputXml = string.Empty; public string result = string.Empty; public string axpert = "Axpert\\"; public string transID = ""; public string rid = string.Empty; private int deletedCount = -1; public bool IsDraftObj = false; public string AxActDepField = ""; public string TabDcStatus = string.Empty; ArrayList AxSubGridRows = new ArrayList(); ArrayList AxDelDcNo = new ArrayList(); ArrayList AxDelRecIds = new ArrayList(); ArrayList subWsRows = new ArrayList(); ArrayList subDsRows = new ArrayList(); public string AxActiveDc = string.Empty; public ArrayList removeFiles = new ArrayList(); //Variables to store the memVars details ArrayList memVarNames = new ArrayList(); ArrayList memVarValues = new ArrayList(); ArrayList memVarTypes = new ArrayList(); public string memVarsData = string.Empty; bool hasMemVars = false; public string strServerTime = string.Empty; public double webTime1; public double webTime2; public double asbTime; //public DateTime asbTime2; public bool logTimeTaken = false; public bool hasImagePath = false; string scriptsPath = HttpContext.Current.Application["ScriptsPath"].ToString(); public string attachDirPath = ""; public string imgAttachPath = ""; public string AxActiveAction = string.Empty; List deletedRowCount = new List(); bool isDeletedRow = false; public ArrayList AxGridAttNotExistList = new ArrayList(); [NonSerialized] public ASBExt.WebServiceExt objWebServiceExt = new ASBExt.WebServiceExt(); LogFile.Log logobj = new LogFile.Log(); Util.Util util = new Util.Util(); CacheMgr.CacheManager cm = new CacheMgr.CacheManager(""); Boolean isDebugFileCreated = false; public TStructDef tstStrObj; public bool attachDir = false; public Dictionary fastDDL = new Dictionary(); int DeleteRowTopNo = 0; #endregion #region Attributes with get,set properties. /// /// Attributes with get, set properties. /// public ArrayList fldNames { get { return fieldName; } set { fieldName = value; } } public ArrayList fldFrameNos { get { return fieldFrameNo; } set { fieldFrameNo = value; } } public ArrayList fldControlNames { get { return fieldControlName; } set { fieldControlName = value; } } public ArrayList fldRowNos { get { return fieldRowNo; } set { fieldRowNo = value; } } public ArrayList fldValues { get { return fieldValue; } set { fieldValue = value; } } public ArrayList fldOldValues { get { return fieldOldValue; } set { fieldOldValue = value; } } public ArrayList fldIdValues { get { return fieldIdValue; } set { fieldIdValue = value; } } public ArrayList fldOldIdValues { get { return fieldOldIdValue; } set { fieldOldIdValue = value; } } public ArrayList attachments { get { return attachArray; } set { attachArray = value; } } public String fldValueXml { get { return fieldValueXml; } set { fieldValueXml = value; } } public String fgFldValueXml { get { return fgFieldValueXml; } set { fgFieldValueXml = value; } } public String transid { get { return transactionID; } set { transactionID = value; } } public String recordid { get { return recordID; } set { recordID = value; } } public string newJson { get { return jsonString; } set { jsonString = value; } } public DataSet dsDataSet { get { return dsData; } set { dsData = value; } } public bool isSaveCalled = false; public bool isAxpImagePath = false; #endregion #region Constructor which parses the jsonData. /// /// Constructor which gets the JsonData from the service and updates all the field related information /// to the array list by parsing through json data. /// /// public TStructData(string jsonData, string transId, string recId, TStructDef strObj) { if (HttpContext.Current.Session["AxLogging"] != null) { if (Convert.ToString(HttpContext.Current.Session["AxLogging"]).ToLower() == "true") logTimeTaken = true; } tstStrObj = strObj; CreateDataSets(strObj); this.rid = recId; transID = transId; if (HttpContext.Current.Session["AxAttachFilePath"] != null) attachDirPath = HttpContext.Current.Session["AxAttachFilePath"].ToString(); if (HttpContext.Current.Session["AxpAttachmentPathGbl"] != null) attachDirPath = HttpContext.Current.Session["AxpAttachmentPathGbl"].ToString(); if (attachDirPath != string.Empty) attachDir = true; if (HttpContext.Current.Session["AxImagePath"] != null && HttpContext.Current.Session["AxImagePath"].ToString() != "") { imgAttachPath = HttpContext.Current.Session["AxImagePath"].ToString(); //CommonDir directory creation taken back due to application server memory usage. //if (!imgAttachPath.Contains(":\\") && !imgAttachPath.StartsWith("\\")) //{ // CreateDirectoryInCommonDir(ref imgAttachPath); //} } if (HttpContext.Current.Session["AxpImagePathGbl"] != null && HttpContext.Current.Session["AxpImagePathGbl"].ToString() != "") { imgAttachPath = HttpContext.Current.Session["AxpImagePathGbl"].ToString(); imgAttachPath = imgAttachPath.Replace(";bkslh", "\\"); } if (HttpContext.Current.Session["AxpSaveImageDb"] != null && HttpContext.Current.Session["AxpSaveImageDb"].ToString() == "true") imgAttachPath = ""; ArrayList imageFlds = new ArrayList(); ArrayList imageSrc = new ArrayList(); GetGlobalVars(); jsonData = jsonData.Replace("*$*", "♦"); jsonData = jsonData.Replace("\\", ";bkslh"); string[] resval = jsonData.Split('♦'); StringBuilder dataJson = new StringBuilder(); for (int j = 0; j < resval.Length; j++) { //TODO: all other json nodes should be handled in the json parsing JArray Data = null; try { if (resval[j] != "") { JObject tstData = JObject.Parse(resval[j]); Data = (JArray)tstData["data"]; jsonString = @"{""data"":["; } } catch (Exception ex) { logobj.CreateLog("JsonToArray function - " + ex.Message, sessionid, "Exception-" + transid, "new"); logobj.CreateLog("JsonData - " + jsonData, sessionid, "Exception-" + transid, ""); //throw ex; } if (Data != null) { string fName = string.Empty; string fValue = string.Empty; string delRows = string.Empty; string rowNo = string.Empty; string fDatatype = string.Empty; string name = string.Empty; string fldName = string.Empty; string fldFrameNo = string.Empty; string frmNum = string.Empty; string frowValues = string.Empty; string fldIdValues = string.Empty; string idCol = string.Empty; string masterRow = string.Empty; string comboVal = string.Empty; string comboIdCol = string.Empty; string dcNo = "0"; string dpmValue = string.Empty; string dpValue = string.Empty; string idVal = string.Empty; string oldIdVal = string.Empty; StringBuilder ddlVals = new StringBuilder(); StringBuilder ddlDpVals = new StringBuilder(); //TODO: Create a single function for parsing the json result- The same code is used in JsonToArray for (int m = 0; m < Data.Count; m++) { Dictionary values = JsonConvert.DeserializeObject>(Data[m].ToString()); fDatatype = ""; delRows = ""; masterRow = string.Empty; dpmValue = string.Empty; dpValue = string.Empty; string dcHasRows = string.Empty; if (values.ContainsKey("t")) fDatatype = values["t"]; if (values.ContainsKey("n")) fName = values["n"]; if (values.ContainsKey("v")) fValue = values["v"]; if (values.ContainsKey("cr")) delRows = values["cr"]; if (values.ContainsKey("mr")) masterRow = values["mr"]; if (values.ContainsKey("idcol")) idCol = values["idcol"]; if (values.ContainsKey("id")) idVal = values["id"]; if (values.ContainsKey("oldid")) oldIdVal = values["oldid"]; if (values.ContainsKey("dpm")) dpmValue = values["dpm"]; if (values.ContainsKey("dp")) dpValue = values["dp"]; if (values.ContainsKey("r")) { rowNo = values["r"]; if (rowNo.Length == 1) rowNo = "00" + rowNo; else if (rowNo.Length == 2) rowNo = "0" + rowNo; } string rowValues = string.Empty; if (fName != string.Empty) { fValue = fValue.Replace("^^dq", "\""); fValue = fValue.Replace(";bkslh", "\\"); if (fName.ToLower() == Constants.AXPATTACHMENTPATH && fValue.Trim() != String.Empty) { attachDirPath = fValue; attachDir = true; } ////TODO: The same code is there in the UpdateDataList, and Jsontoarray //if (fName.ToLower() == "axpcurrencydec") // CheckAxpCurrDec(fName, fValue); string rowVal = ""; if (fDatatype == "i") { //On loading the data, if there is a image field whose image is stored in folders, //Add it to the array to call the MoveImage function to move it to the scripts folder. string fldId = string.Empty; fldId = fName + rowNo + "F" + dcNo; if (fName.StartsWith(Constants.IMGPrefix)) { imageFlds.Add(fldId); fValue = string.Empty; } else if (fName.StartsWith(Constants.IMGSRCPrefix)) { imageSrc.Add(fValue); } } else if (fDatatype == "c") { comboVal = fValue; } else if (fDatatype == "dv") { rowVal = fValue; if (rowValues == "") rowValues = rowVal; else rowValues += "" + rowVal; string[] temp = rowVal.Split('?'); if (temp.Length <= 3 && comboVal == string.Empty && temp.Length > 1) { StringBuilder strVal = new StringBuilder(); for (int i = 0; i < temp.Length; i++) { if (temp[i].ToString() != string.Empty) strVal.Append(temp[i].ToString()); } if (strVal.ToString().ToLower() == "yesno" || strVal.ToString().ToLower() == "noyes") { //To set the default value of checkbox in the grid dc to "no". fValue = "no"; } } } else if (fDatatype == "dc") { string dcRowCount = fName + "~" + fValue; dcNo = fName.Substring(2); if (values.ContainsKey("hasdatarows")) dcHasRows = values["hasdatarows"]; bool isGrid = IsDcGrid(dcNo, strObj); if (isGrid) { if (dcHasRows != "") { TStructDef.DcStruct dc = (TStructDef.DcStruct)strObj.dcs[Convert.ToInt32(dcNo) - 1]; if (dcHasRows == "yes") dc.DCHasDataRows = true; else dc.DCHasDataRows = false; strObj.dcs[Convert.ToInt32(dcNo) - 1] = dc; } //This condition is added to maintain the field array for all the dc fields. //In case of index calculation if some dc's fields are not there then it throws error. if (fValue == "0" && delRows == "") { fValue = "1"; delRows = "i1"; dcRowCount = fName + "~" + fValue; } } UpdateRowCount(fName, dcRowCount); } if (idCol == "no" || idCol == "") idCol = "0"; else idCol = "1"; if (fDatatype == "c") comboIdCol = idCol; if (fDatatype == "dv") { ddlVals.Append(rowValues); ddlVals.Append("♣"); ddlDpVals.Append(dpValue); ddlDpVals.Append("♣"); DSUpdateRowValues(fName, Convert.ToInt32(rowNo), ddlVals.ToString(), ddlDpVals.ToString(), masterRow, comboIdCol); } else { ddlVals = new StringBuilder(); if (fDatatype != "dc") { string rowFrmNo = string.Empty; if (rowNo != "") { name = fName + rowNo + "F" + dcNo; rowFrmNo = rowFrmNo + "F" + dcNo; DSSubmitWithOld(fName, Convert.ToInt32(rowNo), fValue, idVal, oldIdVal); } } } } } CreateFieldValueXml("ALL", "", "LoadData"); } } //Loop through the image fields and load the images in the scripts folder for (int i = 0; i < strObj.AxImageFields.Count; i++) { if (imageSrc.Count != 0 && imageSrc.Count >= i) { if (imageSrc[i].ToString() != "") { string[] fvalues = imageSrc[i].ToString().Split('~'); string recordId = fvalues[2].ToString(); LoadImageToFolder(strObj.AxImageFields[i].ToString(), recordId); } } else if (recId != "0" && recId != "") { LoadImageToFolder(strObj.AxImageFields[i].ToString(), recId); } } //Load the grid attachments in the folder if ((recId != "0" && recId != "" && tstStrObj.ContainsGridAttach) || (recId == "0" && tstStrObj.ContainsGridRefer)) { GetGlobalAttachPath(); LoadGridAttsToFolder(recId, transID); } //Call the function which parses thge memvar node and updates the arrays. ParseMemVarNode(jsonData, "LoadData"); } #endregion #region Methods #region Public Methods /// /// This method is invoked by end user to update the list with new fieldnames and fieldvalues. /// This method inturn calls other methods for updating the list and construct the new field value xml. /// Here there is a assumption that fldArray and fldValueArray are consistent, means both has same number /// of rows and maintain the index. /// /// /// fldArray consists the updated/new component names. /// /// /// fldValueArray consists the updated/new component values. /// /// /// deletedArray is specific to grid fields , it consists the row no. which is deleted and frame no. /// the particular dc no. from where the row is deleted. /// public void GetFieldValueXml(ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList deletedArray, string frameNo, string calledFrom, string condition, string includeDcs) { //first update the list with the new fldArray. UpdateDataList(fldArray, fldDbRowNo, fldValueArray, deletedArray); DeleteDefaultRowInPopDc(project, user, transid, sessionid, AxRole); if (deletedRowCount.Count > 0) { deleteRowOnSave(); } //Create the xml from the updated list. CreateFieldValueXml(condition, includeDcs, calledFrom); } public void GetPerfFieldValueXml(ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList deletedArray, string frameNo, string calledFrom, string condition, string includeDcs) { //first update the list with the new fldArray. UpdateDataList(fldArray, fldDbRowNo, fldValueArray, deletedArray); DeleteDefaultRowInPopDc(project, user, transid, sessionid, AxRole); } /// /// This method is invoked by end user to update the list with new fieldnames and fieldvalues. /// This method inturn calls other methods for updating the list and construct the new field value xml. /// Here there is a assumption that fldArray and fldValueArray are consistent, means both has same number /// of rows and maintain the index. /// /// /// fldArray consists the updated/new component names. /// /// /// fldValueArray consists the updated/new component values. /// /// /// deletedArray is specific to grid fields , it consists the row no. which is deleted and frame no. /// the particular dc no. from where the row is deleted. /// public void GetPopFieldValueXml(ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList deletedArray, string frameNo, string parDcNo, int parRowNo, string popDcNo, int popRowNo) { //first update the list with the new fldArray. UpdateDataList(fldArray, fldDbRowNo, fldValueArray, deletedArray); DeleteDefaultRowInPopDc(project, user, transid, sessionid, AxRole); // Create the xml from the updated list. CreateFieldValueXml("-1", parDcNo, parRowNo, popDcNo, popRowNo); } public void UpdateAttachments(string attachFiles) { string[] attach = attachFiles.Split(','); for (int j = 0; j < attach.Length; j++) attachArray.Add(attach[j].ToString()); } private string GetDelRowDataIndex(string axpRecId) { string delXml = string.Empty; for (int j = 0; j < DelRowFldsXml.Count; j++) { string[] strDelData = DelRowFldsXml[j].ToString().Split('♦'); if (strDelData[0].ToString() == axpRecId) { delXml = strDelData[1].ToString(); break; } } return delXml; } /// /// Function to get the deleted row info from the server side deleted rows. /// /// /// private string GetDelRowsInServer(string delRows) { StringBuilder strDelDcData = new StringBuilder(); //the delrows will be in the below format //dc1-recid1,recid2~dc2-recid1,recid2 if (delRows != string.Empty) { string[] delRowStr = delRows.Split('~'); for (int i = 0; i < delRowStr.Length; i++) { string[] dcStr = delRowStr[i].ToString().Split('-'); string recIds = string.Empty; bool found = false; for (int j = AxDelDcNo.Count - 1; j >= 0; j--) { if (AxDelDcNo[j].ToString() == dcStr[0]) { found = true; recIds = AxDelRecIds[j].ToString(); AxDelDcNo.RemoveAt(j); AxDelRecIds.RemoveAt(j); break; } } if (strDelDcData.ToString() != "") strDelDcData.Append("~"); if (found) strDelDcData.Append(dcStr[0] + "-" + dcStr[1] + "," + recIds); else strDelDcData.Append(dcStr[0] + "-" + dcStr[1]); } } for (int k = 0; k < AxDelDcNo.Count; k++) { if (strDelDcData.ToString() != "") strDelDcData.Append("~"); strDelDcData.Append(AxDelDcNo[k] + "-" + AxDelRecIds[k]); } return strDelDcData.ToString(); } public string GetDelRowsNode(string delRows) { //delrow format will be dcno~recid1,recid2-dcno~recid1,recid2.. StringBuilder strRows = new StringBuilder(); //hook to add deleted rows info from server side delRows = GetDelRowsInServer(delRows); string[] delRowStr = delRows.Split('~'); if (delRows != "") { strRows.Append(""); for (int i = 0; i < delRowStr.Length; i++) { string[] dcStr = delRowStr[i].ToString().Split('-'); strRows.Append("<" + dcStr[0].ToString() + ">"); string[] strRecIds = dcStr[1].ToString().Split(','); for (int j = 0; j < strRecIds.Length; j++) { string axp_recId = strRecIds[j].ToString(); string delXml = GetDelRowDataIndex(axp_recId); if (delXml != "") strRows.Append(delXml); } strRows.Append(""); } strRows.Append(""); } return strRows.ToString(); } private string GetChangedRows(string changedRows) { StringBuilder strRows = new StringBuilder(); string[] chngRowStr = changedRows.Split('~'); if (changedRows != "") { strRows.Append(""); for (int i = 0; i < chngRowStr.Length; i++) { string[] dcStr = chngRowStr[i].ToString().Split('-'); strRows.Append("<" + dcStr[0].ToString() + ">"); strRows.Append(dcStr[1].ToString()); strRows.Append(""); } strRows.Append(""); } else if (recordID == "0") strRows.Append("*"); return strRows.ToString(); } private string GetAttachTransid() { string tidValue = string.Empty; int idx = tstStrObj.GetFieldIndex("axp_attachtransid"); if (idx != -1) { TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[idx]; tidValue = GetFieldValue(fld.fldframeno.ToString(), fld.name); } else { tidValue = tstStrObj.transId; } return tidValue; } //save attached file into local public void SaveAttached(string files, string RecordId) { //CommonDir directory creation taken back due to application server memory usage. //if (!attachDirPath.Contains(":\\") && !attachDirPath.StartsWith("\\")) //{ // CreateDirectoryInCommonDir(ref attachDirPath); //} DirectoryInfo srcDir = new DirectoryInfo(scriptsPath + "Axpert\\" + sessionid); string tidValue = string.Empty; //string schemaName = project; tidValue = GetAttachTransid(); DirectoryInfo desDir = new DirectoryInfo(attachDirPath + "\\" + tidValue + "\\"); if (files != string.Empty) { string[] fnames = files.Split(','); string[] sFileName = new string[fnames.Length]; for (int i = 0; i < fnames.Length; i++) sFileName[i] = Directory.GetFiles(scriptsPath + "Axpert\\" + sessionid, fnames[i])[0]; string sFileDir = scriptsPath + "Axpert\\" + sessionid; string desPath = attachDirPath + "\\" + tidValue + "\\"; try { //Save File on disk if (!desDir.Exists) desDir.Create(); } catch (Exception ex) { throw ex; } string authenticationStatus = string.Empty; if (util.GetAuthentication(ref authenticationStatus)) { foreach (var file in sFileName) File.Copy(file, Path.Combine(desPath, RecordId + "-" + Path.GetFileName(file)), true); } } //Delete the files from folder if (removeFiles.Count > 0 && desDir.Exists) { for (int i = 0; i < removeFiles.Count; i++) { try { foreach (FileInfo fi in desDir.GetFiles(removeFiles[i].ToString().Replace("%20", " "))) fi.Delete(); } catch { } } } } protected void RemoveUnwantedAxpFiles(string transid, string recId, string delRows, TStructData tstData, ArrayList deletedFldArrayValues) { try { GetGlobalAttachPath(); ArrayList lstAttFileServer = new ArrayList(); if (HttpContext.Current.Session["AxpAttFileServer"] != null) lstAttFileServer = (ArrayList)HttpContext.Current.Session["AxpAttFileServer"]; foreach (var axpFlds in tstStrObj.AxpFileUploadFields) { if (!axpFlds.ToString().ToLower().StartsWith("axpfilepath_")) { int idx = tstStrObj.GetFieldIndex(axpFlds.ToString()); TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[idx]; int axpFldDcNo = fld.fldframeno; DataTable oldDcTable = dsDataSet.Tables["deldc" + axpFldDcNo]; if (oldDcTable != null && oldDcTable.Rows.Count > 0) RemoveDeletedRowAxpFiles(oldDcTable, axpFlds.ToString()); var axpFld = lstAttFileServer.Cast().Where(i => i.StartsWith(axpFlds + "~")).ToArray(); if (axpFld.Count() == 0) continue; else { // Need to remove saved files from list. DataTable dcTable = dsDataSet.Tables["dc" + axpFldDcNo]; DataView dv = new DataView(dcTable); dv.Sort = "axp__rowno ASC"; dcTable = dv.ToTable(); string axpGrAttPath = string.Empty; for (int j = 0; j < dcTable.Rows.Count; j++) { string axpValues = string.Empty; axpValues = dcTable.Rows[j][axpFlds.ToString()].ToString(); foreach (var existFiles in axpValues.Split(',')) { var removeValue = lstAttFileServer.Cast().Where(i => i.StartsWith(axpFlds + "~") && i.EndsWith(existFiles)).ToArray(); if (removeValue.Count() > 0) lstAttFileServer.Remove(removeValue[0]); } } } } } if (deletedFldArrayValues.Count > 0) { foreach (var delFile in deletedFldArrayValues) { string[] dltfnameval = delFile.ToString().Split('~'); string dlFName = dltfnameval[0].Substring(0, dltfnameval[0].LastIndexOf("F") - 3); string dlRow = dltfnameval[0].Substring(dltfnameval[0].LastIndexOf("F") - 3, 3); var dlFullname = lstAttFileServer.Cast().Where(i => i.StartsWith(dlFName + "~") && i.EndsWith(dltfnameval[1])).ToArray(); // TO delete file from folder and remove from list which are deleted before save the transaction if (dlFullname.Count() > 0) { lstAttFileServer.Remove(dlFullname[0]); string dlFullPath = dlFullname[0].Replace(dlFName + "~", ""); RemoveDeletedAxpFileFromFolder(dlFullPath); } else { // To delete file from folder after load transaction and delete files var axpfilepath_ = tstStrObj.AxpFileUploadFields.Cast().Where(i => i.ToLower().StartsWith("axpfilepath") && i.EndsWith("_" + dlFName.ToString().Substring(8))).ToArray(); int idx = tstStrObj.GetFieldIndex(dlFName.ToString()); TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[idx]; int axpFldDcNo = fld.fldframeno; DataTable dcTable = dsDataSet.Tables["dc" + axpFldDcNo]; bool isDcGrid = false; isDcGrid = IsDcGrid(axpFldDcNo.ToString(), tstStrObj); int rNo = 0; if (isDcGrid) rNo = int.Parse(dlRow) - 1; else rNo = int.Parse(dlRow); string axpFPath = string.Empty; if (dcTable.Rows.Count > 0) axpFPath = dcTable.Rows[rNo][axpfilepath_[0]].ToString(); if (axpFPath == string.Empty) axpFPath = HttpContext.Current.Session["grdAttPath"].ToString(); if (axpFPath.EndsWith("*")) { string axpFilePath = axpFPath.Substring(0, axpFPath.LastIndexOf('\\')) + "\\"; string PrefixFilename = axpFPath.Substring(axpFPath.LastIndexOf("\\") + 1).Replace("*", ""); string axpFileName = dltfnameval[1]; if (PrefixFilename != string.Empty) axpFileName = PrefixFilename + axpFileName; RemoveDeletedAxpFileFromFolder(axpFilePath + axpFileName); } else RemoveDeletedAxpFileFromFolder(axpFPath + dltfnameval[1]); } } } if (lstAttFileServer.Count > 0) HttpContext.Current.Session["AxpAttFileServer"] = lstAttFileServer; else HttpContext.Current.Session["AxpAttFileServer"] = null; } catch (Exception ex) { logobj.CreateLog("Error while deleting-" + ex.Message, sessionid, "RemoveUnwantedAxpFiles", "new"); } } protected void RemoveDeletedRowAxpFiles(DataTable oldDcTable, string axpFld) { try { var axpfilepath_ = tstStrObj.AxpFileUploadFields.Cast().Where(i => i.ToLower().StartsWith("axpfilepath") && i.EndsWith("_" + axpFld.ToString().Substring(8))).ToArray(); string axpFPath = string.Empty; string axpValues = string.Empty; for (int j = 0; j < oldDcTable.Rows.Count; j++) { axpFPath = oldDcTable.Rows[j][axpfilepath_[0]].ToString(); axpValues = oldDcTable.Rows[j][axpFld].ToString(); if (axpFPath == string.Empty) axpFPath = HttpContext.Current.Session["grdAttPath"].ToString(); foreach (var existFiles in axpValues.Split(',')) { if (axpFPath.EndsWith("*")) { string axpFilePath = axpFPath.Substring(0, axpFPath.LastIndexOf('\\')) + "\\"; string PrefixFilename = axpFPath.Substring(axpFPath.LastIndexOf("\\") + 1).Replace("*", ""); string existFile = existFiles; if (PrefixFilename != string.Empty) existFile = PrefixFilename + existFiles; RemoveDeletedAxpFileFromFolder(axpFilePath + existFile); } else RemoveDeletedAxpFileFromFolder(axpFPath + existFiles); } } } catch (Exception ex) { logobj.CreateLog("Error while deleting OldFiles-" + ex.Message, sessionid, "RemoveDeletedRowAxpFiles", "new"); } } protected void RemoveDeletedAxpFileFromFolder(string fullPath) { try { File.Delete(fullPath); } catch (Exception ex) { logobj.CreateLog("Error while RemoveDeletedAxpFileFromFolder-" + ex.Message, sessionid, "RemoveDeletedAxpFileFromFolder", "new"); } } public string CallSaveDataWS(TStructData tstData, ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList fldDeletedArray, ArrayList deletedFldArrayValues, string files, string rid, string delRows, string changedRows) { DateTime stTime = DateTime.Now; string successMsg = string.Empty; string gridAttSaveResult = string.Empty; string AxRelKeys = string.Empty; bool holdpopup = false; if (!string.IsNullOrEmpty(files)) UpdateAttachments(files); string filesCpy = files; if (attachDir) files = ""; string cngRows = GetChangedRows(changedRows); transid = tstData.transid.ToString(); filename = "save-" + transid; errlog = logobj.CreateLog("Saving Data", sessionid, filename, "new"); string imagefromdb = "false"; if (HttpContext.Current.Session["AxpSaveImageDb"] != null) imagefromdb = HttpContext.Current.Session["AxpSaveImageDb"].ToString(); serviceInputXml = " "; result = string.Empty; logobj.CreateLog("Cross checking field value xml length sent from client and received xml length", sessionid, filename, ""); //call a function to delete the default row in pop grid DeleteDefaultRowInPopDc(project, user, transid, sessionid, AxRole); isSaveCalled = true; tstData.GetFieldValueXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, "-1", "true", "ALL", ""); delRows = GetDelRowsNode(delRows); isSaveCalled = false; if (tstData.fldValueXml.Contains("docid")) { holdpopup = true; } serviceInputXml += tstData.fldValueXml + memVarsData + ""; serviceInputXml += delRows + cngRows; serviceInputXml += HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString(); serviceInputXml += ""; logobj.CreateLog("Call to SaveData Web Service", sessionid, filename, ""); ires = tstStrObj.structRes; //Call service objWebServiceExt = new ASBExt.WebServiceExt(); DateTime asStart = DateTime.Now; result = objWebServiceExt.CallSaveDataWS(transid, serviceInputXml, ires); string requestProcess_logtime = result.Split('♠')[0]; result = result.Split('♠')[1]; DateTime asEnd = DateTime.Now; logobj.CreateLog("End Time : " + DateTime.Now.ToString(), sessionid, filename, ""); //{"message":[{"msg":"Master Saved,recordid=20054000000070"}]} result = result.Replace("\\", ";bkslh"); //To save the image fields in server folders, //the below code checks if the record is saved and copies the images to the folders. if (result.ToLower().Contains("ora-")) { result = result.Replace("ora-", ""); result = result.Replace("ORA-", ""); } if (!result.StartsWith(Constants.ERROR)) { string returnStr = result.Replace("*$*", "¿"); string[] newResult = returnStr.Split('¿'); for (int i = 0; i < newResult.Length; i++) { JArray msg, rslt; try { JObject message = JObject.Parse(newResult[i].ToString()); msg = (JArray)message["message"]; rslt = (JArray)message["result"]; } catch (Exception ex) { throw ex; } if (rslt != null) { string saveStatus = rslt[0].SelectToken("save").ToString(); if (saveStatus == "success" && util.isRealTimeCacEnabled(transid, tstStrObj)) AxRelKeys = util.GetAxRelations(tstData.transid); if (saveStatus == "success" && transID == "axstc") { DataTable dt = tstData.dsDataSet.Tables["dc1"]; if (dt != null && dt.Rows.Count > 0) { string props = dt.Rows[0]["PROPS"].ToString(); if (props.ToLower() == "general") util.ClearAxpStructConfigInRedis(Constants.AXCONFIGGENERAL, transID, GetFieldValue("1", "userroles"), "general", ""); else { string stype = dt.Rows[0]["STYPE"].ToString(); string sname = dt.Rows[0]["STRUCTNAME"].ToString(); if (stype == "Tstruct") util.ClearAxpStructConfigInRedis(Constants.AXCONFIGTSTRUCT, transID, GetFieldValue("1", "userroles"), "tstruct", sname); if (stype == "Iview") { util.ClearAxpStructConfigInRedis(Constants.AXCONFIGTSTRUCT, transID, GetFieldValue("1", "userroles"), "iview", sname); } } } } } if (msg != null) { string saveResult = msg[0].SelectToken("msg").ToString(); if (saveResult.IndexOf(',') != -1) { string recId = ""; string[] resultData = saveResult.Split(','); if (resultData.Length > 1) { successMsg = resultData[0]; if (resultData[resultData.Length - 1].ToString().IndexOf("=") != -1 && resultData[resultData.Length - 1].ToString().IndexOf("recordid") != -1) { string[] recordDts = resultData[resultData.Length - 1].ToString().Split('='); recId = recordDts[1].ToString(); } else if (resultData[resultData.Length - 1].ToString().IndexOf("=") == -1 && Array.FindIndex(resultData, x => x.Trim().Contains("recordid=")) > -1) { int recIdx = Array.FindIndex(resultData, x => x.Contains("recordid")); if (resultData[recIdx].ToString().Contains("=")) { string[] recordDts = resultData[recIdx].ToString().Split('='); recId = recordDts[1].ToString(); } } else { continue; } } if (recId != string.Empty) { if (tstStrObj.AxpFileUploadFields.Count > 0) RemoveUnwantedAxpFiles(transid, recId, delRows, tstData, deletedFldArrayValues); if (tstStrObj.ContainsGridAttach) { try { gridAttSaveResult = SaveGridAttachments(transid, sessionid, recId, delRows, tstData, changedRows, deletedFldArrayValues); } catch (Exception ex) { logobj.CreateLog("Error while SaveGridAttachments-" + ex.Message, sessionid, "SaveGridAttachments", "new", "true"); } } if (tstStrObj.ContainsImage) { string authenticationStatus = string.Empty; bool isAuthenticated = util.GetAuthentication(ref authenticationStatus); SaveImageToFolder(tstStrObj, transid, sessionid, recId, deletedFldArrayValues); } //Save the attach file into the dir if (attachDir && (!string.IsNullOrEmpty(filesCpy) || removeFiles.Count > 0)) SaveAttached(filesCpy, recId); try { Custom custObj = Custom.Instance; custObj.AxAfterAttSave(transid, sessionid, recId); } catch (Exception ex) { } RefFastDataOnSave("save"); RefInMemOnSave(); } } } } } if (logTimeTaken) { webTime1 = asStart.Subtract(stTime).TotalMilliseconds; webTime2 = DateTime.Now.Subtract(asEnd).TotalMilliseconds; asbTime = asEnd.Subtract(asStart).TotalMilliseconds; } if (AxRelKeys != string.Empty) result = result + "*#*" + AxRelKeys; if (holdpopup != false) { result = "{" + "\"holdpopup\"" + ":[{" + "\"hold\"" + ":\" " + holdpopup + "\"}]}" + "*$*" + result; } if (gridAttSaveResult != string.Empty) { result = "{" + "\"GridAttachments\"" + ":[{" + "\"Message\"" + ":\" Attachment is not Saved : " + gridAttSaveResult + "\"}]}" + "*$*" + result; } result = requestProcess_logtime + "♠" + result; return result; } private void ModifyAsNewRecord() { if (dsDataSet.Tables.Count > 0) { for (int i = 1; i <= tstStrObj.dcs.Count; i++) { DataTable dt = dsDataSet.Tables["dc" + i]; if (dt.Rows.Count > 0) { if (((TStructDef.DcStruct)(tstStrObj.dcs[i - 1])).isgrid) { foreach (DataRow row in dt.Rows) { row["axp_recid" + i] = "0"; } } else { dt.Rows[0]["axp_recid" + i] = "0"; } } } } } public string CallWorkFlowActionWS(TStructData tstData, ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList fldDeletedArray, string files, string rid, string inputXml) { if (!string.IsNullOrEmpty(files)) { UpdateAttachments(files); } //GetGlobalVars(); transid = tstData.transid.ToString(); filename = "WorkFlow-" + transid; errlog = logobj.CreateLog("Saving Workflow Data", sessionid, filename, "new"); result = string.Empty; logobj.CreateLog("Cross checking field value xml length send from client and received xml length", sessionid, filename, ""); //call a function to delete the default row in pop grid DeleteDefaultRowInPopDc(project, user, transid, sessionid, AxRole); tstData.GetFieldValueXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, "-1", "true", "ALL", ""); inputXml += "" + tstData.fldValueXml + ""; inputXml += HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString() + ""; logobj.CreateLog("Call to WorkFlowAction Web Service", sessionid, filename, ""); //Call service objWebServiceExt = new ASBExt.WebServiceExt(); result = objWebServiceExt.CallWorkFlowActionWS(transid, inputXml); logobj.CreateLog("End Time : " + DateTime.Now.ToString(), sessionid, filename, ""); return result; } public string GetErrorInResultJson(string result) { result = result.Replace("\\", ";bkslh"); result = result.Replace("^^dq", "\""); string returnStr = result.Replace("*$*", "¿"); string[] newResult = returnStr.Split('¿'); for (int i = 0; i < newResult.Length; i++) { JArray msg; try { JObject message = JObject.Parse(newResult[i].ToString()); msg = (JArray)message["error"]; } catch (Exception ex) { throw ex; } if (msg != null) { string saveResult = msg[0].SelectToken("msg").ToString(); saveResult = saveResult.Remove(0, 1); saveResult = saveResult.Remove(saveResult.Length - 1, 1); return saveResult; } } return result; } private string SaveGridAttachments(string transid, string sid, string recId, string delRows, TStructData tstData, string changedRows, ArrayList deletedFldArrayValues) { GetGlobalAttachPath(); string saveResult = string.Empty; if (recId != "0") { string sourceFilePath = scriptsPath + "axpert\\" + sid; string destFilePath = string.Empty; string grdAttPath = string.Empty; bool hasMultipleFiles = false; bool isAxpAttachFld = false; hasImagePath = false; string fldName = string.Empty; ArrayList attFldNames = new ArrayList(); ArrayList attDestPath = new ArrayList(); ArrayList attFileNames = new ArrayList(); StringBuilder strFiles = new StringBuilder(); ArrayList attWantToDelete = new ArrayList(); //string schemaName = project; string attachTid = GetAttachTransid(); int attTotalFileCount = 0; int attDelFileCount = 0; int attSavedFileCount = 0; ArrayList isRecordFile = new ArrayList(); //bool isRecordFile = false; if (HttpContext.Current.Session["attGridFileServer"] != null && HttpContext.Current.Session["attGridFileServer"].ToString() != string.Empty) { string attTotalFile = HttpContext.Current.Session["attGridFileServer"].ToString(); string[] attTotalFiles = attTotalFile.Split('♦'); attTotalFileCount = attTotalFiles.Length; } bool deletedGridFilesExist = false; foreach (var attFld in tstStrObj.AxAttachFields) { int idx = tstStrObj.GetFieldIndex(attFld.ToString()); TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[idx]; if ((fld.name.StartsWith("dc") && fld.name.ToLower().EndsWith("_image") || fld.name.StartsWith("axp_gridattach_")) && IsDcGrid(fld.fldframeno.ToString(), tstStrObj)) { TStructDef.DcStruct dc = (TStructDef.DcStruct)tstStrObj.dcs[fld.fldframeno - 1]; fldName = fld.name; //For all attachment fields now the global variables AxpImageServer and AxpImagePath will be used for destination path // GetGlobalAttachPath(); grdAttPath = HttpContext.Current.Session["grdAttPath"].ToString(); DataTable dcTable = dsDataSet.Tables["dc" + dc.frameno]; DataTable dcDelRowTable = dsDataSet.Tables["deldc" + dc.frameno]; bool hasDcImagePath = false; hasDcImagePath = dcTable.Columns.Contains("dc" + dc.frameno + "_imagepath"); hasImagePath = hasDcImagePath; if (dc.DCHasDataRows && (grdAttPath != string.Empty || hasDcImagePath == true)) { if (!grdAttPath.EndsWith("\\")) grdAttPath = grdAttPath + "\\"; string value = string.Empty; string destFileName = string.Empty; string sfileEx = string.Empty; bool hasAxpAttachCol = false; hasAxpAttachCol = dcTable.Columns.Contains("axp_gridattach_" + dc.frameno); bool hasAxpAttFileName = false; hasAxpAttFileName = dcTable.Columns.Contains("axpattach_filename" + dc.frameno); DataView dv = new DataView(dcTable); dv.Sort = "axp__rowno ASC"; dcTable = dv.ToTable(); string axpGrAttPath = string.Empty; int delRowCnt = 0; for (int j = 0; j < dcTable.Rows.Count; j++) { //If dc_image is used for referimages, then don't add the referred files for saving, save only newly attached files if (!hasAxpAttachCol) value = GetFilesforSave(dcTable.Rows[j][fld.name].ToString()); else value = dcTable.Rows[j]["axp_gridattach_" + dc.frameno].ToString(); if (value == string.Empty && (changedRows != string.Empty || delRows == string.Empty) && !hasDcImagePath && !hasAxpAttachCol && (fld.name.StartsWith("dc" + dc.frameno + "_image"))) { try { DataTable oldDcTable = dsDataSet.Tables["dc_old" + dc.frameno]; if (dsDataSet.Tables["dc_old" + dc.frameno].Rows[0]["old__" + fld.name].ToString() != string.Empty) { deletedGridFilesExist = true; } } catch (Exception ex) { } } if (value.Contains(",")) hasMultipleFiles = true; if (value == string.Empty && HttpContext.Current.Session["attGridFileServer"] != null && HttpContext.Current.Session["attGridFileServer"].ToString() != string.Empty) { string attServerFiles = HttpContext.Current.Session["attGridFileServer"].ToString(); string[] lstServerFiles = attServerFiles.Split('♦'); int irow = j + 1; var lstServerFile = lstServerFiles.AsEnumerable().Where(x => x.StartsWith(fldName + irow + "~") && x.Contains(HttpContext.Current.Session["username"].ToString() + "-")).ToList(); string authenticationStatus = string.Empty; if (lstServerFile.Count > 0 && util.GetAuthentication(ref authenticationStatus)) { foreach (var lst in lstServerFile) { string savedFileName = lst.Split('~')[1]; File.Delete(savedFileName); attDelFileCount++; HttpContext.Current.Session["attGridFileServer"] = attServerFiles = attServerFiles.Replace(lst + "♦", "").Replace(lst, ""); } } } if (value != string.Empty || deletedGridFilesExist) { //If axp_gridattach if (hasAxpAttachCol) { if (hasAxpAttFileName && !hasMultipleFiles) { sfileEx = value.Substring(value.LastIndexOf(".")); destFileName = dcTable.Rows[j]["axpattach_filename" + dc.frameno].ToString() + sfileEx; } isAxpAttachFld = true; //destFilePath = grdAttPath + schemaName + "\\" + attachTid + "\\" + recId + "\\" + fld.name; destFilePath = grdAttPath + "\\" + attachTid + "\\" + recId + "\\" + fld.name; } else if (fld.name.StartsWith("dc") && fld.name.ToLower().EndsWith("_image") && !hasDcImagePath) { //destFilePath = grdAttPath + schemaName + "\\" + attachTid + "\\" + fld.name; destFilePath = grdAttPath + "\\" + attachTid + "\\" + fld.name; } else if (hasDcImagePath && !hasAxpAttachCol) { if (dcTable.Rows[j]["dc" + +dc.frameno + "_imagepath"].ToString() != string.Empty) { hasImagePath = true; grdAttPath = GetdcImagePath(dcTable.Rows[j]["dc" + +dc.frameno + "_imagepath"].ToString()); destFilePath = grdAttPath; } else { string errorLog = string.Empty; string errMessage = "Value for dc_imagepath field is not specified"; errorLog = logobj.CreateLog("Error in Saving Grid attachments - " + errMessage, sid, "GridAttachments", "new"); saveResult = errMessage; } } } if ((value != string.Empty || deletedGridFilesExist) && destFilePath != string.Empty) { try { DirectoryInfo di = new DirectoryInfo(destFilePath); if (!di.Exists) di.Create(); } catch (Exception ex) { saveResult = "Destination Path is empty"; } if (destFileName != "") value = destFileName; string[] fileNames = value.Split(','); //These arrays will be used to delete the deleted attachments attFldNames.Add(fldName); if (attDestPath.Count > 0) { if (attDestPath.IndexOf(destFilePath) == -1) { attDestPath.Add(destFilePath); if (hasImagePath || hasAxpAttachCol) isRecordFile.Add("false"); else isRecordFile.Add("true"); } } else { attDestPath.Add(destFilePath); if (hasImagePath || hasAxpAttachCol) isRecordFile.Add("false"); else isRecordFile.Add("true"); } for (int fIdx = 0; fIdx < fileNames.Length; fIdx++) { if (HttpContext.Current.Session["attGridFileServer"] != null && HttpContext.Current.Session["attGridFileServer"].ToString() != string.Empty) { int irow = j + delRowCnt + 1; if (dcDelRowTable != null && dcDelRowTable.Rows.Count > 0) { int iDelrow = j + 1; var delRowList = dcDelRowTable.AsEnumerable().Where(s => s.Field("axp__delrow") == iDelrow.ToString()).Select(s => s.Field("axp__delrow")).ToList(); if (delRowList != null && delRowList.Count > 0) { string attServerFiless = HttpContext.Current.Session["attGridFileServer"].ToString(); string[] lstServerFiless = attServerFiless.Split('♦'); var lstMatchFiles = lstServerFiless.AsEnumerable().Where(x => x.StartsWith(fldName + irow + "~") && x.Contains(HttpContext.Current.Session["username"].ToString() + "-")).ToList(); delRowCnt = delRowCnt + 1; irow = irow + 1; foreach (var lst in lstMatchFiles) { string savedFileName = lst.Split('\\').Last(); string attdestFilePath = string.Empty; attdestFilePath = destFilePath + "\\" + savedFileName; // File.Delete(attdestFilePath); attWantToDelete.Add(attdestFilePath); HttpContext.Current.Session["attGridFileServer"] = attServerFiless.Replace(lst + "♦", "").Replace(lst, ""); } } } string attServerFiles = HttpContext.Current.Session["attGridFileServer"].ToString(); string[] lstServerFiles = attServerFiles.Split('♦'); var lstServerFile = lstServerFiles.AsEnumerable().Where(x => x.StartsWith(fldName + irow + "~") && x.Contains(HttpContext.Current.Session["username"].ToString() + "-")).ToList(); string authenticationStatus = string.Empty; if (lstServerFile.Count > 0 && util.GetAuthentication(ref authenticationStatus)) { foreach (var lst in lstServerFile) { string savedFileName = lst.Split('\\').Last();// lst.Split('~')[1]; string attdestFilePath = string.Empty; attdestFilePath = destFilePath + "\\" + savedFileName; string atFileName = savedFileName.Replace(HttpContext.Current.Session["username"].ToString() + "-", ""); var saveFileLst = fileNames.AsEnumerable().Where(x => x == atFileName).ToList(); if (saveFileLst.Count > 0) { if (fileNames[fIdx] == atFileName) { if (hasAxpAttachCol) { string renameFilePath = grdAttPath + attachTid + "\\" + HttpContext.Current.Session["username"].ToString() + "\\" + fld.name; axpGrAttPath = grdAttPath + attachTid + "\\" + HttpContext.Current.Session["username"].ToString(); if (File.Exists(renameFilePath + "\\" + savedFileName)) Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(renameFilePath + "\\" + savedFileName, atFileName); renameFilePath = renameFilePath + "\\" + atFileName; destFilePath = destFilePath + "\\" + atFileName; File.Move(@renameFilePath, @destFilePath); attSavedFileCount++; if (strFiles.ToString() == string.Empty) strFiles.Append(atFileName); else strFiles.Append("," + atFileName); } else if (hasImagePath) { File.Delete(destFilePath + "\\" + atFileName); Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(attdestFilePath, atFileName); if (strFiles.ToString() == string.Empty) strFiles.Append(atFileName); else strFiles.Append("," + atFileName); attSavedFileCount++; } else { File.Delete(destFilePath + "\\" + recId + "-" + atFileName); Microsoft.VisualBasic.FileIO.FileSystem.RenameFile(attdestFilePath, recId + "-" + atFileName); if (strFiles.ToString() == string.Empty) strFiles.Append(recId + "-" + atFileName); else strFiles.Append("," + recId + "-" + atFileName); attSavedFileCount++; } HttpContext.Current.Session["attGridFileServer"] = attServerFiles = attServerFiles.Replace(lst + "♦", "").Replace(lst, ""); } else { if (hasImagePath || hasAxpAttachCol) { if (strFiles.ToString() == string.Empty) strFiles.Append(fileNames[fIdx]); else strFiles.Append("," + fileNames[fIdx]); } else { if (strFiles.ToString() == string.Empty) strFiles.Append(recId + "-" + fileNames[fIdx]); else strFiles.Append("," + recId + "-" + fileNames[fIdx]); } } } else { if (hasImagePath || hasAxpAttachCol) { if (strFiles.ToString() == string.Empty) strFiles.Append(fileNames[fIdx]); else strFiles.Append("," + fileNames[fIdx]); } else { if (strFiles.ToString() == string.Empty) strFiles.Append(recId + "-" + fileNames[fIdx]); else strFiles.Append("," + recId + "-" + fileNames[fIdx]); } attDelFileCount++; File.Delete(attdestFilePath); HttpContext.Current.Session["attGridFileServer"] = attServerFiles = attServerFiles.Replace(lst + "♦", "").Replace(lst, ""); } } } else { string fNames = fileNames[fIdx].ToString(); if (fNames == "") continue; if (!hasDcImagePath && !hasAxpAttachCol) fNames = recId + "-" + fileNames[fIdx].ToString(); if (strFiles.ToString() == string.Empty) strFiles.Append(fNames); else strFiles.Append("," + fNames); } continue; } string fName = fileNames[fIdx].ToString(); if (fName == "") continue; if (!hasDcImagePath && !hasAxpAttachCol) fName = recId + "-" + fileNames[fIdx].ToString(); if (strFiles.ToString() == string.Empty) strFiles.Append(fName); else strFiles.Append("," + fName); CopyFiles(sourceFilePath, destFilePath, fileNames[fIdx], fName); } } } if (axpGrAttPath != string.Empty && Directory.Exists(axpGrAttPath)) { try { Directory.Delete(axpGrAttPath, true); } catch { } } } } } string attDelPath = ""; if (attWantToDelete.Count > 0)//Delete and add same file in another row { attDelFileCount += attWantToDelete.Count; foreach (string wtdFile in attWantToDelete) { string attFName = wtdFile.Split('\\').Last(); attDelPath = wtdFile; attDelPath = attDelPath.Replace("\\" + attFName, ""); try { File.Delete(wtdFile); } catch (Exception ex) { } } } if (changedRows != string.Empty || delRows != string.Empty)//Delete any file or load record and delete file { int delFcnt = DeleteGridAttachments(delRows, recId, grdAttPath, transid, isAxpAttachFld, fldName, attFldNames, attDestPath, strFiles, isRecordFile); //attDelPath = attDelPath == "" ? attDestPath[0].ToString() : attDelPath; if (attDelPath == "" && attDestPath.Count > 0) attDelPath = attDestPath[0].ToString(); if (delFcnt != 0) attDelFileCount += delFcnt; } if (attDelPath != "" && attDelFileCount != 0) { AttDelLogFile(attDelPath, recId, attTotalFileCount, attSavedFileCount, attDelFileCount); } } return saveResult; } private void AttDelLogFile(string attDelPath, string strRecId, int attTotalFileCount, int attSavedFileCount, int attDelFileCount) { // Total uploaded files: , Saved files: and deleted files : // Log file recid-attdetails.txt try { if (attDelPath != "") { //attTotalFileCount //string attFName = attDelPath.Split('\\').Last(); //attDelPath = attDelPath.Replace("\\" + attFName, ""); attDelPath = attDelPath + "\\Temp"; DirectoryInfo diDel = new DirectoryInfo(attDelPath); if (!diDel.Exists) diDel.Create(); string attFPath = diDel + "\\" + strRecId + "-attdetails.txt"; StreamWriter sw = default(StreamWriter); if (File.Exists(attFPath)) { sw = new StreamWriter(attFPath, true); sw.WriteLine("********** {0} **********", DateTime.Now.ToString()); sw.Flush(); sw.Close(); sw = new StreamWriter(attFPath, true); } else { sw = new StreamWriter(attFPath, false); sw.WriteLine("********** {0} **********", DateTime.Now.ToString()); sw.Flush(); sw.Close(); sw = new StreamWriter(attFPath, true); } string text = "Total uploaded files:" + attTotalFileCount + " , saved files:" + attSavedFileCount + " and deleted files :" + attDelFileCount; sw.WriteLine(text); sw.Flush(); sw.Close(); } } catch (Exception exs) { } } public string GetFilesforSave(string referredFiles) { string nonReferredFiles = referredFiles; return nonReferredFiles; string[] refFiles = referredFiles.Split(')'); if (refFiles.Length > 1 && refFiles[1] != string.Empty) nonReferredFiles = refFiles[1]; else if (refFiles.Length > 1 && refFiles[1] == string.Empty) nonReferredFiles = string.Empty; return nonReferredFiles; } //Get dc_imagepath field value public string GetdcImagePath(string dcImagePath) { string grdAttPath = GetImgServerPath(); if (dcImagePath != string.Empty && dcImagePath.Contains(":")) { grdAttPath = dcImagePath; } else if (grdAttPath != string.Empty) { grdAttPath = grdAttPath + "\\" + dcImagePath; } else if (dcImagePath == string.Empty) { string errorLog = string.Empty; string errMessage = "Value for dc_imagepath field is not specified"; errorLog = logobj.CreateLog("Error in loading Grid attachments - " + errMessage, sessionid, "GridAttachments", "new"); grdAttPath = string.Empty; } return grdAttPath; } public void GetGlobalAttachPath() { bool isLocalFolder = false, isOnlyFolder = false; bool isRemoteFolder = false; string imagePath = string.Empty; string imageServer = string.Empty; string grdAttPath = string.Empty; string errorMessage = string.Empty; string mapUsername = string.Empty; string mapPassword = string.Empty; if (HttpContext.Current.Session["AxpImageServerGbl"] != null) { imageServer = HttpContext.Current.Session["AxpImageServerGbl"].ToString(); imageServer = imageServer.Replace(";bkslh", @"\"); } if (HttpContext.Current.Session["AxpImagePathGbl"] != null) { imagePath = HttpContext.Current.Session["AxpImagePathGbl"].ToString(); imagePath = imagePath.Replace(";bkslh", @"\"); if (imagePath.IndexOf(":") > -1) isLocalFolder = true; else if (imagePath.IndexOf(@"\") > -1) isRemoteFolder = true; else isOnlyFolder = true; } if (imagePath != string.Empty) { if (isLocalFolder || isRemoteFolder) grdAttPath = imagePath; else grdAttPath = imageServer + @"\" + imagePath; } else if (imageServer != string.Empty) { grdAttPath = imageServer; } else //If the global variables AxpimageServer and AxpImagePath is not defined { if (HttpContext.Current.Session["AxGridAttachPath"] != null) { grdAttPath = HttpContext.Current.Session["AxGridAttachPath"].ToString(); //CommonDir directory creation taken back due to application server memory usage. //if (!grdAttPath.Contains(":\\")) //{ // // ftp server path // if (!grdAttPath.Contains("\\\\")) // { // grdAttPath = AppDomain.CurrentDomain.BaseDirectory + "CommonDir\\" + grdAttPath; // if (!Directory.Exists(grdAttPath)) // { // Directory.CreateDirectory(grdAttPath); // } // } //} } } HttpContext.Current.Session["grdAttPath"] = grdAttPath; } private int DeleteGridAttachments(string delRows, string recId, string grdAttPath, string transId, bool isAxpAttachFld, string fld, ArrayList attFldNames, ArrayList attDestPath, StringBuilder attFileNames, ArrayList isRecordFile) { int DelfCnt = 0; try { for (int i = 0; i < attDestPath.Count; i++) { //abc.txt,xyz.txt, string isRecFile = isRecordFile[i].ToString(); string attFiles = attFileNames.ToString() + ","; DirectoryInfo di = new DirectoryInfo(attDestPath[i].ToString()); if (di.Exists) { FileInfo[] files = isRecFile == "true" ? di.GetFiles(recId + "-*") : di.GetFiles(); for (int j = 0; j < files.Length; j++) { FileInfo file = (FileInfo)files[j]; string strFileName = file.Name + ","; if (attFiles.IndexOf(strFileName) == -1 && (file.Name).IndexOf(recId) != -1) { file.Delete(); DelfCnt++; } } } } } catch (Exception ex) { logobj.CreateLog("Error while deleting-" + ex.Message, sessionid, "DeleteGridAttachments", "new"); } return DelfCnt; } //For deleting nongrid attachment files from file server private void DeleteNonGridAttachments(string recId, string grdAttPath, string transId, string fieldName, ArrayList attFldNames, ArrayList nonGridAttDestPath, StringBuilder attFileNames) { try { for (int i = 0; i < nonGridAttDestPath.Count; i++) { //abc.txt,xyz.txt, string attFiles = attFileNames.ToString() + ","; DirectoryInfo di = new DirectoryInfo(nonGridAttDestPath[i].ToString()); if (di.Exists) { FileInfo[] files = di.GetFiles(); for (int j = 0; j < files.Length; j++) { FileInfo file = (FileInfo)files[j]; string strFileName = file.Name + ","; if (attFiles.IndexOf(strFileName) == -1 && (file.Name).IndexOf(recId) != -1) file.Delete(); } } } } catch (Exception ex) { logobj.CreateLog("Error while deleting-" + ex.Message, sessionid, "DeleteGridAttachments", "new"); } } //Function to save the image in the server folder if the image starts with fld_ddo private void SaveImageToFolder(TStructDef strObj, string transid, string sid, string recId, ArrayList deletedFldArrayValues) { bool deletedGridFilesExist = false; if (recId != "0") { foreach (var imgFld in tstStrObj.AxImageFields) { int idx = tstStrObj.GetFieldIndex(imgFld.ToString()); TStructDef.FieldStruct fld = (TStructDef.FieldStruct)strObj.flds[idx]; TStructDef.DcStruct dc = (TStructDef.DcStruct)tstStrObj.dcs[fld.fldframeno - 1]; DataTable dcTable = dsDataSet.Tables["dc" + dc.frameno]; if (fld.fieldIsImage) { if (!IsDcGrid(fld.fldframeno.ToString(), strObj)) { string value = string.Empty, destValue = string.Empty; ArrayList nonGridAttDestPath = new ArrayList(); ArrayList attFldNames = new ArrayList(); StringBuilder nonGrdStrFiles = new StringBuilder(); destValue = value = GetFieldValue(fld.fldframeno.ToString(), fld.name); if (value == string.Empty && (fld.name.StartsWith("dc" + fld.fldframeno + "_image") || fld.name.StartsWith("axp_nga_"))) { try { DataTable oldDcTable = dsDataSet.Tables["dc_old" + fld.fldframeno]; if (dsDataSet.Tables["dc_old" + fld.fldframeno].Rows[0]["old__" + fld.name].ToString() != string.Empty) { deletedGridFilesExist = true; } } catch (Exception ex) { } } if (value != string.Empty || deletedGridFilesExist) { string fieldName = fld.name;//fieldControlName[index].ToString(); string strFile = ""; if (!(fieldName.StartsWith("axp_nga_"))) { strFile = scriptsPath + "axpert\\" + sid + "\\" + fieldName; if (!File.Exists(strFile + "\\" + value)) { string strFileNew = scriptsPath + "axpert\\" + sid; if (File.Exists(strFileNew + "\\" + value)) strFile = strFileNew; } string strDest = ""; if (imgAttachPath != "") { string imgName = destValue.Substring(0, destValue.LastIndexOf('.')); destValue = destValue.Replace(imgName, recId); //strDest = imgAttachPath + "\\axpert\\" + transid + "\\" + recId + "\\" + fieldName; strDest = imgAttachPath + "\\" + transid + "\\" + fieldName; } else { //strDest = scriptsPath + "axpert\\" + transid + "\\" + recId + "\\" + fieldName; strDest = scriptsPath + "axpert\\" + transid + "\\" + fieldName; } //loop to check if multiple images exist for same field, if yes then delete all. string authenticationStatus = string.Empty; if (util.GetAuthentication(ref authenticationStatus)) { DirectoryInfo di = new DirectoryInfo(strDest); if (!di.Exists) { di.Create(); } else if (imgAttachPath == "") { FileInfo[] files = di.GetFiles(); for (int j = 0; j < files.Length; j++) { FileInfo file = (FileInfo)files[j]; file.Delete(); } } else if (imgAttachPath != "") { FileInfo[] files = di.GetFiles(); if (files.Length > 0) { var ImgExist = files.Where(x => x.Name.Split('.')[0] == recId).ToList(); if (ImgExist.Count > 0) { foreach (var lstImg in ImgExist) { FileInfo file = (FileInfo)lstImg; file.Delete(); } } } } if (value != string.Empty || deletedGridFilesExist) { CopyFiles(strFile, strDest, value, destValue); } } } else { //strFile = scriptsPath + "axpert\\" + sid + "\\" + fieldName; strFile = scriptsPath + "axpert\\" + sid; if (!File.Exists(strFile + "\\" + value)) { string strFileNew = scriptsPath + "axpert\\" + sid; if (File.Exists(strFileNew + "\\" + value)) strFile = strFileNew; } string strDest = ""; if (imgAttachPath != "" && !(deletedGridFilesExist)) { string imgName = destValue.Substring(0, destValue.LastIndexOf('.')); destValue = destValue.Replace(imgName, recId); //strDest = imgAttachPath + "\\axpert\\" + transid + "\\" + recId + "\\" + fieldName; strDest = imgAttachPath + "\\" + transid + "\\" + fieldName; } else if (!deletedGridFilesExist) { //strDest = scriptsPath + "axpert\\" + transid + "\\" + recId + "\\" + fieldName; strDest = scriptsPath + "axpert\\" + transid + "\\" + fieldName; } else { strDest = imgAttachPath + "\\" + transid + "\\" + fieldName; } //loop to check if multiple images exist for same field, if yes then delete all. string authenticationStatus = string.Empty; if (util.GetAuthentication(ref authenticationStatus)) { DirectoryInfo di = new DirectoryInfo(strDest); if (!di.Exists) { di.Create(); } else if (imgAttachPath == "") { FileInfo[] files = di.GetFiles(); for (int j = 0; j < files.Length; j++) { FileInfo file = (FileInfo)files[j]; file.Delete(); } } else if (imgAttachPath != "") { FileInfo[] files = di.GetFiles(); if (files.Length > 0) { var ImgExist = files.Where(x => x.Name.Split('.')[0] == recId).ToList(); if (ImgExist.Count > 0) { foreach (var lstImg in ImgExist) { FileInfo file = (FileInfo)lstImg; file.Delete(); } } } } if (value != string.Empty || deletedGridFilesExist) { string[] fileNames = value.Split(','); nonGridAttDestPath.Add(strDest); attFldNames.Add(fieldName); for (int fIdx = 0; fIdx < fileNames.Length; fIdx++) { string fName = fileNames[fIdx].ToString(); if (fName == "") continue; fName = recId + "-" + fileNames[fIdx].ToString(); CopyFiles(strFile, strDest, fileNames[fIdx], fName); if (nonGrdStrFiles.ToString() == string.Empty) nonGrdStrFiles.Append(fName); else nonGrdStrFiles.Append("," + fName); } } } DeleteNonGridAttachments(recId, imgAttachPath, transid, fieldName, attFldNames, nonGridAttDestPath, nonGrdStrFiles); } } } } } } } /// /// Function to get a non grid field's value. /// /// /// /// public string GetFieldValue(string dcNo, string fldName) { string fldValue = string.Empty; DataTable dcTable = dsDataSet.Tables["dc" + dcNo]; if (dcTable.Rows.Count > 0) { try { fldValue = dcTable.Rows[0][fldName].ToString(); } catch (Exception ex) { } } return fldValue; } public string DeleteImages(TStructData tstData, string recId, string fieldName) { string res = ""; transid = tstData.transid.ToString(); fieldName = fieldName.Substring(0, fieldName.LastIndexOf("F") - 3); int index = fldNames.IndexOf(fieldName); string fldFrameNo = GetFrameNo(fieldName); string value = GetFieldValue(fldFrameNo, fieldName); string strFile = ""; strFile = scriptsPath + "axpert\\" + sessionid; string strDest = "", strDestNew = ""; if (imgAttachPath != "") { strDest = imgAttachPath + "\\axpert\\" + transid + "\\" + fldNames[index].ToString(); strDestNew = imgAttachPath + "\\" + transid + "\\" + fldNames[index].ToString(); } else { strDest = scriptsPath + "axpert\\" + sessionid + "\\" + fldNames[index].ToString(); } //loop to check if multiple images exist for same field, if yes then delete all. DirectoryInfo di = new DirectoryInfo(strDestNew); try { if (di.Exists) { FileInfo[] files = di.GetFiles(); for (int j = 0; j < files.Length; j++) { FileInfo file = (FileInfo)files[j]; string[] fileStr = file.Name.Split('-'); if (fileStr[0].ToString() == recId) { file.Delete(); } } } DirectoryInfo diNew = new DirectoryInfo(strDest); if (diNew.Exists) { FileInfo[] files = diNew.GetFiles(); for (int j = 0; j < files.Length; j++) { FileInfo file = (FileInfo)files[j]; string[] fileStr = file.Name.Split('-'); if (fileStr[0].ToString() == recId) { file.Delete(); } } } } catch (Exception ex) { res = ex.Message; } return res; } //Function to copy the image from the given source path to the destination path. private void CopyFiles(string sourcePath, string destPath, string srcFileName, string desFileName) { string authenticationStatus = string.Empty; if (util.GetAuthentication(ref authenticationStatus)) { DirectoryInfo sPath = new DirectoryInfo(sourcePath); DirectoryInfo dPath = new DirectoryInfo(destPath); if (!dPath.Exists) dPath.Create(); if (sPath.Exists) { BinaryReader brReader = default(BinaryReader); BinaryWriter brWriter = default(BinaryWriter); string strFile = sourcePath + "\\" + srcFileName; string strDest = destPath + "\\" + desFileName; FileStream input = null; try { input = new FileStream(strFile, FileMode.Open, FileAccess.Read); } catch (FileNotFoundException ex) { } if (input != null) { FileStream output = new FileStream(strDest, FileMode.Create, FileAccess.Write); brReader = new System.IO.BinaryReader(input); brWriter = new System.IO.BinaryWriter(output); int bufsize = 30000; // this is buffer size int readcount = 0; int bsize = 0; int indexer = 0; FileInfo fileInfo = new FileInfo(strFile); int FileLen = Convert.ToInt32(fileInfo.Length); while ((readcount < FileLen)) { if (bufsize < FileLen - readcount) { bsize = bufsize; } else { bsize = FileLen - readcount; } byte[] buffer = new byte[bsize]; brReader.Read(buffer, indexer, bsize); brWriter.Write(buffer, indexer, bsize); readcount = readcount + bsize; } brReader.Close(); brWriter.Close(); brReader.Dispose(); brWriter.Dispose(); output.Dispose(); input.Dispose(); } } } } #region GridAttachments public void LoadGridAttsToFolder(string recId, string tid) { string destFilePath = scriptsPath + "axpert\\" + HttpContext.Current.Session["nsessionid"]; string srcFilePath = string.Empty; string srcpathValue = string.Empty; string grdAttPath = string.Empty; //string schemaName = project; grdAttPath = HttpContext.Current.Session["grdAttPath"].ToString(); string attachTid = GetAttachTransid(); ArrayList attFileNames = new ArrayList(); bool hasGridAttachFld = false; foreach (var attFld in tstStrObj.AxAttachFields) { int idx = tstStrObj.GetFieldIndex(attFld.ToString()); TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[idx]; if ((fld.name.StartsWith("dc") && fld.name.ToLower().EndsWith("_imagepath")) && IsDcGrid(fld.fldframeno.ToString(), tstStrObj)) hasImagePath = true; //If dc_referimages is defined for referring Attachments if ((fld.name.StartsWith("dc") && fld.name.ToLower().EndsWith("_referimages")) && IsDcGrid(fld.fldframeno.ToString(), tstStrObj)) { TStructDef.DcStruct dc1 = (TStructDef.DcStruct)tstStrObj.dcs[fld.fldframeno - 1]; DataTable dcTable1 = dsDataSet.Tables["dc" + dc1.frameno]; string refVal1 = string.Empty; for (int k = 0; k < dcTable1.Rows.Count; k++) { if (string.IsNullOrEmpty(Convert.ToString(dcTable1.Rows[k]["dc" + dc1.frameno + "_referimages"]))) refVal1 = dcTable1.Rows[k]["dc" + dc1.frameno + "_referimages"].ToString(); GetReferedFiles(refVal1, hasImagePath); } } if (((fld.name.StartsWith("axp_gridattach_")) || (fld.name.StartsWith("dc") && fld.name.ToLower().EndsWith("_image"))) && !(fld.name.StartsWith("axp_nga_")) && IsDcGrid(fld.fldframeno.ToString(), tstStrObj)) { TStructDef.DcStruct dc = (TStructDef.DcStruct)tstStrObj.dcs[fld.fldframeno - 1]; if (dc.DCHasDataRows) { if (!(fld.name.StartsWith("axp_gridattach_"))) srcFilePath = grdAttPath + "\\" + attachTid + "\\" + fld.name; //srcFilePath = grdAttPath + "\\" + schemaName + "\\" + attachTid + "\\" + fld.name; else { hasGridAttachFld = true; srcFilePath = grdAttPath + "\\" + attachTid + "\\" + recId + "\\" + fld.name; //srcFilePath = grdAttPath + "\\" + schemaName + "\\" + attachTid + "\\" + recId + "\\" + fld.name; } string value = string.Empty; DataTable dcTable = dsDataSet.Tables["dc" + dc.frameno]; string sfileEx = string.Empty; for (int j = 0; j < dcTable.Rows.Count; j++) { attFileNames.Clear(); value = dcTable.Rows[j][fld.name].ToString(); string[] attFiles; if (value != "") sfileEx = value.Substring(value.LastIndexOf(".")); //If axpattach_filename is defined if (dcTable.Columns.Contains("axpattach_filename" + dc.frameno)) { if (value != string.Empty) if (dcTable.Rows[j]["axpattach_filename" + dc.frameno].ToString() != string.Empty) value = dcTable.Rows[j]["axpattach_filename" + dc.frameno].ToString() + sfileEx; } //If dc_imagepath is defined if (dcTable.Columns.Contains("dc" + dc.frameno + "_imagepath")) { srcFilePath = GetdcImagePath(dcTable.Rows[j]["dc" + dc.frameno + "_imagepath"].ToString()); } //If dc_image field is referring attachments if (value.Contains("@")) { GetReferedFiles(value, hasImagePath); } if (value.Contains(",")) { attFiles = value.Split(','); for (int attCount = 0; attCount < attFiles.Length; attCount++) attFileNames.Add(recId + "-" + attFiles[attCount]); } else attFileNames.Add(recId + "-" + value); LoadFilefromFolder(srcFilePath, destFilePath, attFileNames, recId); } } else { //If no DataRows are there, and the Tstruct is referring attachments through dc_image field if (fld.name.StartsWith("dc") && fld.name.ToLower().EndsWith("_image")) { DataTable dcTableRef = dsDataSet.Tables["dc" + dc.frameno]; for (int j = 0; j < dcTableRef.Rows.Count; j++) { string dcrefVal1 = dcTableRef.Rows[j]["dc" + dc.frameno + "_image"].ToString(); if (dcrefVal1.Contains("@")) { GetReferedFiles(dcrefVal1, hasImagePath); } } } } } else if (fld.name.StartsWith("axp_nga_")) { sessionid = HttpContext.Current.Session["nsessionid"].ToString(); TStructDef.DcStruct dc = (TStructDef.DcStruct)tstStrObj.dcs[fld.fldframeno - 1]; DataTable dcTable = dsDataSet.Tables["dc" + dc.frameno]; if (dcTable != null && dcTable.Rows.Count > 0) { string value = dcTable.Rows[0][fld.name].ToString(); string[] attFiles; attFileNames.Clear(); if (value.Contains(",")) { attFiles = value.Split(','); for (int attCount = 0; attCount < attFiles.Length; attCount++) attFileNames.Add(recId + "-" + attFiles[attCount]); } else attFileNames.Add(recId + "-" + value); string scrPath = scriptsPath + "axpert\\" + sessionid; string desFilePath = "", desFilePathOld = ""; if (imgAttachPath != "") { desFilePathOld = imgAttachPath + "\\axpert\\" + transID + "\\" + recId + "\\" + fld.name; desFilePath = imgAttachPath + "\\" + transID + "\\" + fld.name; } else { desFilePath = scriptsPath + "axpert\\" + transID + "\\" + fld.name; } string authenticationStatus = string.Empty; if (util.GetAuthentication(ref authenticationStatus)) { DirectoryInfo di = new DirectoryInfo(desFilePath); if (!di.Exists) di.Create(); FileInfo[] fileEntries = di.GetFiles(); //TODO: since the loop is breaking after the first loop, the i need not be incremented for (int k = 0; k < fileEntries.Length; k++) { FileInfo file = (FileInfo)fileEntries[k]; string imgName = file.Name.Substring(0, 13); if (imgName == recId) { string destValue = file.Name.Replace(imgName, recId); if (File.Exists(desFilePath + "\\" + destValue)) { imageFldSrc.Add(scrPath + "axpert\\" + sessionid + "\\" + destValue); LoadFilefromFolder(desFilePath, scrPath, attFileNames, recId); } else { DirectoryInfo diOld = new DirectoryInfo(desFilePathOld); if (diOld.Exists) { FileInfo[] fileEntriesOld = diOld.GetFiles(); //TODO: since the loop is breaking after the first loop, the i need not be incremented for (int j = 0; j < fileEntriesOld.Length; j++) { FileInfo fileOld = (FileInfo)fileEntriesOld[j]; imageFldSrc.Add(scrPath + "axpert\\" + sessionid + "\\" + fileOld.Name); LoadFilefromFolder(desFilePath, scrPath, attFileNames, recId); } } } break; } } } } } } } private string GetImgServerPath() { string grdAttPath = string.Empty; string imageServer = string.Empty; if (HttpContext.Current.Session["AxpImageServerGbl"] != null) { imageServer = HttpContext.Current.Session["AxpImageServerGbl"].ToString(); imageServer = imageServer.Replace(";bkslh", @"\"); } return imageServer; } private void LoadFilefromFolder(string fPath, string destFilePath, ArrayList attFileNames, string recId) { if (fPath != string.Empty) { DirectoryInfo di = new DirectoryInfo(fPath); if (!di.Exists) di.Create(); foreach (string fileName in attFileNames) { bool isFileCopied = false; FileInfo[] fileEntries = di.GetFiles(fileName); if (fileEntries != null && fileEntries.Length > 0) { FileInfo file = (FileInfo)fileEntries[0]; string[] fileVal = file.Name.Split(new[] { '-' }, 2); if (attFileNames.IndexOf(file.Name) != -1 && fileVal.Length > 1) { CopyFiles(fPath, destFilePath, file.Name, fileVal[1].ToString()); } else CopyFiles(fPath, destFilePath, file.Name, file.Name); isFileCopied = true; } else { string[] fileVal = fileName.Split(new[] { '-' }, 2); string worFlname = string.Empty; if (fileVal.Length > 1 && fileVal[0] == recId) worFlname = fileVal[1].ToString(); else worFlname = fileName; FileInfo[] fileEntrie = di.GetFiles(worFlname); if (fileEntrie != null && fileEntrie.Length > 0) { FileInfo file = (FileInfo)fileEntrie[0]; CopyFiles(fPath, destFilePath, file.Name, file.Name); isFileCopied = true; } } if (isFileCopied == false) { string[] fileVal = fileName.Split(new[] { '-' }, 2); string neFlname = string.Empty; if (fileVal.Length > 1 && fileVal[0] == recId) neFlname = fileVal[1].ToString(); else neFlname = fileName; AxGridAttNotExistList.Add(neFlname); } } } } private void GetReferedFiles(string dcfldValue, bool hasImagePath) { string destPath = scriptsPath + "axpert\\" + HttpContext.Current.Session["nsessionid"]; string fldValue = string.Empty; string folderPath = string.Empty; string destFname = string.Empty; string grdAttPath = string.Empty; string referRecid = string.Empty; string referfNames = string.Empty; string[] referfNameOnebyOne; try { string[] fldValues = dcfldValue.Split('@'); if (hasImagePath) { grdAttPath = GetImgServerPath(); for (int i = 0; i < fldValues.Length; i++) { //Eg:{@India\BLR\license.txt,release.txt} if (fldValues[i] != string.Empty) { string[] fValues = fldValues[i].Split('('); for (int indx = 0; indx < fValues.Length; indx++) { if (fValues[indx].ToString() != String.Empty) { string[] fvalue = fValues[indx].Split(','); } } folderPath = fldValues[i].Substring(0, fldValues[i].LastIndexOf("\\")); referfNames = fldValues[i].Substring(fldValues[i].LastIndexOf("\\") + 1); if (hasImagePath) grdAttPath = grdAttPath + "\\" + folderPath; } } } else { //Eg : {@MyDocs\transid\fieldname,recordid(filename1,f2,f3)} grdAttPath = HttpContext.Current.Session["grdAttPath"].ToString(); fldValue = dcfldValue.Substring(1, dcfldValue.Length - 1); fldValues = fldValue.Split(new[] { ',' }, 2); if (fldValues.Length > 1) { grdAttPath += "\\" + fldValues[0].ToString(); int nFileSIndex = fldValues[1].IndexOf("("); int nFileEIndex = fldValues[1].IndexOf(")") - 1; referfNames = fldValues[1].Substring(nFileSIndex + 1, nFileEIndex - nFileSIndex); referRecid = fldValues[1].Substring(0, nFileSIndex); } } //Copying Files to Session folder referfNameOnebyOne = referfNames.Split(','); for (int k = 0; k < referfNameOnebyOne.Length; k++) { if (referfNameOnebyOne[k] != "") if (hasImagePath) CopyFiles(grdAttPath, destPath, referfNameOnebyOne[k], referfNameOnebyOne[k]); else { destFname = referRecid + "-" + referfNameOnebyOne[k]; CopyFiles(grdAttPath, destPath, destFname, destFname); } } } catch (Exception ex) { } } #endregion //Function to check all images for the given record id and copy them to scripts folder. private void LoadImageToFolder(string fldName, string recId) { string tmpFldName = fldName;//.Substring(0, fldName.LastIndexOf("F") - 3); if (recId != "0") { sessionid = HttpContext.Current.Session["nsessionid"].ToString(); //scriptsPath += "axpert\\" + sessionid + "\\" + fldName; string scrPath = scriptsPath + "axpert\\" + sessionid + "\\" + fldName; string desFilePath = "", desFilePathOld = ""; if (imgAttachPath != "") { desFilePathOld = imgAttachPath + "\\axpert\\" + transID + "\\" + recId + "\\" + fldName; desFilePath = imgAttachPath + "\\" + transID + "\\" + fldName; } else { desFilePath = scriptsPath + "axpert\\" + transID + "\\" + fldName; //desFilePath = scriptsPath + "axpert\\" + transID + "\\" + recId + "\\" + fldName; } string authenticationStatus = string.Empty; if (util.GetAuthentication(ref authenticationStatus)) { DirectoryInfo di = new DirectoryInfo(desFilePath); if (!di.Exists) di.Create(); FileInfo[] fileEntries = di.GetFiles(); //TODO: since the loop is breaking after the first loop, the i need not be incremented for (int i = 0; i < fileEntries.Length; i++) { FileInfo file = (FileInfo)fileEntries[i]; //imageFldNames.Add(fldName); string imgName = file.Name.Substring(0, file.Name.LastIndexOf('.')); if (imgName == recId) { imageFldNames.Add(fldName); string destValue = file.Name.Replace(imgName, recId); if (File.Exists(desFilePath + "\\" + destValue)) { imageFldSrc.Add(scriptsPath + "axpert\\" + sessionid + "\\" + destValue); CopyFiles(desFilePath, scrPath, destValue, destValue); } else { DirectoryInfo diOld = new DirectoryInfo(desFilePathOld); if (diOld.Exists) { FileInfo[] fileEntriesOld = diOld.GetFiles(); //TODO: since the loop is breaking after the first loop, the i need not be incremented for (int j = 0; j < fileEntriesOld.Length; j++) { FileInfo fileOld = (FileInfo)fileEntriesOld[j]; imageFldNames.Add(fldName); imageFldSrc.Add(scriptsPath + "axpert\\" + sessionid + "\\" + fileOld.Name); CopyFiles(desFilePathOld, scrPath, fileOld.Name, fileOld.Name); } } } break; } } } } } //Get the row numbers for the given dc no from the field array private ArrayList GetGridRowsFromArray(string frmNo) { ArrayList gridRows = new ArrayList(); for (int k = 0; k < fieldControlName.Count; k++) { int fIndx = 0; fIndx = fieldControlName[k].ToString().LastIndexOf("F"); string frameNo = fieldControlName[k].ToString().Substring(fIndx + 1); string rowNo = fieldControlName[k].ToString().Substring(fIndx - 3, 3); if (frameNo == frmNo) { int index = -1; index = gridRows.IndexOf(rowNo); if (index == -1) gridRows.Add(rowNo); } } return gridRows; } //Function to get the concatenated string of parent field values in the pop grid dc. private string GetParentValues(string[] popParentFlds, string rowNo, string frmNo) { return DSGetParentValues(popParentFlds, rowNo, frmNo); } //Function to get the concatenated string of parent field values in the pop grid dc. private string DSGetParentValues(string[] popParentFlds, string rowNo, string frmNo) { string parFldVals = ""; for (int j = 0; j < popParentFlds.Length; j++) { double fldNumber; string popFielsName = "sub" + frmNo + "_" + popParentFlds[j].Trim(); string popFldValue = string.Empty; if (DSGetRow(rowNo, Convert.ToInt32(frmNo)).Table.Columns.Contains(popFielsName)) popFldValue = DSGetRow(rowNo, Convert.ToInt32(frmNo))[popFielsName].ToString(); else { popFielsName = "Sub" + frmNo + "_" + popParentFlds[j].Trim(); popFldValue = DSGetRow(rowNo, Convert.ToInt32(frmNo))[popFielsName].ToString(); } bool isNumber = double.TryParse(popFldValue, out fldNumber); if (isNumber == true) { double popVal = double.Parse(popFldValue); parFldVals += popVal.ToString(); } else { parFldVals += popFldValue; } } return parFldVals; } public DataRow DSGetRow(string rowNo, int dcNo) { if (dcNo == 0) return null; DataTable dt = dsDataSet.Tables["dc" + dcNo]; int rNo = Convert.ToInt32(rowNo); if (rNo == 0) rNo = 1; return dt.Rows.Find(rNo); } public DataRow DsGetRow(string fldName, string rowNo) { return DSGetRow(rowNo, tstStrObj.GetFieldDc(fldName)); } public void GetKeyColValues(int dcNo, ArrayList arrKeyCols, ArrayList keyRowNos) { DSGetKeyColValues(dcNo, arrKeyCols, keyRowNos); } private void DSGetKeyColValues(int dcNo, ArrayList arrKeyCols, ArrayList arrKeyRowNos) { DataTable dt = dsDataSet.Tables["dc" + dcNo]; foreach (DataRow dr in dt.Rows) { string keyValue = string.Empty; string keyRow = string.Empty; TStructDef.DcStruct dc = (TStructDef.DcStruct)tstStrObj.dcs[dcNo - 1]; keyValue = dr[dc.KeyColumn].ToString(); keyRow = dr["axp__rowno"].ToString(); int keyIndex = arrKeyCols.IndexOf(keyValue); if (keyIndex == -1) { arrKeyCols.Add(keyValue); arrKeyRowNos.Add(keyRow); } else { arrKeyRowNos[keyIndex] += "," + keyRow; } } } private int GetFldArrayIndex(string fieldName) { int index = -1; for (int cnt = 0; cnt < fieldControlName.Count; cnt++) { if (fieldControlName[cnt].ToString().ToLower() == fieldName.ToLower()) index = cnt; } return index; } private void DeleteDefaultRowInPopDc(string project, string user, string transid, string sessionId, string AxRole) { ArrayList deleteRows = new ArrayList(); bool isRowFound = false; for (int i = 0; i < tstStrObj.popdcs.Count; i++) { TStructDef.PopDcStruct popDc = (TStructDef.PopDcStruct)tstStrObj.popdcs[i]; string[] popParentFlds = popDc.pfields.Split(','); TStructDef.DcStruct dc = (TStructDef.DcStruct)tstStrObj.dcs[popDc.frameno - 1]; if (popDc.pFirm == "t" || !dc.DCHasDataRows) continue; int rowCount = GetDcRowCount(dc.frameno.ToString()); for (int k = 1; k < rowCount; k++) { for (int j = 0; j < popParentFlds.Length; j++) { string prefix = "sub"; string popFielsName = prefix + popDc.frameno + "_" + popParentFlds[j].Trim() + GetRowNoHelper(k.ToString()) + "F" + popDc.frameno; //int idx = GetFldIndex(dc.frameno, "sub" + popDc.frameno + "_" + popParentFlds[j].Trim(), k; DataRow dr = DsGetRow(prefix + popDc.frameno + "_" + popParentFlds[j].Trim(), k.ToString()); if (dr == null) { prefix = "Sub"; DsGetRow(prefix + popDc.frameno + "_" + popParentFlds[j].Trim(), k.ToString()); } if (dr != null) { string fldValue = dr[prefix + popDc.frameno + "_" + popParentFlds[j].Trim()].ToString(); if (fldValue == "" || fldValue == "***") { string rowNo = k.ToString(); if (rowNo != "-1") deleteRows.Add(rowNo + "F" + popDc.frameno); isRowFound = true; break; } } } if (isRowFound) { isRowFound = false; break; } } for (int dCnt = 0; dCnt < deleteRows.Count; dCnt++) { int fIdx = deleteRows[dCnt].ToString().IndexOf("F"); string delRowNo = deleteRows[dCnt].ToString().Substring(0, fIdx); string delDcNo = deleteRows[dCnt].ToString().Substring(fIdx + 1); if (GetDcRowCount(delDcNo) == 1 && delRowNo == "001") { TStructDef.DcStruct pdc = (TStructDef.DcStruct)tstStrObj.dcs[Convert.ToInt32(delDcNo) - 1]; pdc.DCHasDataRows = false; tstStrObj.dcs[Convert.ToInt32(delDcNo) - 1] = pdc; break; } DeleteRowInFldArrays(delDcNo, delRowNo); int tmpRowCnt = GetDcRowCount(delDcNo); tmpRowCnt = tmpRowCnt - 1; UpdateRowCount("DC" + delDcNo, "DC" + delDcNo + "~" + tmpRowCnt); } } } /// /// Function to be called to add group /// /// /// /// /// /// /// /// /// /// /// /// /// public string CallActionWS(TStructData tstData, ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList fldDeletedArray, ArrayList deletedFldArrayValues, string s, string f, string source, string delRows, string changedRows, string frameNo, string calledFrom = "false", bool isScript = false) { string news = GetTraceString(s); if (news != "") s = news; result = string.Empty; //GetGlobalVars(); string cngRows = GetChangedRows(changedRows); delRows = GetDelRowsNode(delRows); transid = tstData.transid.ToString(); ires = tstStrObj.structRes; frameNo = (Convert.ToInt32(frameNo) - 1).ToString(); tstData.GetFieldValueXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, frameNo, calledFrom, "ALL", ""); s += tstData.fieldValueXml + memVarsData + "" + delRows + cngRows; s += HttpContext.Current.Session["axApps"].ToString(); s += HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString() + ""; if (ires == null) ires = ""; if (isScript) { filename = "Script-" + transid; logobj.CreateLog("Call to RemoteDoScript Web Service", sessionid, filename, ""); //Call service objWebServiceExt = new ASBExt.WebServiceExt(); result = objWebServiceExt.callRemoteDoScriptWS(transid, s, ires, tstData.tstStrObj.WebServiceTimeout); } else { filename = "Action-" + transid; logobj.CreateLog("Call to RemoteDoAction Web Service", sessionid, filename, ""); //Call service objWebServiceExt = new ASBExt.WebServiceExt(); result = objWebServiceExt.CallRemoteDoActionWS(transid, s, ires, tstData.tstStrObj.WebServiceTimeout); } if (result != null) result = result.Split('♠')[1]; CheckSave(result, delRows, tstData, changedRows, deletedFldArrayValues); logobj.CreateLog("End Time : " + DateTime.Now.ToString(), sessionid, filename, ""); return result; } public string CallActionWS(TStructData tstData, ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList fldDeletedArray, ArrayList deletedFldArrayValues, string s, string f, string source, string delRows, string changedRows, string calledFrom = "false", StringBuilder files = null, bool isScript = false) { string news = GetTraceString(s); if (news != "") s = news; result = string.Empty; if (source == "t") { string imagefromdb = "false"; if (HttpContext.Current.Session["AxpSaveImageDb"] != null) imagefromdb = HttpContext.Current.Session["AxpSaveImageDb"].ToString(); if (s != string.Empty) s = s.Replace("" + delRows + cngRows; s += HttpContext.Current.Session["axApps"].ToString(); s += HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString() + ""; } else ires = ""; XmlDocument xmlDoc = new XmlDocument(); string newfilename = ""; if (f != "" && f.Contains("&")) { newfilename = f.Replace("&", "&"); s = s.Replace("__file=\"" + f.ToString() + "\"", "__file=\"" + newfilename.ToString() + "\"");//& } xmlDoc.LoadXml(s); XmlNode rootNode = xmlDoc.SelectSingleNode("//root"); if (rootNode != null) { if (rootNode.Attributes["actname"].Value != string.Empty) AxActiveAction = rootNode.Attributes["actname"].Value; } if (ires == null) ires = ""; if (isScript) { filename = "Script-" + transid; logobj.CreateLog("Call to RemoteDoScript Web Service", sessionid, filename, ""); //Call service objWebServiceExt = new ASBExt.WebServiceExt(); result = objWebServiceExt.callRemoteDoScriptWS(transid, s, ires, tstData.tstStrObj.WebServiceTimeout); } else { filename = "Action-" + transid; logobj.CreateLog("Call to RemoteDoAction Web Service", sessionid, filename, ""); //Call service objWebServiceExt = new ASBExt.WebServiceExt(); result = objWebServiceExt.CallRemoteDoActionWS(transid, s, ires, tstData.tstStrObj.WebServiceTimeout); } string requestProcess_logtime = result.Split('♠')[0]; result = result.Split('♠')[1]; //avoid special chars in result DURING notify if (result != "This proces taking time is more than expected. You will get a notification once completed") CheckSave(result, delRows, tstData, changedRows, deletedFldArrayValues, (files != null ? files.ToString() : "")); AxActiveAction = string.Empty; logobj.CreateLog("End Time : " + DateTime.Now.ToString(), sessionid, filename, ""); result = requestProcess_logtime + "♠" + result; return result; } private void CheckSave(string result, string delRows, TStructData tstData, string changedRows, ArrayList deletedFldArrayValues, string files = "") { if (result == "") return; result = result.Replace("\\", ";bkslh"); //To save the image fields in server folders, //the below code checks if the action was 'save' and copies the images to the folders. string returnStr = result.Replace("*$*", "¿"); string[] newResult = returnStr.Split('¿'); for (int i = 0; i < newResult.Length; i++) { if (newResult[i].ToString() == "") continue; JArray action; try { JObject actionresult = JObject.Parse(newResult[i].ToString()); action = (JArray)actionresult["command"]; } catch (Exception ex) { throw ex; } if (action != null) { string cmd = string.Empty; string cmdVal = string.Empty; string pname = string.Empty; string pvalue = string.Empty; string showin = string.Empty; string recId = string.Empty; string actionValue = string.Empty; for (int m = 0; m < action.Count; m++) { cmd = (string)action[m]["cmd"].ToString().Trim('"'); cmdVal = (string)action[m]["cmdval"].ToString().Trim('"'); if (cmd == "openiview") { pname = (string)action[m]["pname"].ToString().Trim('"'); pvalue = (string)action[m]["pvalue"].ToString().Trim('"'); showin = (string)action[m]["showin"].ToString().Trim('"'); AddParamsToSession(cmdVal, pname, pvalue, showin); } if (cmd == "action") actionValue = cmdVal; else if (cmd == "recid") recId = cmdVal; } if (actionValue.ToLower() == "save") { if (HttpContext.Current.Session["AxReloadCloud"] != null) { if (HttpContext.Current.Session["AxReloadCloud"].ToString() == transid) { try { HttpContext.Current.Session["IscloudRelogin"] = "true"; HttpContext.Current.Session["AxInternalRefresh"] = "true"; util.ClearAxpStructConfigInRedis(Constants.AXCONFIGGENERAL, "", "", "general", ""); } catch (Exception ex) { HttpContext.Current.Session["IscloudRelogin"] = "true"; HttpContext.Current.Session["AxInternalRefresh"] = "true"; logobj.CreateLog("Main Page Reload-" + ex.Message, sessionid, "MainPageReload", "new", "true"); } } } if (util.isRealTimeCacEnabled(transid, tstStrObj)) HttpContext.Current.Session["AxRelKeys"] = util.GetAxRelations(tstData.transid); else HttpContext.Current.Session["AxRelKeys"] = null; if (recId != string.Empty) { if (tstStrObj.AxpFileUploadFields.Count > 0) RemoveUnwantedAxpFiles(transid, recId, delRows, tstData, deletedFldArrayValues); //TStructDef strObj = cm.GetStructDef(project, sessionid, user, transid, AxRole); if (tstStrObj.ContainsImage) SaveImageToFolder(tstStrObj, transid, sessionid, recId, deletedFldArrayValues); if (tstStrObj.ContainsGridAttach) { try { string gridAttSaveResult = SaveGridAttachments(transid, sessionid, recId, delRows, tstData, changedRows, deletedFldArrayValues); } catch (Exception ex) { logobj.CreateLog("Error while SaveGridAttachments-" + ex.Message, sessionid, "SaveGridAttachments", "new", "true"); } } if (attachDir && (!string.IsNullOrEmpty(files) || removeFiles.Count > 0)) SaveAttached(files, recId); } RefFastDataOnSave(AxActiveAction); RefInMemOnSave(); } } } } private void RefFastDataOnSave(string taskName) { //If fast data refresh events are not empty FDW fobj = FDW.Instance; for (int i = 0; i < tstStrObj.fastDataRefEvent.Count; i++) { if (tstStrObj.fastDataRefEvent[i].ToString().Contains(taskName)) { //TODO: Push refresh in Fastdata string dsName = string.Empty; dsName = tstStrObj.fastDataRefDSName[i].ToString(); fobj.PushToDsRefresh(util.GetFastDataDSName(null, dsName)); //objfd.RefreshFastDataset(dsName); //Thread thread = new Thread(() => objfd.PushRefreshDs(dsName, user)); //thread.Start(); } } } private void AddParamsToSession(string ivName, string paramNames, string paramVals, string showIn) { string customIv = GetFieldValue("1", "axp_ivname"); if (customIv != "") ivName = customIv; if (paramNames.IndexOf("###") != -1) paramNames = paramNames.Replace("###", "¿"); if (paramVals.IndexOf("###") != -1) paramVals = paramVals.Replace("###", "¿"); string[] strParams = paramNames.Split('¿'); string[] strParamVals = paramVals.Split('¿'); var paramsStr = ""; int pCount = strParams.Length; Util.Util utilObj = new Util.Util(); if (pCount != 0) { var paraName = ""; var paraVal = ""; var fres = ""; for (var cmp = 0; cmp < pCount; cmp++) { paraName = strParams[cmp]; paraVal = strParamVals[cmp]; //paraVal = utilObj.CheckUrlSpecialChars(paraVal); paraVal = paraVal.Replace("=", "@eq@"); fres = paraName + "=" + paraVal; fres = fres.Replace("&", "--.--"); paramsStr = paramsStr + "&" + fres; } } if (showIn != "" && showIn == "pop") showIn = "&pop=true"; paramsStr = paramsStr + showIn; //HttpContext.Current.Session["AxActionParams" + ivName] = paramsStr; //HttpContext.Current.Session["IviewNavigationData-" + ivName] = paramsStr; ASB.WebService webService = new ASB.WebService(); webService.SetIviewNavigationData(paramsStr, ivName); } private string AddToken(string iXml) { string token = ""; token = util.GetToken(); HttpContext.Current.Session["axpToken"] = token; iXml = iXml.Replace(" IncludeDcRows = new Dictionary(); isDcGrid = IsDcGrid(frameNo, tstStrObj); logobj.CreateLog("Constructing input xml GetRapidDepFLd-field" + fld.name, sessionid, "GetRapidDep-" + transid, "new"); UpdateDataList(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray); DeleteDefaultRowInPopDc(project, user, transid, sessionid, AxRole); DSRapidFieldValueXML(frameNo, rowNo, fieldName, "RapidDep", fld); if (fld.FldRapidAllParents != string.Empty) inputXml += GetGlobalVarValues(fld.FldRapidAllParents); inputXml += tstData.fieldValueXml + memVarsData; inputXml += HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString(); inputXml += ""; //Call service objWebServiceExt = new ASBExt.WebServiceExt(); logobj.CreateLog("Input xml GetRapidDepFLd=" + inputXml, sessionid, "GetRapidDep-" + transid, ""); DateTime asStart = DateTime.Now; result = objWebServiceExt.CallGetRapidDepFldVals(transid, inputXml); logobj.CreateLog("RapidGetDepentendFieldValues Result=" + result, sessionid, "GetRapidDep-" + transid, ""); DateTime asEnd = DateTime.Now; if (logTimeTaken) { webTime1 = asStart.Subtract(stTime).TotalMilliseconds; webTime2 = DateTime.Now.Subtract(asEnd).TotalMilliseconds; asbTime = asEnd.Subtract(asStart).TotalMilliseconds; } return result; } private string GetGlobalVarValues(string parentFlds) { StringBuilder paramsNode = new StringBuilder(); paramsNode.Append(""); List paramFlds = parentFlds.Split(',').ToList(); for (int j = 0; j < paramFlds.Count; j++) { for (int i = 0; i < tstStrObj.lstGlobalParams.Count; i++) { string[] strVar = tstStrObj.lstGlobalParams[i].ToString().Split('='); string value = CheckSpecialChars(strVar[1].ToString()); string pName = paramFlds[j].ToString(); if (strVar[0].ToString() == pName) { paramsNode.Append("<" + pName + ">" + value + ""); } } } if (HttpContext.Current.Session["user"] != null) paramsNode.Append("" + HttpContext.Current.Session["user"].ToString() + ""); paramsNode.Append(""); return paramsNode.ToString(); } public string CallGetDepFldWS(TStructData tstData, ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList fldDeletedArray, string s, string frameNo, string rowNo, string fieldName, string subGridInfo, string parentInfo) { DateTime stTime = DateTime.Now; string news = GetTraceString(s); if (news != "") s = news; string result = null; transid = tstData.transid.ToString(); ires = tstStrObj.structRes; AxActDepField = fieldName; int idx = tstStrObj.GetFieldIndex(fieldName); TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[idx]; ArrayList AxDepFields = new ArrayList(); bool isDcGrid = false; Dictionary IncludeDcRows = new Dictionary(); isDcGrid = IsDcGrid(frameNo, tstStrObj); if (isDcGrid) { string DepFlds = fld.fieldSqlDepParents; AxDepFields = GetParDepFlds(fld.fieldSqlDepParents); } if (fld.fieldSqlGridDeps != string.Empty) { string[] strSDeps = fld.fieldSqlGridDeps.Split(','); for (int i = 0; i < strSDeps.Length; i++) { AxDepFields.Add(strSDeps[i].ToString()); } //The below statement will add the current field to the dependent fields if the current dc is a grid dc //and it has dependents in other grid, then all the row values for the field should be sent in the input xml. if (isDcGrid) AxDepFields.Add(fld.name); } //If the field has non grid sql dependents, then send the parent values for that dep field also if (IsDcGrid(frameNo, tstStrObj)) { //If the call is made from a parent grid, then all its subgriud and their respective rows for the given parent row //will be sent in the given format: dcno~rowno1,rowno2¿dcno~rowno1,rowno2... if (subGridInfo != "") { if (subGridInfo.IndexOf("¿") != -1) { string[] subgridDcs = subGridInfo.Split('¿'); for (int i = 0; i < subgridDcs.Length; i++) { if (subgridDcs[i] != string.Empty) { string[] dcInfo = subgridDcs[i].ToString().Split('~'); IncludeDcRows.Add(dcInfo[0], dcInfo[1]); } } } else { IncludeDcRows.Add(subGridInfo.Substring(0, subGridInfo.IndexOf("~")), subGridInfo.Substring(subGridInfo.IndexOf("~") + 1)); } } //If the call is made from sub grid, then the parentinfo will contain the parent dc no and parent row no in the given format : dcno~rowno if (parentInfo != "") { IncludeDcRows.Add(parentInfo.Substring(0, parentInfo.IndexOf("~")), parentInfo.Substring(parentInfo.IndexOf("~") + 1)); } //first update the list with the new fldArray. UpdateDataList(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray); DeleteDefaultRowInPopDc(project, user, transid, sessionid, AxRole); CreateFieldValueXmlPerf(frameNo, rowNo, AxDepFields, fld.fieldDepGridDcs, IncludeDcRows, ""); //Refer bug - AGI003591 //This function was converting the last invalid row to valid row //UpdateGridDelRowVal(int.Parse(frameNo)); s += tstData.fieldValueXml; } else { if (AxDepFields.Count > 0) { //if a non grid fields has dependent grid dc fields, then send that dc fields data also. //first update the list with the new fldArray. UpdateDataList(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray); DeleteDefaultRowInPopDc(project, user, transid, sessionid, AxRole); CreateFieldValueXmlPerf(frameNo, rowNo, AxDepFields, fld.fieldDepGridDcs, IncludeDcRows, ""); s += tstData.fieldValueXml; } else { //if (fld.fieldDepFillDcs != string.Empty) //{ // string[] depFillDcs = fld.fieldDepFillDcs.Split(','); // for (int dIdx = 0; dIdx < depFillDcs.Length; dIdx++) // { // TStructDef.DcStruct depDc = (TStructDef.DcStruct)tstStrObj.dcs[Convert.ToInt32(depFillDcs[dIdx].ToString()) - 1]; // } //} //if a non grid fields has dependent grid Fill grid dc, then send that dc data also. //TODO: this condition should not send all the fillgrid dep dc data tstData.GetFieldValueXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, "-1", "GetDependents", "NG", fld.fieldDepFillDcs); s += tstData.fieldValueXml; } } s += memVarsData; s += HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString(); s += ""; //Call service objWebServiceExt = new ASBExt.WebServiceExt(); DateTime asStart = DateTime.Now; result = objWebServiceExt.CallGetDepentendFieldValuesWS(transid, s, ires); DateTime asEnd = DateTime.Now; if (logTimeTaken) { webTime1 = asStart.Subtract(stTime).TotalMilliseconds; webTime2 = DateTime.Now.Subtract(asEnd).TotalMilliseconds; asbTime = asEnd.Subtract(asStart).TotalMilliseconds; } return result; } public string CallGetDepFldPerfWS(TStructData tstData, ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList fldDeletedArray, ArrayList regVarFldList, string s, string frameNo, string rowNo, string perfDepFldName, string fieldName, string subGridInfo, string parentInfo) { DateTime stTime = DateTime.Now; string news = GetTraceString(s); if (news != "") s = news; string result = null; transid = tstData.transid.ToString(); AxActDepField = fieldName; ires = tstStrObj.structRes; tstData.GetPerfFieldValueXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, "-1", "GetDependents", "NG", ""); string imagefromdb = "false"; if (HttpContext.Current.Session["AxpSaveImageDb"] != null) imagefromdb = HttpContext.Current.Session["AxpSaveImageDb"].ToString(); if (s != string.Empty) s = s.Replace(" 0) { string regVarXml = ""; try { foreach (var varVal in regVarFldList) { regVarXml += "<" + varVal.ToString().Split(':')[0] + " t='" + varVal.ToString().Split(':')[1] + "'>" + varVal.ToString().Split(':')[2] + ""; } } catch (Exception ex) { } s += regVarXml; } s += HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString(); s += ""; //Call service objWebServiceExt = new ASBExt.WebServiceExt(); DateTime asStart = DateTime.Now; result = objWebServiceExt.CallGetDepentendFieldValuesWS(transid, s, ires); DateTime asEnd = DateTime.Now; if (logTimeTaken) { webTime1 = asStart.Subtract(stTime).TotalMilliseconds; webTime2 = DateTime.Now.Subtract(asEnd).TotalMilliseconds; asbTime = asEnd.Subtract(asStart).TotalMilliseconds; } return result; } public string PerfGetDepFldInput(string fieldName, string perfDepFldName, string frameNo, string rowNo) { string inputFldXML = string.Empty; try { int dfIndx = tstStrObj.GetFieldIndex(fieldName); TStructDef.FieldStruct dfld = (TStructDef.FieldStruct)tstStrObj.flds[dfIndx]; string[] parentFlds = dfld.fieldParents.Replace("~", ",").Split(',');// a66 node of dependent field string[] parentDcFlds = new string[] { }; if (perfDepFldName.StartsWith("dc")) { try { int dcFrame = int.Parse(perfDepFldName.Substring(2)); TStructDef.DcStruct pfldDc = (TStructDef.DcStruct)tstStrObj.dcs[dcFrame - 1]; if (pfldDc.dcPList != "") parentDcFlds = pfldDc.dcPList.Replace("~", ",").Split(','); } catch (Exception ex) { } } string[] lstparentFlds = parentFlds.Union(parentDcFlds).ToArray(); string globalVars = HttpContext.Current.Session["axGlobalVars"].ToString(); string userVars = HttpContext.Current.Session["axUserVars"].ToString(); TStructDef.DcStruct dfldDc = (TStructDef.DcStruct)tstStrObj.dcs[dfld.fldFrameNo - 1]; for (int i = 0; i < lstparentFlds.Length; i++) { int arNumber = 0; int pIndx = tstStrObj.GetFieldIndex(lstparentFlds[i]); if (pIndx == -1) { if (globalVars.ToLower().IndexOf("<" + lstparentFlds[i].ToLower() + ">") > -1) continue; else if (userVars.ToLower().IndexOf("<" + lstparentFlds[i].ToLower() + ">") > -1) continue; else continue; } TStructDef.FieldStruct pfld = (TStructDef.FieldStruct)tstStrObj.flds[pIndx]; TStructDef.DcStruct pfldDc = (TStructDef.DcStruct)tstStrObj.dcs[pfld.fldFrameNo - 1]; //if (pfld.fldFrameNo == dfld.fldFrameNo && dfldDc.isgrid) // Dependent & Parent fields both are in same dc and the dc is grid dc should take active row only // arNumber = int.Parse(rowNo); if (pfldDc.isgrid && pfldDc.DCHasDataRows)// Grid dc field should have 1 row minimum else the field not required in input inputFldXML += PerfGetDepFldValues(pfld.fldFrameNo, arNumber, "GetDep", pfld); else if (!pfldDc.isgrid)// Should take all the non grid dc fields following teh parents. inputFldXML += PerfGetDepFldValues(pfld.fldFrameNo, arNumber, "GetDep", pfld); } } catch (Exception ex) { logobj.CreateLog("PerfGetDepFldInput function -" + ex.Message, sessionid, "Exception-" + transid, ""); } return inputFldXML; } private string PerfGetDepFldValues(int dcNo, int arNumber, string calledFrom, TStructDef.FieldStruct fld = new TStructDef.FieldStruct()) { string iXml = string.Empty; TStructDef.DcStruct pfldDc = (TStructDef.DcStruct)tstStrObj.dcs[dcNo - 1]; DataTable thisDataTable = dsDataSet.Tables["dc" + dcNo]; string dcNumber = dcNo.ToString(); string isGrdVld = string.Empty; foreach (DataRow dr in thisDataTable.Rows) { int rowNo = Convert.ToInt32(dr["axp__rowno"]); if (pfldDc.isgrid)//Refer Bug:AGI004107 isGrdVld = dr["axp__isGrdVld" + dcNo].ToString(); if (isGrdVld != "false") { DataTable dtOld = dsDataSet.Tables["dc_old" + dcNo]; DataRow drOld = dtOld.Rows.Find(rowNo); string value = string.Empty; string oldValue = string.Empty; string idValue = string.Empty; string oldIdValue = string.Empty; value = dr[fld.name].ToString(); if (fld.savenormal) idValue = dr["id__" + fld.name].ToString(); if (drOld != null) { oldValue = drOld["old__" + fld.name].ToString(); if (fld.savenormal) oldIdValue = drOld["oldid__" + fld.name].ToString(); } iXml += WsPerfFieldToXML(fld.name, Convert.ToString(rowNo), value, oldValue, idValue, oldIdValue, dcNumber, fld.savenormal, fld); } } return iXml; } public string CallRefreshDc(ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList fldDeletedArray, string iXml, string frameNo, string includeDcs) { string strTrace = GetTraceString(iXml); if (strTrace != "") iXml = strTrace; string result = string.Empty; ires = tstStrObj.structRes; GetFieldValueXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, "-1", "RefreshDc", "NG", includeDcs); iXml += fieldValueXml + memVarsData; iXml += HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString(); iXml += ""; //Call service objWebServiceExt = new ASBExt.WebServiceExt(); result = objWebServiceExt.CallRefreshDc(iXml, ires); return result; } private ArrayList GetParDepFlds(string depStr) { ArrayList arrDeps = new ArrayList(); string[] depFlds = depStr.Split(','); for (int i = 0; i < depFlds.Length; i++) { arrDeps.Add(depFlds[i].ToString()); } return arrDeps; } public string GetVisibleFormatGridsHtml(TStructDef strObj, string visibleDCsStr) { string[] visibleDCs = visibleDCsStr.Split(','); StringBuilder strDcHtml = new StringBuilder(); for (int i = 0; i < visibleDCs.Length; i++) { string dcStr = visibleDCs[i].ToString().Substring(2); int dcNo = Convert.ToInt32(dcStr); if (depFormatDcs.IndexOf(dcStr) != -1 && ChangedDcs.IndexOf(dcStr) != -1) try { strDcHtml.Append(strObj.GetTabDcHTML(dcNo, this, "false")); } catch (Exception ex) { } } return strDcHtml.ToString(); } public string CallMsFillGrid(TStructData tstData, ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList fldDeletedArray, string frameNo, string s, string paramXml, string fgName) { string news = GetTraceString(s); if (news != "") s = news; string result = null; //GetGlobalVars(); transid = tstData.transid.ToString(); ires = tstStrObj.structRes; tstData.GetFieldValueXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, "-1", "FillGrid", "NG", ""); s += tstData.fieldValueXml + memVarsData; s += HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString(); s += ""; #region Data cache in session //var dcFsg = tstStrObj.fgs.Cast().Where(f => f.fgtargetdc == ("dc" + frameNo) && f.fgName == fgName).ToList(); //string fgSqlParam = string.Empty, fgSqlParamVal = string.Empty; //if (dcFsg.Count > 0) //{ // TStructDef.FGStruct fg = ((TStructDef.FGStruct)dcFsg[0]); // fgSqlParam = fg.fgSqlParams; // if (fgSqlParam != string.Empty) // { // XmlDocument xml = new XmlDocument(); // xml.LoadXml(s.ToLower()); // foreach (var name in fgSqlParam.Split(',')) // { // var xnList = xml.SelectNodes("/sqlresultset/" + name); // foreach (XmlNode text in xnList) // fgSqlParamVal += "~" + name + ":" + text.InnerText.ToLower(); // } // } //} //if (HttpContext.Current.Session["FillGrid-" + transid + "-" + fgName + "-" + fgSqlParamVal] != null) // result = HttpContext.Current.Session["FillGrid-" + transid + "-" + fgName + "-" + fgSqlParamVal].ToString(); //else //{ // //Call service // objWebServiceExt = new ASBExt.WebServiceExt(); // result = objWebServiceExt.CallGetFillGridValuesWS(transid, s, ires); // HttpContext.Current.Session["FillGrid-" + transid + "-" + fgName + "-" + fgSqlParamVal] = result; //} #endregion //Call service objWebServiceExt = new ASBExt.WebServiceExt(); result = objWebServiceExt.CallGetFillGridValuesWS(transid, s, ires); return result; } public string GetCacheFileRecId(string recId) { string recIddataJson = "{\"data\": ["; recIddataJson += "{\"n\":\"DC1\",\"v\":\"1\",\"t\":\"dc\"},{\"n\":\"recid\",\"v\":\"" + recId + "\",\"r\":\"0\",\"t\":\"s\"}]}"; DSSubmit("recid", 0, recId, ""); return recIddataJson; } /// /// Function to return the Fill pop up html for the format fill grid. /// /// /// /// /// /// public string ConstructFormatFillGrid(string result, TStructDef strObj, string dcNo, string src) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(result); int m = 0; string fgRows = ""; string cRows = ""; string headRow = ""; string chkboxVal = ""; int colcount = 0; string fgHTML = string.Empty; XmlNodeList headNodes; int rowCnt = 0; string firstColValue = string.Empty; headNodes = xmlDoc.SelectNodes("//response/row"); TStructDef.DcStruct dc = ((TStructDef.DcStruct)(strObj.dcs[Convert.ToInt32(dcNo) - 1])); foreach (XmlNode resNode in headNodes) { colcount = 0; rowCnt = rowCnt + 1; XmlNodeList headers = resNode.ChildNodes; foreach (XmlNode hdrNode in headers) { colcount = colcount + 1; string selColName = hdrNode.Name.ToLower(); int hIndex = dc.HideColumns.IndexOf(selColName); if (hIndex == -1 && selColName != "nselection" && selColName != "cselection" && selColName != "dselection") { if (rowCnt == 1) { headRow = headRow + "" + hdrNode.Name + ""; } cRows = cRows + ""; } if (selColName.ToLower() == dc.MapColumn) { firstColValue = hdrNode.InnerText; } if (dc.Action != "") { if (selColName.Substring(1, selColName.Length - 1) == "selection") { if (chkboxVal == "") chkboxVal = selColName + "♣" + hdrNode.InnerText; else chkboxVal += "¿" + selColName + "♣" + hdrNode.InnerText; } } else { if (selColName == dc.KeyColumn) { if (chkboxVal == "") chkboxVal = selColName + "♣" + hdrNode.InnerText; else chkboxVal += "¿" + selColName + "♣" + hdrNode.InnerText; } } } string keyColName = dc.KeyColumn; if (dc.MapParentCol != string.Empty) keyColName = dc.MapParentCol; else keyColName = dc.KeyColumn; if (firstColValue != "" && IsDupKeyColValue(keyColName, dcNo, firstColValue)) { fgRows = fgRows + "" + cRows + ""; } else fgRows = fgRows + "" + cRows + ""; cRows = ""; chkboxVal = ""; } if (fgRows.ToString() != "") { if (src == "add") //fgHTML = "
" + headRow + "" + fgRows + "
"; fgHTML = "
" + headRow + "" + fgRows + "
"; else //fgHTML = "
" + headRow + "" + fgRows + "
"; fgHTML = "
" + headRow + "" + fgRows + "
"; if (src == "add") fgHTML += "
"; else { if (dc.Action == "") fgHTML += "
"; else fgHTML += "
"; } } else fgHTML = ""; return fgHTML; } /// /// Function to check if the key column value already exists in the field arrays. /// /// /// /// /// public bool IsDupKeyColValue(string keyColName, string dcNo, string currFldvalue) { bool IsDupValue = false; int rCnt = GetDcRowCount(dcNo); for (int i = 1; i <= rCnt; i++) { string FldValue = string.Empty; if (DSGetRow(i.ToString(), Convert.ToInt32(dcNo))[keyColName] != null) FldValue = DSGetRow(i.ToString(), Convert.ToInt32(dcNo))[keyColName].ToString(); if (FldValue == currFldvalue) { IsDupValue = true; break; } } return IsDupValue; } /// /// Function to return the index of the fill grid from the fill grid struct. /// /// /// private int GetDcFillGridIndex(string dcName, string fillGridName) { if (fillGridName == string.Empty) { for (int i = 0; i < tstStrObj.fgs.Count; i++) { TStructDef.FGStruct fg = (TStructDef.FGStruct)tstStrObj.fgs[i]; if (fg.fgtargetdc.ToLower() == dcName.ToLower()) { return i; } } } else { for (int i = 0; i < tstStrObj.fgs.Count; i++) { TStructDef.FGStruct fg = (TStructDef.FGStruct)tstStrObj.fgs[i]; if (fg.fgName.ToLower() == fillGridName.ToLower()) { return i; } } } return -1; } /// /// Function to construct the fill grid pop up html for the given dc. /// /// /// /// /// /// /// public string ConstructFillGrid(string iXml, string dcNo, string fgName, TStructDef strObj, TStructData tstData, string src, string expResult) { string fgHTML = ""; expResult = expResult.ToLower(); string chkChecked = string.Empty; if (expResult == "t" || expResult == "true") //TODO: to avoid default selection of all items, we have made it unchecked always //chkChecked = "checked"; chkChecked = ""; else chkChecked = ""; if (iXml.Contains(Constants.ERROR)) { string errMsg = tstData.GetErrorInResultJson(iXml); if (errMsg != "") fgHTML = ""; else fgHTML = ""; } else { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(iXml); int m = 0; string fgRows = ""; bool allrowSelected = false; string cRows = ""; string headRow = ""; string chkboxVal = ""; string fgtlhw = ""; int colcount = 0; XmlNodeList headNodes; List headerCaption = new List(); List headerNode = new List(); int hdrCnt = 0; headNodes = xmlDoc.SelectNodes("//response/headrow"); foreach (XmlNode resNode in headNodes) { if (resNode.Attributes["tlhw"] != null) { fgtlhw = resNode.Attributes["tlhw"].Value; } XmlNodeList headers = resNode.ChildNodes; foreach (XmlNode hdrNode in headers) { for (int i = 0; i < strObj.fgs.Count; i++) { TStructDef.FGStruct fg = (TStructDef.FGStruct)strObj.fgs[i]; if (fg.fgtargetdc == "dc" + dcNo && fg.fgName == fgName) { string colWidth = "50"; if (hdrNode.Attributes["width"] != null) { colWidth = hdrNode.Attributes["width"].Value; } // string colWidth = strObj.GetColumnWidth(dcNo, fg.fgDcFldName[j].ToString()); //string colWidth = strObj.GetColumnWidth(dcNo, hdrNode.Name); if (!string.IsNullOrEmpty(hdrNode.InnerText) && (hdrNode.InnerText.ToLower() == "hide" || hdrNode.InnerText.ToLower().StartsWith("hide_"))) headRow = headRow + "" + hdrNode.InnerText + ""; else headRow = headRow + "" + hdrNode.InnerText + ""; headerCaption.Add(hdrNode.InnerText); headerNode.Add(hdrNode.Name); hdrCnt++; break; } } } } DataTable fgData = dsDataSet.Tables["dc" + dcNo]; XmlNodeList dataNodes; dataNodes = xmlDoc.SelectNodes("//response/row"); string fgCondition = string.Empty; //APPEND foreach (XmlNode dataNode in dataNodes) { XmlNodeList baseDataNodes = dataNode.ChildNodes; ArrayList ExitFld = new ArrayList(); ArrayList ExitFldVal = new ArrayList(); foreach (XmlNode baseDataNode in baseDataNodes) { colcount = colcount + 1; for (int i = 0; i < strObj.fgs.Count; i++) { TStructDef.FGStruct fg = (TStructDef.FGStruct)strObj.fgs[i]; if (fg.fgtargetdc == "dc" + dcNo && fg.fgName == fgName) { fgCondition = fg.FGCondition; string strVal = CheckSpecialChars(baseDataNode.InnerText); for (int j = 0; j < fg.fgSqlFldName.Count; j++) { if (fg.fgSqlFldName[j].ToString().ToLower() == baseDataNode.Name.ToLower()) { ExitFld.Add(fg.fgDcFldName[j]); ExitFldVal.Add(strVal); break; } } if (headerNode.IndexOf(baseDataNode.Name) != -1 && !string.IsNullOrEmpty(headerCaption[headerNode.IndexOf(baseDataNode.Name)]) && (headerCaption[headerNode.IndexOf(baseDataNode.Name)].ToLower() == "hide" || headerCaption[headerNode.IndexOf(baseDataNode.Name)].ToLower().StartsWith("hide_"))) cRows = cRows + ""; else cRows = cRows + ""; if (fg.fgSqlFldName.IndexOf(baseDataNode.Name.ToLower()) != -1) { if (chkboxVal == "") chkboxVal = baseDataNode.Name + "♣" + strVal; else chkboxVal += "¿" + baseDataNode.Name + "♣" + strVal; } } } } if (fgData.Rows.Count > 0 && fgCondition == "APPEND") { bool rowExit = false; var fgData1 = fgData; for (int i = 0; i < ExitFld.Count; i++) { try { fgData1 = fgData1.AsEnumerable().Where(r => r.Field(ExitFld[i].ToString()) == ExitFldVal[i].ToString()).CopyToDataTable(); rowExit = true; } catch (Exception ex) { rowExit = false; break; } } if (!rowExit) fgRows = fgRows + "" + cRows + ""; else allrowSelected = true; } else fgRows = fgRows + "" + cRows + ""; cRows = ""; chkboxVal = ""; } if (fgRows.ToString() != "") { //fgHTML = "
" + headRow + "" + fgRows + "
"; fgHTML = "
" + headRow + "" + fgRows + "
"; fgHTML += "
"; fgHTML += "*♠*" + fgtlhw; } else if (allrowSelected) fgHTML = ""; else fgHTML = ""; } return fgHTML; } /// /// Function to get the fill grid data for the selected rows in the fill grid pop up. /// /// /// /// /// /// /// /// /// public string CallGetFillGridWS(TStructData tstData, ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList fldDeletedArray, string frameNo, string s) { DateTime stTime = DateTime.Now; string result = null; string dcNo = frameNo; //GetGlobalVars(); frameNo = Convert.ToString(Convert.ToInt32(frameNo) + 1); transid = tstData.transid.ToString(); ires = tstStrObj.structRes; //tstData.GetFieldValueXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, frameNo, "FillGrid", "NG", dcNo); tstData.GetPerfFieldValueXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, frameNo, "FillGrid", "NG", dcNo); s += "" + WsPerfAddRowLoadDc(dcNo, "FillGrid") + memVarsData + "" + HttpContext.Current.Session["axApps"].ToString(); s += HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString() + ""; //Call service objWebServiceExt = new ASBExt.WebServiceExt(); DateTime asStart = DateTime.Now; string isRapidCall = "false"; if ((HttpContext.Current.Session["RapidTsTruct"] != null && HttpContext.Current.Session["RapidTsTruct"].ToString() == "true") && (HttpContext.Current.Session["AxIsPerfCode"] != null && HttpContext.Current.Session["AxIsPerfCode"].ToString().ToLower() == "true")) isRapidCall = "true"; if (isRapidCall == "true") { s = AddToken(s); result = objWebServiceExt.CallRapidDoFillGridValuesWS(transid, s); } else { result = objWebServiceExt.CallDoFillGridValuesWS(transid, s, ires); } DateTime asEnd = DateTime.Now; if (logTimeTaken) { webTime1 = asStart.Subtract(stTime).TotalMilliseconds; webTime2 = DateTime.Now.Subtract(asEnd).TotalMilliseconds; asbTime = asEnd.Subtract(asStart).TotalMilliseconds; } return result; } public string CallCreatePDFWS(string s) { string news = GetTraceString(s); if (news != "") s = news; s = s + HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString() + ""; string result = null; //Call service objWebServiceExt = new ASBExt.WebServiceExt(); result = objWebServiceExt.CallCreatePDFWS(transid, s); return result; } public string CallCreateFastPDFWS(string s) { string news = GetTraceString(s); if (news != "") s = news; s += HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString() + ""; string result = null; //Call service objWebServiceExt = new ASBExt.WebServiceExt(); result = objWebServiceExt.CallCreateFastPDFWS(transid, s, tstStrObj.structRes); return result; } public string CallViewAttachWS(string s, string structXml) { string result = string.Empty; //Call service objWebServiceExt = new ASBExt.WebServiceExt(); try { if (attachDir) result = GetViewAttachment(s); if (result == string.Empty) result = objWebServiceExt.CallViewAttachmentsWS(transid, s, structXml); if (result != string.Empty) { JObject res = null; JArray command = null; try { res = JObject.Parse(result); command = (JArray)res["command"]; JObject item = (JObject)command[0]; item.Add(new JProperty("isatt", "T")); result = res.ToString(); } catch (Exception ex) { result = ex.Message; } } } catch (Exception ex) { result = ex.Message; } return result; } //copy files from local to script public string GetViewAttachment(string inputXML) { string result = string.Empty; //CommonDir directory creation taken back due to application server memory usage. //if (!attachDirPath.Contains(":\\") && !attachDirPath.StartsWith("\\")) //{ // CreateDirectoryInCommonDir(ref attachDirPath); //} XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(inputXML); XmlNode rootNode = default(XmlNode); rootNode = xmlDoc.SelectSingleNode("root"); string fname = string.Empty; if (rootNode.Attributes["filename"] != null) fname = rootNode.Attributes["filename"].Value; else return result; string srcPath = attachDirPath + "\\" + transid + "\\"; DirectoryInfo tarDir = new DirectoryInfo(scriptsPath + "Axpert\\" + sessionid); DirectoryInfo sPath = new DirectoryInfo(srcPath); try { if (!tarDir.Exists) tarDir.Create(); if (sPath.Exists) { string[] sFileName = Directory.GetFiles(srcPath, recordid + "-" + fname); string authenticationStatus = string.Empty; if (util.GetAuthentication(ref authenticationStatus)) { foreach (var file in sFileName) { string fileName = Path.GetFileName(file); File.Copy(file, Path.Combine(tarDir.ToString(), fileName.Substring(fileName.IndexOf("-") + 1)), true); } } result = "{\"command\":[{\"cmd\":\"openfile\",\"cmdval\":\"" + fname + "\"}]}"; } } catch (Exception ex) { result = ex.Message; } return result; } //Remove the file from dir public string RemoveAttachFromDir(string inputXML) { string myPath = attachDirPath + "\\" + transid + "\\"; string result = string.Empty; DirectoryInfo dir = new DirectoryInfo(myPath); if (inputXML != string.Empty) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(inputXML); XmlNode rootNode = default(XmlNode); rootNode = xmlDoc.SelectSingleNode("root"); string fname = string.Empty; if (rootNode.Attributes["filename"] != null) fname = rootNode.Attributes["filename"].Value; else return result; if (dir.Exists && !string.IsNullOrEmpty(fname)) { removeFiles.Add(recordid + "-" + fname); result = "{\"message\":[{\"msg\":\"done\"}]}"; } return result; } else { try { if (dir.Exists) dir.Delete(true); return result; } catch { return result; } } } public string RemoveAttachFromServer(string inputXML, string stransId) { string result = string.Empty; XmlDocument xml = new XmlDocument(); xml.LoadXml(inputXML); XmlElement root = xml.DocumentElement; string recordid = string.Empty; if (root.HasAttribute("recordid")) recordid = root.GetAttribute("recordid"); if (imgAttachPath != "" && recordid != "0") { for (int i = 0; i < tstStrObj.flds.Count; i++) { TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[i]; if (fld.fieldIsImage) { if (!IsDcGrid(fld.fldframeno.ToString(), tstStrObj) && !fld.name.StartsWith("axp_nga_")) { string strDest = imgAttachPath + "\\" + transid + "\\" + fld.name; string authenticationStatus = string.Empty; if (util.GetAuthentication(ref authenticationStatus)) { DirectoryInfo di = new DirectoryInfo(strDest); if (di.Exists) { FileInfo[] files = di.GetFiles(); if (files.Length > 0) { var ImgExist = files.Where(x => x.Name.Split('.')[0] == recordid).ToList(); if (ImgExist.Count > 0) { foreach (var lstImg in ImgExist) { FileInfo file = (FileInfo)lstImg; file.Delete(); } } } } } } else if (fld.name.StartsWith("axp_nga_")) { string strDest = imgAttachPath + "\\" + transid + "\\" + fld.name; string authenticationStatus = string.Empty; if (util.GetAuthentication(ref authenticationStatus)) { DirectoryInfo di = new DirectoryInfo(strDest); if (di.Exists) { FileInfo[] files = di.GetFiles(); if (files.Length > 0) { var ImgExist = files.Where(x => x.Name.StartsWith(recordid + "-")).ToList(); if (ImgExist.Count > 0) { foreach (var lstImg in ImgExist) { FileInfo file = (FileInfo)lstImg; file.Delete(); } } } } } } } if ((fld.name.StartsWith("dc") && fld.name.ToLower().EndsWith("_image") || fld.name.StartsWith("axp_gridattach_")) && IsDcGrid(fld.fldframeno.ToString(), tstStrObj)) { TStructDef.DcStruct dc = (TStructDef.DcStruct)tstStrObj.dcs[fld.fldframeno - 1]; string fldName = fld.name; string grdAttPath = HttpContext.Current.Session["grdAttPath"].ToString(); if (dc.DCHasDataRows && grdAttPath != string.Empty) { if (!grdAttPath.EndsWith("\\")) grdAttPath = grdAttPath + "\\"; string destFilePath = destFilePath = grdAttPath + "\\" + stransId + "\\" + fld.name; string authenticationStatus = string.Empty; if (util.GetAuthentication(ref authenticationStatus)) { DirectoryInfo di = new DirectoryInfo(destFilePath); if (di.Exists) { FileInfo[] files = di.GetFiles(); if (files.Length > 0) { var ImgExist = files.Where(x => x.Name.StartsWith(recordid + "-")).ToList(); if (ImgExist.Count > 0) { foreach (var lstImg in ImgExist) { FileInfo file = (FileInfo)lstImg; file.Delete(); } } } } } } } } } if (attachDirPath != "" && recordid != "0") { string strDest = imgAttachPath + "\\" + stransId; DirectoryInfo di = new DirectoryInfo(strDest); if (di.Exists) { FileInfo[] files = di.GetFiles(); if (files.Length > 0) { var ImgExist = files.Where(x => x.Name.StartsWith(recordid + "-")).ToList(); if (ImgExist.Count > 0) { foreach (var lstImg in ImgExist) { FileInfo file = (FileInfo)lstImg; file.Delete(); } } } } } return result; } public string CallRemoveAttachWS(string s, string structXml) { string news = GetTraceString(s); if (news != "") s = news; s = s + HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString() + ""; string result = null; //Call service objWebServiceExt = new ASBExt.WebServiceExt(); s = util.CheckReverseUrlSpecialChars(s); if (attachDir) result = RemoveAttachFromDir(s); if (string.IsNullOrEmpty(result)) result = objWebServiceExt.CallRemoveAttachmentsWS(transid, s, structXml); return result; } //This function creates new directories inside the 'CommonDir' folder in web server. public void CreateDirectoryInCommonDir(ref String dirPath) { dirPath = AppDomain.CurrentDomain.BaseDirectory + "CommonDir\\" + dirPath; if (!Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); } } private string GetTraceString(string currentXml) { string traceVal = string.Empty; traceVal = currentXml; if (currentXml.Contains("_#") == true) { currentXml = currentXml.Replace("_#", "~"); } string filename = string.Empty; int sindex = currentXml.IndexOf(Constants.TRACESPLITSTR2); int eindex = currentXml.LastIndexOf(Constants.TRACESPLITSTR1); if (sindex != -1 && eindex != -1) { filename = currentXml.Substring(sindex + 2, eindex - sindex - 2); sessionid = HttpContext.Current.Session["nsessionid"].ToString(); errlog = logobj.CreateLog("Executing Action", sessionid, filename, "new"); traceVal = currentXml.Replace(Constants.TRACESPLITSTR2 + filename + Constants.TRACESPLITSTR1, errlog); } if (traceVal.Contains("~") == true) { traceVal = traceVal.Replace("~", "_#"); } if (scriptsPath != string.Empty) { traceVal = traceVal.Replace(""; loadXml += HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString(); loadXml += ""; objWebServiceExt = new ASBExt.WebServiceExt(); result = objWebServiceExt.CallDoFormLoadWS(tstData.transid, loadXml, tstStrObj.structRes); //requestProcess_logtime += loadRes.Split('♠')[0]; result = result.Split('♠')[1]; return result; } public string CallGetLoadData(TStructData tstData, string recordid, string errorLog) { string result = null; string visibleDCs = string.Empty; visibleDCs = tstStrObj.GetVisibleDCs(); string proj = HttpContext.Current.Session["project"].ToString(); string imagefromdb = "false"; if (HttpContext.Current.Session["AxpSaveImageDb"] != null) imagefromdb = HttpContext.Current.Session["AxpSaveImageDb"].ToString(); string loadXml = " "; loadXml += HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString(); loadXml += ""; loadXml = util.ReplaceImagePath(loadXml); string tsId = tstData.transid; string sXml = tstStrObj.structRes; objWebServiceExt = new ASBExt.WebServiceExt(); result = objWebServiceExt.CallLoadDataWS(tsId, loadXml, sXml, recordid, proj); HttpContext.Current.Session["axp_lockonrecid"] = tsId + "~" + recordid; return result; } #endregion #region Private Methods /// /// Function to update the decimal value for the given field in the structure xml /// /// /// private void UpdateAxpCurrDec(string[] fieldNames, int dec) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(tstStrObj.structRes); XmlNodeList fieldNode; //looping from i=1 as the first item is decimal for (int i = 1; i < fieldNames.Length; i++) { fieldNode = xmlDoc.GetElementsByTagName(fieldNames[i].ToString().Trim()); if (fieldNode.Count > 0) { foreach (XmlNode childNode in fieldNode[0].ChildNodes) { if (childNode.Name == "a5") { childNode.InnerText = dec.ToString(); tstStrObj.structRes = xmlDoc.OuterXml; break; } } } } } /// /// Function to check if the field is axpcurrencydec and call update struct xml /// /// /// private void CheckAxpCurrDec(string fldName, string fldVal) { string[] axpCurrDetails = new string[] { }; axpCurrDetails = fldVal.Split(','); if (axpCurrDetails.Length > 0 && fldVal != "") { int decNo = Convert.ToInt32(axpCurrDetails[0]); UpdateAxpCurrDec(axpCurrDetails, decNo); } } /// /// Function which loads the given image from the image folder to scripts. /// On change of the product, if the image should be replaced, this function is called. /// /// /// /// It returns the imagename along with the source value for the image, which is set in the client function public string GetImageSource(string imageName, string imageSrc) { if (imageSrc != "") { string[] fvalues = imageSrc.ToString().Split('~'); string recordId = fvalues[2].ToString(); imageFldNames.Clear(); imageFldSrc.Clear(); LoadImageToFolder(imageName, recordId); string imgSrc = ""; for (int i = 0; i < imageFldNames.Count; i++) { if (imageFldNames[i].ToString() == imageName) { imgSrc = imageFldSrc[i].ToString(); break; } } return imageName + "♣" + imgSrc; } return imageFldSrc + "♣" + ""; } private void CreateFieldValueXmlLoadTab(string frameNo) { string fValue = string.Empty; StringBuilder fldXml = new StringBuilder(); string curFldFrmNo = "0"; for (int i = 0; i < fieldName.Count; i++) { int fIndex = 0; fIndex = fieldControlName[i].ToString().LastIndexOf("F"); fIndex = fIndex + 1; curFldFrmNo = fieldControlName[i].ToString().Substring(fIndex, fieldControlName[i].ToString().Length - fIndex); if (Convert.ToInt32(curFldFrmNo) <= Convert.ToInt32(frameNo)) { fldXml.Append("<" + fieldName[i] + ">"); fValue = CheckSpecialChars(fieldValue[i].ToString()); fldXml.Append(fValue); fldXml.Append(""); } } fgFieldValueXml = fldXml.ToString(); } private void CreateFieldValueXmlPerf(string frameNum, string ActiveRowNo, ArrayList AxDepFields, string fldDepGridDcs, Dictionary includeDcRows, string includeDcs) { DSFieldValueXMLPerf(frameNum, ActiveRowNo, AxDepFields, fldDepGridDcs, includeDcRows, includeDcs); } private void CreateFieldValueXml(string condition, string includeDcs, string calledFrom) { DSFieldValueXML(condition, includeDcs, calledFrom); } private void FieldToXML(string fldName, string rowNo, string value, string oldValue, string idvalue, string oldIdValue, string dcNo, Boolean fldSaveNormal, bool isSubGrid, string subRowNo, TStructDef.FieldStruct fld = new TStructDef.FieldStruct()) { rowNo = GetRowNoHelper(rowNo.ToString()); value = CheckSpecialChars(value); oldValue = CheckSpecialChars(oldValue); string oldVal = ""; if (recordid != "0") { if (value != oldValue) oldVal = "ov='" + oldValue + "'"; else oldVal = ""; } if (fldName.StartsWith(Constants.IMGPrefix)) return; if (fldName.ToLower() == (Constants.AXPIMAGEPATH)) isAxpImagePath = true; //if (fld.datatype != null && fld.datatype.ToLower() == "image" && imgAttachPath != "") // return; if (fldSaveNormal) { if (Convert.ToString(idvalue) == "") idvalue = "0"; if (Convert.ToString(oldIdValue) == "") oldIdValue = "0"; if (isSubGrid) dsDataXML.Append("<" + fldName + " rowno='" + subRowNo + "' id='" + idvalue + "' oldid='" + oldIdValue + "' " + oldVal + ">" + value + ""); else dsDataXML.Append("<" + fldName + " rowno='" + rowNo + "' id='" + idvalue + "' oldid='" + oldIdValue + "' " + oldVal + ">" + value + ""); } else { if (isSubGrid) dsDataXML.Append("<" + fldName + " rowno='" + subRowNo + "' " + oldVal + ">" + value + ""); else if (fld.fldMultiSelect != null) { dsDataXML.Append("<" + fldName + " rowno='" + rowNo + "' " + oldVal + " multiselect='true' separator='" + fld.fldMultiSelectSep + "'>" + value + ""); } else dsDataXML.Append("<" + fldName + " rowno='" + rowNo + "' " + oldVal + ">" + value + ""); } } private void DSFieldValueXML(string frameNum, string parDcNo, int ParRowNo, string popDcNo, int popRowNo) { int fNo = -1; bool isNumber = false; try { fNo = int.Parse(frameNum); isNumber = true; frameNum = "F" + frameNum; } catch { } dsDataXML.Length = 0; //loop for constructing the field value xml based on the frame no, row no and field order foreach (TStructDef.DcStruct dc in tstStrObj.dcs) { string dcNo = Convert.ToString(dc.frameno); //This condition will construct xml till the given dc if the given number is a frame no, //else it will continue and create the xml for all dc's. if ((frameNum != "F-1") && (isNumber)) { if (dc.frameno > fNo) break; } if (dc.isgrid && dc.DCHasDataRows == false) continue; DataTable thisDataTable = dsDataSet.Tables["dc" + dcNo]; string[] dcRange = tstStrObj.GetDcFieldRange(dcNo).Split(','); int startIdx = Convert.ToInt32(dcRange[0]); int endIdx = Convert.ToInt32(dcRange[1]); string subGridRow = string.Empty; bool isSubGrid = false; foreach (DataRow dr in thisDataTable.Rows) { int rowNo = Convert.ToInt32(dr["axp__rowno"]); if (dc.frameno.ToString() == parDcNo && rowNo != ParRowNo) continue; //Sub-Grid - only the newly added row should be sent in the input xml. if (dc.frameno.ToString() == popDcNo && rowNo != popRowNo) { continue; } else if (dc.frameno.ToString() == popDcNo) { subGridRow = "001"; isSubGrid = true; } DSFieldValueXMLHelper(dcNo, rowNo, startIdx, endIdx, dr, isSubGrid, subGridRow); } } fieldValueXml = dsDataXML.ToString(); } private void DSFieldValueXMLHelperPerf(string dcNo, int rowNo, int startIdx, int endIdx, DataRow dr, ArrayList depFields) { DataTable dtOld = dsDataSet.Tables["dc_old" + dcNo]; DataRow drOld = dtOld.Rows.Find(rowNo); for (int j = startIdx; j <= endIdx; j++) { TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[j]; if (depFields.IndexOf(fld.name) == -1) continue; string value = string.Empty; string oldValue = string.Empty; string idValue = string.Empty; string oldIdValue = string.Empty; string FldValue = string.Empty; value = dr[fld.name].ToString(); if (fld.savenormal) idValue = dr["id__" + fld.name].ToString(); if (drOld != null) { oldValue = drOld["old__" + fld.name].ToString(); if (fld.savenormal) oldIdValue = drOld["oldid__" + fld.name].ToString(); } FieldToXML(fld.name, Convert.ToString(rowNo), value, oldValue, idValue, oldIdValue, dcNo, fld.savenormal, false, ""); } } private void DSFieldValueXMLHelper(string dcNo, int rowNo, int startIdx, int endIdx, DataRow dr, bool isSubGrid, string subGridRowNo) { DataTable dtOld = dsDataSet.Tables["dc_old" + dcNo]; DataRow drOld = dtOld.Rows.Find(rowNo); for (int j = startIdx; j <= endIdx; j++) { TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[j]; string value = string.Empty; string oldValue = string.Empty; string idValue = string.Empty; string oldIdValue = string.Empty; string FldValue = string.Empty; value = dr[fld.name].ToString(); if (fld.savenormal) idValue = dr["id__" + fld.name].ToString(); if (drOld != null) { oldValue = drOld["old__" + fld.name].ToString(); if (fld.savenormal) oldIdValue = drOld["oldid__" + fld.name].ToString(); } ////// is save true and rtf check.. if (isSaveCalled) { if ((fld.name.Contains("rtf_") || fld.name.Contains("rtfm_") || fld.name.Contains("fr_rtf_")) && fld.name.Contains("_printable")) value = ReplaceRTFTagsForPrint(dr[fld.name.Replace("_printable", "")].ToString()); } FieldToXML(fld.name, Convert.ToString(rowNo), value, oldValue, idValue, oldIdValue, dcNo, fld.savenormal, isSubGrid, subGridRowNo, fld); } } private void RapidFieldValueXML(string dcNo, int rowNo, int startIdx, int endIdx, DataRow dr, bool isSubGrid, string subGridRowNo, TStructDef.FieldStruct Parfld, string actRow, string calledFrom) { DataTable dtOld = dsDataSet.Tables["dc_old" + dcNo]; DataRow drOld = dtOld.Rows.Find(rowNo); string[] arrParams; if (calledFrom == "Rapid") arrParams = Parfld.FldRapidParents.Split(','); else arrParams = Parfld.FldRapidAllParents.Split(','); List lstParams = new List(); lstParams.AddRange(arrParams); string[] arrParAllRows = Parfld.FldRapidAllRows.Split(','); List lstParAllRows = new List(); lstParAllRows.AddRange(arrParAllRows); for (int j = startIdx; j <= endIdx; j++) { TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[j]; int dIdx = -1; dIdx = lstParams.IndexOf(fld.name); //If the field is not there in the params array, continue the loop if (dIdx == -1 && !fld.name.StartsWith("axp_recid")) continue; //If the allrows for the current parent is false, then only if the current dc and parent dc are same row should be constructed for active row else continue //arrParAllRows.Length > dIdx - this condition needs to be handled if (IsDcGrid(fld.fldframeno.ToString(), tstStrObj) && dIdx != -1 && arrParAllRows.Length > dIdx) { if (!(fld.fldframeno == Parfld.fldframeno && arrParAllRows[dIdx] == "F" && rowNo.ToString() == actRow)) continue; } string value = string.Empty; string oldValue = string.Empty; string idValue = string.Empty; string oldIdValue = string.Empty; string FldValue = string.Empty; value = dr[fld.name].ToString(); if (fld.savenormal) idValue = dr["id__" + fld.name].ToString(); if (drOld != null) { oldValue = drOld["old__" + fld.name].ToString(); if (fld.savenormal) oldIdValue = drOld["oldid__" + fld.name].ToString(); } ////// is save true and rtf check.. if (isSaveCalled) { if ((fld.name.Contains("rtf_") || fld.name.Contains("rtfm_") || fld.name.Contains("fr_rtf_")) && fld.name.Contains("_printable")) value = ReplaceRTFTagsForPrint(dr[fld.name.Replace("_printable", "")].ToString()); } FieldToXML(fld.name, Convert.ToString(rowNo), value, oldValue, idValue, oldIdValue, dcNo, fld.savenormal, isSubGrid, subGridRowNo); } } private string ReplaceRTFTagsForPrint(string inpStr) { // string[] rtfTags = new string[] { "", "", "
", "", "", "", "", "", "", "", "", "", "", "", "

", "", "
" }; string[] rtfTags = new string[] { "", "", "
", "", "", "", "", "", "", "", "", "", "", "

", "", "
" }; for (int i = 0; i < rtfTags.Length; i++) while (inpStr.Contains(rtfTags[i])) { int startIdx = -1; int endIdx = -1; startIdx = inpStr.IndexOf(rtfTags[i]); endIdx = inpStr.IndexOf(">", startIdx); string replaceStr = string.Empty; string strNode = inpStr.Substring(startIdx, (endIdx - startIdx) + 1); //Code to replace
with new line in fast report if (strNode == "
" || strNode == "
  • ") { //replaceStr = "#13#10"; inpStr = inpStr.Insert(endIdx + 1, "~"); } inpStr = inpStr.Remove(startIdx, (endIdx + 1) - startIdx); inpStr = inpStr.Replace(rtfEndTags[i], replaceStr); } string[] rtfSupportedTags = new string[] { "", startIdx); inpStr = inpStr.Remove(startIdx, (endIdx + 1) - startIdx); inpStr = inpStr.Insert(startIdx, rtfSupportedTags[i] + ">"); endIdx = endIdx - (endIdx - startIdx); } } inpStr = inpStr.Replace(" ", ""); inpStr = inpStr.Replace("\n", "~"); return inpStr; } private void DSFieldValueXML(string frameNum, string calledFrom) { int fNo = -1; bool isNumber = true; try { fNo = int.Parse(frameNum); isNumber = true; } catch { isNumber = false; } if (isNumber) frameNum = "F" + frameNum; dsDataXML.Length = 0; //loop for constructing the field value xml based on the frame no, row no and field order foreach (TStructDef.DcStruct dc in tstStrObj.dcs) { string dcNo = Convert.ToString(dc.frameno); //This condition will construct xml till the given dc if the given number is a frame no, //else it will continue and create the xml for all dc's. if ((frameNum != "F-1") && (isNumber)) { if (calledFrom == "FillGrid") { //– Only non grid data will be sent in input xml.For all grid dcs only row count will be sent. if (dc.isgrid) { int rCnt = GetDcRowCount(dcNo); dsDataXML.Append("" + rCnt + ""); continue; } } else if (calledFrom == "LoadDc") { //Only non grid data and this DC data will be sent as parameter if (fNo != dc.frameno || dc.isgrid) continue; } //TODO: why this is empty? else if (calledFrom == "GetDep") { } else { //NOTE: for a webservice where the frame no is sent, all other grid dcs data should also be sent to the web service. if (dc.frameno > fNo && dc.isgrid) continue; } } int rowCnt = 0; if (dc.isgrid) { rowCnt = GetDcRowCount(dcNo); if (rowCnt == 0) rowCnt = 1; if (calledFrom != "PickList" && dc.DCHasDataRows == false) continue; } DataTable thisDataTable = dsDataSet.Tables["dc" + dcNo]; string[] dcRange = tstStrObj.GetDcFieldRange(dcNo).Split(','); int startIdx = Convert.ToInt32(dcRange[0]); int endIdx = Convert.ToInt32(dcRange[1]); foreach (DataRow dr in thisDataTable.Rows) { int rowNo = Convert.ToInt32(dr["axp__rowno"]); DSFieldValueXMLHelper(dcNo, rowNo, startIdx, endIdx, dr, false, ""); } } if (frameNum == "F-1") fieldValueXml = dsDataXML.ToString(); else fgFieldValueXml = dsDataXML.ToString(); } public void DSRapidFieldValueXML(string frameNo, string actRowNo, string fieldName, string calledFrom, TStructDef.FieldStruct fld) { dsDataXML = new StringBuilder(); //loop for constructing the field value xml based on the frame no, row no and field order foreach (TStructDef.DcStruct dc in tstStrObj.dcs) { string dcNo = Convert.ToString(dc.frameno); //This condition will construct xml for all the non grids in the given tstruct, //if the includeDcs contains any grid dc then that dc also will be included in the xml construction. //TODO:RAPID - Check allrows along with params int rowCnt = 0; if (dc.isgrid) { rowCnt = GetDcRowCount(dcNo); if (rowCnt == 0) rowCnt = 1; //if (calledFrom != "PickList" && dc.DCHasDataRows == false && calledFrom != "RefreshDc") // continue; } DataTable thisDataTable = dsDataSet.Tables["dc" + dcNo]; try { if (calledFrom != "AutoComplete" && calledFrom != "axpbutton") { DataRow[] rows; rows = thisDataTable.Select("axp__isGrdVld" + dcNo + " = 'false'"); // axp__isGrdVld is Column Name foreach (DataRow r in rows) thisDataTable.Rows.Remove(r); } } catch (Exception ex) { //catch block is not handlink because - we are skipping the rows which does not contains axp__isGrdVld+dcno column } string[] dcRange = tstStrObj.GetDcFieldRange(dcNo).Split(','); int startIdx = Convert.ToInt32(dcRange[0]); int endIdx = Convert.ToInt32(dcRange[1]); foreach (DataRow dr in thisDataTable.Rows) { int rowNo = Convert.ToInt32(dr["axp__rowno"]); if (calledFrom != "AutoComplete" && calledFrom != "axpbutton" && thisDataTable.Columns.Contains(Constants.AXPISROWVALID + dcNo) && dr[Constants.AXPISROWVALID + dcNo].ToString() == "false") continue; RapidFieldValueXML(dcNo, rowNo, startIdx, endIdx, dr, false, "", fld, actRowNo, calledFrom); } } fieldValueXml = dsDataXML.ToString(); } /// /// /// /// NG /// /// public void DSFieldValueXML(string condition, string includeDcs, string calledFrom) { dsDataXML.Length = 0; ArrayList incGridDcs = new ArrayList(); if (!string.IsNullOrEmpty(includeDcs)) { string[] incDcs = includeDcs.Split(','); for (int idx = 0; idx < incDcs.Length; idx++) { if (!string.IsNullOrEmpty(incDcs[idx].ToString())) { incGridDcs.Add(incDcs[idx].ToString()); if (IsParentDc(incDcs[idx].ToString())) { ArrayList arrPopDcs = new ArrayList(); arrPopDcs = GetPopDcsForParent(incDcs[idx].ToString()); for (int pIdx = 0; pIdx < arrPopDcs.Count; pIdx++) { if (incGridDcs.IndexOf(arrPopDcs[pIdx].ToString()) == -1) incGridDcs.Add(arrPopDcs[pIdx].ToString()); } } } } } string sourceDc = string.Empty; ArrayList tabParentFlds = new ArrayList(); if (calledFrom == "LoadTab" || calledFrom == "FillGrid" || calledFrom == "AutoComplete") { if (includeDcs != string.Empty) { TStructDef.DcStruct tabDc = (TStructDef.DcStruct)tstStrObj.dcs[Convert.ToInt32(includeDcs) - 1]; tabParentFlds = tabDc.tabParentFields; } //incGridDcs.Clear(); if (calledFrom == "FillGrid") { int idx = tstStrObj.GetFillGridIndex("dc" + includeDcs.ToString()); includeDcs = ""; if (idx != -1) { TStructDef.FGStruct fg = (TStructDef.FGStruct)tstStrObj.fgs[idx]; if (fg.fgSourceDC != "") sourceDc = fg.fgSourceDC.Substring(2); } } } //loop for constructing the field value xml based on the frame no, row no and field order foreach (TStructDef.DcStruct dc in tstStrObj.dcs) { string dcNo = Convert.ToString(dc.frameno); //This condition will construct xml for all the non grids in the given tstruct, //if the includeDcs contains any grid dc then that dc also will be included in the xml construction. if (condition == "NG") { //– Only non grid data will be sent in input xml.For all grid dcs only row count will be sent. if (dc.isgrid) { //For getdep web service, the other grid dcs rowcount also should be sent. //if ((calledFrom == "GetDep" || calledFrom == "GetDependents") && incGridDcs.IndexOf(dcNo) == -1) if (calledFrom == "GetDep" && incGridDcs.IndexOf(dcNo) == -1) { int rCnt = GetDcRowCount(dcNo); dsDataXML.Append("" + rCnt + ""); } //Refer bug - IWA-C-0000024 //Removed LoadData as current dc data should not be sent to webservice- This will result in tabdata bringing empty row. if (calledFrom != "FillGrid" && calledFrom != "AutoComplete" && calledFrom != "axpbutton" && incGridDcs.IndexOf(dcNo) == -1) continue; } } int rowCnt = 0; if (dc.isgrid) { rowCnt = GetDcRowCount(dcNo); if (rowCnt == 0) rowCnt = 1; if (calledFrom != "PickList" && dc.DCHasDataRows == false && calledFrom != "RefreshDc") continue; } DataTable thisDataTable = dsDataSet.Tables["dc" + dcNo]; try { if (calledFrom != "AutoComplete" && calledFrom != "axpbutton") { DataRow[] rows; rows = thisDataTable.Select("axp__isGrdVld" + dcNo + " = 'false'"); // axp__isGrdVld is Column Name foreach (DataRow r in rows) thisDataTable.Rows.Remove(r); } } catch (Exception ex) { //catch block is not handlink because - we are skipping the rows which does not contains axp__isGrdVld+dcno column } bool isAddRow = false; if (calledFrom == "RefreshDc" && thisDataTable.Rows.Count == 0) { DataRow newRow = thisDataTable.NewRow(); newRow["axp__rowno"] = 1; newRow["axp__delrow"] = 0; thisDataTable.Rows.Add(newRow); thisDataTable.AcceptChanges(); isAddRow = true; } string[] dcRange = tstStrObj.GetDcFieldRange(dcNo).Split(','); int startIdx = Convert.ToInt32(dcRange[0]); int endIdx = Convert.ToInt32(dcRange[1]); foreach (DataRow dr in thisDataTable.Rows) { int rowNo = Convert.ToInt32(dr["axp__rowno"]); if (calledFrom != "AutoComplete" && calledFrom != "axpbutton" && thisDataTable.Columns.Contains(Constants.AXPISROWVALID + dcNo) && dr[Constants.AXPISROWVALID + dcNo].ToString() == "false") continue; if (calledFrom == "LoadTab" && dcNo == includeDcs) DSFieldValueXMLHelper(dcNo, rowNo, startIdx, endIdx, dr, false, ""); else if (calledFrom == "FillGrid" && dc.isgrid && dcNo == sourceDc) DSFieldValueXMLHelper(dcNo, rowNo, startIdx, endIdx, dr, false, ""); else if (calledFrom == "LoadTab" && dc.isgrid && incGridDcs.IndexOf(dcNo) != -1) DSFieldValueXMLHelper(dcNo, rowNo, startIdx, endIdx, dr, false, ""); else if ((calledFrom == "LoadTab" || calledFrom == "FillGrid" || calledFrom == "AutoComplete") && dc.isgrid && dcNo != includeDcs) DSFieldValueXMLHelperPerf(dcNo, rowNo, startIdx, endIdx, dr, tabParentFlds); else DSFieldValueXMLHelper(dcNo, rowNo, startIdx, endIdx, dr, false, ""); } if (isAddRow && calledFrom == "RefreshDc") { thisDataTable.Rows.RemoveAt(0); isAddRow = false; } } fieldValueXml = dsDataXML.ToString(); } private void DSFieldValueXMLPerf(string frameNum, string ActiveRowNo, ArrayList depFields, string fldDepGridDcs, Dictionary includeDcRows, string includeDcs) { int fNo = -1; bool isNumber = true; bool IsDcInclude = false; string[] refreshdc = new string[10]; if (includeDcs != string.Empty) refreshdc = includeDcs.Split(','); try { fNo = int.Parse(frameNum); isNumber = true; } catch { isNumber = false; } if (isNumber) frameNum = "F" + frameNum; dsDataXML.Length = 0; //loop for constructing the field value xml based on the frame no, row no and field order foreach (TStructDef.DcStruct dc in tstStrObj.dcs) { string dcNo = Convert.ToString(dc.frameno); string incRowsStr = string.Empty; ArrayList includeRows = new ArrayList(); if (includeDcRows.ContainsKey(dcNo)) { IsDcInclude = true; includeDcRows.TryGetValue(dcNo, out incRowsStr); string[] incRows = incRowsStr.Split(','); for (int j = 0; j < incRows.Length; j++) { if (incRows[j] != "") includeRows.Add(Convert.ToInt32(incRows[j].ToString())); } } else { IsDcInclude = false; if (Array.IndexOf(refreshdc, dcNo) > -1) IsDcInclude = true; else if (!dc.isgrid) IsDcInclude = true; string[] depDcs = fldDepGridDcs.Split(','); for (int dIdx = 0; dIdx < depDcs.Length; dIdx++) { if (depDcs[dIdx].ToString() == dcNo) { IsDcInclude = true; break; } } } string[] dcRange = tstStrObj.GetDcFieldRange(dcNo).Split(','); int startIdx = Convert.ToInt32(dcRange[0]); int endIdx = Convert.ToInt32(dcRange[1]); int rowCnt = 0; if (dc.isgrid) { if (dc.frameno == fNo || IsDcInclude) { rowCnt = GetDcRowCount(dcNo); if (rowCnt == 0) rowCnt = 1; if (dc.DCHasDataRows == false) continue; } else continue; } int ActRowNo = Convert.ToInt32(ActiveRowNo); DataTable thisDataTable = dsDataSet.Tables["dc" + dcNo]; int subRowNo = 0; //This loop will run through all the rows in the grid, if the given rowno is same as activerowno, then it will construct for all the fields //Else it will construct xml only for the fields given in the depFields parameter. foreach (DataRow dr in thisDataTable.Rows) { int rowNo = Convert.ToInt32(dr["axp__rowno"]); //If a non grid field is changed and a grid has record in add panel(Invalid row) it should not be sent to web-service if (frameNum != "F" + dc.frameno.ToString() && dc.isgrid && dr[Constants.AXPISROWVALID + dcNo].ToString() == "false") continue; if ((Array.IndexOf(refreshdc, dcNo) > -1) && (dc.frameno != fNo)) DSFieldValueXMLHelper(dcNo, rowNo, startIdx, endIdx, dr, false, ""); else if (!dc.isgrid) DSFieldValueXMLHelper(dcNo, rowNo, startIdx, endIdx, dr, false, ""); else if (dc.frameno == fNo && rowNo == ActRowNo) DSFieldValueXMLHelper(dcNo, rowNo, startIdx, endIdx, dr, false, ""); else if (IsDcInclude && includeRows.IndexOf(rowNo) != -1) { if (dc.ispopgrid) { subRowNo++; DSFieldValueXMLHelper(dcNo, rowNo, startIdx, endIdx, dr, dc.ispopgrid, subRowNo.ToString()); } else { DSFieldValueXMLHelper(dcNo, rowNo, startIdx, endIdx, dr, false, ""); } } else DSFieldValueXMLHelperPerf(dcNo, rowNo, startIdx, endIdx, dr, depFields); } } fieldValueXml = dsDataXML.ToString(); } private void CreateFieldValueXml(string frameNum, string parDcNo, int ParRowNo, string popDcNo, int popRowNo) { DSFieldValueXML(frameNum, parDcNo, ParRowNo, popDcNo, popRowNo); return; } public DataTable CreateDataTable() { return new DataTable(); } /// /// This method loops through the lists and construct the field value xml. /// and updates the object variable “PopfieldValueXml”. /// private void CreatePopFieldValueXml(ArrayList fldArray, ArrayList fldValueArray, ArrayList fldDeletedArray, string frameNum, string pframeno, string maxRows, ArrayList popRows) { string fValue = string.Empty; frameNum = "F" + frameNum; StringBuilder fldXml = new StringBuilder(); StringBuilder popFldXml = new StringBuilder(); string rnList = ""; popFldXml.Append(""); for (int i = 0; i < fieldName.Count; i++) { if (fieldControlName[i].ToString().IndexOf(frameNum.ToString()) == -1) { fldXml.Append("<" + fieldName[i] + ">"); fValue = CheckSpecialChars(fieldValue[i].ToString()); fldXml.Append(fValue); fldXml.Append(""); } else { popFldXml.Append("<" + fieldName[i] + ">"); fValue = CheckSpecialChars(fieldValue[i].ToString()); popFldXml.Append(fValue); popFldXml.Append(""); } } popFGFieldValueXml = ""; if (popFldXml.ToString() == "") popFldXml.Append(""); popFGFieldValueXml = "" + popFldXml.ToString() + "" + "" + fgFieldValueXml.ToString() + ""; } /// /// function for replacing the special characters in a given string. /// /// /// /// private string CheckSpecialChars(string str) { //hack: The below line is used to make sure that the & in & is not converted inadvertantly // for other chars this scenario will not come as it does not contains the same char. str = Regex.Replace(str, "&", "&"); str = Regex.Replace(str, """, "“"); str = Regex.Replace(str, "\n", "
    "); str = Regex.Replace(str, "&", "&"); str = Regex.Replace(str, "<", "<"); str = Regex.Replace(str, ">", ">"); str = Regex.Replace(str, "'", "'"); str = Regex.Replace(str, "\"", """); str = Regex.Replace(str, "’", "'"); str = Regex.Replace(str, "“", """); str = Regex.Replace(str, "”", """); str = Regex.Replace(str, "™", "™"); str = Regex.Replace(str, "®", "®"); str = str.Replace((char)160, ' '); if (str == defaultDateStr) str = ""; return str; } private string GetDbFieldName(string fieldCompName, string dbRowNo) { if (dbRowNo.Length == 1) dbRowNo = "00" + dbRowNo; else if (dbRowNo.Length == 2) dbRowNo = "0" + dbRowNo; int fIndx = fieldCompName.LastIndexOf("F"); if (fIndx != -1) { string fldDcNo = fieldCompName.Substring(fIndx + 1); string dbFldName = fieldCompName.Substring(0, fIndx - 3); string newCompName = dbFldName + dbRowNo + "F" + fldDcNo; return newCompName; } else { if (fieldCompName.StartsWith("dc") && dbRowNo == "0-1") return "dc"; else return fieldCompName; } } /// /// This method for for updating the existing field values and adding any new values. /// Note: Only grid field values can be added and deleted. /// /// /// /// public void UpdateDataList(ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList deletedArray) { for (int j = 0; j < fldArray.Count; j++) { if (fldArray[j] != null) { if (fldValueArray[j].ToString() == defaultDateStr) fldValueArray[j] = ""; string fldname = string.Empty; string frmNum = string.Empty; string fldRowNo = string.Empty; string newCompName = GetDbFieldName(fldArray[j].ToString(), fldDbRowNo[j].ToString()); if (newCompName == "dc") { string[] dcData = fldValueArray[j].ToString().Split('♦'); string newRowCnt = dcData[0]; string changedRows = dcData[1]; if (changedRows != "") { SetDbRows(changedRows, fldArray[j].ToString().Substring(2), tstStrObj, ""); } UpdateRowCount(fldArray[j].ToString(), newRowCnt); continue; } int lastIndex = newCompName.LastIndexOf('F'); if (lastIndex != -1) { fldname = newCompName.Substring(0, lastIndex - 3); fldRowNo = newCompName.Substring(lastIndex - 3, 3); frmNum = newCompName.Substring(lastIndex + 1); } else { fldname = newCompName.Substring(0, newCompName.Length - 5); fldRowNo = newCompName.Substring(lastIndex - 3, 3); frmNum = newCompName.Substring(newCompName.Length - 2); } //Update the dc dchasdatarowws property. TStructDef.DcStruct dc = (TStructDef.DcStruct)tstStrObj.dcs[Convert.ToInt32(frmNum) - 1]; if (dc.isgrid) { if (!dc.DCHasDataRows) { //Refer bugid- AXP-C-0000136 //If the row comes from client due to expression eval for pop up grid row, do not mark it valid var valIdx = fldArray.IndexOf("axp__isGrdVld" + frmNum + fldRowNo + "F" + frmNum); if (valIdx != -1 && fldValueArray[valIdx].ToString() == "false") { //In case of grid(pop) a new row value will be sent after expression evaluation but the row is not valid. In this case the dchasDataRows should not be changed to true. } else { dc.DCHasDataRows = true; tstStrObj.dcs[Convert.ToInt32(frmNum) - 1] = dc; } } } //int index = fieldControlName.IndexOf(newCompName); // int index = GetFldIndex(Convert.ToInt32(frmNum), fldname, Convert.ToInt32(fldDbRowNo[j])); string newFldValue = fldValueArray[j].ToString(); //TODO: The same code is there in the TstructData constructor, and Jsontoarray //if (fldname.ToLower() == "axpcurrencydec") // CheckAxpCurrDec(fldname, newFldValue); if (newCompName.StartsWith("axp_recid") && newFldValue == "") newFldValue = "0"; string tmpFldVal = string.Empty; string tmpFldIdVal = string.Empty; if (newCompName != string.Empty) { if (newFldValue.Contains("¿")) { string[] idVal = newFldValue.Split('¿'); tmpFldVal = idVal[1]; tmpFldIdVal = idVal[0]; } else tmpFldVal = newFldValue.ToString(); } DSSubmit(fldname, Convert.ToInt32(fldDbRowNo[j].ToString()), tmpFldVal, tmpFldIdVal); } } // For deleting the fields from the list. for (int k = 0; k < deletedArray.Count; k++) { int fIdx = deletedArray[k].ToString().IndexOf("F"); string delRowNo = deletedArray[k].ToString().Substring(0, fIdx); string delDcNo = deletedArray[k].ToString().Substring(fIdx + 1); int tmpRowCnt = GetActualDcRowCount(delDcNo);//GetDcRowCount(delDcNo);//Refer Bug: AGI003750 if (tmpRowCnt == 1 && (delRowNo == "001" || delRowNo == "1")) { TStructDef.DcStruct dc = (TStructDef.DcStruct)tstStrObj.dcs[Convert.ToInt32(delDcNo) - 1]; dc.DCHasDataRows = false; tstStrObj.dcs[Convert.ToInt32(delDcNo) - 1] = dc; } if (recordID != "0" && recordID != "") DeleteRowInFldArrays(delDcNo, delRowNo); else DeleteRowInFldArrays(delDcNo, delRowNo); tmpRowCnt = tmpRowCnt - 1; if (tmpRowCnt >= 0) UpdateRowCount("DC" + delDcNo, "DC" + delDcNo + "~" + tmpRowCnt); } } private int GetActualDcRowCount(string dcNo) { int rowCount = 0; DataTable dt = dsDataSet.Tables["dc" + dcNo]; if (dt.Rows.Count > 0) { rowCount = dt.Select("axp__isGrdVld" + dcNo + " = ''").Count(); } return rowCount; } private string GetFrameNo(string fieldId) { return fieldId.Substring(fieldId.LastIndexOf("F") + 1); } private int GetDCRowCntIndex(string dcNo) { int index = -1; for (int i = 0; i < dcRowCntVals.Count; i++) { string[] dcName = dcRowCntVals[i].ToString().Split('~'); if (dcName[0] == dcNo) index = i; } return index; } private ArrayList GetSubGridDcsInTabDC(TStructDef strObj, string TabDcNo) { ArrayList subGridDcs = new ArrayList(); for (int i = 0; i < strObj.popdcs.Count; i++) { if (TabDcNo == ((TStructDef.PopDcStruct)(strObj.popdcs[i])).pdcno.ToString()) { subGridDcs.Add(((TStructDef.PopDcStruct)(strObj.popdcs[i])).frameno); } } return subGridDcs; } /// /// Function to parse the memvar node from the json and update the memvar arrays /// /// /// public void ParseMemVarNode(string jsonData, string calledFrom) { jsonData = jsonData.Replace("*$*", "♦"); jsonData = jsonData.Replace("\\", ";bkslh"); string[] resval = jsonData.Split('♦'); StringBuilder dataJson = new StringBuilder(); if (jsonData == string.Empty) return; for (int j = 0; j < resval.Length; j++) { JArray memVarNode = null; try { JObject tstData = JObject.Parse(resval[j]); memVarNode = (JArray)tstData["memvar"]; } catch (Exception ex) { logobj.CreateLog("ParseMemVarNode function -" + ex.Message, sessionid, "Exception-" + transid, "new"); } if (memVarNode != null) { for (int m = 0; m < memVarNode.Count; m++) { string memVarName = string.Empty; string memVarValue = string.Empty; string memVarType = string.Empty; Dictionary values = JsonConvert.DeserializeObject>(memVarNode[m].ToString()); if (values.ContainsKey("n")) memVarName = values["n"]; if (values.ContainsKey("v")) memVarValue = values["v"]; if (values.ContainsKey("t")) memVarType = values["t"]; memVarValue = CheckSpecialChars(memVarValue); int idx = memVarNames.IndexOf(memVarName); if (idx == -1) { memVarNames.Add(memVarName); memVarValues.Add(memVarValue); memVarTypes.Add(memVarType); } else { memVarNames[idx] = memVarName; memVarValues[idx] = memVarValue; memVarTypes[idx] = memVarType; } } //Construct the fieldvaluexml for memvar node and update the global variable ConstructMemVarNode(); } } } /// /// Function to construct the field value xml for memvar nodes from the arrays /// public void ConstructMemVarNode() { StringBuilder strXml = new StringBuilder(); //strXml.Append(""); for (int i = 0; i < memVarNames.Count; i++) { strXml.Append("<" + memVarNames[i].ToString() + " t='" + memVarTypes[i].ToString() + "'>" + memVarValues[i].ToString() + ""); } //strXml.Append(""); memVarsData = strXml.ToString(); } public void JsonToArray(string jsonResult, TStructDef strObj, string tabDcNo, string calledFrom) { ChangedDcs.Clear(); depFormatDcs.Clear(); if (jsonResult == string.Empty) return; ArrayList tabDcs = new ArrayList(); AxDepArrays = new StringBuilder(); if (tabDcNo != "") { tabDcs = GetSubGridDcsInTabDC(strObj, tabDcNo); tabDcs.Add(tabDcNo); } //Get the non grid experssion dependent fields if the call is done from a grid field. ArrayList fldExpDeps = new ArrayList(); if (calledFrom == "GetDepPerf") fldExpDeps = GetFldExpDependents(AxActDepField); // dcRowCntVals = new ArrayList(); jsonResult = jsonResult.Replace("*$*", "♦"); jsonResult = jsonResult.Replace("\\", ";bkslh"); string[] resval = jsonResult.Split('♦'); StringBuilder dataJson = new StringBuilder(); tabJson = new StringBuilder(); string dcHasDataRowsStr = string.Empty; string tabJsonPrefix = "{\"data\": ["; string timeTakenJson = string.Empty; //Sub grid for GetDep related variables. bool isDcPopGrid = false; int dsRowNo = 0; for (int j = 0; j < resval.Length; j++) { //TODO: all other json nodes should be handled in the json parsing JArray Data = null; try { JObject tstData = JObject.Parse(resval[j]); Data = (JArray)tstData["data"]; } catch (Exception ex) { logobj.CreateLog("JsonToArray function -" + ex.Message, sessionid, "Exception-" + transid, "new"); logobj.CreateLog("JsonData -" + jsonResult, sessionid, "Exception-" + transid, ""); //throw ex; } if (Data != null) { string fName = string.Empty; string fValue = string.Empty; string changedRows = string.Empty; string delRows = string.Empty; string rowNo = string.Empty; string fDatatype = string.Empty; string name = string.Empty; string fldName = string.Empty; string fldFrameNo = string.Empty; string frmNum = string.Empty; string frowValues = string.Empty; string fldIdValues = string.Empty; string idCol = string.Empty; string masterRow = string.Empty; string comboVal = string.Empty; string comboFld = string.Empty; string comboIdCol = "0"; string dcNo = "0"; string dpmStr = string.Empty; string dpValues = string.Empty; string idVal = string.Empty; string oldIdVal = string.Empty; string rowFromJson = string.Empty; int DCPriorRowCount = 0; string fillGridName = string.Empty; StringBuilder ddlVals = new StringBuilder(); StringBuilder ddlDpVals = new StringBuilder(); bool isTabDc = false; for (int m = 0; m < Data.Count; m++) { fDatatype = ""; idCol = ""; changedRows = string.Empty; delRows = string.Empty; masterRow = string.Empty; dpValues = ""; string dcHasRows = string.Empty; Dictionary values = JsonConvert.DeserializeObject>(Data[m].ToString()); if (values.ContainsKey("t")) fDatatype = values["t"]; if (values.ContainsKey("n")) fName = values["n"]; if (values.ContainsKey("v")) fValue = values["v"]; if (values.ContainsKey("cr")) changedRows = values["cr"]; if (values.ContainsKey("fg")) fillGridName = values["fg"]; if (values.ContainsKey("dr")) delRows = values["dr"]; if (values.ContainsKey("mr")) masterRow = values["mr"]; if (values.ContainsKey("idcol")) idCol = values["idcol"]; if (values.ContainsKey("id")) idVal = values["id"]; if (values.ContainsKey("oldid")) oldIdVal = values["oldid"]; if (values.ContainsKey("r")) { rowNo = values["r"]; if (rowNo.Length == 1) rowNo = "00" + rowNo; else if (rowNo.Length == 2) rowNo = "0" + rowNo; rowFromJson = rowNo; } if (values.ContainsKey("dp")) dpValues = values["dp"]; if (values.ContainsKey("dpm")) dpmStr = values["dpm"]; string rowValues = string.Empty; if (idCol == "no" || idCol == "") idCol = "0"; else idCol = "1"; if (fName != string.Empty) { //This condition will get the fields in the tab dc which have master row true. if (masterRow == "1" && dcNo == tabDcNo) { if (AxMasterRowFlds.IndexOf(fName) == -1) AxMasterRowFlds.Add(fName); } fValue = fValue.Replace("^^dq", """); fValue = fValue.Replace(";bkslh", "\\"); //To copy the dc2_referimage file from the given path to Axpert Session folder if ((fName.StartsWith("dc") && fName.ToLower().EndsWith("_imagepath"))) hasImagePath = true; if (fName.ToLower().Contains("dc2_referimages") && fValue != string.Empty) GetReferedFiles(fValue, hasImagePath); //TODO: Same code is available in TStructData constructor and UpdateDataList. //if (fName.ToLower() == "axpcurrencydec") // CheckAxpCurrDec(fName, fValue); if (fDatatype != "c" && fDatatype != "dv") dpmStr = string.Empty; string rowVal = ""; if (fDatatype == "c" || fDatatype == "cl" || fDatatype == "rg") { comboVal = fValue; comboFld = fName; comboIdCol = idCol; } else if (fDatatype == "dv") { rowVal = fValue; if (rowValues == "") rowValues = rowVal; else rowValues += "" + rowVal; string[] temp = rowVal.Split('?'); if (temp.Length <= 3 && comboVal == string.Empty) { StringBuilder strVal = new StringBuilder(); for (int i = 0; i < temp.Length; i++) { if (temp[i].ToString() != string.Empty) strVal.Append(temp[i].ToString()); } if (strVal.ToString().ToLower() == "yesno" || strVal.ToString().ToLower() == "noyes") { //To set the default value of checkbox in the grid dc to "no". fValue = "no"; } } if (dpValues != string.Empty) { string[] dpVals = dpValues.Split('~'); string[] depFlds = dpmStr.Split(','); string cbVal = string.Empty; if (comboIdCol == "1") cbVal = fValue.Substring(fValue.IndexOf("~") + 1); else cbVal = fValue; cbVal = CheckSpecialChars(cbVal); for (int depIdx = 0; depIdx < depFlds.Length; depIdx++) { AxDepArrays.Append("ComboParentField.push(\"" + comboFld + "\");ComboParentValue.push(\"" + cbVal + "\");ComboDepField.push(\"" + depFlds[depIdx] + "\");ComboDepValue.push(\"" + dpVals[depIdx] + "\");"); } } } else if (fDatatype == "dc") { if (values.ContainsKey("hasdatarows")) dcHasRows = values["hasdatarows"]; comboFld = ""; string dcRowCount = fName + "~" + fValue; dcNo = fName.Substring(2); DCPriorRowCount = 0; //Code to avoid tabbed dc and its sub grid in the construction of json for GetTabData. int tabIndx = tabDcs.IndexOf(dcNo); if (tabIndx != -1) isTabDc = true; else isTabDc = false; if (strObj.IsDcFormatGrid(Convert.ToInt32(dcNo))) { depFormatDcs.Add(dcNo); isTabDc = true; } if (isTabDc) { dcHasDataRowsStr = "{\"n\":\"DC" + dcNo + "\",\"v\":\"" + fValue + "\",\"t\":\"dc\",\"hasdatarows\":\"" + dcHasRows + "\"}"; } bool dcOldHasRows = false; bool isGrid = IsDcGrid(dcNo, strObj); TStructDef.DcStruct dc = (TStructDef.DcStruct)tstStrObj.dcs[Convert.ToInt32(dcNo) - 1]; if (dc.ispopgrid) isDcPopGrid = true; else isDcPopGrid = false; if (isGrid) { if (dcHasRows != "") { dcOldHasRows = dc.DCHasDataRows; if (dcHasRows == "yes") dc.DCHasDataRows = true; else dc.DCHasDataRows = false; tstStrObj.dcs[Convert.ToInt32(dcNo) - 1] = dc; } } if (fValue == "0") { fValue = "1"; dcRowCount = fName + "~" + fValue; } if (isDcPopGrid && calledFrom == "GetDepPerf" && IsParentDc(AxActiveDc)) { //Code to add the dr attribute recids to deleted row information. if (delRows != string.Empty) SetPopDeletedRows(dcNo, delRows); // delete the old subgrid rows sent to the webservice for the getdep call DeletePopRowsAfterDep(); AxSubGridRows = new ArrayList(); subWsRows = new ArrayList(); subDsRows = new ArrayList(); dsRowNo = 1; //Since the full sub grid data will not be sent to the webservice, //the row numbers will always start from 1 hence appending the rows to the grid. DCPriorRowCount = GetDcRowCount(dcNo); } if (changedRows != "" && isGrid) { if (dcOldHasRows == false && dcHasRows == "yes") changedRows = "d*," + changedRows; if (ChangedDcs.IndexOf(dcNo) == -1) ChangedDcs.Add(dcNo); //If the dc has fill grid, and if the fillgrid condition is INIT or AOWE //then the existing rows should be cleared and added. //The same condition is also added in ExecData in process.js int fgIdx = GetDcFillGridIndex(fName, fillGridName); if (fgIdx != -1 && calledFrom != "ExecAction" && calledFrom != "AddRow") { TStructDef.FGStruct fg = (TStructDef.FGStruct)tstStrObj.fgs[fgIdx]; if (fg.FGCondition == Constants.INIT || fg.FGCondition == Constants.AOWE) { if (changedRows.IndexOf("d*") == -1) changedRows = "d*," + changedRows; if (IsParentDc(dcNo)) { ArrayList arrPopDcs = new ArrayList(); arrPopDcs = GetPopDcsForParent(dcNo); for (int pIdx = 0; pIdx < arrPopDcs.Count; pIdx++) { TStructDef.DcStruct pdc = (TStructDef.DcStruct)tstStrObj.dcs[Convert.ToInt32(arrPopDcs[pIdx].ToString()) - 1]; if (pdc.DCHasDataRows) SetDbRows("d*", pdc.frameno.ToString(), tstStrObj, ""); } } } else if (fg.FGCondition == Constants.APPEND && dcHasRows == "yes" && calledFrom == "Action") { DCPriorRowCount = 0;// GetDcRowCount(dcNo); if (changedRows.IndexOf("d*") != -1) dcRowCount = fName + "~" + (Convert.ToInt32(fValue)); else dcRowCount = fName + "~" + (Convert.ToInt32(fValue) + GetDcRowCount(dcNo)); } else if (fg.FGCondition == Constants.APPEND && dcOldHasRows) { DCPriorRowCount = GetDcRowCount(dcNo); dcRowCount = fName + "~" + (Convert.ToInt32(fValue) + GetDcRowCount(dcNo)); } } if (dcHasRows == "yes" || (dcOldHasRows && dcHasRows == "no")) { //The cr attribute from the getdep will be ignored for subgrid if (isDcPopGrid && calledFrom == "GetDepPerf" && IsParentDc(AxActiveDc)) continue; SetDbRows(changedRows, dcNo, strObj, calledFrom); } } else if (calledFrom == "FillGridMS" && isGrid && dcOldHasRows == false && dcHasRows == "yes")//Refer Bug: HEA000021-- Multy select fillgrid having hidden row its not adding based on srvice result. { SetDbRows("d*", dcNo, strObj, calledFrom); } UpdateRowCount(fName, dcRowCount); } else { //Code for setting default item value for auto select comboFld = ""; } //The isTabDc can be used for format grid dc, for returning the json without format grid data. if (!isTabDc) { if (dataJson.ToString() == "") dataJson.Append(Data[m].ToString()); else dataJson.Append("," + Data[m].ToString()); } else { if (dcHasDataRowsStr != "") { if (dataJson.ToString() == "") dataJson.Append(dcHasDataRowsStr); else dataJson.Append("," + dcHasDataRowsStr); dcHasDataRowsStr = string.Empty; } } if (fDatatype == "dv") { ddlVals.Append(rowValues); ddlVals.Append("♣"); ddlDpVals.Append(dpValues); ddlDpVals.Append("♣"); DSUpdateRowValues(fName, Convert.ToInt32(rowNo) + DCPriorRowCount, ddlVals.ToString(), ddlDpVals.ToString(), masterRow, comboIdCol); } else { ddlVals = new StringBuilder(); if (fDatatype != "dc") { string rowFrmNo = string.Empty; if (rowNo != "") { name = fName + rowNo + "F" + dcNo; rowFrmNo = rowFrmNo + "F" + dcNo; } //If the get dependents is called on a grid field, then the below code will ignore all expression dependents in the non grid. if (calledFrom == "GetDepPerf") { if (fldExpDeps.IndexOf(fName) != -1) continue; } if (isDcPopGrid && calledFrom == "GetDepPerf" && IsParentDc(AxActiveDc)) { dsRowNo = GetSubDsRowNo(Convert.ToInt32(rowNo), dcNo); DSSubmit(fName, dsRowNo, fValue, idVal); } else DSSubmit(fName, Convert.ToInt32(rowNo) + DCPriorRowCount, fValue, idVal); } } } } } else { ParseJsonNodes(resval[j].ToString()); JArray timeTaken = null; try { JObject tstData = JObject.Parse(resval[j]); timeTaken = (JArray)tstData["timetaken"]; } catch (Exception ex) { } if (timeTaken != null) { timeTakenJson = resval[j].ToString() + "*$*"; continue; } if (dataJson.ToString() != "") { tabJson.Insert(0, tabJsonPrefix); tabJson.Append(dataJson + "]}"); dataJson.Remove(0, dataJson.ToString().Length); } tabJson.Append(resval[j].ToString()); } } if (dataJson.ToString() != "") { tabJson.Insert(0, tabJsonPrefix); tabJson.Append(dataJson + "]}"); dataJson.Remove(0, dataJson.ToString().Length); tabJson.Insert(0, timeTakenJson); } //Call the function which parses thge memvar node and updates the arrays. ParseMemVarNode(jsonResult, calledFrom); } //Function to get the exact rowno for the new row being added. private int GetSubDsRowNo(int wsRowNo, string dcNo) { int dsRowNo = 0; int idx = -1; idx = subWsRows.IndexOf(wsRowNo); if (idx == -1) { subWsRows.Add(wsRowNo); dsRowNo = GetDcRowCount(dcNo) + 1; subDsRows.Add(dsRowNo); } else { dsRowNo = (Int32)subDsRows[idx]; } return dsRowNo; } /// /// Function return true if the given dc is a parent dc. /// /// /// private bool IsParentDc(string dcNo) { bool isParDc = false; for (int i = 0; i < tstStrObj.popdcs.Count; i++) { if (dcNo == ((TStructDef.PopDcStruct)(tstStrObj.popdcs[i])).pdcno.ToString()) { isParDc = true; break; } } return isParDc; } /// /// Function returns array of popdcs defined for a given dc. /// /// /// public ArrayList GetPopDcsForParent(string dcNo) { ArrayList arrPopDcs = new ArrayList(); for (int i = 0; i < tstStrObj.popdcs.Count; i++) { if (dcNo == ((TStructDef.PopDcStruct)(tstStrObj.popdcs[i])).pdcno.ToString()) { arrPopDcs.Add(((TStructDef.PopDcStruct)(tstStrObj.popdcs[i])).frameno); } } return arrPopDcs; } /// /// Function to get the non grid expression dependents for a field. /// /// /// private ArrayList GetFldExpDependents(string fName) { int idx = tstStrObj.GetFieldIndex(fName); TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[idx]; ArrayList fldExpDep = new ArrayList(); string[] fldDeps = fld.fieldDependents.Split(','); for (int i = 0; i < fldDeps.Length; i++) { string depFldName = fldDeps[i].ToString(); string prefix = depFldName.Substring(0, 1); int depIdx = tstStrObj.GetFieldIndex(depFldName.Substring(1)); if (depIdx != -1) { TStructDef.FieldStruct depFld = (TStructDef.FieldStruct)tstStrObj.flds[depIdx]; if (prefix == "e" && fld.fldframeno > depFld.fldframeno && !IsDcGrid(depFld.fldframeno.ToString(), tstStrObj)) { fldExpDep.Add(fldDeps[i].ToString()); } } } return fldExpDep; } /// /// Function to get the dependent grid dc for a given field. /// /// /// public ArrayList GetGridDepForField(string fieldName) { int idx = tstStrObj.GetFieldIndex(fieldName); TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[idx]; ArrayList sqlDepDc = new ArrayList(); string[] fldDeps = fld.fieldDependents.Split(','); for (int i = 0; i < fldDeps.Length; i++) { string depFldName = fldDeps[i].ToString(); string prefix = depFldName.Substring(0, 1); int depIdx = tstStrObj.GetFieldIndex(depFldName.Substring(1)); if (depIdx != -1) { TStructDef.FieldStruct depFld = (TStructDef.FieldStruct)tstStrObj.flds[depIdx]; if (prefix != "e" && sqlDepDc.IndexOf(depFld.fldframeno) == -1 && IsDcGrid(depFld.fldframeno.ToString(), tstStrObj)) { sqlDepDc.Add(depFld.fldframeno); } } } return sqlDepDc; } private void StringToFile(string strDebugText) { if (!isDebugFileCreated) { logobj.CreateLog(strDebugText, HttpContext.Current.Session["nsessionid"].ToString(), "DebugValues", "new"); isDebugFileCreated = true; } logobj.CreateLog(strDebugText, HttpContext.Current.Session["nsessionid"].ToString(), "DebugValues", ""); } private void ParseJsonNodes(string result) { if (result == string.Empty) return; JArray cmdNode = null; try { JObject tstData = JObject.Parse(result); cmdNode = (JArray)tstData["command"]; } catch (Exception ex) { logobj.CreateLog("ParseJsonNodes function -" + ex.Message, sessionid, "Exception-" + transid, "new"); } if (cmdNode != null) { string cmdName = string.Empty; string cmdVal = string.Empty; for (int i = 0; i < cmdNode.Count; i++) { Dictionary values = JsonConvert.DeserializeObject>(cmdNode[i].ToString()); for (int k = 0; k < values.Count; k++) { if (values.ContainsKey("cmd")) cmdName = values["cmd"]; if (values.ContainsKey("cmdval")) cmdVal = values["cmdval"]; if (cmdName == "newtrans" || cmdName == "copytrans") { recordid = "0"; recordID = "0"; rid = "0"; ModifyAsNewRecord(); break; } } } } } public string GetMasterRowFlds() { string AxFlds = string.Empty; for (int i = 0; i < AxMasterRowFlds.Count; i++) { if (AxFlds == string.Empty) AxFlds = AxMasterRowFlds[i].ToString(); else AxFlds += "," + AxMasterRowFlds[i].ToString(); } return AxFlds == string.Empty ? "Ax-NA" : AxFlds; } private void SetDbRowsOnLoad(string changedRows, string dcNo, TStructDef strObj) { int frameNo = Convert.ToInt32(dcNo); string[] rowStr = changedRows.Split(','); for (int i = 0; i < rowStr.Length; i++) { string firstChar = rowStr[i].Substring(0, 1); string rowNo = rowStr[i].Substring(1); if (firstChar == "d") { if (rowNo == "*") DeleteAllRowsInDc(dcNo); else DeleteRowInFldArrays(dcNo, rowNo); } } } public void SetSubGridRows(string subGridRows) {//The string will be in the format of popdc1~row1,row2,row3¿popdc2~row1,row2 if (subGridRows != string.Empty) { string[] subrows = subGridRows.Split('¿'); for (int i = 0; i < subrows.Length; i++) { if (subrows[i].ToString() != string.Empty) { AxSubGridRows.Add(subrows[i].ToString()); } } } } private void SetDbRows(string changedRows, string dcNo, TStructDef strObj, string calledFrom) { int frameNo = Convert.ToInt32(dcNo); string[] rowStr = changedRows.Split(','); for (int i = 0; i < rowStr.Length; i++) { if (rowStr[i] == string.Empty) continue; try { string firstChar = rowStr[i].Substring(0, 1); string rowNo = rowStr[i].Substring(1); if (firstChar == "d") { if (rowNo == "*") DeleteAllRowsInDc(dcNo); else DeleteRowInFldArrays(dcNo, rowNo); } } catch (Exception ex) { logobj.CreateLog(ex.StackTrace, HttpContext.Current.Session["nsessionid"].ToString(), "Exception", "new"); } } } private string GetMaxDcRowNo(string dcNo) { int rowNo = 0; for (int i = 0; i < fieldControlName.Count; i++) { if (fieldFrameNo[i].ToString() == dcNo) { string rNo = fieldRowNo[i].ToString(); if (Convert.ToInt32(rNo) > rowNo) rowNo = Convert.ToInt32(rNo); } } return GetRowNoHelper(Convert.ToString(rowNo + 1)); } private string GetFieldsRowNo(string fldId) { int idx = fldId.LastIndexOf("F"); if (idx != -1) return fldId.Substring(idx - 3, 3); else return "000"; } private string GetRowNoHelper(string rowNo) { if (rowNo.Length == 1) rowNo = "00" + rowNo; else if (rowNo.Length == 2) rowNo = "0" + rowNo; return rowNo; } private string CreateDataJson(Boolean IsDc, string dcNo, string Value, string rowCnt, string dataJson) { string dcDataRowsStr = string.Empty; if (IsDc) dcDataRowsStr = "{\"n\":\"DC" + dcNo + "\",\"v\":\"" + rowCnt + "\",\"t\":\"dc\"}"; else dcDataRowsStr = "{\"n\":\"axp_recid" + dcNo + "\",\"v\":\"0\",\"r\":\"" + rowCnt + "\",\"t\":\"s\"}"; if (dataJson.ToString() != "") dcDataRowsStr = "," + dcDataRowsStr; return dcDataRowsStr; } public void UpdateRowCount(string dcNo, string newRowCnt) { int index = -1; for (int i = 0; i < dcRowCntVals.Count; i++) { string[] dcRCnt = dcRowCntVals[i].ToString().Split('~'); if (dcRCnt[0].ToString().ToLower() == dcNo.ToLower()) { index = i; break; } } if (index == -1) dcRowCntVals.Add(newRowCnt); else dcRowCntVals[index] = newRowCnt; } /// /// Function to get the fields index from the fieldControlName array. /// /// /// public int GetFieldIndex(string fldName) { for (int j = 0; j < fieldControlName.Count; j++) { if (fieldControlName[j] != null) { if (fieldControlName[j].ToString() == fldName) { return j; } } } return -1; } public string CallDeleteDataWS(string s) { DateTime stTime = DateTime.Now; string news = GetTraceString(s); if (news != "") s = news; s = s + HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString() + ""; string result = null; //Call service objWebServiceExt = new ASBExt.WebServiceExt(); DateTime asStart = DateTime.Now; result = objWebServiceExt.CallDeleteDataWS(transid, s); DateTime asEnd = DateTime.Now; if (result.ToLower().IndexOf("data deleted successfully") > -1) RemoveAttachFromServer(s, transid); //RemoveAttachFromDir(""); if (logTimeTaken) { webTime1 = asStart.Subtract(stTime).TotalMilliseconds; webTime2 = DateTime.Now.Subtract(asEnd).TotalMilliseconds; asbTime = asEnd.Subtract(asStart).TotalMilliseconds; } return result; } public string CallAddRowWS(TStructData tstData, ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList fldDeletedArray, string s, string dcNo) { string news = GetTraceString(s); if (news != "") s = news; transid = tstData.transid.ToString(); ires = tstStrObj.structRes; tstData.GetFieldValueXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, "-1", "", "NG", dcNo); s += tstData.fieldValueXml + memVarsData; s += HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString(); s += ""; string result = string.Empty; //Call service objWebServiceExt = new ASBExt.WebServiceExt(); result = objWebServiceExt.CallAddRowWS(transid, s, ires); return result; } public string CallAddRowPerfWS(TStructData tstData, ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList fldDeletedArray, string s, string dcNo) { string news = GetTraceString(s); if (news != "") s = news; transid = tstData.transid.ToString(); ires = tstStrObj.structRes; tstData.GetPerfFieldValueXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, "-1", "", "NG", dcNo); s += WsPerfAddRowLoadDc(dcNo, "AddRow"); s += memVarsData; s += HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString(); s += ""; string result = string.Empty; //Call service objWebServiceExt = new ASBExt.WebServiceExt(); result = objWebServiceExt.CallAddRowWS(transid, s, ires); return result; } private string WsPerfAddRowLoadDc(string dcno, string calledFrom) { string iXml = string.Empty; int dcFrame = int.Parse(dcno); TStructDef.DcStruct pfldDc = (TStructDef.DcStruct)tstStrObj.dcs[dcFrame - 1]; if (pfldDc.dcPList != "") { string[] parentFlds = pfldDc.dcPList.Replace("~", ",").Split(','); string globalVars = HttpContext.Current.Session["axGlobalVars"].ToString(); string userVars = HttpContext.Current.Session["axUserVars"].ToString(); for (int i = 0; i < parentFlds.Length; i++) { int pIndx = tstStrObj.GetFieldIndex(parentFlds[i]); if (pIndx == -1) { if (globalVars.ToLower().IndexOf("<" + parentFlds[i].ToLower() + ">") > -1) continue; else if (userVars.ToLower().IndexOf("<" + parentFlds[i].ToLower() + ">") > -1) continue; else continue; } TStructDef.FieldStruct pfld = (TStructDef.FieldStruct)tstStrObj.flds[pIndx]; if (calledFrom == "AddRow" || calledFrom == "DeleteRow") iXml += PerfGetDepFldValues(pfld.fldFrameNo, 0, calledFrom, pfld); else if ((calledFrom == "LoadDc" || calledFrom == "FillGrid") && pfld.fldFrameNo != dcFrame) iXml += PerfGetDepFldValues(pfld.fldFrameNo, 0, calledFrom, pfld); } } return iXml; } private string WsPerfFieldToXML(string fldName, string rowNo, string value, string oldValue, string idvalue, string oldIdValue, string dcNo, Boolean fldSaveNormal, TStructDef.FieldStruct fld = new TStructDef.FieldStruct()) { string dsDataXML = string.Empty; rowNo = GetRowNoHelper(rowNo.ToString()); value = CheckSpecialChars(value); oldValue = CheckSpecialChars(oldValue); string oldVal = ""; if (recordid != "0") { if (value != oldValue) oldVal = "ov=\"" + oldValue + "\""; else oldVal = ""; } if (fldName.StartsWith(Constants.IMGPrefix)) return dsDataXML; if (fld.datatype != null && fld.datatype.ToLower() == "image" && imgAttachPath != "") return dsDataXML; if (fldSaveNormal) { if (Convert.ToString(idvalue) == "") idvalue = "0"; if (Convert.ToString(oldIdValue) == "") oldIdValue = "0"; dsDataXML += "<" + fldName + " rowno=\"" + rowNo + "\" id=\"" + idvalue + "\" oldid=\"" + oldIdValue + "\" " + oldVal + ">" + value + ""; } else { dsDataXML += "<" + fldName + " rowno=\"" + rowNo + "\" " + oldVal + ">" + value + ""; } return dsDataXML; } public string CallDeleteRowWS(TStructData tstData, ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList fldDeletedArray, string s, string dcNo) { string news = GetTraceString(s); if (news != "") s = news; transid = tstData.transid.ToString(); ires = tstStrObj.structRes; tstData.GetFieldValueXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, "-1", "", "NG", dcNo); s += tstData.fieldValueXml + memVarsData; s += HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString(); s += ""; string result = string.Empty; //Call service objWebServiceExt = new ASBExt.WebServiceExt(); result = objWebServiceExt.CallDeleteRowWS(transid, s, ires); return result; } public string CallDeleteRowPerfWS(TStructData tstData, ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList fldDeletedArray, string s, string dcNo) { string news = GetTraceString(s); if (news != "") s = news; transid = tstData.transid.ToString(); ires = tstStrObj.structRes; tstData.GetPerfFieldValueXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, "-1", "", "NG", dcNo); s += WsPerfAddRowLoadDc(dcNo, "DeleteRow"); s += memVarsData; s += HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString(); s += ""; string result = string.Empty; bool callService = false; if (tstStrObj.wsPerfEnabled == true) { if (tstStrObj.wsPerfGRDDcs != null && tstStrObj.wsPerfGRDDcs.IndexOf(dcNo) != -1) callService = true; } else callService = true; if (callService) { objWebServiceExt = new ASBExt.WebServiceExt(); result = objWebServiceExt.CallDeleteRowWS(transid, s, ires); } return result; } public string LoadComboValues(TStructData tstData, ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList fldDeletedArray, string iXml, string dcNo) { DateTime stTime = DateTime.Now; string strTrace = GetTraceString(iXml); if (strTrace != "") iXml = strTrace; string result = string.Empty; //GetGlobalVars(); transid = tstData.transid.ToString(); ires = tstStrObj.structRes; //tstData.GetFieldValueXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, "-1", "LoadTab", "NG", dcNo); //iXml += tstData.fieldValueXml + memVarsData; tstData.GetPerfFieldValueXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, "-1", "LoadTab", "NG", dcNo); iXml += WsPerfAddRowLoadDc(dcNo, "LoadDc"); iXml += memVarsData; iXml += HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString(); iXml += ""; //Call service objWebServiceExt = new ASBExt.WebServiceExt(); DateTime asStart = DateTime.Now; if (CallWsPerfLoadDc(dcNo)) result = objWebServiceExt.CallLoadDCCombosWS(transid, iXml, ires); DateTime asEnd = DateTime.Now; if (logTimeTaken) { webTime1 = asStart.Subtract(stTime).TotalMilliseconds; webTime2 = DateTime.Now.Subtract(asEnd).TotalMilliseconds; asbTime = asEnd.Subtract(asStart).TotalMilliseconds; } return result; } private bool CallWsPerfLoadDc(string dcNo) { bool isCallDcCombo = false; //If dc has fillgrid if (dcNo != "" && tstStrObj.wsPerfFGDcName != null && rid == "0") { string[] flGridDc = tstStrObj.wsPerfFGDcName; var loaddcFG = flGridDc.Where(d => d.ToLower() == "dc" + dcNo).ToList(); if (loaddcFG.Count > 0) isCallDcCombo = true; } //Below condition not required to now becuse of accept sql field will take cae either doformload, addrow or getdependency ////If dc has accept sql or select with auto select fields //if (tstStrObj.wsPerfLDcName != null && isCallDcCombo == false && rid == "0") //{ // string[] fldldCall = tstStrObj.wsPerfLDcName; // var loaddcFld = fldldCall.Where(fd => fd.ToLower() == "dc" + dcNo).ToList(); // if (loaddcFld.Count > 0) // isCallDcCombo = true; //} return isCallDcCombo; } public string GetSubGridCombos(ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList fldDeletedArray, string iXml, string dcNo, string parDcNo, int popRowNo, int parRowNo) { string strTrace = GetTraceString(iXml); if (strTrace != "") iXml = strTrace; string result = string.Empty; ires = tstStrObj.structRes; GetPopFieldValueXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, "-1", parDcNo, parRowNo, dcNo, popRowNo); iXml += fieldValueXml + memVarsData; iXml += HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString(); iXml += ""; //Call service objWebServiceExt = new ASBExt.WebServiceExt(); result = objWebServiceExt.CallGetSubGridCCombosWS(transid, iXml, ires); return result; } #endregion #endregion private void UpdateRowValues(string fldName, string rowNo, string dcNo, string comboValues, string dpValues) { int idx = GetFldIndex(Convert.ToInt32(dcNo), fldName, Convert.ToInt32(rowNo)); if (idx != -1) { fieldRowValues[idx] = comboValues; fieldDPVals[idx] = dpValues; } } public bool IsDcGrid(string dcNo, TStructDef strObj) { bool isGrid = false; for (int i = 0; i < strObj.dcs.Count; i++) { TStructDef.DcStruct dc = (TStructDef.DcStruct)strObj.dcs[i]; if (dc.frameno.ToString() == dcNo && dc.isgrid == true) { isGrid = true; break; } } return isGrid; } public int GetDcRowCount(string dcNo) { return dsDataSet.Tables["dc" + dcNo].Rows.Count; } #region PickList Methods /// /// Function to call the webservice which returns the filtered value for the picklist field. /// /// /// public string GetPickListResult(ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList fldDeletedArray, string iXml, string structXml, string fldName, string frameNo, string parentInfo, string subGridInfo, string activeRow, string includeDcs) { string res = ""; GetPicklistInputXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, fldName, frameNo, parentInfo, subGridInfo, activeRow); iXml += this.fieldValueXml + memVarsData; iXml += HttpContext.Current.Session["axApps"].ToString() + HttpContext.Current.Application["axProps"].ToString() + HttpContext.Current.Session["axGlobalVars"].ToString() + HttpContext.Current.Session["axUserVars"].ToString(); iXml += ""; //Call service objWebServiceExt = new ASBExt.WebServiceExt(); iXml = util.CheckSplChrInputXML(iXml); res = objWebServiceExt.CallGetSearchResultWS(transid, iXml, structXml); if (res != "done" && res != "" && !res.StartsWith(Constants.ERROR)) { res = ParsePickListJson(res); } return res; } public void GetPicklistInputXml(ArrayList fldArray, ArrayList fldDbRowNo, ArrayList fldValueArray, ArrayList fldDeletedArray, string fldName, string frameNo, string parentInfo, string subGridInfo, string activeRow) { int idx = tstStrObj.GetFieldIndex(fldName); TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[idx]; ArrayList AxDepFields = new ArrayList(); bool isDcGrid = false; Dictionary IncludeDcRows = new Dictionary(); isDcGrid = IsDcGrid(frameNo, tstStrObj); if (isDcGrid) { string DepFlds = fld.fieldSqlDepParents; AxDepFields = GetParDepFlds(fld.fieldSqlDepParents); } if (fld.fieldSqlGridDeps != string.Empty) { string[] strSDeps = fld.fieldSqlGridDeps.Split(','); for (int i = 0; i < strSDeps.Length; i++) { AxDepFields.Add(strSDeps[i].ToString()); } //The below statement will add the current field to the dependent fields if the current dc is a grid dc //and it has dependents in other grid, then all the row values for the field should be sent in the input xml. if (isDcGrid) AxDepFields.Add(fld.name); } //If the field has non grid sql dependents, then send the parent values for that dep field also if (IsDcGrid(frameNo, tstStrObj)) { //If the call is made from a parent grid, then all its subgriud and their respective rows for the given parent row //will be sent in the given format: dcno~rowno1,rowno2¿dcno~rowno1,rowno2... if (subGridInfo != "") { if (subGridInfo.IndexOf("¿") != -1) { string[] subgridDcs = subGridInfo.Split('¿'); for (int i = 0; i < subgridDcs.Length; i++) { string[] dcInfo = subgridDcs[i].ToString().Split('~'); IncludeDcRows.Add(dcInfo[0], dcInfo[1]); } } else { IncludeDcRows.Add(subGridInfo.Substring(0, subGridInfo.IndexOf("~")), subGridInfo.Substring(subGridInfo.IndexOf("~") + 1)); } } //If the call is made from sub grid, then the parentinfo will contain the parent dc no and parent row no in the given format : dcno~rowno if (parentInfo != "") { IncludeDcRows.Add(parentInfo.Substring(0, parentInfo.IndexOf("~")), parentInfo.Substring(parentInfo.IndexOf("~") + 1)); } //first update the list with the new fldArray. UpdateDataList(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray); DeleteDefaultRowInPopDc(project, user, transid, sessionid, AxRole); CreateFieldValueXmlPerf(frameNo, activeRow, AxDepFields, fld.fieldDepGridDcs, IncludeDcRows, ""); } else { if (AxDepFields.Count > 0) { //if a non grid fields has dependent grid dc fields, then send that dc fields data also. //first update the list with the new fldArray. UpdateDataList(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray); DeleteDefaultRowInPopDc(project, user, transid, sessionid, AxRole); CreateFieldValueXmlPerf(frameNo, activeRow, AxDepFields, fld.fieldDepGridDcs, IncludeDcRows, ""); } else { //if a non grid fields has dependent grid Fill grid dc, then send that dc data also. GetFieldValueXml(fldArray, fldDbRowNo, fldValueArray, fldDeletedArray, "-1", "GetDependents", "NG", fld.fieldDepFillDcs); } } } /// /// Function to parse the result of GetSearchResult service and construct the result string and return to the client. /// /// /// private string ParsePickListJson(string result) { StringBuilder pickDataArray = new StringBuilder(); JArray Data; try { result = result.Replace("\\", ";bkslh"); JObject tstData = JObject.Parse(result); Data = (JArray)tstData["pickdata"]; } catch (Exception ex) { throw ex; } if (Data != null) { string fName = string.Empty; string fValue = string.Empty; for (int m = 0; m < Data.Count; m++) { if (Data[m]["rcount"] != null) { string rCount = Data[m]["rcount"].ToString(); rCount = rCount.Replace("\"", ""); if (rCount != "0") pickDataArray.Append(rCount + "♣"); } else if (Data[m]["fname"] != null) { fName = (string)Data[m]["fname"].ToString(); } else { fValue = (string)Data[m]["fvalue"].ToString(); //Following Code was removing first and last character of fname and fvalue resulting in issues.. hence commented //fName = fName.Remove(0, 1); //fName = fName.Remove(fName.Length - 1, 1); //fValue = fValue.Remove(0, 1); //fValue = fValue.Remove(fValue.Length - 1, 1); fValue = fValue.Replace("^^dq", "\""); fValue = fValue.Replace(";bkslh", @"\"); string[] pickFldValues = fValue.Split('~'); for (int j = 0; j < pickFldValues.Length; j++) { if (j == 0) pickDataArray.Append(pickFldValues[j].ToString()); else pickDataArray.Append("¿" + pickFldValues[j].ToString()); } } } } return pickDataArray.ToString(); } #endregion private void GetGlobalVars() { project = HttpContext.Current.Session["project"].ToString(); user = HttpContext.Current.Session["user"].ToString(); AxRole = HttpContext.Current.Session["AxRole"].ToString(); sessionid = HttpContext.Current.Session["nsessionid"].ToString(); } public string GetIncludeDcsForLoad() { string includeDcs = string.Empty; string depDcs = string.Empty; DataRow dr = DsGetRow("axp_mustloaddc", "001"); if (dr != null) depDcs = dr["axp_mustloaddc"].ToString(); return depDcs; } public void AddToFasDDl(string fName, string fJson) { if (fastDDL.ContainsKey(fName)) fastDDL.Remove(fName); fastDDL.Add(fName, fJson); } #region New Indexing Methods /// /// Function loops through the dcs in the tstruct and for every dc adds the default fields into the field arrays. /// /// private void CreateDefaultFArray(TStructDef strObj) { foreach (TStructDef.DcStruct dc in strObj.dcs) UpdateRowCount(dc.frameno.ToString(), "DC" + dc.frameno.ToString() + "~1"); } /// /// Function loops through the dcs in the tstruct and for every dc adds the default fields into the Data Table. /// /// private void CreateDataSets(TStructDef strObj) { DataSet ds = new DataSet("datacache"); // TODO: needs proper comment - Create a DataSet and put both tables in it. foreach (TStructDef.DcStruct dc in strObj.dcs) { ds.Tables.Add(DSConstruct(dc.frameno, strObj)); ds.Tables.Add(DSConstructOld(dc.frameno, strObj)); ds.Tables.Add(DSSaveFalse(dc.frameno, strObj)); } ds.Tables.Add(DSCreateDropDownTable()); dsDataSet = ds; } private DataTable DSCreateDropDownTable() { DataTable dtDropDownValue = new DataTable(); dtDropDownValue.TableName = "dsdropdown"; DataColumn[] keys1 = new DataColumn[1]; DataColumn column1 = dtDropDownValue.Columns.Add("dropdownkey"); keys1[0] = column1; dtDropDownValue.PrimaryKey = keys1; dtDropDownValue.Columns.Add("fldname"); dtDropDownValue.Columns.Add("axp__rowno"); dtDropDownValue.Columns.Add("rowvals"); dtDropDownValue.Columns.Add("dpmvalues"); dtDropDownValue.Columns.Add("dp"); dtDropDownValue.Columns.Add("mr"); dtDropDownValue.Columns.Add("idcol"); return dtDropDownValue; } private DataTable DSSaveFalse(int dcNo, TStructDef strObj) { TStructDef.DcStruct dc = (TStructDef.DcStruct)strObj.dcs[dcNo - 1]; DataTable dtObj = new DataTable("dc_savefalse" + dcNo.ToString()); DataColumn[] keys = new DataColumn[1]; DataColumn column; string dcFldRange = strObj.GetDcFieldRange(dcNo.ToString()); string[] fldRange = dcFldRange.Split(','); int startIndex = Convert.ToInt32(fldRange[0]); int endIndex = Convert.ToInt32(fldRange[1]); for (int j = startIndex; j <= endIndex; j++) { TStructDef.FieldStruct fld = (TStructDef.FieldStruct)strObj.flds[j]; if (fld.savevalue == false) { dtObj.Columns.Add(fld.name); } } column = dtObj.Columns.Add("axp__rowno"); column.DataType = typeof(Int32); keys[0] = column; dtObj.PrimaryKey = keys; return dtObj; } private DataTable DSConstructOld(int dcNo, TStructDef strObj) { TStructDef.DcStruct dc = (TStructDef.DcStruct)strObj.dcs[dcNo - 1]; DataTable dtOldObj = new DataTable("dc_old" + dcNo.ToString()); DataColumn[] keys = new DataColumn[1]; DataColumn column; string dcFldRange = strObj.GetDcFieldRange(dcNo.ToString()); string[] fldRange = dcFldRange.Split(','); int startIndex = Convert.ToInt32(fldRange[0]); int endIndex = Convert.ToInt32(fldRange[1]); for (int j = startIndex; j <= endIndex; j++) { TStructDef.FieldStruct fld = (TStructDef.FieldStruct)strObj.flds[j]; dtOldObj.Columns.Add("old__" + fld.name); if (fld.savenormal) dtOldObj.Columns.Add("oldid__" + fld.name); } column = dtOldObj.Columns.Add("axp__rowno"); column.DataType = typeof(Int32); keys[0] = column; dtOldObj.PrimaryKey = keys; return dtOldObj; } /// /// Function to add every field in given dc into the field array and index array. /// /// /// /// private DataTable DSConstruct(int dcNo, TStructDef strObj) { TStructDef.DcStruct dc = (TStructDef.DcStruct)strObj.dcs[dcNo - 1]; DataTable dtObj = new DataTable("dc" + dcNo.ToString()); DataColumn[] keys = new DataColumn[1]; DataColumn column; string dcFldRange = strObj.GetDcFieldRange(dcNo.ToString()); string[] fldRange = dcFldRange.Split(','); int startIndex = Convert.ToInt32(fldRange[0]); int endIndex = Convert.ToInt32(fldRange[1]); for (int j = startIndex; j <= endIndex; j++) { TStructDef.FieldStruct fld = (TStructDef.FieldStruct)strObj.flds[j]; dtObj.Columns.Add(fld.name); //dtObj.Columns.Add("old__" + fld.name); if (fld.savenormal) { dtObj.Columns.Add("id__" + fld.name); //dtObj.Columns.Add("oldid__" + fld.name); } } //dtObj.Columns.Add("axp_recid" + dcNo); column = dtObj.Columns.Add("axp__rowno"); column.DataType = typeof(Int32); keys[0] = column; dtObj.PrimaryKey = keys; dtObj.Columns.Add("axp__delrow"); if (dc.isgrid) dtObj.Columns.Add(Constants.AXPISROWVALID + dcNo); return dtObj; } /// /// Function which loop though each dc till the given dc and appends the field count. /// /// /// /// private int GetDcIndex(int dcNo) { int fldCnt = 0; foreach (TStructDef.DcStruct dc in tstStrObj.dcs) { if (dc.frameno >= dcNo) break; fldCnt += dc.fieldCount; } return fldCnt; } /// /// Function to calculate the index of the field in the fieldIndexArray /// and return the value from that item of the fieldIndexArray. /// /// /// /// /// public int GetFldIndex(int dcNo, string fldName, int rowNo) { int idx = 0; int index = 0; if (rowNo == 0) rowNo = 1; foreach (TStructDef.DcStruct dc in tstStrObj.dcs) { if (dc.frameno >= dcNo) break; idx += GetDcRowCount(dc.frameno.ToString()) * dc.fieldCount; } TStructDef.DcStruct currentDC = (TStructDef.DcStruct)tstStrObj.dcs[dcNo - 1]; int fieldOrder = GetFieldOrder(fldName, dcNo, currentDC); //Formula = idx + FieldCountInDC * (RowNo-1) + (FieldOrder - StartOrderInDC) idx += currentDC.fieldCount * (rowNo - 1) + (fieldOrder - GetDcIndex(dcNo)); if (idx >= fieldIndexArray.Count) index = -1; else index = (Int32)fieldIndexArray[idx]; return index; } /// /// Function to get the field order for the given field in the given dc. /// /// /// /// /// private int GetFieldOrder(string fldName, int dcNo, TStructDef.DcStruct dc) { int fldOrd = 0; string dcFldRange = tstStrObj.GetDcFieldRange(dcNo.ToString()); string[] fldRange = dcFldRange.Split(','); int startIndex = Convert.ToInt32(fldRange[0]); int endIndex = Convert.ToInt32(fldRange[1]); for (int j = startIndex; j <= endIndex; j++) { TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[j]; if (fld.name == fldName) { fldOrd = j; break; } } return fldOrd; } /// /// Function to add or update the field arrays. /// /// /// /// /// /// /// /// /// /// /// /// /// /// private void SubmitFieldInArrays(string value, string oldValue, string idCol, string mr, string rowVals, string id, string oldId, string dpmValues, string dp, int index) { fieldValue[index] = value; fieldOldValue[index] = value; fldIdCol[index] = idCol; fldMasterRow[index] = mr; fieldRowValues[index] = rowVals; fieldOldIdValue[index] = oldId; fieldIdValue[index] = id; fieldDPMVals[index] = dpmValues; fieldDPVals[index] = dp; //StringToFile("Replace Values - FieldName-" + fieldName[index].ToString() + " Rowno- " + fieldRowNo[index].ToString() + " Value- " + value + " Index- " + index); } private void DSSubmit(string fldName, int rowNo, string value, string idValue) { int dcNo = tstStrObj.GetFieldDc(fldName); if (dcNo == 0 && fldName.StartsWith(Constants.AXPISROWVALID)) { dcNo = Convert.ToInt32(fldName.Substring(13)); } if (rowNo == 0) rowNo = 1; DataTable dt = dsDataSet.Tables["dc" + dcNo]; DataRow foundRow = dsDataSet.Tables["dc" + dcNo].Rows.Find(rowNo); if (foundRow == null) { foundRow = dt.NewRow(); foundRow["axp__rowno"] = Convert.ToInt32(rowNo); foundRow["axp__delrow"] = 0; dt.Rows.Add(foundRow); } if (!fldName.StartsWith("axp_recid")) foundRow[fldName] = value; string axp_recId = foundRow["axp_recid" + dcNo].ToString(); foundRow["axp_recid" + dcNo] = axp_recId == "" ? "0" : axp_recId; if (dt.Columns.Contains("id__" + fldName)) foundRow["id__" + fldName] = idValue; dt.AcceptChanges(); } private void DSSubmitDropDownValues(string fldName, int rowNo, string rowVals, string dpmValues, string dp, string mr, string idCol) { DataTable thisDataTable = dsDataSet.Tables["dsdropdown"]; if (rowNo == 0) rowNo = 1; DataRow thisDataRow = thisDataTable.Rows.Find(fldName + "-" + rowNo); if (thisDataRow == null) { thisDataRow = thisDataTable.NewRow(); thisDataRow["dropdownkey"] = fldName + "-" + rowNo; thisDataRow["fldname"] = fldName; thisDataRow["axp__rowno"] = rowNo; thisDataTable.Rows.Add(thisDataRow); } thisDataRow["rowvals"] = rowVals; thisDataRow["dpmvalues"] = dpmValues; thisDataRow["dp"] = dp; thisDataRow["mr"] = mr; thisDataRow["idcol"] = idCol; dsDataSet.AcceptChanges(); } private void DSUpdateRowValues(string fldName, int rowNo, string rowVals, string dp, string masterRow, string idCol) { DataTable thisDataTable = dsDataSet.Tables["dsdropdown"]; if (rowNo == 0) rowNo = 1; DataRow thisDataRow = thisDataTable.Rows.Find(fldName + "-" + rowNo); if (thisDataRow == null) { thisDataRow = thisDataTable.NewRow(); thisDataRow["dropdownkey"] = fldName + "-" + rowNo; thisDataRow["fldname"] = fldName; thisDataRow["axp__rowno"] = rowNo; thisDataRow["idcol"] = idCol; thisDataTable.Rows.Add(thisDataRow); } thisDataRow["rowvals"] = rowVals; thisDataRow["dp"] = dp; thisDataRow["mr"] = masterRow; dsDataSet.AcceptChanges(); } public DataRow DSGetDropdownRow(string fldName, string rowNo) { DataTable thisDataTable = dsDataSet.Tables["dsdropdown"]; int rNo = Convert.ToInt32(rowNo); if (rNo == 0) rNo = 1; return thisDataTable.Rows.Find(fldName + "-" + rNo); } private void DSSubmitWithOld(string fldName, int rowNo, string value, string idValue, string oldIdValue) { int dcNo = tstStrObj.GetFieldDc(fldName); if (dcNo == 0) return; if (rowNo == 0) rowNo = 1; DataTable dt = dsDataSet.Tables["dc" + dcNo]; DataRow foundRow = dsDataSet.Tables["dc" + dcNo].Rows.Find(rowNo); if (foundRow == null) { foundRow = dt.NewRow(); foundRow["axp__rowno"] = rowNo; foundRow["axp__delrow"] = 0; dt.Rows.Add(foundRow); } foundRow[fldName] = value; if (dt.Columns.Contains("id__" + fldName)) foundRow["id__" + fldName] = idValue; dt.AcceptChanges(); DSSubmitOldValues(fldName, rowNo, value, idValue, oldIdValue); } private void DSSubmitOldValues(string fldName, int rowNo, string value, string idValue, string oldIdValue) { int dcNo = tstStrObj.GetFieldDc(fldName); if (rowNo == 0) rowNo = 1; DataTable dtOld = dsDataSet.Tables["dc_old" + dcNo]; DataRow drOld = dtOld.Rows.Find(rowNo); if (drOld == null) { drOld = dtOld.NewRow(); drOld["axp__rowno"] = rowNo; dtOld.Rows.Add(drOld); } drOld["old__" + fldName] = value; if (dtOld.Columns.Contains("oldid__" + fldName)) drOld["oldid__" + fldName] = oldIdValue; dtOld.AcceptChanges(); } private void DSInsertRow(int dcNo, int rowNo) { DataTable DCTable = dsDataSet.Tables["dc" + dcNo]; for (int i = DCTable.Rows.Count - 1; i >= 0; i--) { DataRow thisrow = DCTable.Rows[i]; int thisRowNo = Convert.ToInt32(thisrow["axp__rowno"]); if (thisRowNo < rowNo) break; thisrow["axp__rowno"] = thisRowNo + 1; } DataRow newRow = DCTable.NewRow(); newRow["axp__rowno"] = rowNo; DCTable.Rows.Add(newRow); DCTable.AcceptChanges(); dsDataSet.AcceptChanges(); } /// /// Function to delete all the rows in the given dc from the field arrays. /// /// private void DeleteAllRowsInDc(string dcNo) { DSDeleteAllRows(dcNo); } private void DSDeleteAllRows(string dcNo) { int idx = AxDelDcNo.IndexOf("dc" + dcNo); if (idx == -1) AxDelDcNo.Add("dc" + dcNo); StringBuilder strDelIds = new StringBuilder(); if (idx != -1) strDelIds.Append(AxDelRecIds[idx].ToString()); DataTable DCTable = dsDataSet.Tables["dc" + dcNo]; for (int j = DCTable.Rows.Count; j > 0; j--) { DataRow foundRow = DCTable.Rows.Find(j); if (foundRow != null) { if (strDelIds.ToString() == string.Empty) strDelIds.Append(foundRow["axp_recid" + dcNo].ToString()); else strDelIds.Append("," + foundRow["axp_recid" + dcNo].ToString()); } DeleteRowInFldArrays(dcNo, j.ToString()); } if (idx == -1) AxDelRecIds.Add(strDelIds.ToString()); else AxDelRecIds[idx] = strDelIds.ToString(); } //Set the deleted rows from GetDependents, to the global array private void SetPopDeletedRows(string dcNo, string delRecIds) { int idx = AxDelDcNo.IndexOf("dc" + dcNo); if (idx == -1) { AxDelDcNo.Add("dc" + dcNo); AxDelRecIds.Add(delRecIds); } else { AxDelRecIds[idx] = delRecIds; } } public void DSDeleteRow(string dcNo, string rowNum) { DataTable DCTable = dsDataSet.Tables["dc" + dcNo]; DataTable DCOldTable = dsDataSet.Tables["dc_old" + dcNo]; int rNo = Convert.ToInt32(rowNum); if (rNo == 0) rNo = 1; DataRow foundRow = DCTable.Rows.Find(rNo); DataRow oldRow = DCOldTable.Rows.Find(rNo); DataTable DeletedRowsTable = dsDataSet.Tables["deldc" + dcNo]; if (DeletedRowsTable == null) { DeletedRowsTable = DCTable.Clone(); DeletedRowsTable.TableName = "deldc" + dcNo; dsDataSet.Tables.Add(DeletedRowsTable); } if (foundRow != null) { DeletedRowsTable.ImportRow(foundRow); DataRow DelTableRow = DeletedRowsTable.Rows.Find(rNo); DelTableRow["axp__delrow"] = DelTableRow["axp__rowno"]; DelTableRow["axp__rowno"] = deletedCount--; //copying delete contents to xml for sending to web service. StringBuilder strDelRowFlds = new StringBuilder(); string axpRecidVal = "0"; string axpNode = string.Empty; string[] dcRange = tstStrObj.GetDcFieldRange(dcNo).Split(','); int startIdx = Convert.ToInt32(dcRange[0]); int endIdx = Convert.ToInt32(dcRange[1]); for (int j = startIdx; j <= endIdx; j++) { TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[j]; if (recordid != "0") { if (oldRow != null) { if (fld.name == "axp_recid" + dcNo) { axpNode = "<" + fld.name + ">" + CheckSpecialChars(oldRow["old__" + fld.name].ToString()) + ""; axpRecidVal = foundRow[fld.name].ToString(); } else { strDelRowFlds.Append("<" + fld.name + ">" + CheckSpecialChars(oldRow["old__" + fld.name].ToString()) + ""); } } } } DelRowFldsXml.Add(axpRecidVal + "♦" + axpNode + strDelRowFlds.ToString()); foundRow.Delete(); DCTable.AcceptChanges(); DCTable.PrimaryKey = null; DCTable = DeleteRowFalse(DCTable, DeletedRowsTable, dcNo); int givenRow = Convert.ToInt32(rNo); foreach (DataRow thisrow in DCTable.Rows) { int thisRowNo = Convert.ToInt32(thisrow["axp__rowno"]); if (thisRowNo > givenRow) thisrow["axp__rowno"] = thisRowNo - 1; } DCTable.PrimaryKey = new DataColumn[] { DCTable.Columns["axp__rowno"] }; if (oldRow != null) { oldRow.Delete(); DCOldTable.AcceptChanges(); } DCOldTable.PrimaryKey = null; foreach (DataRow thisrow in DCOldTable.Rows) { int thisRowNo = Convert.ToInt32(thisrow["axp__rowno"]); if (thisRowNo > givenRow) thisrow["axp__rowno"] = thisRowNo - 1; } DCOldTable.PrimaryKey = new DataColumn[] { DCOldTable.Columns["axp__rowno"] }; DSDeleteDropDown(dcNo, rowNum); } } private void deleteRowOnSave() { try { for (int i = 0; i < deletedRowCount.Count; i++) { string dcNumber = deletedRowCount[i].ToString().Split('♦')[1]; string delRowNumber = (int.Parse(deletedRowCount[i].ToString().Split('♦')[0]) + 1).ToString(); DSDeleteRow(dcNumber, delRowNumber); } } catch (Exception ex) { } } private void UpdateGridDelRowVal(int dcNumner) { try { if (isDeletedRow) { int totRowCount = dsData.Tables["DC" + dcNumner].Rows.Count; dsData.Tables["DC" + dcNumner].Rows[totRowCount - 1]["axp__isGrdVld" + dcNumner] = ""; dsData.Tables["DC" + dcNumner].AcceptChanges(); if (deletedRowCount.Count == 0) { deletedRowCount.Add(totRowCount + "♦" + dcNumner); } else { string checkValue = string.Join(",", deletedRowCount.Select(x => x.ToString()).ToList()); if (checkValue.IndexOf("♦" + dcNumner) != -1) { var prevValue = deletedRowCount.AsEnumerable().Where(x => x.Contains("♦" + dcNumner)).ToList(); deletedRowCount.Remove(prevValue[0]); deletedRowCount.Add(totRowCount + "♦" + dcNumner); } else { deletedRowCount.Add(totRowCount + "♦" + dcNumner); } } } } catch (Exception ex) { } } private DataTable DeleteRowFalse(DataTable DCTable, DataTable DeletedRowsTable, string dcNo) { try { isDeletedRow = true; int delRowCount = DeletedRowsTable.Rows.Count; int OrgRows = DCTable.Rows.Count; if (delRowCount < OrgRows) { for (int i = 1; i <= delRowCount; i++) { bool flagRemff = true; foreach (DataColumn dc in DCTable.Columns) { if (dc.ColumnName == "axp__rowno") { break; } else if (DCTable.Rows[OrgRows - i][dc].ToString() != "" && DCTable.Rows[OrgRows - i][dc].ToString() != "0") { flagRemff = false; } } if (flagRemff) { DCTable.Rows[OrgRows - i]["axp__isGrdVld" + dcNo] = "false"; } } } else { #region delete int userValue = 0; int ofrows = DCTable.Rows.Count; for (int trc = 0; trc < DCTable.Rows.Count; trc++) { int dbValue = int.Parse(DCTable.Rows[trc]["axp__rowno"].ToString()); if (dbValue >= userValue) { userValue = dbValue; DeleteRowTopNo = trc; } } bool flagRem = true; foreach (DataColumn dc in DCTable.Columns) { if (dc.ColumnName.ToLower() == "axp__rowno") { break; } else if (DCTable.Rows[DeleteRowTopNo][dc].ToString() != "" && DCTable.Rows[DeleteRowTopNo][dc].ToString() != "0") { flagRem = false; } } if (flagRem) { int totRowCount = DCTable.Rows.Count; if (totRowCount != 1 && totRowCount == ofrows) { DCTable.Rows[totRowCount - 1]["axp__isGrdVld" + dcNo] = "false"; DCTable.AcceptChanges(); } } #endregion } return DCTable; } catch (Exception ex) { return DCTable; } } //Function to delete all the sub grid rows after the get dep call. private void DeletePopRowsAfterDep() { //AxSubGridRows will have dcno~1,2,3 in every item for (int i = 0; i < AxSubGridRows.Count; i++) { string[] dcData = AxSubGridRows[i].ToString().Split('~'); string dcNo = dcData[0].ToString(); int delIdx = AxDelDcNo.IndexOf("dc" + dcNo); //This code will add the dr attribute recids sent from the getdep, and store the deleted row information for save. ArrayList delRecIds = new ArrayList(); if (delIdx != -1) { string[] delIds = AxDelRecIds[delIdx].ToString().Split(','); for (int ind = 0; ind < delIds.Length; ind++) { if (delIds[ind].ToString() != string.Empty) delRecIds.Add(delIds[ind].ToString()); } } string[] popRows = dcData[1].ToString().Split(','); //This loop is reversed as the array will be sorted in asc order. and while deleting it should always be in desc order. for (int j = popRows.Length - 1; j >= 0; j--) { if (popRows[j] != "") { string rowNum = popRows[j].ToString(); DataTable DCTable = dsDataSet.Tables["dc" + dcNo]; DataTable DCOldTable = dsDataSet.Tables["dc_old" + dcNo]; int rNo = Convert.ToInt32(rowNum); if (rNo == 0) rNo = 1; DataRow foundRow = DCTable.Rows.Find(rNo); DataRow oldRow = DCOldTable.Rows.Find(rNo); if (foundRow != null) { StringBuilder strDelRowFlds = new StringBuilder(); string axpRecidVal = "0"; string axpNode = string.Empty; string[] dcRange = tstStrObj.GetDcFieldRange(dcNo).Split(','); int startIdx = Convert.ToInt32(dcRange[0]); int endIdx = Convert.ToInt32(dcRange[1]); for (int k = startIdx; k <= endIdx; k++) { TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[k]; if (recordid != "0") { if (oldRow != null) { if (fld.name == "axp_recid" + dcNo) { axpNode = "<" + fld.name + ">" + CheckSpecialChars(oldRow["old__" + fld.name].ToString()) + ""; axpRecidVal = foundRow[fld.name].ToString(); } else { strDelRowFlds.Append("<" + fld.name + ">" + CheckSpecialChars(oldRow["old__" + fld.name].ToString()) + ""); } } } } if (delRecIds.IndexOf(axpRecidVal) != -1) DelRowFldsXml.Add(axpRecidVal + "♦" + axpNode + strDelRowFlds.ToString()); foundRow.Delete(); DCTable.AcceptChanges(); DCTable.PrimaryKey = null; int givenRow = Convert.ToInt32(rNo); foreach (DataRow thisrow in DCTable.Rows) { int thisRowNo = Convert.ToInt32(thisrow["axp__rowno"]); if (thisRowNo > givenRow) thisrow["axp__rowno"] = thisRowNo - 1; } DCTable.PrimaryKey = new DataColumn[] { DCTable.Columns["axp__rowno"] }; if (oldRow != null) { oldRow.Delete(); DCOldTable.AcceptChanges(); } DCOldTable.PrimaryKey = null; foreach (DataRow thisrow in DCOldTable.Rows) { int thisRowNo = Convert.ToInt32(thisrow["axp__rowno"]); if (thisRowNo > givenRow) thisrow["axp__rowno"] = thisRowNo - 1; } DCOldTable.PrimaryKey = new DataColumn[] { DCOldTable.Columns["axp__rowno"] }; //DSDeleteDropDown(dcNo, rowNum); } } } } } private void DSDeleteDropDown(string dcNo, string rowNum) { DataTable dsDropDown = dsDataSet.Tables["dsdropdown"]; if (dsDropDown == null) return; int rNo = Convert.ToInt32(rowNum); if (rNo == 0) rNo = 1; StringBuilder strDelRowFlds = new StringBuilder(); string axpNode = string.Empty; string[] dcRange = tstStrObj.GetDcFieldRange(dcNo).Split(','); int startIdx = Convert.ToInt32(dcRange[0]); int endIdx = Convert.ToInt32(dcRange[1]); for (int j = startIdx; j <= endIdx; j++) { TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[j]; DataRow dr = dsDropDown.Rows.Find(fld.name + "-" + Convert.ToString(rNo)); if (dr != null) { bool Proceed = false; if (dr["mr"].ToString() == "0") Proceed = true; Proceed = Custom_CanDelRowInEsti(fld, dr["mr"].ToString(), dcNo, rowNum); if (Proceed) { dr.Delete(); dsDropDown.AcceptChanges(); foreach (DataRow drRow in dsDropDown.Rows) { int rowNo = Convert.ToInt32(drRow["axp__rowno"]); if (rowNo > rNo && fld.name == drRow["fldname"].ToString()) { drRow["axp__rowno"] = rowNo - 1; drRow["dropdownkey"] = fld.name + "-" + Convert.ToString(rowNo - 1); } } } } } dsDropDown.AcceptChanges(); } private bool Custom_CanDelRowInEsti(TStructDef.FieldStruct fld, string mr, string dcNo, string rowNum) { bool Proceed = false; if (fld.name == "role") mr = "1"; if (fld.name == "activity") { Proceed = true; } if (mr == "0") Proceed = true; return Proceed; } /// /// Function to delete all the fields in the given row and dc from the field arrays. /// /// /// private void DeleteRowInFldArrays(string frameNo, string rowNum) { DSDeleteRow(frameNo, rowNum); } /// /// Function to get the index of the given row and dc from the fieldindexarray. /// /// /// /// private int GetRowIndex(int dcNo, int rowNo) { int idx = 0; if (rowNo == 0) rowNo = 1; foreach (TStructDef.DcStruct dc in tstStrObj.dcs) { if (dc.frameno >= dcNo) break; idx += GetDcRowCount(dc.frameno.ToString()) * dc.fieldCount; } TStructDef.DcStruct currentDC = (TStructDef.DcStruct)tstStrObj.dcs[dcNo - 1]; //Formula = idx + FieldCountInDC * (RowNo-1) + (FieldOrder - StartOrderInDC) idx += currentDC.fieldCount * (rowNo - 1); return idx; } private void RefInMemOnSave() { try { if (tstStrObj.axp_inmemTids != String.Empty && (HttpContext.Current.Session["RapidTsTruct"] != null && HttpContext.Current.Session["RapidTsTruct"].ToString() == "true") && (HttpContext.Current.Session["AxIsPerfCode"] != null && HttpContext.Current.Session["AxIsPerfCode"].ToString().ToLower() == "true")) { string[] inMemTids = tstStrObj.axp_inmemTids.Split(','); FDR fdrObj; if (HttpContext.Current.Session["FDR"] != null) fdrObj = (FDR)HttpContext.Current.Session["FDR"]; else fdrObj = new FDR(); FDW fdwObj = FDW.Instance; foreach (string Tid in inMemTids) { ArrayList arrKeys = fdrObj.GetPrefixedKeys(project + "-" + Tid + "-"); foreach (string key in arrKeys) { fdwObj.ClearRedisServerDataByKey(key, String.Empty, true); } } } } catch (Exception Ex) { } } #endregion #region Json creation Functions /// /// Function to create json from the data arrays in the stored draft. /// /// public string CreateJsonForDraft() { StringBuilder draftJson = new StringBuilder(); StringBuilder dcJson = new StringBuilder(); draftJson.Append("{\"data\":["); string tmpStr = string.Empty; //loop for constructing the field value xml based on the frame no, row no and field order foreach (TStructDef.DcStruct dc in tstStrObj.dcs) { string dcNo = Convert.ToString(dc.frameno); DataTable thisDataTable = dsDataSet.Tables["dc" + dcNo]; if (dc.isgrid) { errlog = logobj.CreateLog("CreateJsonForDraft", sessionid, "CreateJson-tstData", "new"); try { DataRow[] rows; rows = thisDataTable.Select("axp__isGrdVld" + dcNo + " = 'false'"); // axp__isGrdVld is Column Name foreach (DataRow r in rows) thisDataTable.Rows.Remove(r); } catch (Exception ex) { errlog = logobj.CreateLog(ex.Message + ex.StackTrace, sessionid, "CreateJson-tstData", ""); } } string[] dcRange = tstStrObj.GetDcFieldRange(dcNo).Split(','); int startIdx = Convert.ToInt32(dcRange[0]); int endIdx = Convert.ToInt32(dcRange[1]); int rowCnt = 0; string cr = string.Empty; if (dc.isgrid) { rowCnt = thisDataTable.Rows.Count; cr = GetCrAttrJson(rowCnt); } tmpStr = "{\"n\":\"DC" + dcNo + "\",\"v\":\"" + rowCnt + "\", " + cr + " \"t\":\"dc\", \"hasdatarows\":\"" + (rowCnt > 0 && !string.IsNullOrEmpty(cr) ? "yes" : "no") + "\"}"; //construct dc json tag //{"n":"DC1","v":"1","t":"dc"} if (dcJson.ToString() == string.Empty) dcJson.Append(tmpStr); else dcJson.Append("," + tmpStr); foreach (DataRow dr in thisDataTable.Rows) { int rowNo = Convert.ToInt32(dr["axp__rowno"]); for (int j = startIdx; j <= endIdx; j++) { TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[j]; dcJson.Append("," + GetFieldJson(rowNo.ToString(), dr, fld, thisDataTable)); } } //close here } draftJson.Append(dcJson + "]}"); return draftJson.ToString(); } public string GetCurrTabStatus(string dcNo) { //DC1-1,DC2-2 string isTabOpened = "no"; dcNo = "DC" + dcNo; if (!string.IsNullOrEmpty(TabDcStatus)) { string[] dcAndStatusArray = TabDcStatus.Split(','); foreach (string dcAndStatus in dcAndStatusArray) { string[] status = dcAndStatus.Split('-'); if (status[0].ToLower() == dcNo.ToLower()) { if (status[1] == "1") isTabOpened = "yes"; break; } } } return isTabOpened; } public string GetTabDCJson(string dcNo) { StringBuilder draftJson = new StringBuilder(); StringBuilder dcJson = new StringBuilder(); draftJson.Append("{\"data\":["); string tmpStr = string.Empty; bool isGrid = ((TStructDef.DcStruct)tstStrObj.dcs[int.Parse(dcNo) - 1]).isgrid; DataTable thisDataTable = dsDataSet.Tables["dc" + dcNo]; if (isGrid) { errlog = logobj.CreateLog("CreateJsonForDraft-GetTabDCJson", sessionid, "GetTabDCJson-tstData", "new"); try { DataRow[] rows; rows = thisDataTable.Select("axp__isGrdVld" + dcNo + " = 'false'"); // axp__isGrdVld is Column Name foreach (DataRow r in rows) thisDataTable.Rows.Remove(r); } catch (Exception ex) { errlog = logobj.CreateLog(ex.Message + ex.StackTrace, sessionid, "GetTabDCJson-tstData", ""); } } string[] dcRange = tstStrObj.GetDcFieldRange(dcNo).Split(','); int startIdx = Convert.ToInt32(dcRange[0]); int endIdx = Convert.ToInt32(dcRange[1]); int rowCnt = 0; string cr = string.Empty; if (isGrid) { rowCnt = thisDataTable.Rows.Count; cr = GetCrAttrJson(rowCnt); } tmpStr = "{\"n\":\"DC" + dcNo + "\",\"v\":\"" + rowCnt + "\", " + cr + " \"t\":\"dc\", \"hasdatarows\":\"" + (rowCnt > 0 && !string.IsNullOrEmpty(cr) ? "yes" : "no") + "\"}"; if (dcJson.ToString() == string.Empty) dcJson.Append(tmpStr); else dcJson.Append("," + tmpStr); foreach (DataRow dr in thisDataTable.Rows) { int rowNo = Convert.ToInt32(dr["axp__rowno"]); for (int j = startIdx; j <= endIdx; j++) { TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[j]; dcJson.Append("," + GetFieldJson(rowNo.ToString(), dr, fld, thisDataTable)); } } draftJson.Append(dcJson + "]}"); return draftJson.ToString(); } /// /// Function to get the cr attribute for the dc based on the rowcount. /// /// /// private string GetCrAttrJson(int rowCnt) { StringBuilder strCr = new StringBuilder(); for (int i = 1; i <= rowCnt; i++) { if (i == 1) { strCr.Append("\"cr\":"); strCr.Append("\"i" + i); } else strCr.Append(",i" + i); } if (strCr.ToString() != string.Empty) strCr.Append("\","); return strCr.ToString(); } /// /// Function to get the field json based on its type. /// /// /// /// /// /// private string GetFieldJson(string rowNo, DataRow dr, TStructDef.FieldStruct fld, DataTable dt) { string fieldName = fld.name; string type = string.Empty; string value = string.Empty; string idVal = string.Empty; string oldIdVal = string.Empty; string mr = string.Empty; string idCol = string.Empty; string fldJson = string.Empty; string strId = string.Empty; string strComboValues = string.Empty; string dpm = string.Empty; DataRow dsDataRow = DSGetDropdownRow(fieldName, rowNo); string fldRowVals = string.Empty; string dpVals = string.Empty; if (dsDataRow != null) { fldRowVals = dsDataRow["rowvals"].ToString(); dpVals = dsDataRow["dp"].ToString(); idCol = dsDataRow["idcol"].ToString(); mr = dsDataRow["mr"].ToString(); dpm = dsDataRow["dpmvalues"].ToString(); } type = GetFieldType(fld); value = dr[fld.name].ToString(); if (dt.Columns.Contains("id__" + fieldName)) idVal = dr["id__" + fld.name].ToString(); if (dt.Columns.Contains("oldid__" + fld.name)) oldIdVal = dr["oldid__" + fld.name].ToString(); if (rowNo == "1" && mr == "1" && AxMasterRowFlds.IndexOf(fieldName) == -1) AxMasterRowFlds.Add(fieldName); if (rowNo != "1" && AxMasterRowFlds.IndexOf(fieldName) != -1) mr = "1"; if (mr != "1" && fld.fieldIsFrmList) mr = "1"; if (mr != string.Empty) mr = "\"mr\":\"" + mr + "\","; if (idCol != string.Empty) { if (idCol == "0") idCol = "no"; else idCol = "yes"; idCol = "\"idcol\":\"" + idCol + "\","; if (type == "s") idCol = string.Empty; } if (type == "m") value = value.Replace("\n", "
    "); value = CheckSpecialCharsForClient(value); strId = "\"id\":\"" + idVal + "\", \"oldid\":\"" + oldIdVal + "\","; if (dpm != string.Empty) dpm = "\"dpm\":\"" + dpm + "\","; if (type == "c") strComboValues = GetComboItemsJson(fldRowVals, dpVals); //This is a dummy json example for dropdown //{"n":"sponsor","v":"abc","r":"0","idcol":"yes","id":"10032000001017","oldid":"0","mr":"0","dpm":"suffix,title","t":"c"}, if (fld.savenormal) fldJson = "{\"n\":\"" + fld.name + "\",\"v\":\"" + value + "\",\"r\":\"" + rowNo + "\"," + idCol + mr + strId + dpm + " \"t\":\"" + type + "\"}"; else fldJson = "{\"n\":\"" + fld.name + "\",\"v\":\"" + value + "\",\"r\":\"" + rowNo + "\"," + idCol + mr + dpm + "\"t\":\"" + type + "\"}"; if (strComboValues != string.Empty) fldJson = fldJson + "," + strComboValues; return fldJson; } /// /// Function to get the json for the dv nodes for a given combo box. /// /// /// private string GetComboItemsJson(string fldRowValues, string fldDpValues) { StringBuilder strItems = new StringBuilder(); //sample json for dropdown item //{"v":"15146000000000~EST-000274-Rev1","t":"dv","dp":"EST-000274~1~001~001~002"}, string[] choices = fldRowValues.Split('♣'); string[] dpValues = fldDpValues.Split('♣'); string tmpStr = string.Empty; for (int i = 0; i < choices.Length; i++) { string strChoice = choices[i].ToString(); strChoice = CheckSpecialCharsForClient(strChoice); if (strChoice != "" && i <= dpValues.Length) { tmpStr = "{\"v\":\"" + strChoice + "\", \"t\":\"dv\", \"dp\":\"" + dpValues[i].ToString() + "\"}"; if (strItems.ToString() == string.Empty) strItems.Append(tmpStr); else strItems.Append("," + tmpStr); } } return strItems.ToString(); } private string CheckSpecialCharsForClient(string value) { //single quote is handled in the tstruct.aspx.cs file before renddering the json to client. //Hence handling only double quote and backward slash. //fValue = fValue.Replace("^^dq", "\""); //fValue = fValue.Replace(";bkslh", "\\"); value = value.Replace("\"", "^^dq"); value = value.Replace("\\", ";bkslh"); return value; } /// /// Function to get the field type of the given field and return the type attribute 't' in the json. /// /// /// private string GetFieldType(TStructDef.FieldStruct fld) { string type = string.Empty; type = fld.ctype.ToUpper(); string moe = string.Empty; if (fld.moe.ToLower() == "select") { if (fld.editcombo) return "s"; else return "c"; } else { switch (type) { case "CHECK LIST": return "cl"; case "MEMO": return "m"; case "IMAGE": return "i"; case "CHECK BOX": return "s"; default: if (type.IndexOf("AXPBUTTON") != -1) return "b"; else return "s"; } } } #endregion public string GetFieldSqlQuery(string fldName, string fldValues, string globalVar, string userVars, int activeRow, string parentFlds) { int fldidx = tstStrObj.GetFieldIndex(fldName); TStructDef.FieldStruct fld = (TStructDef.FieldStruct)tstStrObj.flds[fldidx]; string sqlQuery = fld.fieldSqlQuery; string sqlParamsXML = string.Empty, appVarTypes = string.Empty, parentFldVals = string.Empty; try { sqlQuery = "" + CheckSpecialChars(sqlQuery) + ""; fldValues = "" + fldValues + ""; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(fldValues); sqlParamsXML += ""; // in cluase paramets for grid field {invioceno*} for non grid field {invioceno} if (Regex.Match(sqlQuery.ToLower(), @"{\b\w+\b}", RegexOptions.IgnoreCase).Success || Regex.Match(sqlQuery.ToLower(), @"{\b\w+\b\*}", RegexOptions.IgnoreCase).Success) { MatchCollection matchListSt = Regex.Matches(sqlQuery, @"{\b\w+\b\*}"); var listSt = matchListSt.Cast().Select(match => match.Value).Distinct().ToList(); MatchCollection matchList = Regex.Matches(sqlQuery, @"{\b\w+\b}"); var list = matchList.Cast().Select(match => match.Value).Distinct().ToList(); if (listSt.Count > 0) { foreach (var lst in listSt) { string strFld = lst.Split('{')[1].Split('*')[0]; XmlNodeList slctNode = xmlDoc.SelectNodes("fldXML/" + strFld + ""); int ic = 0; string stFldValue = string.Empty; foreach (XmlElement strText in slctNode) { if (strText.InnerText != "") stFldValue += strText.InnerText + "~"; if (ic == 0) { int fldidxs = tstStrObj.GetFieldIndex(strFld); TStructDef.FieldStruct flds = (TStructDef.FieldStruct)tstStrObj.flds[fldidxs]; if (flds.datatype == "Character" || flds.datatype == "Text") appVarTypes += "c"; else if (flds.datatype == "Numeric") appVarTypes += "n"; else if (flds.datatype == "Date/Time") appVarTypes += "d"; } ic++; } if (stFldValue != string.Empty) stFldValue = stFldValue.Remove(stFldValue.Length - 1); sqlParamsXML += "<" + strFld + ">" + stFldValue + ""; parentFldVals += strFld + ":" + stFldValue + "~"; } } if (list.Count > 0) { foreach (var lst in list) { string strFld = lst.Split('{')[1].Split('}')[0]; sqlParamsXML += xmlDoc.SelectSingleNode("fldXML/" + strFld + "").OuterXml; parentFldVals += strFld + ":" + xmlDoc.SelectSingleNode("fldXML/" + strFld + "").InnerXml + "~"; int fldidxs = tstStrObj.GetFieldIndex(strFld); TStructDef.FieldStruct flds = (TStructDef.FieldStruct)tstStrObj.flds[fldidxs]; if (flds.datatype == "Character" || flds.datatype == "Text") appVarTypes += "c"; else if (flds.datatype == "Numeric") appVarTypes += "n"; else if (flds.datatype == "Date/Time") appVarTypes += "d"; } } } if (sqlQuery.Contains(":"))// to check any of tstruct fields & global Vars { if (Regex.Match(sqlQuery, String.Format(@":\b{0}\b", "recordid"), RegexOptions.IgnoreCase).Success) { if (xmlDoc.InnerText != "") { //sqlParamsXML += xmlDoc.SelectSingleNode("fldXML/axp_recid1").OuterXml; string StrRecId = xmlDoc.SelectSingleNode("fldXML/axp_recid1").OuterXml; StrRecId = StrRecId.Replace("axp_recid1", "recordid"); sqlParamsXML += StrRecId; parentFldVals += "recordid:" + xmlDoc.SelectSingleNode("fldXML/axp_recid1").InnerXml + "~"; } else { sqlParamsXML += "recordid"; parentFldVals += "recordid:0~"; } int fldidxs = tstStrObj.GetFieldIndex("axp_recid1"); TStructDef.FieldStruct flds = (TStructDef.FieldStruct)tstStrObj.flds[fldidxs]; if (flds.datatype == "Character" || flds.datatype == "Text") appVarTypes += "c"; else if (flds.datatype == "Numeric") appVarTypes += "n"; else if (flds.datatype == "Date/Time") appVarTypes += "d"; } foreach (XmlNode parms in xmlDoc.ChildNodes[0].ChildNodes) { if (Regex.Match(sqlQuery, String.Format(@":\b{0}\b", parms.Name.ToString()), RegexOptions.IgnoreCase).Success) { int fldidxs = tstStrObj.GetFieldIndex(parms.Name); TStructDef.FieldStruct flds = (TStructDef.FieldStruct)tstStrObj.flds[fldidxs]; bool isDcGrid = false; isDcGrid = IsDcGrid(flds.fldframeno.ToString(), tstStrObj); if (isDcGrid == true && int.Parse(parms.Attributes["rowno"].Value) == activeRow) { sqlParamsXML += parms.OuterXml; parentFldVals += parms.Name + ":" + parms.InnerXml + "~"; if (flds.datatype == "Character" || flds.datatype == "Text") appVarTypes += "c"; else if (flds.datatype == "Numeric") appVarTypes += "n"; else if (flds.datatype == "Date/Time") appVarTypes += "d"; } else if (isDcGrid == false) { sqlParamsXML += parms.OuterXml; parentFldVals += parms.Name + ":" + parms.InnerXml + "~"; if (flds.datatype == "Character" || flds.datatype == "Text") appVarTypes += "c"; else if (flds.datatype == "Numeric") appVarTypes += "n"; else if (flds.datatype == "Date/Time") appVarTypes += "d"; } } } XmlDocument xmlDocgbl = new XmlDocument(); xmlDocgbl.LoadXml(globalVar); string blgAppVar = string.Empty; if (xmlDocgbl.SelectSingleNode("globalvars/appvartypes") != null) blgAppVar = xmlDocgbl.SelectSingleNode("globalvars/appvartypes").InnerXml; int gblIcnt = 1; foreach (XmlNode parms in xmlDocgbl.ChildNodes[0].ChildNodes) { if (Regex.Match(sqlQuery, String.Format(@":\b{0}\b", parms.Name.ToString()), RegexOptions.IgnoreCase).Success && parms.Name != "appvartypes" && !Regex.Match(sqlParamsXML, System.String.Format(@"<\b{0}\b", parms.Name.ToString()), RegexOptions.IgnoreCase).Success) { sqlParamsXML += parms.OuterXml; parentFldVals += parms.Name + ":" + parms.InnerXml + "~"; if (blgAppVar.Length >= gblIcnt) appVarTypes += blgAppVar[gblIcnt - 1].ToString(); else if (blgAppVar.Length < gblIcnt) appVarTypes += "c"; } gblIcnt++; } XmlDocument xmlDocUv = new XmlDocument(); xmlDocUv.LoadXml(userVars); foreach (XmlNode parms in xmlDocUv.ChildNodes[0].ChildNodes) { if (Regex.Match(sqlQuery, String.Format(@":\b{0}\b", parms.Name.ToString()), RegexOptions.IgnoreCase).Success) { sqlParamsXML += parms.OuterXml; parentFldVals += parms.Name + ":" + parms.InnerXml + "~"; appVarTypes += "c"; } } } if (sqlParamsXML != "") sqlParamsXML += "" + appVarTypes + ""; sqlParamsXML += ""; if (activeRow == 0) { string SessAutKey = "autocomplete♦" + transid + "-" + fldName + "-" + parentFlds; HttpContext.Current.Session[SessAutKey] = sqlQuery + sqlParamsXML + "♠" + parentFldVals; } } catch (Exception ex) { } return sqlQuery + sqlParamsXML + "♠" + parentFldVals; } } #endregion