Save data back to xml file using datagrid in flash builder

511 Views Asked by At

I have an xml file which has employee details who have registered with the company. I am populating the xml using a local server. I have a login page and have a registration page. I have successfully populated my xml data into a datagrid and can not update or add new employee through text input field. Kindly help me with the required process to be followed to update my xml file in my hard drive.

    <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
           xmlns:s="library://ns.adobe.com/flex/spark"
           xmlns:mx="library://ns.adobe.com/flex/mx"
           xmlns:registration="services.registration.*"
           creationComplete="employeeService.send()" currentState="login"
           minWidth.registration="955" minHeight.registration="600">

    <s:layout>
        <s:BasicLayout/>
    </s:layout>
    <fx:Style source="assgpart2.css"/>


    <s:states>
         <s:State name="registration"/>
         <s:State name="login"/>
         <s:State name="home"/>
    </s:states>


    <fx:Script>

    <![CDATA[
        import events.Task;
        import mx.controls.Alert;
        import mx.events.FlexEvent;
        import mx.events.ValidationResultEvent;
        import mx.messaging.messages.ErrorMessage;
        import mx.rpc.events.ResultEvent;
        import mx.utils.ObjectUtil;

        private var indexCounter:Number = 0;

        private function validateForm():void
        {
            var vreName:ValidationResultEvent= un.validate();
            var vrepass:ValidationResultEvent= ps.validate();
            var vrecnfpass:ValidationResultEvent= cp.validate();
            var vrefName:ValidationResultEvent= fn.validate();
            var vrelName:ValidationResultEvent= ln.validate();
            var vreemail:ValidationResultEvent= em.validate();
            var vredate:ValidationResultEvent= datevalid.validate();

            if( vreName.type == ValidationResultEvent.VALID &&
                vrepass.type == ValidationResultEvent.VALID &&
                vrecnfpass.type == ValidationResultEvent.VALID &&
                vrefName.type == ValidationResultEvent.VALID &&
                vrelName.type == ValidationResultEvent.VALID &&
                vreemail.type == ValidationResultEvent.VALID &&
                vredate.type == ValidationResultEvent.VALID )
            {
                if((male.selected== '0') && (female.selected == '0'))
                {
                    mx.controls.Alert.show("you forgot to enter your gender....!");
                }
                else
                {
                    mx.controls.Alert.show("thank you for registaring with us....!!!");
                }
            }

            else
            {
                mx.controls.Alert.show("enter valid details");
            }
        }



        private function validatelogin(event:MouseEvent):void
        {
        //  getemployeesResult.token = login.getemployees(urname.text, passwd.text);
        }

    ]]>
    </fx:Script>

    <fx:Declarations>
    <s:HTTPService id="employeeService"
                   url="C:\Users\rknikhil\Adobe Flash Builder 4.6\Assignment1\src\assests\registration.xml"
                   result="employeeService_resultHandler(event)" method.registration="post">

    </s:HTTPService>
    <mx:StringValidator id ="un"  source =" {uname}" property = "text" />
    <mx:StringValidator id ="ps"  source =" {pswd}" property = "text" />
    <mx:StringValidator id ="cp"  source =" {cnfpass}" property = "text" />
    <mx:StringValidator id ="fn"  source =" {fname}" property = "text" />
    <mx:StringValidator id ="ln"  source =" {lname}" property = "text" />
    <mx:StringValidator  source =" {email2}"
                         property = "text"
                         minLength.registration="8"
                         tooShortError.registration="min of 8 length" 
                         />


    <mx:EmailValidator id ="em" source= "{email2}" 
                       property="text" 
                       requiredFieldError.registration="have to contain [email protected]" />


    <mx:DateValidator id="datevalid"
                      source = "{datev}" 
                      inputFormat.registration="MM-DD-YYYY" 
                      property = "text"
                      requiredFieldError.registration= "enter in MM-DD-YYYY format" />  


    <s:RadioButtonGroup id="gender"/>

    <s:CallResponder id="getemployeesResult"/>
    <registration:Registration id="registration"
                               fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)"
                               showBusyCursor="true"/>
    <s:CallResponder id="getemployeesResult2"/>
    <s:CallResponder id="getemployeesResult3"/>

    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>




