代码之家  ›  专栏  ›  技术社区  ›  Amiyar

生成票据时序列号重复

  •  0
  • Amiyar  · 技术社区  · 8 年前

    我正在尝试在成功预订后生成条形码票,它运行良好。但昨天(2017年1月6日)晚上11时59分,一位客户预订了两张票,但票sl.no是重复的。t这两张票都是sl.no 1 .事实上,应该是 2 .但下一个客户的票sl.no是正确的,是 3,4,5 .生成票证的代码中是否存在任何错误?

    for($j=1;$j<=$cat_array[$i];$j++) {
      $sel_max_dt =  mysql_query("select MAX(DT) AS maxdt, MAX(REC_NO) AS maxrec FROM  tkt_barcode");
      //to select max date and max rec no.
      $row_max_dt = mysql_fetch_array($sel_max_dt);
      $dt_max = $row_max_dt['maxdt'];
      //$no_max = $row_max_dt['maxno'];
      $recno = $row_max_dt['maxrec'];
      if($dt_max ==  date("Y-m-d") && $recno == $TxnID) {
        //if same date and same bkid  barcode slno continues.
        $sel_no = mysql_query("select MAX(BARCODE_SLNO) AS maxno FROM  tkt_barcode WHERE REC_NO=".$TxnID);
        $row_sel_no = mysql_fetch_array($sel_no);   
        $tkt_slno = $row_sel_no['maxno'];
        $tkt_slno = $tkt_slno + 1;
      }
      if($dt_max ==  date("Y-m-d")&& $recno != $TxnID) {
        //if same date and different bkid  barcode slno continues.
        $sel_no = mysql_query("select MAX(BARCODE_SLNO) AS maxno FROM  tkt_barcode WHERE DT='$dt_max' ");
        $row_sel_no = mysql_fetch_array($sel_no);   
        $tkt_slno = $row_sel_no['maxno'];
        $tkt_slno = $tkt_slno + 1;
      }
      if($dt_max != date("Y-m-d") && $recno != $TxnID) {
        //if not same date start barcode slno from 1.
        $tkt_slno = 1;
      }
      $sel_sl_no = mysql_query("select MAX(SL_NO) AS slno FROM  tkt_barcode WHERE REC_NO=".$TxnID);
      $row_slno = mysql_fetch_array($sel_sl_no);
      $slno = $row_slno['slno'];
      $bartkt_slno = $slno + 1;
      if($i==1 && $j>$count_promo_adult && $arr_edit["PROMO_CODE"]!=""){
        //adult cat and total adult count > total promo adult count
        $disc_adult = $adult_amt;
        $discamt=$adult_amt - $disc_adult ; //  discount amt
        $rate=$adult_amt;  //normal rate
        $net_amt=$disc_adult; //discount rate
        $pro_cd ="";
        //promo code is null when total adult count > total promo adult count
       } //end if
      //string pading digits 
      $len_txn =strlen($TxnID); // bookid length 
      $pad = 6; //str_pad digits
      if($len_txn > 5) {
        if($len_txn==6) { $pad = $pad-1;}// if 6 digit
        if($len_txn==7){ $pad = $pad-2;}// if 7 digit
      }
      $fullbar = $TxnID.str_pad($tkt_slno, $pad, 0, STR_PAD_LEFT).$clnd_date.$counter_no;
      //barcode no
      $fields  = "BARCODE_SLNO,DT,FIN_YEAR,Counter_Code,Branch_cd,REC_NO,BARCODE,TICKET_TYPE,CATG_CD,AMT,DISC_AMT,SL_NO,NET_AMT,BCODE_CATG_SLNO,BCODE_SLNO_GEN,BCODE_SLNO_CATG_TOT,DAY_TYPE,Check_in_date,PROMO_CODE,TAX,S_TAX,conv_base_rate,conv_tax_rate";
      $values = "'$tkt_slno','$booked_date','$fin_year','$counter_no','$branch','$TxnID','$fullbar','$cat_name_tkt','$i','$rate','$discamt','$bartkt_slno','$net_amt','$j','$count','$cat_tot','$type_day','$date_check','$pro_cd','$tax_each','$ser_tax_each','$conv_base','$conv_tax'";
      $sql_tkt = $objA->insert_fields(TABLEPREFIX.'tkt_barcode',$fields,$values);
    }//end for loop
    
    2 回复  |  直到 8 年前
        1
  •  0
  •   Aaron    8 年前

    您正在选择现有记录的计数

      $sel_sl_no = mysql_query("select MAX(SL_NO) AS slno FROM  tkt_barcode WHERE REC_NO=".$TxnID);
      $row_slno = mysql_fetch_array($sel_sl_no);
      $slno = $row_slno['slno'];
      $bartkt_slno = $slno + 1;
    

    并使用该计数设置您的sl号。但是在读取计数和写入记录之间经过时间。当两个线程同时读取计数时,就会出现问题。

        2
  •  0
  •   Amiyar    8 年前

    最后,我通过添加下面给出的另一个条件找到了解决方案。

    if($dt_max !=  date("Y-m-d")&& $recno == $TxnID) {
    //if different date and same bkid  barcode slno continues.
    $sel_no = mysql_query("select MAX(BARCODE_SLNO) AS maxno FROM  tkt_barcode WHERE DT='$dt_max' ");
    $row_sel_no = mysql_fetch_array($sel_no);   
    $tkt_slno = $row_sel_no['maxno'];
    $tkt_slno = $tkt_slno + 1;
    }
    

    谢谢大家的帮助。下次我会尽量让我的代码更具可读性。:)