【问题标题】:Acumatica postal code validation and matchAcumatica 邮政编码验证和匹配
【发布时间】:2017-08-17 13:18:02
【问题描述】:

我在销售订单屏幕中创建了一个新的自定义字段(邮政编码 - Usrpostalcode),我正在尝试将此字段设为必填(即使在添加 [PXDefault] 后也不起作用 [PXUIField(..., Required = true)] ),验证它并确保它与运输设置中的邮政编码匹配。

谁能帮我解决这个问题?

在销售订单屏幕上创建发货时出现此错误

enter image description here

【问题讨论】:

    标签: validation acumatica postal-code


    【解决方案1】:

    添加 PXDefault 属性应该足以使该字段成为必填项。如果值为 null 或为空,PXDefault 将阻止保存。它将引发错误并突出显示该字段。

    在 SOOrder DAC 中添加自定义字段:

    将自定义字段添加到销售订单屏幕:

    通过保存而不提供邮政编码值来测试必填字段:

    使用检查元素,找到您要验证的字段:

    在代码部分,为 SOOrderEntry 创建一个图形扩展,您将在其中放置验证:

    在该图形扩展中编写您的验证代码:

    namespace PX.Objects.SO
    {
      public class SOOrderEntry_Extension:PXGraphExtension<SOOrderEntry>
      {
        public const string postalCodeErrorMessage = "Sales Order postal code must match shipping address postal code.";
    
        // Validate just before saving, triggered when graph save function is called
        public void SOOrder_RowPersisting(PXCache sender, PXRowPersistingEventArgs e)
        {
          if (!ValidatePostalCode(sender, e.Row as SOOrder))
          {
             // Raise field error
             PXUIFieldAttribute.SetError<SOOrderExt.usrPostalCode>(sender, e.Row, postalCodeErrorMessage);
          }
        }
    
        // Validation function
        public bool ValidatePostalCode(PXCache sender, SOOrder soOrder)
        {
          if (soOrder != null)
          {
            // Get SOOrder custom field Postal Code
            SOOrderExt soOrderExt = sender.GetExtension<SOOrderExt>(soOrder);
    
            if (soOrderExt != null)
            {
              string soPostalCode = soOrderExt.UsrPostalCode;
      
              // Get current shipping address displayed on Sales Order
              SOShippingAddress shippingAddress = Base.Shipping_Address.Current as SOShippingAddress;
      
              if (shippingAddress != null)
              {
                  // Special case to handle null values
                  if (soPostalCode == null || shippingAddress.PostalCode == null)
                  {
                      return soPostalCode == shippingAddress.PostalCode;
                  }
      
                  // Compare postal codes
                  soPostalCode =soPostalCode.Trim().Replace(" ", "");
                  string shippingPostalCode = shippingAddress.PostalCode.Trim().Replace(" ", "");
                  
                  return soPostalCode.Equals(shippingPostalCode, StringComparison.OrdinalIgnoreCase);
              }
            }
          }
    
          return false;
        }
      }
    }
    

    保存或自定义邮政编码字段失去焦点时,将触发验证:

    【讨论】:

    • 如果您想始终进行验证,按照 Brendan 的建议使用 FieldVerifying 是一个更好的选择。如果您只想在保存时进行验证,则可以仅使用 RowPersisting 并删除 FieldUpdated。
    • 我在图表扩展中对如何获取销售订单上显示的当前送货地址进行了小编辑,因为当前缓存项在我测试时似乎为空。现在改为:Base.Shipping_Address.Current as SOShippingAddress;
    • 我在添加邮政编码验证错误后尝试复制订单时收到此错误:处理字段邮政编码期间发生错误:无法将“System.Int32”类型的对象转换为输入'System.String'..
    • 这通常是由于声明的 DAC 类型和数据库类型不匹配造成的。使用 SQL Management Studio 等数据库管理实用程序检查数据库中自定义字段的类型。它们应该与 DAC 的类型相匹配。例如:DAC [PXDBString(50, IsUnicode=true) DB nvarchar(50)
    • 是的......数据库中的数据类型是(int)......谢谢!
    【解决方案2】:

    您可以通过添加选择器或实现 FieldVerifying 来检查值。

    如果默认使用 PXSelector,如果在后备表中找不到,则选择器将抛出错误。

    或者,您可以使用字段 FieldVerifying 事件,方法是将其添加到销售订单的图形扩展中,如下例所示...

    public class SOOrderEntryExtension : PXGraphExtension<SOOrderEntry>
    {
        protected virtual void SOOrder_Usrpostalcode_FieldVerifying(PXCache sender, PXFieldVerifyingEventArgs e)
        {
            //search for table value...
    
            // if not found...
    
            throw new PXSetPropertyException<SOOrder.usrpostalcode>("Invalid postal code");
        }
    }
    

    【讨论】:

    • 哦,好吧...我将使用 FieldVerifying 事件!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2018-07-21
    • 2014-09-08
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多