<s:Panel id="login" includeIn="login " x="0" y="0" width="100%" height="100%"
         backgroundAlpha="0.0" contentBackgroundAlpha="0.0" title="login"
         backgroundAlpha.login="400">

    <s:Label x="16" y="196" text="username"/>
    <s:TextInput id="urname" x="87" y="186"/>
    <s:Label x="12" y="239" text="password"/>
    <s:TextInput id= "passwd" x="87" y="238"/>
    <s:Button x="10" y="278" label="login" click="validatelogin(event)"/>
    <s:Button x="568" y="278" label="register" click ="currentState='registration'"/>

    <mx:DataGrid id="dataGrid" x="2" y="2"
                 creationComplete="dataGrid_creationCompleteHandler(event)"
                 dataProvider="{getemployeesResult.lastResult}" editable.login="true">
        <mx:columns>
            <mx:DataGridColumn dataField="username" headerText="username"/>
            <mx:DataGridColumn dataField="email" headerText="email"/>
            <mx:DataGridColumn dataField="firstname" headerText="firstname"/>
            <mx:DataGridColumn dataField="lastname" headerText="lastname"/>
            <mx:DataGridColumn dataField="dob" headerText="dob"/>
            <mx:DataGridColumn dataField="gender" headerText="gender"/>
        </mx:columns>
    </mx:DataGrid>


    <s:Label x="379" y="220" width="92" height="19"
             text="{employeeService.lastResult.employees.employee.username}"/>
</s:Panel>







    <s:VGroup includeIn="registration" y="15" width="50%" height="50%" horizontalCenter="221">

        <s:HGroup width="300" height="30">

            <s:FormItem label="username" required = "true">
                <s:TextInput id="uname" height="21" color="#D42222"
                             text="{getemployeesResult.lastResult[0].username}"/> 

            </s:FormItem>

        </s:HGroup>

        <s:HGroup width="300" height="30">
            <s:FormItem label="password" required = "true">
            <s:TextInput id="pswd" width="150" color="#D42222"
                         text="{getemployeesResult.lastResult[0].password}"/> 
            </s:FormItem>
        </s:HGroup>


        <s:HGroup width="300" height="30">
            <s:FormItem label="confirmpassword" required = "true" >
                <s:TextInput id="cnfpass" width="150" color="#D42222"
                             text="{getemployeesResult.lastResult[0].confirmpassword}"/>
            </s:FormItem>
        </s:HGroup>

        <s:HGroup width="300" height="30">
            <s:FormItem label="email" required = "true" >
                <s:TextInput id="email2" width="150" color="#D42222" text="{getemployeesResult.lastResult[0].email}" /> 
            </s:FormItem>
        </s:HGroup>

        <s:HGroup width="300" height="30">
            <s:FormItem label="first name" required = "true">
                <s:TextInput id="fname" width="150" color="#D42222"
                             text="{getemployeesResult.lastResult[0].firstname}"/> 
            </s:FormItem>
        </s:HGroup>


        <s:HGroup width="300" height="30">
            <s:FormItem label="last name" required = "true">
                <s:TextInput id="lname" width="150" color="#D42222"
                             text="{getemployeesResult.lastResult[0].lastname}"/> 
            </s:FormItem>
        </s:HGroup>



        <s:HGroup width="300" height="30">
            <s:FormItem label="date of birth" required = "true">
                <s:HGroup>
                    <s:TextInput id="datev" width="150" color="#D42222"
                                 text="{getemployeesResult.lastResult[0].dob}"/>
                </s:HGroup>
            </s:FormItem>
        </s:HGroup>

        <s:HGroup>
            <s:Label id= "gen" backgroundColor="#A6A1A1" chromeColor="#131212" color="#FCFAF8"
                     paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5"
                     text="gender"/>
            <s:RadioButton id="male" label="male" groupName="gender"/>
            <s:RadioButton id="female" label="female" groupName="gender" />

        </s:HGroup>
        <s:Button id="submit1" label="Submit" />
        <s:Button id="back" label="Back" click="currentState='login'"/>
    </s:VGroup>



    <s:Panel includeIn="home" x="4" y="2" width="100%" height="100%" fontFamily="Times New Roman"
         fontSize="20" fontWeight="bold" title="welcome to the home page">
    <s:BorderContainer x="0" y="0" width="100%" height="100%" fontFamily="Times New Roman"
                       fontSize="12">
        <s:Form includeIn="home" x="404" y="25" width="100%" height="100%">
            <s:FormItem label="name">
                <s:BorderContainer width="200" height="27">
                    <s:RichText width="100%" height="100%" color="#020202" fontSize="16"
                                horizontalCenter="0" paddingBottom="5" paddingLeft="5"
                                paddingRight="5" paddingTop="5" text="{urname.text} "
                                verticalCenter="0"
                                styleName.home="assgpart2.as"/>
                </s:BorderContainer>
            </s:FormItem>
            <s:FormItem label="comments">
                <s:BorderContainer width="200" height="97">
                    <s:RichEditableText left="0" top="0" width="100%" height="100%" text=""/>
                </s:BorderContainer>
            </s:FormItem>
            <s:Button label="confirm" cornerRadius="5"/>
        </s:Form>
        <s:Image includeIn="home" x="0" y="2" width="382" height="285" opaqueBackground="true"
                 smooth="true" source="images/Lighthouse.jpg"/>
    </s:BorderContainer>
    </s:Panel>
<mx:LinkButton x="70" y="250" label="forgot password ?"  focusColor="#FD0101"
               rollOverColor="#FCF8F8" textDecoration="underline"
               x.login="85" y.login="311"/>


</s:Application>
2

There are 2 best solutions below

0
aktell On BEST ANSWER

OK, I have copied this out of my App which I have use for a few years now, and which runs on my servers so it is very well proven and it works perfectly! but of course it was totally to my own requirements adapted and these are the read write basics only. Hope that will help you to sort your own Application !!! rgards aktell

I used TextInput components !!!

            INIT ....
        import flash.filesystem.*;




<mx:Script>
    <![CDATA[

        import mx.rpc.events.FaultEvent;
        import mx.controls.Alert;

        import mx.rpc.events.ResultEvent;
        import mx.rpc.xml.SimpleXMLDecoder;

        import mx.rpc.http.HTTPService;

        private var myHTTP:HTTPService = new HTTPService();

        private function initConfigCall():void {

            myHTTP.url = "com/assets/data/.......? file.xml";

            myHTTP.send();
            myHTTP.resultFormat = "xml";
            myHTTP.addEventListener(ResultEvent.RESULT, resultHandler);
            myHTTP.addEventListener(FaultEvent.FAULT, faultHandler);    
        }

        private function resultHandler(evt:ResultEvent):void {

            var xmlStr:String = evt.result.toString();
            var xmlDoc:XMLDocument = new XMLDocument(xmlStr);
            var decoder:SimpleXMLDecoder = new SimpleXMLDecoder(true);
            var resultObj:Object = decoder.decodeXML(xmlDoc);

            // Removed [0] on single node !
            plnMsg.title = resultObj.application.configApp.appNewUpDate +''+  resultObj.application.configApp.appLastChanged;
            /* appLastChanged.text = resultObj.application.configApp.appLastChanged;
            appChangedSections.text = resultObj.application.configApp.appChangedSections; */

            myHTTP.disconnect();
            myHTTP = null;

            xmlStr = null;
            xmlDoc = null;
            decoder = null;
            resultObj = null;
        }
        private function faultHandler(event:mx.rpc.events.FaultEvent):void {

            var faultInfo:String="fault details: "+event.fault.faultDetail+"\n\n";
            faultInfo+="fault faultString: "+event.fault.faultString+"\n\n";
            mx.controls.Alert.show(faultInfo,"Fault Information");

            var eventInfo:String="event target: "+event.target+"\n\n";
            eventInfo+="event type: "+event.type+"\n\n";
            mx.controls.Alert.show(eventInfo,"Event Information");

            myHTTP.disconnect();
            myHTTP = null;

            myHTTP.removeEventListener(ResultEvent.RESULT, resultHandler);
            myHTTP.removeEventListener(FaultEvent.FAULT, faultHandler);
        }  
    ]]>
</mx:Script>






<!-- -->
<!-- *********************************************************************** -->
<!--    XML FILE READ OUT STREAM. -->
<!-- *********************************************************************** -->
<!-- -->
<mx:Script>
    <![CDATA[

        /* import flash.filesystem.FileStream;
        import flash.filesystem.FileMode;
        import flash.events.Event;
        import flash.filesystem.*; */

        private var myFileReadOut:File; 
        private var streamReadOut:FileStream = new FileStream(); 

        [Bindable] 
        private var xmlDataReadOut:XML;

        private function readOutXML():void {    

            myFileReadOut = File.desktopDirectory.resolvePath("Files/");
            myFileReadOut = myFileReadOut.resolvePath("dataONE.xml");

            if (myFileReadOut.exists) {

                streamReadOut.open(myFileReadOut, FileMode.READ);

                xmlDataReadOut = XML(streamReadOut.readUTFBytes(streamReadOut.bytesAvailable));


                Txt000_0.text = xmlDataReadOut.search000_0;
                PrefixTxt000_0.text = xmlDataReadOut.Prefix000_0;
                CountryTxt000_0.text = xmlDataReadOut.Country000_0;
                OnTxt000_0.htmlText = xmlDataReadOut.On000_0;

                streamReadOut.close();

                myFileReadOut = null;
                streamReadOut = null;

                xmlDataReadOut = null;
            }
        }
    ]]>
</mx:Script>








        private function saveStartData():void {

            xmlData = <urlGeneral/>;

            // 
            xmlData.search000_0 = Txt000_0.text;
            xmlData.Prefix000_0 = PrefixTxt000_0.text;
            xmlData.Country000_0 = CountryTxt000_0.text;
            xmlData.On000_0 = OnTxt000_0.text;

            var outputString:String = '<?xml version="1.0" encoding="utf-8"?>\n';

            outputString += xmlData.toXMLString();
            outputString = outputString.replace(/\n/g, File.lineEnding);

            stream = new FileStream();

            stream.open(myFile, FileMode.WRITE);
            stream.writeUTFBytes(outputString);

            stream.close();


            // Do NOT Use ! Second SAVE can give ERROR.
            /* myFile = null; */

            stream = null;

            xmlData = null;
            outputString = null;

            System.disposeXML(xmlData);
        }
    ]]>
</mx:Script>





<mx:Script>
    <![CDATA[

        /* import flash.filesystem.*; */

        private var myFile:File; 
        private var myFileONE:File; 

        private var stream:FileStream; 
        private var streamONE:FileStream;

        [Bindable] 
        private var xmlData:XML;    
        [Bindable] 
        private var xmlDataONE:XML;         

        public function AppInit():void {

            myFile = File.desktopDirectory.resolvePath("Files/");
            myFile = myFile.resolvePath("dataONE.xml");

            // Change over from - (desktopDirectory).
            myFileONE = File.applicationStorageDirectory.resolvePath("Files/DataFiles/");
            myFileONE = myFileONE.resolvePath("....?.xml");

            openXML();
            openXMLONE();
        }

        private function openXML():void {

            stream = new FileStream();

            if (myFile.exists) {

                stream.open(myFile, FileMode.READ); 

                xmlData = XML(stream.readUTFBytes(stream.bytesAvailable));

                stream.close();

                PhraseOneTxt.text = xmlData.Phrase001_0;
                PhraseTwoTxt.text = xmlData.Phrase002_0;
                PhraseThreeTxt.text = xmlData.Phrase003_0;
                PhraseFourTxt.text = xmlData.Phrase004_0;
                PhraseFiveTxt.text = xmlData.Phrase005_0;
                PhraseSixTxt.text = xmlData.Phrase006_0;
                PhraseSevenTxt.text = xmlData.Phrase007_0;
                PhraseEightTxt.text = xmlData.Phrase008_0;
                PhraseNineTxt.text = xmlData.Phrase009_0;

                // Do NOT Use ! Second SAVE can give ERROR.
                /* myFile = null; */

                stream = null; 

                xmlData = null;

                System.disposeXML(xmlData);
            }
        }






        private function lastRecordedRun():void {

            xmlDataONE = <urlGeneral/>;

            // Base Run 0.
            xmlDataONE.search000_0 = Txt000_0.text;
            xmlDataONE.Prefix000_0 = PrefixTxt000_0.text;
            xmlDataONE.Country000_0 = CountryTxt000_0.text;

            xmlDataONE.infoLastRun = lastRunTxt.text;
            xmlDataONE.saveStartDate = lastRunDateTime.text;

            xmlDataONE.Phrase001_0 = PhraseOneTxt.text;
            xmlDataONE.Phrase002_0 = PhraseTwoTxt.text;
            xmlDataONE.Phrase003_0 = PhraseThreeTxt.text;
            xmlDataONE.Phrase004_0 = PhraseFourTxt.text;
            xmlDataONE.Phrase005_0 = PhraseFiveTxt.text;
            xmlDataONE.Phrase006_0 = PhraseSixTxt.text;
            xmlDataONE.Phrase007_0 = PhraseSevenTxt.text;
            xmlDataONE.Phrase008_0 = PhraseEightTxt.text;
            xmlDataONE.Phrase009_0 = PhraseNineTxt.text;

            var outputStringONE:String = '<?xml version="1.0" encoding="utf-8"?>\n';

            outputStringONE += xmlDataONE.toXMLString();
            outputStringONE = outputStringONE.replace(/\n/g, File.lineEnding);

            streamONE = new FileStream();

            streamONE.open(myFileONE, FileMode.WRITE);
            streamONE.writeUTFBytes(outputStringONE);

            streamONE.close();


            // Do NOT Use ! SAVE can give ERROR.
            /* myFileONE = null; */

            streamONE = null;

            xmlDataONE = null;
            outputStringONE = null;

            System.disposeXML(xmlDataONE);


            startGCCycle();
        }
5
aktell On

I looked at your code over & over, yet I can't find anything which would / could write to the XML file e.g. Write, Re-Write - Update or Add ??? What I see is simple a Read out of the XML file! regards aktell