Problema en facturación

Hola tengo el siguiente problema:
Tengo 2 puestos de trabajo para facturar, el problema cuando funcionan al mismo tiempo no me controla que factura entra primero y me mezcla los números ; como si se fucionaran.. ¿cómo puedo hacer para controlar este tipo de situaciones? ¿Mediante transacciones?
¿Uso v 2005 y sql server 2000 . El sql debería controlar este tipo de situaciones mediante bloqueos? Como debería ser

2 Respuestas

Respuesta
1
¿Cómo creas el numero de la factuar? Si lo estas haciendo con un autonumérico no deben mezclarses las facturas pues SQL lo controla.
Si lo haces así y te pasa es que tienes mal la lógica de escritura del detalle, debes colocar eso dentro de una transacción para que lo haga bien.
Hola gracias por responder. A los números los genero yo manual. Al detalle lo puse dentro de una transacción en visual
Pero no se porque no me bloquea la primer pc hasta que entre y después siga con la demás.
Podrías darme un ejemplo gracias..
No entiendo que quieres decir, pero si tu generas el numero, este nmero segenera solo hasta el final al momento de grabar la factura no al principio, si lo haces al principio si tienes al posibilidad de repetir el ultimo numero que generes
Primero incremento y luego grabo pero... en ese momento pude estar pasando lo mismo en la otra pc y ahí es cuando se duplican.
Yo tengo 3 tablas factura_cabecera
factura_detalle y factuta totales
Con un for recorro la grilla para guardar el detalle
Si pero incrementas y grabas ese incremento, para que el próximo seleccione el incremento o el mismo numero que tu acabas de tomar, eso es lo que ue creoq ue te esta pasando, incrementas y grabas el nuevo registro, pero no grabas la actualziacion del consecutivo
U ejemplo:
Arrancamos las 2 pc con el numero 20 porque recién grabo cuando guardo la factura..
Si presionamos para guardar al mismo tiempo hay una rutina que incrementa y actualiza el numerador. Ahí es cuando entran los 2 juntos y me duplica las facfturas con el ismo numero
utiliza Lock al momentode grabar el registro del consecutivo
Y como uso lock.. yo tenia entendido que usando transacciones desde visual basic 2005 se bloqueaba el registro e la base de datos otra forma no conozco
insert lock row
Respuesta
1
No debería hacer eso si está programado correctamente, aún si se usa el mismo SP o Instrucción.
Lo que debes asegurar es que el Insert genere bien el registro y te enviee el ID de la transacción, ¿imagino qué al asentar una factura esta tiene un campo ID que es único verdad?
Mandame el código que inserta y que recuere el ID.
Este es el código que uso... son 3 tablas cabecera, detalle, totales
coman = New SqlCommand("INSERT INTO fact_cab(num_fact1,tipo_fact,prefijo_fact,letra_fact,fec_emision,fec_vto,id_cli,nombre,tipo_iva,cuit,direccion,vendedor,nom_vendedor,lista,forma_pago,estado_fact,id_lista,talon,ing_bruto1,arqueo,pago) VALUES('" & tal.numerador & "','" & tipo & "','" & Me.txt_prefijo.Text & "' , '" & Me.txt_letra.Text & "','" & Me.dt_fec_emision.Text & "','" & Me.dt_fec_vto.Text & "','" & Me.txt_codigo.Text & "','" & Me.txt_cliente.Text & "','" & cli.iva_solo & "','" & cli.cuit & "','" & Me.txt_direccion.Text & "','" & Me.txt_vendedor.Text & "','" & Me.txt_nom_vendedor.Text & "','" & Me.txt_lista.Text & "','" & Me.cmb_forma_pago.Text & "','Activo', '" & Me.txt_lista_predet.Text & "', '" & Me.txt_talonario_pred.Text & "', '" & Me.txt_ingbrutos.Text & "','B','" & pago & "')", conex)
coman.ExecuteNonQuery()
If RTrim(Me.cmb_forma_pago.Text) = "Cta Cte" Then
If tipo = "FC" Or tipo = "RE" Then
coman = New SqlCommand("INSERT INTO cta_cte01(id_cta,tc,lt,pre,id_cli,cli,fecha_emi,fecha_vto,debito,credito,num_fact,estado,confirma,cod_vend) VALUES('" & tal.numerador - 1 & "','" & tipo & "', '" + Me.txt_letra.Text + "','" + Me.txt_prefijo.Text + "','" + Me.txt_codigo.Text + "','" + Me.txt_cliente.Text + "','" & Me.dt_fec_emision.Text & "','" & Me.dt_fec_vto.Text & "','" & Val(Me.txt_total_grilla.Text) & "', '','" & tal.numerador - 1 & "', 'DEBE','P','" & Me.txt_vendedor.Text & "')", conex)
coman.ExecuteNonQuery()
cta_cte = True
coman = New SqlCommand("INSERT INTO cta_cte_hist(num,tc,lt,pre,debito,credito,estado,fec,id_cli,cli) VALUES('" & tal.numerador - 1 & "','" & tipo & "', '" + Me.txt_letra.Text + "','" + Me.txt_prefijo.Text + "','" & Val(Me.txt_total_grilla.Text) & "', '','DEBE','" & Me.dt_fec_emision.Text & "','" & Me.txt_codigo.Text & "','" & Me.txt_cliente.Text & "')", conex)
coman.ExecuteNonQuery()
coman.Dispose()
End If
If tipo = "NC" Or tipo = "RS" Then
coman = New SqlCommand("INSERT INTO cta_cte01(id_cta,tc,lt,pre,id_cli,cli,fecha_emi,fecha_vto,debito,credito,num_fact,estado,confirma,cod_vend) VALUES('" & tal.numerador - 1 & "','" & tipo & "','" + Me.txt_letra.Text + "','" + Me.txt_prefijo.Text + "','" + Me.txt_codigo.Text + "','" + Me.txt_cliente.Text + "','" & Me.dt_fec_emision.Text & "','" & Me.dt_fec_vto.Text & "',' ','" & Val(Me.txt_total_grilla.Text) & "','" & tal.numerador - 1 & "','DEBE','P', '" & Me.txt_vendedor.Text & "')", conex)
coman.ExecuteNonQuery()
cta_cte = True
coman = New SqlCommand("INSERT INTO cta_cte_hist(num,tc,lt,pre,debito,credito,estado,fec,id_cli,cli) VALUES('" & tal.numerador - 1 & "','" & tipo & "', '" + Me.txt_letra.Text + "','" + Me.txt_prefijo.Text + "','','" & Val(Me.txt_total_grilla.Text) & "','DEBE','" & Me.dt_fec_emision.Text & "','" & Me.txt_codigo.Text & "','" & Me.txt_cliente.Text & "')", conex)
coman.ExecuteNonQuery()
coman.Dispose()
End If
End If
For i = 0 To Me.DataGridView1.Rows.Count - 2
detalle = Me.DataGridView1.Rows(i).Cells(1).Value
If RTrim(Me.txt_tipo_fact.Text) = "PD" Then
tbbl1.Clear()
comando = New SqlDataAdapter("select * from ped_det where num= '" & tal.numerador - 1 & "' and pre ='" & Me.txt_prefijo.Text & "' and tc = '" & Me.txt_tipo_fact.Text & "' and lt = '" & Me.txt_letra.Text & "'", conex)
comando.Fill(tbbl1)
End If
coman = New SqlCommand("INSERT INTO fact_det(fec_emi,num_fact,tipo_fact2,prefijo_fact2,letra_fact1,codi_producto,detalle,cantidad1,descuento,iva_inscripto,imp_interno,exento1,precio_unidad,total1,iva1,precio_civa1,cod_lista,mes,ao,talon1,cantidad_sin_stock,fila,costo,cod_prov,cod_rub,nom_producto,vend1) VALUES('" & Me.dt_fec_emision.Text & "','" & tal.numerador & "' ,'" & tipo & "', '" + Me.txt_prefijo.Text + "','" + Me.txt_letra.Text + "','" & Val(Me.DataGridView1.Rows(i).Cells(0).Value) & "','" & Me.DataGridView1.Rows(i).Cells(1).Value & "','" & Me.DataGridView1.Rows(i).Cells(2).Value & "','" & Val(Me.DataGridView1.Rows(i).Cells(5).Value) & "','" & Me.DataGridView1.Rows(i).Cells(6).Value & "','" & Me.DataGridView1.Rows(i).Cells(7).Value & "','" & Me.DataGridView1.Rows(i).Cells(9).Value & "','" & Me.DataGridView1.Rows(i).Cells(3).Value & "','" & Me.DataGridView1.Rows(i).Cells(4).Value & "','" & Me.DataGridView1.Rows(i).Cells(10).Value & "', '" & Me.DataGridView1.Rows(i).Cells(11).Value & "', '" & Me.txt_lista_predet.Text & "', '" & Date.Now.Month & "', '" & Date.Now.Year & "', '" & Me.txt_talonario_pred.Text & "','NO','" & i & "','" & Me.DataGridView1.Rows(i).Cells(14).Value & "','" & Me.DataGridView1.Rows(i).Cells(15).Value & "','" & Me.DataGridView1.Rows(i).Cells(16).Value & "','" & detalle & "','" & Me.txt_vendedor.Text & "')", conex)
coman.ExecuteNonQuery()
coman.Dispose()
If tipo = "RE" Or tipo = "RS" Then
If RTrim(Me.txt_tipo_cliente.Text) <> "Furgon" Then
coman = New SqlCommand("update art_01 set proveedor = '" & Me.txt_cliente.Text & "',id_proveedor = '" & Me.txt_codigo.Text & "' where id_art = '" & Me.DataGridView1.Rows(i).Cells(0).Value & "'", conex)
coman.ExecuteNonQuery()
coman.Dispose()
End If
End If
pos = i
detalle = ""
Next
coman = New SqlCommand("INSERT INTO fact_tot(num_factura,letra,tipo_factura,pref,id_cliente,nombre_cli,total,iva_ins,exento,imp_interno1,iva_10,sub_total,fecha_emision1,descuento,total_cobro,talon2,efectivo,comentario) VALUES('" & tal.numerador & "','" + Me.txt_letra.Text + "','" & tipo & "','" + Me.txt_prefijo.Text + "','" + Me.txt_codigo.Text + "','" + Me.txt_cliente.Text + "','" & Val(Me.txt_total_grilla.Text) & "','" & Val(Me.txt_inscripto.Text) & "','" & Val(Me.txt_exento.Text) & "','" & Val(Me.txt_imp_interno_grilla.Text) & "','" & Val(Me.txt_insc_10.Text) & "','" & Val(Me.txt_gravado.Text) & "','" & Me.dt_fec_emision.Text & "','0','" & Val(Me.txt_total_grilla.Text) & "', '" & Me.txt_talonario_pred.Text & "','SI','" & comentario & "')", conex)
Coman.ExecuteNonQuery()
Coman.Dispose()
Y donde obtienes lo que acabas de insertar.
Es decir, explicame como obtienes el número de factura que le corresponde a la venta, es decir, donde tomas el último y le agregas 1.
Hola. Tengo una tabla numeradores que guardo todos los numeradores de factura. fac a, fact b, etc
Fíjate en el código que te puse .. en la clausula insert de la tabla fact_cab hay un campo num_fact1 y le asigo el valor de tal. Numerador luego mediante un for next recoorro la grilla y voy agregando el detalle a la tabla fac_det en este caso el campo es num_fact y le asigno el valor de tal. Numerador luego con la fact_tot que son los totales..
Básicamente lo que hago es cargar el numerador, lo incremento en 1 y ahí empiezo con la rutina que te describo arriba para poner el numero de factura
Creo que por ahí va la cosa, no puedes tomar el último y asignar 1 más, por que si ambos toman el último y le asignan uno al mismo tiempo, tendrás problemas con el número.
La forma correcta es hacerlo en la BD, haciendo el insert y tomando el identity asignado para que SQL (o el motor de base de datos que sea) trabaje la entrada a esa asignación.
A mi forma de ver, tendrías que cambiar eso.
Te dejo algo de ayuda para trabajr con esto:
http://technet.microsoft.com/es-es/library/ms186775.aspx

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas