Module CustomerAndOrderInfo.wo
1// Structures used by the services
2
3// Customer Information
4// This structure matches the structure of the Customer table
5struct tCustomerInfo
6 integer iCustNumber
7 string sName
8 string sCustAddress
9 string sCity
10 string sState
11 string sZip
12 string sPhoneNumber
13 string sFaxNumber
14 string sEmailAddress
15 real rCreditLimit
16 real rPurchases
17 real rBalance
18 string sComments
19 string sStatus
20end_struct
21
22// These next two structures do not match the structure of the Customer table exactly
23// It is an example of structures that could have been determined by some other source (e.g. an industry group)
24
25// Customer Address
26struct tCustAddress
27 string sCustAddress
28 string sCity
29 string sState
30 string sZip
31end_struct
32
33// New Customer
34struct tNewCustomer
35 string sFirstName
36 string sMiddleName
37 string sLastName
38 tCustAddress Address
39 string sPhoneNumber
40 string sFaxNumber
41 string sEmailAddress
42end_struct
43
44// Order Detail
45struct tOrderDet
46 string sItemID
47 integer iQty
48 real rUnitPrice
49 real rPrice
50end_struct
51
52// Order
53struct tOrder
54 integer iOrderNumber
55 integer iCustNumber
56 date dOrdDate
57 string sTerms
58 string sShipVia
59 string sOrderedBy
60 string sSalesPerson
61 real rOrderTotal
62 tOrderDet[] ArrayOfDetails
63end_struct
64
65// Order Summary
66struct tOrderSummary
67 integer iOrderNumber
68 date dOrderDate
69 real rOrderTotal
70end_struct
71
72Use cWebService.pkg
73Use DataDict.pkg
74Use VENDOR.DD
75Use INVT.DD
76Use CUSTOMER.DD
77Use SALESP.DD
78Use OrderHea.DD
79Use ORDERDTL.DD
80
81Object oCustOrderWebService is a cWebService
82
83 // psDocumentation provides high level documentation of your web service. Clients using
84 // this service will see and use this documentation.
85 set psDocumentation to ;
86 ("This Visual DataFlex Web Service provides information on Customers " +;
87 "and their orders. You can also use this service to update Customer information, " +;
88 "create new Customers and retrieve a list of Customers.")
89
90 Set psServiceName to "CustomerAndOrderInfo"
91 Set psServiceURI to "http://tempuri.org/"
92 Set psServiceTitle to "Customer and Order Information Service"
93
94 Object Vendor_DD is a Vendor_DataDictionary
95 Send DefineAllExtendedFields
96 End_Object // Vendor_DD
97
98 Object Invt_DD is a Invt_DataDictionary
99 Set DDO_Server to Vendor_DD
100 Send DefineAllExtendedFields
101 End_Object // Invt_DD
102
103 Object Customer_DD is a Customer_DataDictionary
104 Send DefineAllExtendedFields
105 End_Object // Customer_DD
106
107 Object Salesp_DD is a Salesp_DataDictionary
108 Send DefineAllExtendedFields
109 End_Object // Salesp_DD
110
111 Object OrderHea_DD is a OrderHea_DataDictionary
112 Set DDO_Server to Customer_DD
113 Set DDO_Server to Salesp_DD
114 Set Constrain_File to Customer.File_Number
115 Send DefineAllExtendedFields
116 End_Object // OrderHea_DD
117
118 Object OrderDtl_DD is a OrderDtl_DataDictionary
119 Set DDO_Server to OrderHea_DD
120 Set DDO_Server to Invt_DD
121 Set Constrain_File to OrderHea.File_Number
122 Send DefineAllExtendedFields
123 End_Object // OrderDtl_DD
124
125 Set Main_DD to Customer_DD
126
127 // Function GetOrdersForCustomer:
128 // Searches for order number in the OrderHea file for specified customer number and returns order numbers
129 //
130 // This demonstrates how to build and return data in an Array based on a fundamental datatype (array of integers)
131 //
132 // iCustNum - Customer number
133 // iArrayOfOrderNumbers - Array containing Order numbers for iCustNum
134 { Published = True }
135 { Description = "Searches for order number in the OrderHea file for specified customer number and returns order numbers." }
136 Function GetOrdersForCustomer integer iCustNum returns Integer[]
137 integer[] iArrayOfOrderNumbers
138 handle hoCustomerDD hoOrderHeaDD
139 integer iCount iOldConstraint iNewConst
140
141 move 0 to iCount
142
143 // Validate Customer Number
144 move Customer_DD to hoCustomerDD
145 send clear of hoCustomerDD
146 move iCustNum to Customer.Customer_number
147 send find of hoCustomerDD EQ 1
148
149 // Find Orders for iCustNum
150 if (found) begin
151 move OrderHea_DD to hoOrderHeaDD
152 send find of hoOrderHeaDD first_record 1
153
154 while (found)
155 move OrderHea.Order_number to iArrayOfOrderNumbers[iCount]
156
157 send find of hoOrderHeaDD GT 1
158 increment iCount
159 loop
160
161 end
162 else begin
163 send WebServiceException "Customer number not found."
164 Function_Return
165 end
166
167 Function_Return iArrayOfOrderNumbers
168 End_Function // GetOrdersForCustomer
169
170 // Function ChangeCustomerAddress:
171 // Change address for customer
172 //
173 // This demonstrates how to pass in and use simple struct data
174 //
175 // NewCustomerAddress - New Customer Address
176 // bSuccess - Boolean indicating if the new address was changed successfully or not
177 { Published = True }
178 { Description = "Change address for customer." }
179 Function ChangeCustomerAddress integer iCustNum tCustAddress NewCustomerAddress returns Boolean
180 boolean bSuccess
181 handle hDD
182
183 move False to bSuccess
184
185 move Customer_DD to hDD
186 send clear of hDD
187 move iCustNum to Customer.Customer_number
188 send find of hDD EQ 1
189
190 if (found) begin
191 // Move values from structure to DD buffer
192 set field_changed_value of hDD FIELD Customer.Address to NewCustomerAddress.sCustAddress
193 set field_changed_value of hDD FIELD Customer.City to NewCustomerAddress.sCity
194 set field_changed_value of hDD FIELD Customer.State to NewCustomerAddress.sState
195 set field_changed_value of hDD FIELD Customer.Zip to NewCustomerAddress.sZip
196
197 // Save record
198 send Request_Save of hDD
199 move (not(Err)) to bSuccess
200 end
201
202 Function_Return bSuccess
203 End_Function // ChangeCustomerAddress
204
205 // Function CreateNewCustomer:
206 // Add new customer to Customer file
207 //
208 // This demonstrates how to pass in and use more complex struct data where
209 // the struct contains an element that is itself another struct
210 //
211 // NewCustomer - New Customer
212 // iSuccess - Integer containing the customer number, if the new customer was added successfully
213 // or -1 if customer not added
214 { Published = True }
215 { Description = "Add new customer to Customer file." }
216 Function CreateNewCustomer tNewCustomer NewCustomer returns Integer
217 integer iSuccess
218 handle hDD
219 string sName
220
221 move Customer_DD to hDD
222 send clear of hDD
223
224 // Move values from structure to DD buffer
225 move (NewCustomer.sFirstName * NewCustomer.sMiddleName * NewCustomer.sLastName) to sName
226 set field_changed_value of hDD FIELD Customer.Name to sName
227 set field_changed_value of hDD FIELD Customer.Address to NewCustomer.Address.sCustAddress
228 set field_changed_value of hDD FIELD Customer.City to NewCustomer.Address.sCity
229 set field_changed_value of hDD FIELD Customer.State to NewCustomer.Address.sState
230 set field_changed_value of hDD FIELD Customer.Zip to NewCustomer.Address.sZip
231 set field_changed_value of hDD FIELD Customer.Phone_number to NewCustomer.sPhoneNumber
232 set field_changed_value of hDD FIELD Customer.Fax_number to NewCustomer.sFaxNumber
233 set field_changed_value of hDD FIELD Customer.Email_address to NewCustomer.sEmailAddress
234
235 // note that the default for Credit_limit is already set in the data dictionary
236 set field_changed_value of hDD FIELD Customer.Purchases to 0
237 set field_changed_value of hDD FIELD Customer.Balance to 0
238 set field_changed_value of hDD FIELD Customer.Comments to "New Customer"
239 set field_changed_value of hDD FIELD Customer.Status to "Y" // Active by default
240
241 // Save record
242 send request_save of hDD
243 if (not(Err)) move Customer.Customer_Number to iSuccess
244 else move -1 to iSuccess
245
246 Function_Return iSuccess
247 End_Function // CreateNewCustomer
248
249 // Function GetCustomerInfo:
250 // Searches for customer number in the Customer file and returns customer details
251 //
252 // This demonstrate how to build and return data in a simple struct
253 //
254 // iCustNum - Customer number
255 // OneCustomer - Structure containing Customer Information in Customer File
256 { Published = True }
257 { Description = "Searches for customer number in the Customer file and returns customer details." }
258 Function GetCustomerInfo integer iCustNum returns tCustomerInfo
259 tCustomerInfo OneCustomer
260 handle hDD
261
262 move Customer_DD to hDD
263 send clear of hDD
264 move iCustNum to Customer.Customer_number
265 send find of hDD EQ 1
266
267 if (found) begin
268 move Customer.Customer_Number to OneCustomer.iCustNumber
269 move Customer.Name to OneCustomer.sName
270 move Customer.Address to OneCustomer.sCustAddress
271 move Customer.City to OneCustomer.sCity
272 move Customer.State to OneCustomer.sState
273 move Customer.Zip to OneCustomer.sZip
274 move Customer.Phone_number to OneCustomer.sPhoneNumber
275 move Customer.Fax_number to OneCustomer.sFaxNumber
276 move Customer.Email_address to OneCustomer.sEmailAddress
277 move Customer.Credit_limit to OneCustomer.rCreditLimit
278 move Customer.Purchases to OneCustomer.rPurchases
279 move Customer.Balance to OneCustomer.rBalance
280 move Customer.Comments to OneCustomer.sComments
281 move Customer.Status to OneCustomer.sStatus
282 end
283 else begin
284 send WebServiceException "Customer number not found."
285 Function_Return
286
287 end
288
289 Function_Return OneCustomer
290 End_Function // GetCustomerInfo
291
292 // Function GetCustomerInfoList:
293 // Reads customer file and returns an array with a list of customers
294 //
295 // This demonstrates how to build and return data in an Array of structs
296 //
297 // ArrayOfCustomers - Array containing Customer from Customer File
298 { Published = True }
299 { Description = "Reads customer file and returns an array with a list of customers." }
300 Function GetCustomerInfoList returns tCustomerInfo[]
301 tCustomerInfo[] ArrayOfCustomers
302 handle hoCustomerDD
303 integer iCount
304
305 move 0 to iCount
306 move Customer_dd to hoCustomerDD
307
308 // now go through all customer records
309 send clear of hoCustomerDD
310 send find of hoCustomerDD GE 2
311 while (found)
312 move Customer.Customer_Number to ArrayOfCustomers[iCount].iCustNumber
313 move Customer.Name to ArrayOfCustomers[iCount].sName
314 move Customer.Address to ArrayOfCustomers[iCount].sCustAddress
315 move Customer.City to ArrayOfCustomers[iCount].sCity
316 move Customer.State to ArrayOfCustomers[iCount].sState
317 move Customer.Zip to ArrayOfCustomers[iCount].sZip
318 move Customer.Phone_number to ArrayOfCustomers[iCount].sPhoneNumber
319 move Customer.Fax_number to ArrayOfCustomers[iCount].sFaxNumber
320 move Customer.Email_address to ArrayOfCustomers[iCount].sEmailAddress
321 move Customer.Credit_limit to ArrayOfCustomers[iCount].rCreditLimit
322 move Customer.Purchases to ArrayOfCustomers[iCount].rPurchases
323 move Customer.Balance to ArrayOfCustomers[iCount].rBalance
324 move Customer.Comments to ArrayOfCustomers[iCount].sComments
325 move Customer.Status to ArrayOfCustomers[iCount].sStatus
326
327 send find of hoCustomerDD GT 2
328 increment iCount
329 Loop
330
331 Function_Return ArrayOfCustomers
332 End_Function // CustomerList
333
334 // Function GetOrderSummaryForCustomer:
335 // Searches for order number in the OrderHea file for specified customer number and returns order numbers,
336 // date and total.
337 //
338 // This demonstrates how to build and return data in an Array of structs
339 //
340 // iCustNum - Customer number
341 // ArrayOfOrdersSum - Array containing OrderSummary for iCustNum
342 { Published = True }
343 { Description = "Searches for order number in the OrderHea file for specified customer number and returns order numbers, date and total." }
344 Function GetOrderSummaryForCustomer integer iCustNum returns tOrderSummary[]
345 tOrderSummary[] ArrayOfOrdersSum
346 handle hDD
347 integer iCount iOldConstraint
348
349 move 0 to iCount
350
351 // Validate Customer Number
352 move Customer_DD to hDD
353 send clear of hDD
354 move iCustNum to Customer.Customer_number
355 send find of hDD EQ 1
356
357 // Find Orders for iCustNum
358 if (found) begin
359 move OrderHea_DD to hDD
360 send find of hDD first_record 1
361
362 while (found)
363 move OrderHea.Order_number to ArrayOfOrdersSum[iCount].iOrderNumber
364 move OrderHea.Order_Date to ArrayOfOrdersSum[iCount].dOrderDate
365 move OrderHea.Order_Total to ArrayOfOrdersSum[iCount].rOrderTotal
366
367 send find of hDD GT 1
368 increment iCount
369 loop
370
371 end
372 else begin
373 send WebServiceException "Customer number not found."
374 Function_Return
375
376 end
377
378 Function_Return ArrayOfOrdersSum
379 End_Function // GetOrderSummaryForCustomer
380
381 // Function GetOrderInfo:
382 // Searches for order number in the OrderHea file and returns order header and details
383 //
384 // This demonstrates how to build and return data in complex structs.
385 // This struct contains a member that is an array of structs
386 //
387 // iOrdNum - Order number
388 // OneOrder - Structure containing Order header and details
389 { Published = True }
390 { Description = "Searches for order number in the OrderHea file and returns order header and details." }
391 Function GetOrderInfo integer iOrdNum returns tOrder
392 tOrder OneOrder
393 handle hDD
394 integer iCount iOldConstraint
395 boolean bHasRecord
396
397 move 0 to iCount
398
399 move OrderHea_DD to hDD
400
401 // OrderHea_DD is constrained by Customer. In order to find all orders,
402 // not only the ones belonging to the current Customer in the DD buffer,
403 // we need to remove the constraint. Here we:
404 // save the current constraint
405 get constrain_file of hDD to iOldConstraint
406 // remove the constraint
407 set constrain_file of hDD to 0
408 // enforce the new rule i.e. no constraint
409 send rebuild_constraints of hDD
410
411 send clear of hDD
412 move iOrdNum to OrderHea.Order_number
413 send find of hDD EQ 1
414
415 // restore the default constraint to whatever it was
416 set constrain_file of hDD to iOldConstraint
417 send rebuild_constraints of hDD
418
419 get HasRecord of hDD to bHasRecord
420 if (bHasRecord) begin
421
422 move OrderHea.Order_Number to OneOrder.iOrderNumber
423 move OrderHea.Customer_Number to OneOrder.iCustNumber
424 move OrderHea.Order_Date to OneOrder.dOrdDate
425 move OrderHea.Terms to OneOrder.sTerms
426 move OrderHea.Ship_Via to OneOrder.sShipVia
427 move OrderHea.Ordered_By to OneOrder.sOrderedBy
428 move OrderHea.Salesperson_ID to OneOrder.sSalesPerson
429 move OrderHea.Order_Total to OneOrder.rOrderTotal
430
431 move OrderDtl_DD to hDD
432 send find of hDD first_record 1
433 while (found)
434 move OrderDtl.Item_id to OneOrder.ArrayOfDetails[iCount].sItemID
435 move OrderDtl.Qty_ordered to OneOrder.ArrayOfDetails[iCount].iQty
436 move OrderDtl.Price to OneOrder.ArrayOfDetails[iCount].rUnitPrice
437 move OrderDtl.Extended_price to OneOrder.ArrayOfDetails[iCount].rPrice
438
439 send find of hDD GT 1
440 increment iCount
441 loop
442
443 end
444 else begin
445 send WebServiceException "Order number not found."
446 Function_Return
447 end
448
449 Function_Return OneOrder
450 End_Function // GetOrderInfo
451
452End_Object // oCustOrderWebService
453