none
Como Relacionar la tabla maestro factura con detalle

    Pregunta

  • 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!

    domingo, 02 de diciembre de 2012 0:47

Todas las respuestas

  • 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

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 02 de diciembre de 2012 1:57
  • 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:05
  • 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:12
  • 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:37
  • 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 2:56
  • 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:03
  • 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

    domingo, 02 de diciembre de 2012 3:16