Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Handling an object parameter
Message
De
23/04/2013 06:03:26
 
 
À
23/04/2013 03:58:16
Information générale
Forum:
ASP.NET
Catégorie:
Code, syntaxe and commandes
Divers
Thread ID:
01571599
Message ID:
01571654
Vues:
37
Hi Nick,

sorry, still not getting a clear picture as to what runtime calls which to do what -
might be me, not firing on all cells (too much coffee, too little sleep...)

Shoveling data from vfp to dotnet, Rick's approaches often revolve around a single scatter object.
When I shovelled vfp cursors to DotNet Ironpython, AFAIR I sent them over directly via COM into an array like structure
and built on the vfp side a data dictionary cursor via copy stru extended and sent that over as well with the same mechanism - as it was always 4 cols for the DD-array, easy to work with. For a more object-typical way, such a DD-cursor could be put into a string concatenating the first 4 columns of afields(Cursor2Move) into a CSV list for generic handling on DotNet side.

For cases where the scatter objects returned from vfp like in Ricks example can have different property counts and names, in my 2nd post I hinted at a similar approach, If the cursors used to as source to scatter from have different columns and you want to keep a single object interface, on the fox side something like
&&= afields(laFields )
&&lcCSV = BuildCSV_DD(@laFields)
&& easier here, only field names needed
lcCSV = ""
for lnRun = 1 to afields(laFields )
  lcCSV = lcCSV + laFields[m.lnRun, 1] + ","
next
addproperty(loFoxReturnObject, "__FldList", m.lcCSV)

&& if your fox code builds returnobjects from different sources, the Filedlist could be built on the object
lcCSV = ""
for lnRun = 1 to  amembers(laProps)
  lcCSV = lcCSV + laProps[m.lnRun] + ","
next
addproperty(loFoxReturnObject, "__FldList", m.lcCSV)

should do the trick. On the Dotnet side you have ALWAYS the __FldList property to parse.

Hope I made myself clearer and am not too far off target...

thomas

