C# 在Acumatica中使用BQL检索数据

C# 在Acumatica中使用BQL检索数据,c#,customization,acumatica,C#,Customization,Acumatica,我已经为APReleaseCheckProcess创建了扩展。我需要发送文档的RefNbr,其中DocType='REF'将供应商退款的RefNbr发送到另一个数据库。 我在下面使用了这个代码 public static class APReleaseCheckProcess { public static void APPaymentRowPersisted(PXCache sender, PXRowPersistedEventArgs e) {

我已经为APReleaseCheckProcess创建了扩展。我需要发送文档的RefNbr,其中DocType='REF'将供应商退款的RefNbr发送到另一个数据库。 我在下面使用了这个代码

public static class APReleaseCheckProcess
  {
      public static void APPaymentRowPersisted(PXCache sender, PXRowPersistedEventArgs e)
      {
          string serverJade, dbJade, userJade, passJade;

          serverJade = "BS-DEV64\\SQL2014"; //--- Server Jade : 192.168.10.13
          dbJade = "SGL"; //--- DB Jade Live : SGL || DB Jade test : SGL_TEST
          userJade = "sa"; //--- User ID : sa
          passJade = "Admin1"; //--- Password : sa_091073

          if (e.TranStatus == PXTranStatus.Completed && e.Operation == PXDBOperation.Update)
          {
              var doc = e.Row as APPayment;
              #region Doc Type = Vendor Refund
              if (doc != null && doc.Released == true && doc.DocType == "REF")
              {
                  foreach (APAdjust oldadj in PXSelect<APAdjust,
                      Where<
                          APAdjust.adjgDocType, Equal<Required<APPayment.docType>>,
                              And<APAdjust.adjgRefNbr, Equal<Required<APPayment.refNbr>>,
                              And<APAdjust.adjNbr, Less<Required<APPayment.lineCntr>>>>>>
                      .Select(sender.Graph, doc.DocType, doc.RefNbr, doc.LineCntr))
                  {
                      string refNbr = oldadj.AdjdRefNbr;
                      string docType = oldadj.AdjdDocType;

                      // I need to retrieve InvoiceNbr from this query below using BQL statement:
                      string InvNbr = "select InvoiceNbr from APInvoice where CompanyID = 2 and RefNbr = refnbr";

                      // query to send to another database
                      using (SqlConnection conJade = new SqlConnection("server = " + serverJade + "; database = " + dbJade + "; user = " + userJade + "; password = " + passJade + ""))
                                  {
                                      string qRefund = "update b set b.cano = "+doc.RefNbr+"" +
                                                       "from evmaster as b " +
                                                            "inner join evmaster as a on a.svno = b.vchno " +
                                                       "where a.vchno = "+InvNbr+"";
                                      conJade.Open();
                                      using (SqlCommand comJade = new SqlCommand(qRefund, conJade))
                                      {
                                          SqlDataReader sdr = comJade.ExecuteReader();
                                          sdr.Close();
                                      }
                                  }
                  }
              }
              #endregion
          }
      }
  }

如何编写代码,在Acumatica Customize project中使用BQL生成上面的查询。

假设您希望为登录用户的公司运行查询,而不进行错误检查,这将是:

((APInvoice)PXSelect<APInvoice, Where<APInvoice.refNbr, Equal<Required<APInvoice.refNbr>>>>.Select(sender.Graph, refNbr)).InvoiceNbr
如果需要为登录用户的公司以外的公司运行查询,建议将数据放入不带CompanyID字段的表中


BQL严格执行公司隔离,除非您登录到另一家公司,否则您将无法从另一家公司检索数据。如果其他公司的数据被拆分/共享,ORM还负责从其他公司ID返回数据。对于不包含CompanyID字段的表,系统将返回此表中包含的所有数据。

您是否查看了Acumatica大学的API参考和培训资料?谢谢您的建议,我会查看。实际上,下面的答案是有效的,我将使用它。但是我想如果我有关于BQL的另一个案例,我肯定会检查培训材料。我需要运行当前公司的查询,当然登录用户也会这样。我试过你的BQL,它很有效。谢谢你的回答: