Como Relacionar la tabla maestro factura con detalle

Pregunta 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:57
    Moderador
     
     

    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 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:12
    Moderador
     
      Tiene código

    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:56
    Moderador
     
     

    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:16
    Moderador
     
     

    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