Thanks, Kirk.

> On Mar 6, 2018, at 10:24 AM, Kirk Brooks via 4D_Tech <[email protected]> 
> wrote:
> 
> Robert,
> John's suggestion about a worker process is a good one. It sounds like
> you're just starting into this area so I'll throw out out a few things that
> aren't readily apparent.
> 
> I use Execute on server (EOS) methods a lot. When a method is EOS it runs
> on the server but in the 'twin' process of the one on the client. Let's say
> I've opened an order in a new process named 'order_1234'. I have the actual
> record open and locked on my client machine. That is, it's locked by the
> client process.
> 
> Now I call a method to lookup some stuff. Since it's a big lookup (or like
> me you are running over TCP/IP between the server and client) I use an EOS
> method. That method runs on the server in the process named 'order_1234'
> but the server side of the process, the 'twin', doesn't share the context
> of the client side. So there is no current order record on the server yet,
> for example. And if I try to load the order record on the server it will be
> locked because it's already open on the client side.
> 
> This can be useful. Let's say I've got some Order Lines in a related table.
> On the client side I probably have a current selection of them in a listbox
> or subform. On the server side I could do a search on that table, create a
> completely different current selection yet not disrupt the current
> selection on the client.
> 
> This can also create problems. If I forget to explicitly set the server
> side process to READ ONLY(*) before using it then I can lock a record in
> that process. The LOCKED ATTRIBUTE will only tell me it's locked by the
> 'order_1234' process - not WHICH VERSION of the process has it locked. That
> one stumped me for a while in one case. I just could not find where a
> record in a table was getting locked especially since I called READ ONLY(*)
> when the process started. Eventually I realized the situation was resulting
> from an EOS method that did a query and left the selection with the record
> locked. Grrr. So now the method that runs when I create a new method calls
> an little EOS method which sets all tables to READ ONLY.
> 
> The other type of server side process is what we call a stored method. This
> is initiated from the client by Execute on server or by simply creating a
> new process on the server itself. When you do this these processes exist
> only on the server and are conceptually similar to a Worker process.
> Workers have the cool feature of their own messaging system however. But
> simple server side processes are useful as well.
> 
> I use them for doing things like aggregating information that may be
> displayed on various client side forms or dashboards. I just finished work
> on a 'sales scoreboard' feature. A stored method periodically (every 5
> minutes) builds a set of summary arrays of sales data folks are interested
> in. I stuff them into an IP c-obj on the server. I use this same c-obj for
> a number of operations like this.
> 
> The cool benefit of server side IP vars, and especially c-objects in my
> view, is that any client can access that data with a simple EOS function.
> This DOES NOT use Get Process Variable which can be problematic. You don't
> need to. Here's the method that gets the sales data:
> 
>  //  Score_get_data **EOS**
>  // Written by: Kirk as Designer, Created: 03/06/18, 08:50:48
>  // ------------------
>  // Method: Score_get_data (ptr)
>  // $1 is ptr to c-obj
>  // Purpose: get the data object from the server
> C_POINTER($1)
> C_OBJECT($obj)
> 
> $obj:=OB_New
> $obj:=OBJ_get_obj (<>appObject;"scoreData")
> $1->:=$obj
> 
> 
> I add the **EOS**  to the headers of methods to make it easy to remember
> which ones are. Otherwise you have to look at the properties.
> 
> This is called from the form on the client. I don't need to worry about
> locking the IP var because I'm only reading it. You can also use this to
> write to the server side variable but this gets more complicated if you
> actually use it. So I stick to reading from the server side only.
> 
> I pass a pointer to a local object var. This is a pretty handy way to let
> your server manage this sort of operation without having to add the
> overhead of a messaging table where the server process writes data to a
> table and the client side reads from the table. I did it that way before
> but this is just easier.
> 
> Just some ideas. The best thing to do is start up a server and just play
> with it. This all gets a lot clearer when you can actually see it work, I
> think.
> 
> 
> On Mon, Mar 5, 2018 at 8:00 PM, Robert McKeever via 4D_Tech <
> [email protected]> wrote:
> 
>> I have two processes, one foreground, the other background (runs
>> continually with appropriate pause/resume). There are a few dialogs that
>> exist in the background process that can be eliminated. Since it does a lot
>> of information gathering before creating/deleting a record and updating
>> another, I’d like to move it so it executes on the server. It see that it
>> creates a new process on the server.
>> 
>> 1. Is that a unique process for each user, or only one process for all
>> users?
>> 
>> 2. Are the local variables in use on the ‘client’ the save as when you use
>> ‘Execute on Server’? e.g., if I start the process on the server, does it
>> share variables with the client or must they be exchanged via a record in a
>> table?
>> 
>> _________________________________________
>> Bob McKeever                      http://www.mswl.com <
>> http://www.mswl.com/>
>> McKeever's Software Wizardry
>> Port Coquitlam, B.C.
>> [email protected]
>> 
>> 
>> 
>> 
>> **********************************************************************
>> 4D Internet Users Group (4D iNUG)
>> FAQ:  http://lists.4d.com/faqnug.html
>> Archive:  http://lists.4d.com/archives.html
>> Options: https://lists.4d.com/mailman/options/4d_tech
>> Unsub:  mailto:[email protected]
>> **********************************************************************
> 
> 
> 
> 
> -- 
> Kirk Brooks
> San Francisco, CA
> =======================
> 
> *We go vote - they go home*
> **********************************************************************
> 4D Internet Users Group (4D iNUG)
> FAQ:  http://lists.4d.com/faqnug.html
> Archive:  http://lists.4d.com/archives.html
> Options: https://lists.4d.com/mailman/options/4d_tech
> Unsub:  mailto:[email protected]
> **********************************************************************

_________________________________________
Bob McKeever                      http://www.mswl.com <http://www.mswl.com/>
McKeever's Software Wizardry
Port Coquitlam, B.C.
[email protected]




**********************************************************************
4D Internet Users Group (4D iNUG)
FAQ:  http://lists.4d.com/faqnug.html
Archive:  http://lists.4d.com/archives.html
Options: https://lists.4d.com/mailman/options/4d_tech
Unsub:  mailto:[email protected]
**********************************************************************

Reply via email to