在 Acumatica 中使用 BQL 检索数据

retrieve data using BQL in Acumatica

我已经为 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 项目中使用 BQL 编写生成上述查询的代码。

假设您想要 运行 查询已登录用户的公司,不进行错误检查将是:

((APInvoice)PXSelect<APInvoice, Where<APInvoice.refNbr, Equal<Required<APInvoice.refNbr>>>>.Select(sender.Graph, refNbr)).InvoiceNbr

如果需要运行查询登录用户所在公司以外的公司,推荐的方式是将数据放在table没有CompanyID字段的地方。

BQL 强烈强制执行公司隔离,除非您登录该公司,否则您将无法从另一家公司检索数据。如果此数据是 split/shared 与另一家公司的数据,则 ORM 还负责返回来自其他公司 ID 的数据。对于不包含 CompanyID 字段的 table,系统 returns 此 table 中包含的所有数据。