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