>>>>>Hi
>>>>>
>>>>>I want to pass into a c# dll and object parameter like this
>>>>>
>>>>> public string PassRecordObjectDynamic(dynamic FoxObject)
>>>>>
>>>>>(from Ricks example at
>>>>>
>>>>>http://www.west-wind.com/weblog/posts/2010/Sep/13/The-dynamic-Type-in-C-Simplifies-COM-Member-Access-from-Visual-FoxPro
>>>>>
>>>>>but I'm not sure how to handle varying numbers of items in the object in the c# dll.
>>>>>
>>>>>ie There may be 1 or maybe 10.
>>>>>
>>>>>I can control what they are called
>>>>> like phone1 phone2 etc but I'm not suer what the best way to deal with this in c#
>>>>>
>>>>>Some sort of macro substitution seems out (from what I've read)
>>>>>Any pointers
>>>>
>>>>**pointer
>>>>
>>>>seriously it might be a good idea (at least easier coding-wise) to add a list of propertynames on the vfp side.
>>>>After casting to dynamic you just parse that list via dot-notation ? Easy if you can be sure of a specific free field/propertyname, for instance __fldlist, to borrow from the pythonic usage of "internal, do not touch" naming.
>>>>
>>>>Update: from glancing over the code in Rick's article foxObject should be object and cast from COM to dynamic.
>>>>Not clear from the method signature iyou showed.
>>>>
>>>>HTH
>>>>
>>>>thomas
>>>
>>>Thanks Thomas
>>>
>>>I can add the properties on the vfp side no problem. I'm not sure about the best way to access their names at the c# end
>>>
>>>like phone1 phone2 phone3 etc
>>
>>if the cast from object to dynamic succeeds, walking the list of propertynames ad calling them via dynmic.singlepropname should work ?
>>IIRC all the additional/newfound names land in a hashmap and will work at minimally lower speed due to hashmap access.
>>
>>Update: seems Rick and Craig are guessing as well ;-) Time to copy and paste some code in vfp and dotnet, and if it is planned to be generic add some text about which cases it should cover.
>
>Ok
>
>this is taken from a test form which posts information to a web service
>
>I want to run this from a dll which I'm calling from a foxpro process.
>
>I'm using foxpro because there's legacy code which gets the infomtion that i want to pass to the web service from a variety of sources (web emails ftp etc) .
>
>the for loop is adding information that might have one item or many.
>
>the first part is no problem its the variable part I'm a but stuck on.
>
>I may pass it as one string and parse it. (c# purists can faint here if they like :-))
>
>
>
>    private void submitWaybill()
>        {
>            logbox.AppendText("Submitting Waybill:");
>            PPIntegrationService.Waybill_submitWaybill_Request waybillReq = new SoapTester.PPIntegrationService.Waybill_submitWaybill_Request();
>
>            
>            //Create a new waybill details object
>            waybillReq.details = new SoapTester.PPIntegrationService.Waybill_submitWaybill_Request_Details();
>            
>            //Inserting a new record
>            waybillReq.s_ttype = "I";
>
>            //general details data
>            waybillReq.details.s_accnum = accnum.Text;
>            waybillReq.details.s_waybill = waybillno.Text;
>            waybillReq.details.s_service = servicetextBox.Text;            
>
>            //origin details 
>            waybillReq.details.s_origperadd1 = origadd1.Text;
>            waybillReq.details.s_origperadd2 = origadd2.Text;
>            waybillReq.details.s_origperadd3 = origadd3.Text;
>            waybillReq.details.s_origperadd4 = origadd4.Text;
>            waybillReq.details.s_origpercell = origcell.Text;
>            waybillReq.details.s_origpercontact = origcontact.Text;
>            waybillReq.details.s_origperpcode = origpcode.Text;
>            waybillReq.details.s_origperphone = origtel.Text;
>            waybillReq.details.s_origtown = origtown.Text;
>            waybillReq.details.s_origpers = ethgew.Text;
>
>
>            //destination details
>            waybillReq.details.s_destperadd1 = destadd1.Text;
>            waybillReq.details.s_destperadd2 = destadd2.Text;
>            waybillReq.details.s_destperadd3 = destadd3.Text;
>            waybillReq.details.s_destperadd4 = destadd4.Text;
>            waybillReq.details.s_destpercell = destcell.Text;
>            waybillReq.details.s_destpercontact = destcontact.Text;
>            waybillReq.details.s_destperpcode = destpcode.Text;
>            waybillReq.details.s_destperphone = desttel.Text;
>            waybillReq.details.s_desttown = desttown.Text;
>            waybillReq.details.s_destpers = destpers.Text;
>
>            //contents            
>            waybillReq.contents = new SoapTester.PPIntegrationService.Waybill_submitWaybill_Request_Contents[dataGridView2.RowCount-1];
>              
>            for (int i = 0; i < dataGridView2.RowCount-1; i++)
>            {
>                waybillReq.contents[i] = new SoapTester.PPIntegrationService.Waybill_submitWaybill_Request_Contents();
>                //Populate details
>                waybillReq.contents[i].i_item = Convert.ToString(dataGridView2.Rows[i].Cells["ItemNo"].Value);
>                waybillReq.contents[i].i_pieces = Convert.ToString(dataGridView2.Rows[i].Cells["Pieces"].Value);
>                waybillReq.contents[i].s_description = Convert.ToString(dataGridView2.Rows[i].Cells["Description"].Value);
>                waybillReq.contents[i].i_dim1 = Convert.ToString(dataGridView2.Rows[i].Cells["Dim1"].Value);                
>                waybillReq.contents[i].i_dim2 = Convert.ToString(dataGridView2.Rows[i].Cells["Dim2"].Value);
>                waybillReq.contents[i].i_dim3 = Convert.ToString(dataGridView2.Rows[i].Cells["Dim3"].Value);
>                waybillReq.contents[i].f_actmass = Convert.ToString(dataGridView2.Rows[i].Cells["Mass"].Value);
>            }
>
>            //tracking
>            waybillReq.tracks = new SoapTester.PPIntegrationService.Waybill_submitWaybill_Request_Tracks[dataGridView1.RowCount-1];
>
>            for (int i = 0; i < dataGridView1.RowCount-1; i++)
>            {
>                //Create a new tracking entry
>                waybillReq.tracks[i] = new SoapTester.PPIntegrationService.Waybill_submitWaybill_Request_Tracks();
>                //Populate details
>                waybillReq.tracks[i].i_item = Convert.ToString(dataGridView1.Rows[i].Cells["Item"].Value);
>                waybillReq.tracks[i].i_parcelno = Convert.ToString(dataGridView1.Rows[i].Cells["ParcelNo"].Value);
>                waybillReq.tracks[i].s_trackno = Convert.ToString(dataGridView1.Rows[i].Cells["Trackno"].Value);
>
>            }
>
>            try
>            {      
>                //Make the request
>                PPIntegrationService.Waybill_submitWaybill_Response waybillResp = this.service.Waybill_submitWaybill(this.token, waybillReq);
>                if (waybillResp.errorcode == 0)
>                {
>                    logbox.AppendText(" Success \n");
>                }
>                else
>                {
>                    logbox.AppendText(" Error:" + waybillResp.errormessage + "\n");
>                }
>            }
>            catch (Exception e)
>            {
>                logbox.AppendText(" Error: " + e.Message + "\n");
>            }
>            logbox.AppendText("----------------------------------------------------------------------------------------\n");            
>        }
>
>
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform