当前位置: 首页 > 知识库问答 >
问题:

逐行发送,不重复

茅涵映
2023-03-14

我有下表

正如您所看到的,有一个名为bool类型Integration的列,所有这个表都通过一个存储过程显示在DataGridView中,该存储过程是

CREATE PROCEDURE [dbo].[SP_Payments]
AS 
SELECT 'CE-'+CardCode AS CardCode,DocType,Series,DocDate,dbo.udf_GetNumeric(DocNum) AS DocNum,
DocEntry,TrsfrAcct,TrsfrDate,TrsfrSum, Integration,Comments,SumApplied
FROM  PaymentsReceived WHERE Integration = 0

这个SP说只向我显示那些为0的值,这是false的值,我对那些为false的值所做的是通过web服务发送它们,我有一个方法,它遍历每一行,并在每次发送时发送它,将它设置为true,然后它从DataGridView中消失,这个方法在一个计时器中,每5秒触发一次,在这个方法中有一个条件,如果集成为==false,让它发送,这就是方法。

private async void Envio_Timer_Tick(object sender, EventArgs e)
        {
            try
            {
                ProxyBL proxy = new ProxyBL();
                foreach (DataGridViewRow Datos in dataGridView1.Rows)
                {
                    PagosRecibidos pagos = new PagosRecibidos
                    {
                        CardCode = Convert.ToString(Datos.Cells[0].Value),
                        DocType = Convert.ToString(Datos.Cells[1].Value),
                        Series = Convert.ToInt32(Datos.Cells[2].Value),
                        DocDate = Convert.ToDateTime(Datos.Cells[3].Value),
                        DocEntry = Convert.ToInt32(Datos.Cells[5].Value),
                        TrsfrAcct = Convert.ToString(Datos.Cells[6].Value),
                        TrsfrDate = Convert.ToDateTime(Datos.Cells[7].Value),
                        TrsfrSum = Convert.ToDecimal(Datos.Cells[8].Value),
                        Integration = Convert.ToBoolean(Datos.Cells[9].Value),
                        Comments = Convert.ToString(Datos.Cells[10].Value),
                        SumApplied = Convert.ToDecimal(Datos.Cells[11].Value)
                    };
                    Inte = pagos.Integration;
                    if (Inte == false)
                    {
                        var EnvioDatos = await proxy.EnviarPago(pagos);
                    }
                    ListarEmple();
                    ListarLog();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

这就是SendPayment的方法

这个方法从服务获得响应,如果操作成功或失败,它会将其插入日志中

Consultas c = new Consultas();

        public async Task<string> EnviarPago(PagosRecibidos detalle)
        {
            try
            {
                ProxyXML xmlProxy = new ProxyXML();
                string respuesta = await xmlProxy.EnviarSAP(detalle);
                c.InsertarLog(1, DateTime.Now, respuesta, xmlProxy.XmlSerializado);
                return respuesta;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

在此方法之后,输入装运、EnviaSAP

这是我捕获答案的地方,如果操作成功,那么给我集成列为“1 true”。

readonly Consultas c = new Consultas();  
        public string XmlSerializado = null;

    public async Task<string> EnviarSAP(PagosRecibidos detalle)
    {
        try
        {
            using (WSSincronizacionClient clienteSAP = new WSSincronizacionClient())
            {
                XmlSerializado = this.SerializarXml(detalle);
                var respuesta = await clienteSAP.EnviarDatosSAPAsync(XmlSerializado);
                if (respuesta.Contains("true|Operación Exitosa|"))
                {
                    c.EditarIntegration(true, Convert.ToInt32(detalle.DocEntry));
                }
                return respuesta;
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

每件事都正常工作,但当发送它时,有时它发送它两次或重复,即在SAP中它到达两次,我如何做这个验证,那个是假的只进入我一次,它没有发送它两次,我应该在哪个部分做这个验证

我也不知道为什么如果你已经确认我只发了假的,你还发了两次。

共有1个答案

宇文飞翮
2023-03-14

我唯一能想到的是,处理单个行的时间超过了计时器间隔,因此您可能在两个处理程序调用中并行地迭代同一个项,因为没有足够的时间让另一个处理程序完成它的处理。

也许您可以在获取该行时标记该行,并保存更改,以便该标记可以作为其他计时器刻度处理程序调用忽略该行的鉴别器:

foreach (DataGridViewRow Datos in dataGridView1.Rows)
{
    var alreadyProcessingRow = Convert.ToBoolean(Datos.Cells[{ProcessingFlagColumnIndex}].Value);
    if(alreadyProcessingRow)
        continue; //skip the row, don't reprocess it

    Datos.Cells[{ProcessingFlagColumnIndex}] = true; //Mark the row as processing

    PagosRecibidos pagos = new PagosRecibidos
    {
        CardCode = Convert.ToString(Datos.Cells[0].Value),
        DocType = Convert.ToString(Datos.Cells[1].Value),
        Series = Convert.ToInt32(Datos.Cells[2].Value),
        DocDate = Convert.ToDateTime(Datos.Cells[3].Value),
        DocEntry = Convert.ToInt32(Datos.Cells[5].Value),
        TrsfrAcct = Convert.ToString(Datos.Cells[6].Value),
        TrsfrDate = Convert.ToDateTime(Datos.Cells[7].Value),
        TrsfrSum = Convert.ToDecimal(Datos.Cells[8].Value),
        Integration = Convert.ToBoolean(Datos.Cells[9].Value),
        Comments = Convert.ToString(Datos.Cells[10].Value),
        SumApplied = Convert.ToDecimal(Datos.Cells[11].Value)
    };
    Inte = pagos.Integration;
    if (Inte == false)
    {
        var EnvioDatos = await proxy.EnviarPago(pagos);
    }
    Datos.Cells[{ProcessingFlagColumnIndex}] = false; //reset the flag (not that important if you just don't care after processing)
    ListarEmple();
    ListarLog();
}

我不确定是否可以使用datagridview对象来实现这一点,但如果不能,可以使用ConcurrentDictionary,并将当前正在处理的行(或行ID)存储在那里,以便检查和避免重复处理。

 类似资料:
  • 我有这个问题,其中由于某种原因,我不能发送数据到另一个PHP脚本与POST通过API。 我已经检查了其他解决方案并清理了我的代码,但它仍然无法工作。 也许我错过了什么。 这是我的密码: 印刷品: 数组(0){} 我还测试了在PHP中解析Javascript读取中显示的解决方案,但它没有解决问题。我仍然没有在我的PHP脚本中获得POST数据。

  • 如何保持一个连续的流,以“反应”新的丢弃的文件?(或其他事件,如HTTP GET请求或类似的事件)... 例如,如果我不返回PublisherBuilder的实例,而是返回一个整数,那么我的kafka主题将由一个非常巨大的整数值流填充。这就是为什么示例在发送消息时使用一些间隔... 我应该使用一些CompletationStage或CompletableFuture吗?RXJava2?使用哪个li

  • 问题内容: 我的代码逐行将文本输入到网页的文本区域中,如何 使它一次全部插入整个文本,是否有解决方案 ?因为逐行需要很多时间 问题答案: 要将整个文本块通过Python发送到使用硒中,以加快处理速度,您可以注入脚本并使用以下 解决方案: Code Block: from selenium.webdriver.common.by import By from selenium.webdriver.s

  • 我正在使用一个1&1托管服务器上的基本脚本: 但是由于某些原因,我没有收到任何电子邮件,也没有任何错误,因为PHP mail()函数没有发送电子邮件指令。 我认为这可能是一个服务器问题,但1&1声明它是完全支持的。我也从这个服务器/主机发送电子邮件之前使用的只是一个收件人,主题和主体,所以我相当不确定为什么它现在不工作! ..起作用了,所以使用标题似乎是个问题?

  • 我有一个PDF文件,我正试图通过Intent分享。行动!。不过当我点击其中一个选项(gmail、google drive等)时。上面写着“请求不包含数据”**更新代码如下 我想问题一定出在我的电脑上?这就是说,我的文件的URL肯定有效,因为我可以成功地使用该路径打印PDF。 编辑:我已经更新了我的代码一点点。 这让我从Whatsapp获得“文件格式不被接受”,从Gmail获得“无法附加文件”。 想