一次查询支付多张发票

Posted

技术标签:

【中文标题】一次查询支付多张发票【英文标题】:Paid multiple invoice in one query 【发布时间】:2019-03-07 02:39:11 【问题描述】:

我在尝试生成付款时遇到问题(取决于金额)“X”金额发票的取消。

例如,客户总共有 6 张“赊账”发票,总金额为 155 美元。当客户即将付款或已支付(例如 135 美元)时,代码必须减去每张发票的总和从最早的到完成金额,这可能会导致三件事:

    取消欠款总额。 发票上的剩余金额(按照前面的示例,支付了四张发票,第五张发票剩余 5 美元, 第六总是有他的 20 美元待处理) 或支付全部款项,其余部分作为借方用于未来的其他购买。

我有一个表格,可以跟踪每个客户的所有待处理发票、金额、付款和一行以了解它是待付款、部分付款、已付款还是以客户为受益人的借方。

当我进行更新时,而不是一一进行,相同的支付价值被保存在所有“赊账”发票中......我觉得我迷路了

我希望你能帮助我。

这是更新后的脚本:

      $conn->beginTransaction();

        $id = $_POST['idCliente'];   // Client id

     //  now only select the invoices with pending payments 0, 4, 5, 6

        $sql = $conn->prepare("SELECT COUNT(refId) AS fMora FROM VENTAS WHERE idCliente = :idCliente
        AND contacredito IN (0, 4, 5, 6) AND activo = '1'");
        $sql->bindParam(':idCliente',$id);
        $sql->execute();

   // Now is calling the rows that need to change

        while($row = $sql->fetch(PDO::FETCH_ASSOC))  $fMora = $row['fMora'];
            $sth = $conn->prepare("SELECT idV, refVenta, refId, total, pagado
            FROM VENTAS WHERE idCliente = :idCliente AND contacredito IN (0, 4, 5, 6) AND activo = '1'");
            $sth->bindParam(':idCliente',$id);
            $sth->execute();

   // fMora run if is more or equal than one
            if($fMora >= '1') 

  // each time if are more than 1

                for($i=0; $i< $fMora; $i++)
                    while($row2 = $sth->fetch(PDO::FETCH_ASSOC)) 

                        $percibido = $_POST['abono']; // the client amount
                        $percibido2 = $resta;  // variable with the subtracted of the amount
                        $abona = $percibido - $percibido2;  // variable make an subtract for making each time smaller amount

                        $idV = $row2['idV'];  // table id
                        $refVenta = $row2['refVenta'];  // ref id equal to printed invoice
                        $refId = $row2['refId']; // id for print
                        $total = $row2['total'];  // invoice total
                        $pagado = $row2['pagado'];  //previously paid

   // if the amount is less than the total

                        if($abona < $total && $abona > '0') 
                            $paga = $abona;  // add the amount
                            $contaCred = '4';  // change to partial payment

                            $sql = "UPDATE VENTAS SET
                            contacredito = :contacredito,
                            pagado = :pagado
                            WHERE refId = :refId";
                            $stmt = $conn->prepare($sql);
                            $stmt->bindParam(':contacredito', $contaCred, PDO::PARAM_STR);
                            $stmt->bindParam(':pagado', $paga, PDO::PARAM_STR);
                            $stmt->bindParam(':refId', $refId, PDO::PARAM_STR);
                            $stmt->execute();
                         

     // if is greater of the total amount

                        else if($abona >= $total)
                            $paga = $total;  // add the same value of total in pagado
                            $pagado = $total-$pagado;  // make the subtraction to generate the amount that will be subtracted
                            $contaCred = '1';  // change to paid
                            $resta = $abona-$pagado;  // make the subtraction to generate the new amount to the new invoice

                            $sql = "UPDATE VENTAS SET
                            contacredito = :contacredito,
                            pagado = :pagado
                            WHERE refId = :refId";
                            $stmt = $conn->prepare($sql);
                            $stmt->bindParam(':contacredito', $contaCred, PDO::PARAM_STR);
                            $stmt->bindParam(':pagado', $paga, PDO::PARAM_STR);
                            $stmt->bindParam(':refId', $refId, PDO::PARAM_STR);
                            $stmt->execute();
                        ;


                    
                
            

            $conn->commit();

【问题讨论】:

这一行:$percibido = $_POST['abono'] 应该在您的循环之外 - 您需要在贷记每一行时减少付款中剩余的金额。 不工作,总是在每张发票中减去相同的债务 @Jerry ,忘记之前的评论......你给了我解决方案!谢谢你。如果可以,请添加解决方案以给您积分并标记为已解决 【参考方案1】:

这一行:

$percibido = $_POST['abono']

应该在您的循环之外 - 您需要在贷记每一行时减少付款中剩余的金额。

【讨论】:

以上是关于一次查询支付多张发票的主要内容,如果未能解决你的问题,请参考以下文章

SQL server 数据查询功能 下

Oracle 同时删除多张表

winform程序在rdlc报表中怎样一次打印多张单子

Mysql多张表关联时的分页查询

mysql合并查询(多张表) union 和 union all

mysql啥时候使用子查询,啥时候使用表连接查询,关系多张表的时候该怎么查询