Como Relacionar la tabla maestro factura con detalle
-
domingo, 02 de diciembre de 2012 0:47
Hola buen dia.
mi inquietud es la siguiente, me encuentro realizando un software para manejo de restaurantes; necesito crear la factura; el campo numero de factura es automatico; al momento en que grabo los datos del dataggrid en la tabla detalle; por cada registro me genera un nuevo numero de factura; es decir, si tengo 10 items; tendria 10 numeros de factura diferente, se que la relacion entre tablas ve de 1 a muchos; es decir, un numero de factura puede tener muchos items, entonces cree aparte una tabla maestro llamada factura, y otra llamada detalle; saben como se hace la relacion o como hacer la factura?
el software es desarrollado en C# Y el motor de base de datos es SQL Server 2012.
cualquier ayuda,tutoria o direccionamiento a otros post la agradeceria.
Gracias!
Todas las respuestas
-
domingo, 02 de diciembre de 2012 1:57Moderador
si tengo 10 items; tendria 10 numeros de factura diferente, se que la relacion entre tablas ve de 1 a muchos
ehh no, no es asi, el numero de factura es uno solo, lo que tendras seran 10 lineas de factura
[N-Tier] – Desarrollo en capas - Ejemplo Facturacion - parte 3
saben como se hace la relacion o como hacer la factura?
analiza el articulo, alli justamente implementalgo como lo que describes, veras que la tabla detalle tendra el campo idfactura para crear la relacion 1 a muchos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
domingo, 02 de diciembre de 2012 2:05
creo que primero toca crear la relacion entre tablas, asi lo hize pero me genera el siguiente error..."The INSERT statement conflicted with the FOREIGN KEY constraint "FK_factura_factura". The conflict occurred in database "Latinaja", table "dbo.detalle_factura", column 'factura_Asociada'."
Sabes tal vez a que se deba?
-
domingo, 02 de diciembre de 2012 2:12Moderador
En SQL Server debe tener algo así:
Create Table Facturas ( ID int Not Null Identity(1, 1) Primary Key , ... ); Create Table DetallesFactura ( ID bigint Not Null Identity(1, 1) Primary Key , IDFactura int Not Null Foreign Key References Facturas(ID) On Update Cascade , ... );
Entonces cuando usted graba una factura nueva, usted debe retornar el valor de scope_identity(), que es el ID recién insertado. Yo siempre uso procedimientos almacenados así que muestro un proc. alm. típico:
Create Procedure dbo.spNuevaFactura @campo1 tipo , @campo2 ... , @id int output --Para devolver el valor de ID. As Begin Set NoCount On; Insert Into Facturas (...) Values (@campo1, @campo2, ...) ; Set @id = scope_identity(); return 0; End
Ese SP se llamaría de la siguiente manera en C#:
using (SqlConnection conn = new SqlConnection("cadena de conexión")) { using (SqlCommand cmd = new SqlCommand("sp", conn)) { cmd.Parameters.AddWithValue("campo1", <valor de campo1>); cmd.Parameters.AddWithValue("campo2", ...); ... cmd.Parameters.Add("id", SqlDbType.Int).Direction = ParameterDirection.Output; cmd.ExecuteNonQuery(); //Ahora el parámetro ID tiene el valor esperado. int id = (int)cmd.Parameters["id"].Value; //Devolver el ID como resultado de una función, o usarlo para insertar registros detalle aquí mismo, etc. ... } }
Jose R. MCP
Code Samples -
domingo, 02 de diciembre de 2012 2:37
Hola, tengo el codigo asi.
void maestro()
{
SqlCommand grabar = new SqlCommand("insert into factura(nro_factura,subtotal,iva,total)values(@nfact,@subt,@iva,@total)", tinajita);
grabar.Parameters.AddWithValue("nfact", textBox8.Text);
grabar.Parameters.AddWithValue("subt", textBox13.Text);
grabar.Parameters.AddWithValue("iva", textBox4.Text);
grabar.Parameters.AddWithValue("total", textBox5.Text);
tinajita.Open();
grabar.ExecuteNonQuery();
tinajita.Close();
}Perdon pero no entiendo ,uy bien lo que dices con dicho codigo...
-
domingo, 02 de diciembre de 2012 2:56Moderador
pero cuando creas el INSERT del detalle de la factura le asignas el id de factura que generaste en el INSERT de la cebecera ?
porque recuerda que primero se inserta la cebecera del detalle ycon eso se obtiene el id
luego se hace un loop por cada linea de detalle y se asigna a cada iteracion el id del primer paso (cabecera de factura)
valida que esteas asignando correctamente ese valor en el parametro de la query
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
domingo, 02 de diciembre de 2012 3:03
asi es tal cual lo tengo, primero grabo el num de la factura y despues el detalle.
//graba el total en la factura
void maestro()
{
SqlCommand grabar = new SqlCommand("insert into factura(nro_factura,subtotal,iva,total)values(@nfact,@subt,@iva,@total)", tinajita);
grabar.Parameters.AddWithValue("nfact", textBox8.Text);
grabar.Parameters.AddWithValue("subt", textBox13.Text);
grabar.Parameters.AddWithValue("iva", textBox4.Text);
grabar.Parameters.AddWithValue("total", textBox5.Text);
tinajita.Open();
grabar.ExecuteNonQuery();
tinajita.Close();
}//ciclo_guarda facturas
void guarda_factura()
{
for (int a = 0; a < data1.RowCount; a++)
{
if (data1.Rows[a].IsNewRow) continue;
{
SqlCommand grabar = new SqlCommand("insert into detalle_factura(codigo_comida,nombre_producto,valor,cantidad,valor_total,subtotal,iva,total_a_pagar)values(@cod_com,@nom,@valorunitario,@cantidad,@valortotal_comida,@subtot,@iva,@totapag)", tinajita);
grabar.Parameters.AddWithValue("cod_com", data1.Rows[a].Cells["cod1"].Value);
grabar.Parameters.AddWithValue("nom", data1.Rows[a].Cells["name"].Value);
grabar.Parameters.AddWithValue("valorunitario", data1.Rows[a].Cells["val2"].Value);
grabar.Parameters.AddWithValue("cantidad", data1.Rows[a].Cells["cant1"].Value);
grabar.Parameters.AddWithValue("valortotal_comida", data1.Rows[a].Cells["tot"].Value);
grabar.Parameters.AddWithValue("subtot", textBox13.Text);
grabar.Parameters.AddWithValue("iva", textBox4.Text);
grabar.Parameters.AddWithValue("totapag", textBox5.Text);
// grabar.Parameters.AddWithValue("numfactura", textBox8.Text);
//grabar.Parameters.AddWithValue("codped", textBox9.Text);
tinajita.Open();
grabar.ExecuteNonQuery();
tinajita.Close();
}
MessageBox.Show("Factura Grabada", "Registro Grabado Exitosamente");
}
}
-
domingo, 02 de diciembre de 2012 3:16Moderador
pero cuando haces
insert into factura
donde recuperas el id que se genero ? o acaso el nro_factura es la key de la tabla y no es autonumerica
--------
esta linea
if (data1.Rows[a].IsNewRow) continue;
que significa ? esta muy rara
------------
porque comentaste esta linea
// grabar.Parameters.AddWithValue("numfactura", textBox8.Text);
justamente cuando realices el insert en la tabla de detalle debes asignar el campo de factura al cual ses relaciona
------------
Nota: revisa el articulo del link que pase al principio alli esta completa las operaciones que deben realizarse
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina

