How to publish blank fields in a webservice

msinnmsinn Member Posts: 10
edited 2012-07-19 in NAV Three Tier
Hello everybody,

this is my first post and I'm new in Navision.

I'm consuming a webservice from Dynamics NAV 2009 R2 as in this very helpful blog http://blogs.msdn.com/b/freddyk/archive/2010/01/19/connecting-to-nav-web-services-from-php.aspx. Everything works fine, but the result does not contain blank fields. So I have in the result an array with stdObj. Each stdObj is a dataset from Navision but it contains just the fields which have set a value, the blank fields aren't in the data set.
Does anybody know how to get the blank fields in the result too?

Thank you a lot, Marius

Comments

  • kinekine Member Posts: 12,562
    But where is the problem? You know, that fields, which are not there, are empty... :?:
    Kamil Sacek
    MVP - Dynamics NAV
    My BLOG
    NAVERTICA a.s.
  • msinnmsinn Member Posts: 10
    Hello kine and thank you for your attention.

    There are some problems there, e.g. I have to find a workaround for sorting the datasets, while each data set contains different fields. For the date fields I have '01.01.0001' even if they are blank, for other fields as number or string fields I have nothing, because they aren't published at all. Further i have some issues because of that in my presentation framework ExtJS. I have to hijack the result in php, but so it is everything slowlier.

    It will be better if Navision would have the sense to publish the blank fields through the webservice too as in the case of date fields. Do you know if it is possible to configure it in Navision?

    Thank you for your time
  • kinekine Member Posts: 12,562
    In NAV you can only select which fields are part of the result or not. I still do not understand the problem… if the fields are on the PAGE in NAV, they will be part of the result, becuase the fields will be defined in the class for the result. If they are not on the PAGE,they are not defined in the class thus they are not there regardless their value…

    E.g. date filter - there is problem which I understand - the field is of type DateTime but is empty if the date in NAV is empty - thus it is creating problems e.g. in C# code trying to parse the empty value to date... but in this case, if the PAGE in NAV is specially created for the webservice, there could be process, which all empty dates replace with some predefined value...
    Kamil Sacek
    MVP - Dynamics NAV
    My BLOG
    NAVERTICA a.s.
  • msinnmsinn Member Posts: 10
    Thank you again kine,

    I have more webservices and I would like to use the same php script for all oh them. As I mentioned, I cannot sort and do paging on the result as it is. Since I have an array with stdObj and each stdObj contain different fields I have to merge to each stdObj the missed blank fields in order to sort and paging it. Or when I update a field in ExtJS-Page and send back to NAV and that field has dependecies in NAV and other fields of the same dataset will get programatically empty, they will be not in the response so I'll have different values in NAV-Page and ExtJS-Page since they don't get synchronized. My workaround is working but is much slowlier.

    So, there is nothing to do to get in the response(ReadMultiple, Update) the blank fields?
    I very appreciate your help, thank you.
  • kinekine Member Posts: 12,562
    Still, I do not understand the problem. May be just because I do not understand how your app works, how you are working with the data in your PHP etc.

    Mainly I do not understand this:
    Since I have an array with stdObj and each stdObj contain different fields
    How the object could contain different fields? All objects returned by readmultiple have same structure, same "properties". How you can have in one array objects with different fields? Are you reading the objects into this array by different webservices?
    Kamil Sacek
    MVP - Dynamics NAV
    My BLOG
    NAVERTICA a.s.
  • msinnmsinn Member Posts: 10
    The result for ReadMultiple looks with var_dump() like:
    array
      0 => 
        object(stdClass)[4]
          public 'Key' => string '20;EgAAAACJ/zAwWFgyNQ==7;69710490;' (length=34)
          public 'No' => string '00XX25' (length=6)
          public 'Blocked' => string '_blank_' (length=7)
          public 'Checked' => boolean false
          public 'Checked_at_date' => string '0001-01-01' (length=10)
          public 'Next_check_at' => string '0001-01-01' (length=10)
      1 => 
        object(stdClass)[5]
          public 'Key' => string '16;EgAAAACJBTExMTA37;69670140;' (length=30)
          public 'No' => string '11107' (length=5)
          public 'Address' => string 'Grabenallee 2' (length=19)
          public 'Post_Code' => string '77652' (length=5)
          public 'Country_Region_Code' => string 'DE' (length=2)
          public 'City' => string 'Ingolstadt' (length=10)
          public 'Our_Account_No' => string 'L-NR. 11789500' (length=14)
          public 'Blocked' => string 'Ship' (length=4)
          public 'Checked' => boolean true
          public 'Checked_at_date' => string '2012-06-14' (length=10)
          public 'Checked_by' => string 'TU_WEBSERVICE' (length=13)
          public 'Next_check_at' => string '2013-06-14' (length=10)
      2 => 
        object(stdClass)[6]
          public 'Key' => string '16;EgAAAACJBTExMTEw7;69728080;' (length=30)
          public 'No' => string '11110' (length=5)
          public 'Name' => string 'Borsi' (length=7)
          public 'Address' => string 'Am Ziegelplatz 11-13' (length=17)
          public 'Post_Code' => string '77749' (length=5)
          public 'Country_Region_Code' => string 'DE' (length=2)
          public 'City' => string 'Schutterwald' (length=10)
          public 'Search_Name' => string 'BORSI' (length=7)
          public 'Our_Account_No' => string 'D202201' (length=7)
          public 'Blocked' => string '_blank_' (length=7)
          public 'Checked' => boolean false
          public 'Checked_at_date' => string '0001-01-01' (length=10)
          public 'Next_check_at' => string '2012-07-03' (length=10)
      3 => 
        object(stdClass)[7]
    ...
    
    As you see, each object has different properties.
    And my workaround for merging the missed properties, since they are empty and not published by the NAV-Page is:
    function formatData($page, $rawdata) {
        $types =  $page->__getTypes();
        $keySearch= 'struct '.$_POST['sname'].' {';
        foreach ($types as $key => $value) if(strpos($value, $keySearch)!==false) $type = $value;
        $typeExploded = explode(' ',$type);
        foreach ($typeExploded as $key => $value) if(strpos($value,';')!==false) $dataPattern[strstr($value, ';',true)]='';
        if(is_array($rawdata))foreach ($rawdata as $key => $value) $formatdata[$key] = array_merge($dataPattern, (array)$value);
        else $formatdata = array_merge($dataPattern, (array)$rawdata);
        return $formatdata;
    }
    
    Now I can do sorting and paging on the datasets.
  • kinekine Member Posts: 12,562
    Is this array the array directly returned by the webservice? How looks the XML returned from the webservice? (you can use e.g. fiddler web debugger to catch the XML).
    Kamil Sacek
    MVP - Dynamics NAV
    My BLOG
    NAVERTICA a.s.
  • msinnmsinn Member Posts: 10
    A big thank you for your time :D
    Yes, the array is returned by the webservice.
    $page = new NTLMSoapClient($url);
    $rawdata = $page->ReadMultiple($params)->ReadMultiple_Result->$_POST['sname'];
    

    The XML returned from the webservice is:
    <definitions targetNamespace="urn:microsoft-dynamics-schemas/page/customerblacklistcontrol" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:microsoft-dynamics-schemas/page/customerblacklistcontrol">
        <types>
            <xsd:schema elementFormDefault="qualified" targetNamespace="urn:microsoft-dynamics-schemas/page/customerblacklistcontrol" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                <xsd:simpleType name="Blocked">
                    <xsd:restriction base="xsd:string">
                        <xsd:enumeration value="_blank_"/>
                        <xsd:enumeration value="Ship"/>
                        <xsd:enumeration value="Invoice"/>
                        <xsd:enumeration value="All"/>
                    </xsd:restriction>
                </xsd:simpleType>
                <xsd:complexType name="CustomerBlacklistControl">
                    <xsd:sequence>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Key" type="xsd:string"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="No" type="xsd:string"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Name" type="xsd:string"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Name_2" type="xsd:string"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Address" type="xsd:string"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Address_2" type="xsd:string"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Post_Code" type="xsd:string"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Country_Region_Code" type="xsd:string"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="City" type="xsd:string"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Phone_No" type="xsd:string"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Fax_No" type="xsd:string"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="E_Mail" type="xsd:string"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Contact" type="xsd:string"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Language_Code" type="xsd:string"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Search_Name" type="xsd:string"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Our_Account_No" type="xsd:string"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Blocked" type="tns:Blocked"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Checked" type="xsd:boolean"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Checked_at_date" type="xsd:date"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Checked_by" type="xsd:string"/>
                        <xsd:element minOccurs="0" maxOccurs="1" name="Next_check_at" type="xsd:date"/>
                    </xsd:sequence>
                </xsd:complexType>
                <xsd:complexType name="CustomerBlacklistControl_List">
                    <xsd:sequence>
                        <xsd:element minOccurs="1" maxOccurs="unbounded" name="CustomerBlacklistControl" type="tns:CustomerBlacklistControl"/>
                    </xsd:sequence>
                </xsd:complexType>
                <xsd:simpleType name="CustomerBlacklistControl_Fields">
                    <xsd:restriction base="xsd:string">
                        <xsd:enumeration value="No"/>
                        <xsd:enumeration value="Name"/>
                        <xsd:enumeration value="Name_2"/>
                        <xsd:enumeration value="Address"/>
                        <xsd:enumeration value="Address_2"/>
                        <xsd:enumeration value="Post_Code"/>
                        <xsd:enumeration value="Country_Region_Code"/>
                        <xsd:enumeration value="City"/>
                        <xsd:enumeration value="Phone_No"/>
                        <xsd:enumeration value="Fax_No"/>
                        <xsd:enumeration value="E_Mail"/>
                        <xsd:enumeration value="Contact"/>
                        <xsd:enumeration value="Language_Code"/>
                        <xsd:enumeration value="Search_Name"/>
                        <xsd:enumeration value="Our_Account_No"/>
                        <xsd:enumeration value="Blocked"/>
                        <xsd:enumeration value="Checked"/>
                        <xsd:enumeration value="Checked_at_date"/>
                        <xsd:enumeration value="Checked_by"/>
                        <xsd:enumeration value="Next_check_at"/>
                    </xsd:restriction>
                </xsd:simpleType>
                <xsd:complexType name="CustomerBlacklistControl_Filter">
                    <xsd:sequence>
                        <xsd:element minOccurs="1" maxOccurs="1" name="Field" type="tns:CustomerBlacklistControl_Fields"/>
                        <xsd:element minOccurs="1" maxOccurs="1" name="Criteria" type="xsd:string"/>
                    </xsd:sequence>
                </xsd:complexType>
                <xsd:element name="Read">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element minOccurs="1" maxOccurs="1" name="No" type="xsd:string"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="Read_Result">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element minOccurs="0" maxOccurs="1" name="CustomerBlacklistControl" type="tns:CustomerBlacklistControl"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="ReadByRecId">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element minOccurs="1" maxOccurs="1" name="recId" type="xsd:string"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="ReadByRecId_Result">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element minOccurs="0" maxOccurs="1" name="CustomerBlacklistControl" type="tns:CustomerBlacklistControl"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="ReadMultiple">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element minOccurs="1" maxOccurs="unbounded" name="filter" type="tns:CustomerBlacklistControl_Filter"/>
                            <xsd:element minOccurs="0" maxOccurs="1" name="bookmarkKey" type="xsd:string"/>
                            <xsd:element minOccurs="1" maxOccurs="1" name="setSize" type="xsd:int"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="ReadMultiple_Result">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element minOccurs="0" maxOccurs="1" name="ReadMultiple_Result" type="tns:CustomerBlacklistControl_List"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="IsUpdated">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element minOccurs="1" maxOccurs="1" name="Key" type="xsd:string"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="IsUpdated_Result">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element minOccurs="1" maxOccurs="1" name="IsUpdated_Result" type="xsd:boolean"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="GetRecIdFromKey">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element minOccurs="1" maxOccurs="1" name="Key" type="xsd:string"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="GetRecIdFromKey_Result">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element minOccurs="1" maxOccurs="1" name="GetRecIdFromKey_Result" type="xsd:string"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="Update">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element minOccurs="1" maxOccurs="1" name="CustomerBlacklistControl" type="tns:CustomerBlacklistControl"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="Update_Result">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element minOccurs="1" maxOccurs="1" name="CustomerBlacklistControl" type="tns:CustomerBlacklistControl"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="UpdateMultiple">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element minOccurs="1" maxOccurs="1" name="CustomerBlacklistControl_List" type="tns:CustomerBlacklistControl_List"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="UpdateMultiple_Result">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element minOccurs="1" maxOccurs="1" name="CustomerBlacklistControl_List" type="tns:CustomerBlacklistControl_List"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:schema>
        </types>
        <message name="Read">
            <part name="parameters" element="tns:Read"/>
        </message>
        <message name="Read_Result">
            <part name="parameters" element="tns:Read_Result"/>
        </message>
        <message name="ReadByRecId">
            <part name="parameters" element="tns:ReadByRecId"/>
        </message>
        <message name="ReadByRecId_Result">
            <part name="parameters" element="tns:ReadByRecId_Result"/>
        </message>
        <message name="ReadMultiple">
            <part name="parameters" element="tns:ReadMultiple"/>
        </message>
        <message name="ReadMultiple_Result">
            <part name="parameters" element="tns:ReadMultiple_Result"/>
        </message>
        <message name="IsUpdated">
            <part name="parameters" element="tns:IsUpdated"/>
        </message>
        <message name="IsUpdated_Result">
            <part name="parameters" element="tns:IsUpdated_Result"/>
        </message>
        <message name="GetRecIdFromKey">
            <part name="parameters" element="tns:GetRecIdFromKey"/>
        </message>
        <message name="GetRecIdFromKey_Result">
            <part name="parameters" element="tns:GetRecIdFromKey_Result"/>
        </message>
        <message name="Update">
            <part name="parameters" element="tns:Update"/>
        </message>
        <message name="Update_Result">
            <part name="parameters" element="tns:Update_Result"/>
        </message>
        <message name="UpdateMultiple">
            <part name="parameters" element="tns:UpdateMultiple"/>
        </message>
        <message name="UpdateMultiple_Result">
            <part name="parameters" element="tns:UpdateMultiple_Result"/>
        </message>
        <portType name="CustomerBlacklistControl_Port">
            <operation name="Read">
                <input name="Read" message="tns:Read"/>
                <output name="Read_Result" message="tns:Read_Result"/>
            </operation>
            <operation name="ReadByRecId">
                <input name="ReadByRecId" message="tns:ReadByRecId"/>
                <output name="ReadByRecId_Result" message="tns:ReadByRecId_Result"/>
            </operation>
            <operation name="ReadMultiple">
                <input name="ReadMultiple" message="tns:ReadMultiple"/>
                <output name="ReadMultiple_Result" message="tns:ReadMultiple_Result"/>
            </operation>
            <operation name="IsUpdated">
                <input name="IsUpdated" message="tns:IsUpdated"/>
                <output name="IsUpdated_Result" message="tns:IsUpdated_Result"/>
            </operation>
            <operation name="GetRecIdFromKey">
                <input name="GetRecIdFromKey" message="tns:GetRecIdFromKey"/>
                <output name="GetRecIdFromKey_Result" message="tns:GetRecIdFromKey_Result"/>
            </operation>
            <operation name="Update">
                <input name="Update" message="tns:Update"/>
                <output name="Update_Result" message="tns:Update_Result"/>
            </operation>
            <operation name="UpdateMultiple">
                <input name="UpdateMultiple" message="tns:UpdateMultiple"/>
                <output name="UpdateMultiple_Result" message="tns:UpdateMultiple_Result"/>
            </operation>
        </portType>
        <binding name="CustomerBlacklistControl_Binding" type="tns:CustomerBlacklistControl_Port">
            <binding transport="http://schemas.xmlsoap.org/soap/http" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
            <operation name="Read">
                <operation soapAction="urn:microsoft-dynamics-schemas/page/customerblacklistcontrol:Read" style="document" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                <input name="Read">
                    <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                </input>
                <output name="Read_Result">
                    <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                </output>
            </operation>
            <operation name="ReadByRecId">
                <operation soapAction="urn:microsoft-dynamics-schemas/page/customerblacklistcontrol:ReadByRecId" style="document" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                <input name="ReadByRecId">
                    <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                </input>
                <output name="ReadByRecId_Result">
                    <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                </output>
            </operation>
            <operation name="ReadMultiple">
                <operation soapAction="urn:microsoft-dynamics-schemas/page/customerblacklistcontrol:ReadMultiple" style="document" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                <input name="ReadMultiple">
                    <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                </input>
                <output name="ReadMultiple_Result">
                    <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                </output>
            </operation>
            <operation name="IsUpdated">
                <operation soapAction="urn:microsoft-dynamics-schemas/page/customerblacklistcontrol:IsUpdated" style="document" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                <input name="IsUpdated">
                    <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                </input>
                <output name="IsUpdated_Result">
                    <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                </output>
            </operation>
            <operation name="GetRecIdFromKey">
                <operation soapAction="urn:microsoft-dynamics-schemas/page/customerblacklistcontrol:GetRecIdFromKey" style="document" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                <input name="GetRecIdFromKey">
                    <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                </input>
                <output name="GetRecIdFromKey_Result">
                    <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                </output>
            </operation>
            <operation name="Update">
                <operation soapAction="urn:microsoft-dynamics-schemas/page/customerblacklistcontrol:Update" style="document" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                <input name="Update">
                    <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                </input>
                <output name="Update_Result">
                    <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                </output>
            </operation>
            <operation name="UpdateMultiple">
                <operation soapAction="urn:microsoft-dynamics-schemas/page/customerblacklistcontrol:UpdateMultiple" style="document" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                <input name="UpdateMultiple">
                    <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                </input>
                <output name="UpdateMultiple_Result">
                    <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
                </output>
            </operation>
        </binding>
        <service name="CustomerBlacklistControl_Service">
            <port name="CustomerBlacklistControl_Port" binding="tns:CustomerBlacklistControl_Binding">
                <address location="http://domsrv140:4566/DYNAMICSNAV/WS/TEST%20IMM%20Testsystem%2027.03.2012/Page/CustomerBlacklistControl" xmlns="http://schemas.xmlsoap.org/wsdl/soap/"/>
            </port>
        </service>
    </definitions>
    
  • kinekine Member Posts: 12,562
    Ok, now I understand more... as you can see, in the WSDL the elements are defined as "minOccurs="0" maxOccurs="1"" - thus "optional". When you are working with the respnse as TEXT, you are missing the defailt elements. Because I am working with the result in e.g. C# as with array of objects which were deserialized from the response, the properties of these objects are filled correctly. It means, you need to think about possible different way how to handle the response as not only text or "generic" objects, but rather array of objects of type CustomerBlacklistControl as defined in WSDL.
    Kamil Sacek
    MVP - Dynamics NAV
    My BLOG
    NAVERTICA a.s.
  • msinnmsinn Member Posts: 10
    Ok, I'll try to go through the SOAP classes to find a solution. SoapClient::__doRequest or SoapServer::setObject could be the way, so I have to learn first SOAP.
    I really appreciate all your support, you are very helpful, thank you.
Sign In or Register to comment.