Respuesta: Problemas cuando dos personas registran datos al mismo tiempo en mi aplica en mi caso yo asigno el numero de folio hasta que se termina y se graba , como asignándole un numero de ficha con un autoincrementable de la bd te explicare la rutina que tengo por ejemplo en la captura de mi modulo de ventas
por ejemplo tengo en la base de datos una tabla llamada lista_notas_venta , en ella tengo un campo llamado folio que es de tipo autoincrementable ,entre otros campos mas que guardan los detalles generales de la nota de venta , al terminar la venta ingreso un insert con un resultset que me retorna las keys generadas , en este caso seria el numero asignado al campo folio y lo capturo en un string , después hago el update correspondiente , te muestro un código de ejemplo para que te des una idea ,otra cosa que puedes hacer es tener una tabla llamada transacciones , al iniciar tu procedimiento realizas un insert y retornas el valor , una vez que terminen la captura puedes hacer el insert a tu otra tabla correspondiente utilizando como referencia el numero de transaccion , aunque esto para mi seria un desperdicio de espacio y limitante , pues con el tiempo quienes no terminen o cancelen su captura te generaría números de transacción desperdiciados , pero ojo , no puedes asignar un folio antes de completar la transacción o captura pues te pasaría la situación que te ha estado sucediendo siempre
Código:
public void TerminarVenta()throws SQLException{
//Declaro mi conexion
ConexionMySQL ConexionMysql = new ConexionMySQL();
Connection cn = ConexionMysql.Conectar();
//Hago una instancia de un resultset de donde extraeré el numero o key generado para el folio de la nota
ResultSet IdFolioNota = null;
try{
//creo un prepared statement con el parámetro de retornar las keys generadas
PreparedStatement pstFolioNota = cn.prepareStatement("Insert into LISTANOTAS(FOLIO,N_ALMACEN,ID_VENDEDOR,TOTAL_ARTICULOS,SUB_TOTAL,IVA,TOTAL,TASA_IVA,PAGO_VALE,PAGO_AMEX,PAGO_TARJETA,PAGO_EFECTIVO,IMPORTE_PAGO,IMPORTE_CAMBIO,FOLIO_CP,ESTATUS)Values(null,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",PreparedStatement.RETURN_GENERATED_KEYS);
pstFolioNota.setString(1,NumeroAlmacen);
pstFolioNota.setString(2,NumeroVendedor);
pstFolioNota.setString(3,String.valueOf(TotalArticulos));
pstFolioNota.setString(4,df.format(Subtotal));
pstFolioNota.setString(5,df.format(Iva));
pstFolioNota.setString(6,df.format(ImporteTotal));
pstFolioNota.setString(7,df.format(TasaIva));
pstFolioNota.setString(8,df.format(PagoVale));
pstFolioNota.setString(9,df.format(PagoAmex));
pstFolioNota.setString(10,df.format(PagoTarjeta));
pstFolioNota.setString(11,df.format(PagoEfect));
pstFolioNota.setString(12,df.format(TotalPago));
pstFolioNota.setString(13,df.format(TotalCambio));
pstFolioNota.setString(14,FolioParcial);
pstFolioNota.setString(15,"3");
pstFolioNota.executeUpdate();
//paso al resultset instanciado las keys generadas
IdFolioNota = pstFolioNota.getGeneratedKeys();
//coloco el cursor para iniciar el ciclo
IdFolioNota.beforeFirst();
//inicio el ciclo while y extraigo el folio
while(IdFolioNota.next()){
//asigno el folio generado a un string llamado folio nota
FolioNota = IdFolioNota.getString(1);
}
//guardo el detalle que capture previamente
ModeloDetalleVenta = (DefaultTableModel)tblDetalleVenta.getModel();
int nr = tblDetalleVenta.getRowCount();
for(int rventas = 0;rventas < nr;rventas++){
PreparedStatement pstDetalleVenta = cn.prepareStatement("Insert into DETALLE_NOTASVENTA(N_ALMACEN,FOLIO_NOTA,ID_ART,MODELO,MATERIAL,VARIEDAD,TALLA,PRECIO,CANTIDAD,IMPORTE_TOTAL,BARCODE)values(?,?,?,?,?,?,?,?,?,?,?)");
pstDetalleVenta.setString(1,NumeroAlmacen);
pstDetalleVenta.setString(2,FolioNota);
pstDetalleVenta.setString(3, (String)ModeloDetalleVenta.getValueAt(rventas,0));
pstDetalleVenta.setString(4, (String)ModeloDetalleVenta.getValueAt(rventas,1));
pstDetalleVenta.setString(5, (String)ModeloDetalleVenta.getValueAt(rventas,2));
pstDetalleVenta.setString(6, (String)ModeloDetalleVenta.getValueAt(rventas,3));
pstDetalleVenta.setString(7, (String)ModeloDetalleVenta.getValueAt(rventas,4));
pstDetalleVenta.setString(8, String.valueOf(ModeloDetalleVenta.getValueAt(rventas,6).toString()));
pstDetalleVenta.setString(9, (String)ModeloDetalleVenta.getValueAt(rventas,7));
pstDetalleVenta.setString(10, String.valueOf(ModeloDetalleVenta.getValueAt(rventas,8).toString()));
pstDetalleVenta.setString(11, (String)ModeloDetalleVenta.getValueAt(rventas,5));
pstDetalleVenta.executeUpdate();
}
ImprimirNota Imprimirnota = new ImprimirNota();
Imprimirnota.Imprimir(FolioNota);
JOptionPane.showMessageDialog(null,"Venta terminada Folio :" + FolioNota);
LimpiarFormulario();
OpenCashDrawer Open = new OpenCashDrawer();
Open.abrircajon();
Open.abrircajon();
}
catch(Exception e){
JOptionPane.showMessageDialog(null,e);
}
}
espero te hayas dado una idea clara de como podrias guardar y asignar tus folios , saludos |