Mi consulta es la siguiente:
Tengo un proceso en la cual el usuario selecciona un archivo a importar (.CSV,.TXT Y .BACKUP). Cada fila usa un delimitador "|" para diferencias el valor de un campo de otro. Mi problema es que no sé si estoy usando bien las transacciones (BEGIN, ROLLBACK Y COMMIT). Ya que si bien no se registran las operaciones que están mal,
el auto_increment de mi tabla sigue aumentando por sí solo, como si en realidad registrase algo, pero no es así
Mi código es extenso, pero igual dejo una gran parte de ello.
Código PHP:
De antemano gracias por darle una chequeadita. Ver original
$dblink=fConectar("estadisticas"); $sEstructuraDet="INSERT INTO movement_of_vessel_det(cod_movement_of_vessel,nitem,qtty, cod_cargo,cod_port_orig,cod_port_dest,cod_shipper,cod_receiver,cod_tracing)VALUES"; if($nFilaCont>=$nFilaDefaultIni){//INICIO DE IMPORTACION //ID|VESSEL|GRT|OPERATION|COUNTRY (ORIG)|PORT (ORIG)|COUNTRY (DEST)|PORT //(DEST)|ARRIVED|BERTHED|COMPLETED|AGENT|OWNER|CHARTERER|CARGO_TYPE|CARGO|QTTY|SHIPPER|RECEIVER|REMARKS $sVessel=trim($aDatos[1]);$fGRT=(strlen($aDatos[2])>0?str_replace(",","",$aDatos[2]):0);$sOperation=trim($aDatos[3]); if(!$respInsertDET){ }else{ $nTotRegValid++; } } $sQueryIDOpetation="SHOW TABLE STATUS LIKE 'movement_of_vessel'"; $aIDOperation=faResultQuery_vImport($sQueryIDOpetation,$dblink); $cod_movement_of_vessel=($aIDOperation['error']==true?0:$aIDOperation['Auto_increment']); $aIDTbl[$nIDOperacion]=$cod_movement_of_vessel;//GUARDA TEMPORALMENTE EL ID AUTO EN UN ARRAY $cod_vessel=""; $sQueryVessel="SELECT cod_vessel,dsc_vessel FROM vessel WHERE TRIM(dsc_vessel)='".trim($sVessel)."'"; $aVessel=faResultQuery_vImport($sQueryVessel,$dblink); $cod_vessel=($aVessel['error']==true?0:$aVessel['cod_vessel']);//echo $sVessel."->".$cod_vessel."\n"; } $cod_operation=""; $sQueryOperation="SELECT cod_operation,dsc_operation FROM operation WHERE TRIM(dsc_operation)='".trim($sOperation)."'"; $aOperation=faResultQuery_vImport($sQueryOperation,$dblink); $cod_operation=($aOperation['error']==true?0:$aOperation['cod_operation']); } $xsArrived=fsChangeFormartDate($sArrived,"d/m/y","y-m-d"); //strlen($sArrived)>0 and $aErr[$nContErr]['id']=$nIDOperacion; $aErr[$nContErr]['fila']=$nFilaCont; $aErr[$nContErr]['columna']=9; $aErr[$nContErr]['descripcion']="(ARRIVED) El dato ingresado no es de tipo fecha"; $nContErr++; } $cod_agent=""; $aAgent=faResultQuery_vImport($sQueryAgent,$dblink); $cod_agent=($aAgent['error']==true?0:$aAgent['cod_agent']); } $cod_owner=""; $aOwner=faResultQuery_vImport($sQueryOwner,$dblink); $cod_owner=($aOwner['error']==true?0:$aOwner['cod_owner']); } $cod_charterer=""; $sQueryCharterer="SELECT cod_charterer,dsc_charterer FROM charterer WHERE TRIM(dsc_charterer)='".trim($sCharterer)."'"; $aCharterer=faResultQuery_vImport($sQueryCharterer,$dblink); $cod_charterer=($aCharterer['error']==true?0:$aCharterer['cod_charterer']); } $sQueryInsertCAB="INSERT INTO movement_of_vessel(cod_movement_of_vessel,cod_vessel,cod_operation,arrived, berthed,completed,cod_agent,cod_owner,cod_charterer,remarks,record_date,record_cod_user, active)VALUES(" else if($sBerthed=="-" or $sBerthed=="") $sQueryInsertCAB.="0000-00-00,"; else if($sCompleted=="-" or $sCompleted=="") $sQueryInsertCAB.="0000-00-00,"; ."CURRENT_DATE(),".$arrayDatosUser[0].",1)"; if(!$respInsertCAB ){ //echo $sQueryInsertCAB."\n".mysql_error($dblink); $aErr[$nContErr]['id']=$nIDOperacion; $aErr[$nContErr]['fila']=$nFilaCont; $aErr[$nContErr]['columna']="ALL"; $aErr[$nContErr]['descripcion']="Los datos de importación ya han sido registrados.<br/> Ref: Los campos VESSEL, ARRIVED Y OPERATION no pueden duplicarse."; $nContErr++; } } }//FIN CAB OPERACIONES $cod_cargo=""; $aCargo=faResultQuery_vImport($sQueryCargo,$dblink); $cod_cargo=($aCargo['error']==true?0:$aCargo['cod_cargo']); } $cod_port_orig=""; $aPortOrig=faResultQuery_vImport($sQueryPort,$dblink); $cod_port_orig=($aPortOrig['error']==true?0:$aPortOrig['cod_port']); } $cod_port_dest=""; $aPortDest=faResultQuery_vImport($sQueryPort,$dblink); $cod_port_dest=($aPortDest['error']==true?0:$aPortDest['cod_port']); } $cod_shipper=""; $sQueryShipper="SELECT cod_shipper,dsc_shipper FROM shipper WHERE TRIM(dsc_shipper)='".trim($sShipper)."'"; $aShipper=faResultQuery_vImport($sQueryShipper,$dblink); $cod_shipper=($aShipper['error']==true?0:$aShipper['cod_shipper']); } $cod_receiver=""; $sQueryReceiver="SELECT cod_receiver,dsc_receiver FROM receiver WHERE TRIM(dsc_receiver)='".trim($sReceiver)."'"; $aReceiver=faResultQuery_vImport($sQueryReceiver,$dblink); $cod_receiver=($aReceiver['error']==true?0:$aReceiver['cod_receiver']); } //INSERT DETALLE $aInsertCamposDet[]="( ."".$nNumItem.",".$fQtty."," $nNumItem++; }else{ $aErr[$nContErr]['id']=$nIDOperacion; $aErr[$nContErr]['fila']=$nFilaCont; $aErr[$nContErr]['columna']="ALL"; $aErr[$nContErr]['descripcion']="La fila debe de contar con 20 Columnas para la importación<BR>REF:Asegúrese que en los valores de las celdas no usen como primer carácter \" o '"; $nContErr++; } } $nFilaCont++; } if(!$respInsertDET){ }else{ $nTotRegValid++; } }
IMPORTANTE: La importación se realiza en 2 tablas movement_of_vessel (CABECERA) y movement_of_vessel_det (DETALLE),si un registro del detalle esta mal debe de cancelarse sólo esa operación no de las demás.Con esta variable diferencio una operación de otra $nIDOperacion=trim($aDatos[0]);
Saludos