pfry Posted August 21, 2016 Posted August 21, 2016 Hi, In order to use the ES_Exclude fonction, I need to send some value list to the server for the calculation. (I am filtering the customers according to 2 lists : department and job ). Is there anybody who can explain how to send these list to the server ? I think I can't use the $$additional_pull_info because the list items are separated with carriage return right ? Btw can we have a debug mode for the the server scripts ? thanks and have a good day ! Jonathan
Joshua Willing Halpern Posted August 21, 2016 Posted August 21, 2016 The settings portion of the payload, which includes any additional info you send, is delimited by the end tag "</setting>", not by carriage returns. My hunch is that your value lists should work as is. Have you tried including them and seeing if the sync works? If that proves problematic, why not change the value list delimiter to a different character which you could parse? And... there are debug steps built into the server scripts, but you need to change the "$$use_psos_during_*" settings in the client-side settings script to 0 so that the server scripts run on the local machine.
pfry Posted August 21, 2016 Author Posted August 21, 2016 Excuse me Joshua, I am not sure to understand what you mean about the end tag "</setting>". For example I saw that the the exclude action was done in the "Prepare Payload for Client" script. I can see that the parameter script is : Evaluation ( "EasySync_Payloads::ES_Last_Pull_UTC_Time" ) & ¶ & Evaluation ( "EasySync_Payloads::ES_Last_Push_UTC_Time" ) & ¶ & Obtenir ( IDPersistant ) & ¶ & $$client_version & ¶ & Substituer ( Obtenir ( AdresseIPSystème ); ¶; ", " ) & ¶ & Substituer ( Obtenir ( AdresseNICSystème ); ¶; ", " ) & ¶ & Obtenir ( PlateformeSystème ) & ¶ & Obtenir ( VersionSystème ) & ¶ & Obtenir ( Appareil ) & ¶ & Obtenir ( ProtocoleRéseau ) & ¶ & Obtenir ( TypeRéseau ) & ¶ & $$additional_pull_info What am I supposed to input in the $$additional_pull_info ? 1st list & "</setting>" & 2d List & "</setting>" ?
pfry Posted August 21, 2016 Author Posted August 21, 2016 Ok I replace the carrier return by another symbol and it works perfectly. Thanks !
Joshua Willing Halpern Posted August 21, 2016 Posted August 21, 2016 First of all, "Prepare Payload For Client" is part of the PULL process and therefore not relevant to the PUSH procedure. You originally asked about sending additional information to the server so I'll address that. (Let us know if you also need to send additional info back to the client.) On second look, I think you're right that ¶ won't work in your additional_push_info variable. This is because in "Process Payload From Client", the server replaces every "</setting> end tag with "¶" and then uses GetValue to parse the different settings including the additional info. If your value list has ¶ characters in it, the script will only grab the first value of the first value list : /. Sooo, I think the best way to handle this would be to take both value lists and substitute a different character/string for every carriage return before putting it into the $additional_info variable. Make sure to use a string that you know won't appear in your value lists, e.g. $$additional_push_info = Substitute ( <value list 1> & ¶ & <value list 2> ; ¶ ; "¥" ). Or you can employ Tim's html-esque method and use "</vl>". Then, in "Process Payload From Client", to convert back to value list format, change the calculation in this script step: to Substitute ( GetValue ( Substitute ( $settings ; "</setting>" ; ¶ ) ; 12 ) ; "¥" ; ¶ ) Your $additional_settings variable should now read as your two value lists originally did back to back, separated by ¶. If you want to keep the two lists separate, use a different separator in the $$additional_push_info step. Oh, haha, right when I finished. Glad you got it working!
pfry Posted August 21, 2016 Author Posted August 21, 2016 (edited) Thanks a lot Joshua. Your support to integrate fm easy sync is really appreciated ! Edited August 21, 2016 by pfry
Joshua Willing Halpern Posted August 21, 2016 Posted August 21, 2016 It bugs me that the "Process Payload From Client" script was substituting "</setting>" delimiters with ¶. This diminishes the usefulness of the delimiter in the first place, and instead of only having to worry about "</setting>" appearing in our data we also have to worry about any stray ¶s. ¶ is MUCH more common than "</setting>". So I changed the script to parse the $settings variable without substitution. Just 2 steps. 1. In "Process Payload From Client", add the following before the Set Variable [$field_delimiter] step: Set Variable [ $i ; 0 ] 2. Then for each of the following 12 Set Variable steps, from $field_delimiter to $additional_settings, change the calculation to: Let ( [ $i = $i + 1 ; $start = $end + 10 ; $end = Position ( $settings ; "</setting>" ; 1 ; $i ) ; $end = If ( $end = 0 ; Length ( $settings ) + 1 ; $end ) ]; If ( $i ≠ 1 ; Middle ( $settings ; $start ; $end - $start ) ; Left ( $settings ; $end - 1 ) ) ) Hopefully that saves someone a future headache. J
Joshua Willing Halpern Posted August 21, 2016 Posted August 21, 2016 (edited) Or for simplicity: 1. Set Variable [ $expression ; " Let ( [ $i = $i + 1 ; $start = $end + 10 ; $end = Position ( $settings ; \"</setting>\" ; 1 ; $i ) ; $end = If ( $end = 0 ; Length ( $settings ) + 1 ; $end ) ]; If ( $i ≠ 1 ; Middle ( $settings ; $start ; $end - $start ) ; Left ( $settings ; $end - 1 ) ) ) " ] 2. Set Variable [ $i ; 0 ] 3. Change each of the following 12 set variable calculations to Evaluate ( $expression ) Edited August 21, 2016 by Joshua Willing Halpern
pfry Posted August 22, 2016 Author Posted August 22, 2016 Hi Joshua, I think I don't really understand the way to use this exclude fonction. I thought that the exclude process was during the “Prepare Payload for Client" because of this : "#Add this table's fields to the SELECT statement. #Note: This is the SELECT statement that is used to select the data for the payload. #You can add your own custom business rules here to determine what data is sent to the user, by looking at things like the table name being worked on, the user / device that has requested the data, etc. Dynamically add your conditions to the WHERE clause." So I use the $$additional_pull_info, then edit the “Prepare Payload for Client" script to get back my value list in a global variable to do the ES_Exclude calculation. But I must admit that I have some strange results... Now I understand that you are talking about the "Process Payload From Client" script, and I was surprised because I thought this script was not include in the exclude process. Can you please confirm which scripts are used for this exclude fonction and need the $$additional_settings ? I also have another little question : if a user make a mistake and delete a record. This record will not be pulled after that if the ES_Device_ID was this user_device. Is there any way to prevent about that ? Thanks a lot
Joshua Willing Halpern Posted August 22, 2016 Posted August 22, 2016 (edited) It sounds like your ES_Exclude calculation is not working. If you're trying to exclude records that match the value lists, maybe use the calculation: PatternCount ( $additional_settings ; <field> ) > 0. It would help to know what you specifically need. As for the accidental deletion problem. You need to ensure your users don't accidentally delete things without logging the deletion in a payload record. If that means removing delete from the menu, then do that. To get around the ES_Device_ID problem I changed the field calculation to include either the system or host ip address depending on whether the user has accessed the local or hosted file. I had to modify the scripts to accommodate this change and prevent round-tripping. That's a subject for another thread though. More about exclusions; there are 2 ways to exclude records from the sync. 1) Use the ES_Exclude field. Any record with an ES_Exclude value that evaluates to true will be excluded from the push or pull payloads. You can see that in the Push Payload script here: 2) The second way to exclude records is by modifying the $dyn_sql SELECT statement in "Prepare Payload For Client." Modify this however you want. Want to exclude all Georges from the Pull?... Add "AND name <> 'George'" to the end of the SELECT statement. To exclude values that match your value list, maybe create a loop that adds a clause each time -- E.g. & " AND field <> " & GetValue ( $additional_info ; $i )" is added with each loop. You could technically add more conditions to the Push Payload SELECT statement too, but It's probably better to push all new/edited records and only pull what you need. J Edited August 22, 2016 by Joshua Willing Halpern
pfry Posted August 22, 2016 Author Posted August 22, 2016 Hi Joshua, I think I am missing something, I run the pull script in debug mode, without PSOS, and the ES_Exclude calculation looks ok but all my records are deleted ... Here are the client and hosted files, can you tell me what is wrong ? Jonathan FM_Surveys_Mobile_jMod3.fmp12 FM_Surveys_Hosted_jMod1.fmp12
Joshua Willing Halpern Posted August 22, 2016 Posted August 22, 2016 Hey Jonathan, DELETIONS The reason your records are being deleted is because Sync check will also exclude records with the ES_Exclude flag. In your case, to fix this you'll need to update $$additional_sync_check_info in the client settings to include your state list. In the server-side sync check script set the $States_Selected variable again so that the ES_Exclude flags are correct when the server uuid list is assembled. 1. Copy the calculation from $$additional_pull_info into $$additional_sync_check_info. 2 then add this line to the server sync check script: Set Variable [ $States_Selected ; Substitute ( $additional_sync_check_info ; "-" ; ¶ ) ] after the line Set Variable [$additional_sync_check_info] EXCLUDE Your ES_Exclude seems to be working to me. Try this: Select a state or two in your global picker. Then click the utilities button at bottom and wipe and reset. Your client db should be empty now. Click sync and the records that are pulled down should only be from those two states. That's how your ES_Exclude is currently setup. Records that don't match your selected states will be excluded during pull.
pfry Posted August 23, 2016 Author Posted August 23, 2016 Hi Joshua, When do your recommandation the "EasySync Settings Client" close the script after the line : #If there are no UUIDs in the sync tables... So I don't achieve the Server Sync Check Process Any idea ?
Joshua Willing Halpern Posted August 23, 2016 Posted August 23, 2016 (edited) Why don't you want to run sync check? If a record is deleted on server, it won't be deleted from client without sync check. Maybe I misunderstand your question? Why don't we continue via email. Look in the easysync scripts for my email or message me directly. Edited August 23, 2016 by Joshua Willing Halpern
Recommended Posts
This topic is 3283 days old. Please don't post here. Open a new topic instead.
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now