将RefNbr插入/发送到Acumatica ERP系统中的另一个数据库

时间:2017-02-07 03:15:28

标签: c# acumatica erp

我在Acumatica屏幕的支票和付款屏幕上创建了一个付款并将其发布。请参阅以下屏幕截图。

enter image description here

我已经创建了以下代码来提供它。

  protected virtual void APPayment_RowPersisted(PXCache sender, PXRowPersistedEventArgs e)
  {
      string serverJade, dbJade, userJade, passJade;
      serverJade = Properties.Settings.Default.serverJade;
      dbJade = Properties.Settings.Default.dbJade;
      userJade = Properties.Settings.Default.userJade;
      passJade = Properties.Settings.Default.passJade;


      APPayment app = (APPayment)e.Row;
      if (e.Operation == PXDBOperation.Update && e.TranStatus == PXTranStatus.Completed)
      {
          if (app.DocType == APPaymentType.Check || app.DocType == APPaymentType.Prepayment)
          {
              if (app.RefNbr != null)
              {

                  using (SqlConnection con = new SqlConnection("server = " + serverJade + "; database = " + dbJade + "; user = " + userJade + "; password = " + passJade + ""))
                  {
                      con.Open();
                      //---- query to update a field in the table of another database -------//
                      string query = "Update EVMaster set AcuRefNo = '" + app.RefNbr + "' where VchNo = 'DD02/16-VIII/12206-VCH-01'";
                      using (SqlCommand com = new SqlCommand(query, con))
                      {
                          SqlDataReader sdr = com.ExecuteReader();
                          sdr.Close();
                      }
                      con.Close();
                  }
              }
          }
      }
  }

我已经尝试调试此代码,但没有用。然后我尝试使用这个以下代码。

    protected virtual void APPayment_RowPersisted(PXCache sender, PXRowPersistedEventArgs e)
  {
      string serverJade, dbJade, userJade, passJade;
      serverJade = Properties.Settings.Default.serverJade;
      dbJade = Properties.Settings.Default.dbJade;
      userJade = Properties.Settings.Default.userJade;
      passJade = Properties.Settings.Default.passJade;


      APPayment app = (APPayment)e.Row;
          if (app.DocType == APPaymentType.Check || app.DocType == APPaymentType.Prepayment)
          {
              if (app.RefNbr != null)
              {

                  using (SqlConnection con = new SqlConnection("server = " + serverJade + "; database = " + dbJade + "; user = " + userJade + "; password = " + passJade + ""))
                  {
                      con.Open();
                      //---- query to update a field in the table of another database -------//
                      string query = "Update EVMaster set AcuRefNo = '" + app.RefNbr + "' where VchNo = 'DD02/16-VIII/12206-VCH-01'";
                      using (SqlCommand com = new SqlCommand(query, con))
                      {
                          SqlDataReader sdr = com.ExecuteReader();
                          sdr.Close();
                      }
                      con.Close();
                  }
              }
          }
  }

上面的代码是可行的,我只是删除if条件(如果(e.Operation == PXDBOperation.Update&& e.TranStatus == PXTranStatus.Completed)           {})。

但这不是我的目标,我必须仅从文档中过滤Doc Status ='printed'的文档,并且在点击'Release'按钮时执行此过程。

还有任何想法如何获取当前文档的APAdjust中的所有记录?因为我需要比较apadjust中的adjgrefnbr和基于adjgrefnbr(apadjust)= refnbr(apinvoice)的APInvoice中的refnbr。所以我也可以根据refnbr(APinvoice)= ajgrefnbr(当前的apadjust)得到APinvoice的所有记录。这个条件用于使'where'条件的查询不必硬编码,我将使用变量来提供它。

有什么建议可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

下面是一个示例,说明如何扩展发布流程以进行检查,并为APRegister DAC订阅RowPersisted处理程序,以将已发布的文档RefNbr保存到另一个数据库:

public class APPaymentEntryExt : PXGraphExtension<APPaymentEntry>
{
    public PXAction<APPayment> release;

    [PXUIField(DisplayName = "Release", MapEnableRights = PXCacheRights.Update, MapViewRights = PXCacheRights.Update)]
    [PXProcessButton]
    public IEnumerable Release(PXAdapter adapter)
    {
        PXGraph.InstanceCreated.AddHandler<APReleaseProcess>((graph) =>
        {
            graph.RowPersisted.AddHandler<APRegister>(APReleaseCheckProcess.APPaymentRowPersisted);
        });

        return Base.release.Press(adapter);
    }
}

public class APReleaseChecksExt : PXGraphExtension<APReleaseChecks>
{
    protected virtual void ReleaseChecksFilter_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
    {
        var row = e.Row as ReleaseChecksFilter;
        if (row == null) return;

        Base.APPaymentList.SetProcessDelegate(list =>
        {
            PXGraph.InstanceCreated.AddHandler<APReleaseProcess>((graph) =>
            {
                graph.RowPersisted.AddHandler<APRegister>(APReleaseCheckProcess.APPaymentRowPersisted);
            });

            APReleaseChecks.ReleasePayments(list, row.Action);
        });
    }
}

通过执行非常简单的BQL查询,您可以访问与RowPersisted事件的处理程序中已发布检查关联的APAdjust记录:

public static class APReleaseCheckProcess
{
    public static void APPaymentRowPersisted(PXCache sender, PXRowPersistedEventArgs e)
    {
        if (e.TranStatus == PXTranStatus.Completed && e.Operation == PXDBOperation.Update)
        {
            var doc = e.Row as APPayment;
            if (doc != null && doc.Released == true)
            {
                // save RefNbr to another database

                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))
                {

                }
            }
        }
    }
}