📄 modellocator.as
字号:
package model
{
import flash.events.EventDispatcher;
import flash.external.ExternalInterface;
import flash.net.URLRequest;
import flash.net.navigateToURL;
import flash.utils.*;
import mx.collections.ArrayCollection;
import mx.collections.IViewCursor;
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.remoting.mxml.RemoteObject;
[Bindable]
public class ModelLocator extends EventDispatcher
{
//静态常量,定义事件类型
//public static const LOGIN_OK:String = "loginOK";
//public static const LOGIN_FAILED:String ="loginFailed";
//public static const addContactEvent:String = "addContact";
//public static const selectContactEvent:String = "selectContact";
//变量
public var Statuses:ArrayCollection;//所有的记录数据,每个元素都是一个Status对象
//public var users:ArrayCollection; //所有的记录数据,每个元素都是一个User对象
public var Array_Mains:ArrayCollection;//所有MRP集合
public var Array_Subs:ArrayCollection; //一条主记录所对应的ECN明细记录
public var ArrayTreeXML:XMLList=new XMLList();
public var ArrayCursor:IViewCursor;
public var Araay_face:ArrayCollection;
//public var selectedUser:User; //当前正在查看的记录
public var icurruid:int; //当前用户编号
public var suser_name:String;//当前用户名称
public var idepid:int=0;//部门号
public var sError:String; //出错提示
//对于obj,按照其fldname的值在src数组集中查找对应的记录,并返回在src中找到的记录位置号
public static function getArrayColIndex1(src:ArrayCollection,findstr:String,fldname:String):int{
var ire:int=0;
for each(var ob:Object in src){
if (ob[fldname].toString()==findstr){
return ire;
}
ire++;
}
return ire;
}
//对于obj,按照其fldname1和fldname2的值在src数组集中查找对应的记录,并返回在src中找到的记录位置号
public static function getArrayColIndex(src:ArrayCollection,obj:Object,fldname1:String,fldname2:String):int{
var ire:int=0;
for each(var ob:Object in src){
if (ob[fldname1].toString()==obj[fldname1].toString() && ob[fldname2].toString()==obj[fldname2].toString()){
return ire;
}
ire++;
}
return ire;
}
//对于obj,按照其fldname1和fldname2的值在src数组集中查找对应的记录,并返回在src中找到的记录位置号
public static function getArrayRowIndex(src:Array,obj:Object,fldname1:String,fldname2:String):int{
var ifound:Boolean=false;//未找到
var ire:int=0;
for each(var ob:Object in src){
if (ob[fldname1].toString()==obj[fldname1].toString() && ob[fldname2].toString()==obj[fldname2].toString()){
ifound =true;
return ire;
}
ire++;
}
if (ifound){
return ire;
}else{
return -1;
}
}
//取得增加记录的update sql语句数组,fldname1和fldname2是关键字段
public static function getAddedArraySql2(src:Array,curr:Array,fldname1:String,fldname2:String,tabname:String,subtbfldsArr:Array,subtbfldstype:Array):Array{
var adddataArray:Array = new Array();
//比较curr和src,找出增加的记录,即按curr主键字段 not in src主键字段,取得对应curr中的数组项
var istep:int=0;
var irowc:int=curr.length;
for(istep;istep<irowc;istep++){
var innercurrstep:int=0;//本次外循坏在内循环次数中累计循环次数
for each (var item:Object in src){
innercurrstep+=1;
//如果在原始数组中存在(外循环)当前记录,则表示此行不是增加的记录,此时结束内循环
//var innerfound:Boolean=false;//(内循环中)在原始数组中是否找到与当前记录相同的行
if (curr[istep][fldname1].toString()==item[fldname1].toString() &&
curr[istep][fldname2].toString()==item[fldname2].toString()){
//innerfound=true;//只要在原始数组中找到相同行,则不是增加的记录,设置innerfound并跳出循环
//innerfound=true;这一行代码其实可以不要,因为后面就已经break了
break; //结束内循环,如果需要直接结束外循环则需在外循环前加一标签,并在这里使用"break 标签"语法
}else{
if (innercurrstep==src.length){//内循环在原始数组中没找到记录,则表示是增加的记录
adddataArray.push(curr[istep]);
}
}
/* if (!(innerfound)){//如果在原始数组中没找到当前记录则表示当前记录是增加的行
adddataArray.push(curr[istep]);
} */
}
}
return ModelLocator.getSqlArray(adddataArray,tabname,"Add",subtbfldsArr,subtbfldstype,2);
//上述内循环中依据主键字段来判断是否增加的记录,因此主键字段是其依赖性字段,
//也就是说不能先删除一笔记录,再增加一笔新记录(这是用户的要求),上述算法会当作是修改一笔记录(某种条件下也说得通)
//因此这也是删除一笔时就直接调用远程方法执行操作,而不像增加和修改操作可以一次多笔记录。
}
//取得增加记录的update sql语句数组,fldname1和fldname2是关键字段
public static function geteditedArraySql2(src:Array,curr:Array,fldname1:String,fldname2:String,tabname:String,subtbfldsArr:Array,subtbfldstype:Array):Array{
var editdataArray:Array = new Array();
//比较curr和src,找出修改过的记录,即按curr各个字段和src各个对应字段比较,如任一对应字段值不同则该记录为修改过的
//这里由于只是为了找修改过的记录,因此src作为比较对象,curr作为被比较对象,与上面找增加的记录相反。
var istep:int=0;
var irowc:int=src.length;
for(istep;istep<irowc;istep++){
//for each(var item:Object in curr){ //不需全部遍历,可以首先按关键字段去找对应记录(getArrayRowIndex函数)
var founddiffrec:Boolean=false;//是否找到修改过的记录,默认为false(以便内循环中继续找)
//首先找到curr对应记录(按关键字段)的位置号索引
var idx:int=getArrayRowIndex(curr,src[istep],fldname1,fldname2);
//Alert.show(idx.toString(),"源数组当前记录在当前数组记录中位置");
if (idx>=0){//如果找到对应记录,则进行比较
//if (src[istep].toString()!=curr[idx].toString()){//如果修改过
for each(var va:String in subtbfldsArr){
if (src[istep][va].toString()!=curr[idx][va].toString()){
founddiffrec=true;
editdataArray.push(curr[idx]);//加入到修改过记录的数组中去
}
}
}else{//如果在curr中没找到src当前记录的对应记录,则表示用户已经删除该记录
}
//if (founddiffrec){}移到founddiffrec=true语句后
// }
}
return getSqlArray(editdataArray,tabname,"Edit",subtbfldsArr,subtbfldstype,2);
// return ModelLocator.getSqlArray(editdataArray,...);
}
public static function traceDetail(obj:Object):void{
for each(var so:Object in obj){
for each(var va:String in so){
trace(va);
}
}
}
public static function clone(obj:Object):* {
var copier:ByteArray = new ByteArray();
copier.writeObject(obj);
copier.position = 0;
return copier.readObject();
}
//过滤数据集
public static function filterArrayCol(src:ArrayCollection,filterfunc:Function):ArrayCollection{
src.filterFunction = filterfunc;
src.refresh();
return src;
}
//对指定字段,取得数组集合的该字段的数组集
public static function getDistinctArray(src:ArrayCollection,fldname:String):ArrayCollection{
var arr:Array=new Array();
var befvalue:String;
befvalue=src.getItemAt(0)[fldname].toString();
arr.push(befvalue);
var nowvalue:String;
var tmpvalue:String;
for(var idx:int=1;idx<src.length;idx++){//从第二行开始,与第一行比较
nowvalue = src.getItemAt(idx)[fldname].toString();
if (nowvalue != befvalue){
arr.push(nowvalue);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -