none
Crear un DataTable a pertir de dos tablas en un DataSet RRS feed

  • Pregunta

  • Buenos días;

     

    Tengo un problema con consultas a un DataSet y no he podido resolverlo, el caso es el siguiente:

    1) De un sistema externo(No relacionado con SQL Server) recibo dos archivos en memoria(RAM) los cuales son convertidos en DataTables.

    2) Al ser archivos "Planos" no tienen constraint.

    Estructra Tabla_1:

    Client, [Doc Number], Vendor

     

    Estructra Tabla_2:

    Client, [Doc Number],  [Item Number]

     

    3) Una vez agregados a un DataSet necesito hacer un JOIN con esas tablas para obtener la información consolidada, existen columnas que pueden ser declaradas llaves:

     

    El string sería algo así:

    SELECT Tabla_2.Client, Tabla_2.[Doc Number], Tabla_2.[Item Number], Tabla_1.Vendor
    FROM    Tabla_1 RIGHT OUTER JOIN
                Tabla_2 ON Tabla_1.[Doc Number] = Tabla_2.[Doc Number] AND Tabla_1.Client = Tabla_2.Client

     

    Si alguien puede ayudarme se lo agradecería.

    martes, 13 de abril de 2010 17:13

Todas las respuestas

  • pues lo que podrias hacer es un script para la importacion desde un SP (Procedimiento Almacenado) a lo mejor..

    luego una vez importadas las tablas te creas un alter table (seria dentro de otro sp o el mismo) para modificar las tablas y realizar el foreing key..

    pues esto no es necesario desde un SP puede ser desde un script de tu sistema qeu se yo ....luego una vez echo esto haces la consulta que planteas....

     

    te dejo un link a cerca de la importacion

    http://msdn.microsoft.com/es-es/library/ms175937.aspx

    aqui otro ejemplo de como importar un archivo plano en este caso es un .CSV

    http://blog.sqlauthority.com/2008/02/06/sql-server-import-csv-file-into-sql-server-using-bulk-insert-load-comma-delimited-file-into-sql-server/

    pues una vez importado las tablas ...lo demas solo te tocaria ejecutar desde tu aplicacion la actualizacion como te indique en inicio...obviamente todo este proceso lo harias con un simple click en un boton o algo asi..

    cualquier duda comentanos...

     

     


    Pablo González Desarrollo de Sistemas. Ecuasoftware.Net Ecuador.
    martes, 13 de abril de 2010 22:36
  • pues lo que podrias hacer es un script para la importacion desde un SP (Procedimiento Almacenado) a lo mejor..

    luego una vez importadas las tablas te creas un alter table (seria dentro de otro sp o el mismo) para modificar las tablas y realizar el foreing key..

    pues esto no es necesario desde un SP puede ser desde un script de tu sistema qeu se yo ....luego una vez echo esto haces la consulta que planteas....

     

    te dejo un link a cerca de la importacion

    http://msdn.microsoft.com/es-es/library/ms175937.aspx

    aqui otro ejemplo de como importar un archivo plano en este caso es un .CSV

    http://blog.sqlauthority.com/2008/02/06/sql-server-import-csv-file-into-sql-server-using-bulk-insert-load-comma-delimited-file-into-sql-server/

    pues una vez importado las tablas ...lo demas solo te tocaria ejecutar desde tu aplicacion la actualizacion como te indique en inicio...obviamente todo este proceso lo harias con un simple click en un boton o algo asi..

    cualquier duda comentanos...

     

     


    Pablo González Desarrollo de Sistemas. Ecuasoftware.Net Ecuador.
    martes, 13 de abril de 2010 22:36
  • Muchas gracias por la respuesta, sin embargo la información no esta en archivos .CSV, la información la recibo de un sistema cuya Base de Datos no es SQL Server, por razones de seguridad no podemos realizar una conexion directa a la base de datos, creo que es Oracle, no estoy seguro, sin embargo, utilizando BAPI's y Remote Functions Calls obtengo la información, con otras funciones puedo convertir esa información en un DataTable, se que para mas facilidad puedo realizar un BulkCopy de los DataTables a un SQL Server y realizar el Join de una manera mas facil, pero a nivel de eficiencia estaría enviando la informacion al servidor, para luego volver a solicitar la información, lo cual ocasionaria mucho trafico en la red, mas que hay usuarios que deben conectarse de diferentes paises, la idea es encontrar una solucion para manipular la información localmente.

     

    Nuevamente gracias por el aporte, si tienes alguna otra sugerencia te lo agradecería. Saludos.

    miércoles, 14 de abril de 2010 2:03
  • hola entiendo tu preocupacion ...

    te mencione lo de CSV como ejm nadamas esto porque mencionas de archivos "planos"..

    entonces te hago una pregunta...

    hablas de eficiencia ...pero a nivel de que...es decir tu no quieres crear tablas en sql? simplemente tenerlos en datatables o datasets y eso mismo consumirlo en la aplicacion???

    en otras palabras seria ..sin bases de datos..???


    Pablo González Desarrollo de Sistemas. Ecuasoftware.Net Ecuador.
    miércoles, 14 de abril de 2010 21:26
  • Saludos Cristian.

     

    Se me ocurre vaciar los Datatables a algun tipo de estructura por ejemplo:

      internal class Tabla1
      {
        public int Client
        {
          get;
          set;
        }
        public int Doc_Number
        {
          get;
          set;
        }
        public string Vendor
        {
          get;
          set;
        }
      }
      internal class Tabla2
      {
        public int Client
        {
          get;
          set;
        }
        public int Doc_Number
        {
          get;
          set;
        }
        public int ItemNumber
        {
          get;
          set;
        }
      }
    


    Luego vaciamos los datatables en las estructuras y hacemos el right join usando Linq

    public void llenar(System.Data.DataTable dt1, System.Data.DataTable dt2 )
        {
          List<Tabla1> tabla1 = new List<Tabla1>();
          List<Tabla2> tabla2 = new List<Tabla2>();
    
          foreach (System.Data.DataRow dr in dt1.Rows)
          {
            tabla1.Add(new Tabla1()
            {
              Client = int.Parse(dr["Client"].ToString()),
              Doc_Number = int.Parse(dr["Doc_Number"].ToString()),
              Vendor = dr["Vendor"].ToString()
            });
          }
          foreach (System.Data.DataRow dr in dt2.Rows)
          {
            tabla2.Add(new Tabla2()
            {
              Client = int.Parse(dr["Client"].ToString()),
              Doc_Number = int.Parse(dr["Doc_Number"].ToString()),
               ItemNumber = int.Parse(dr["Vendor"].ToString())
            });
          }
    
    // Esta es la parte del right join
    // no he probado esta parte pero seguro que te sirve
    // puedes ver mas en:
    /*
     http://codingsense.wordpress.com/2009/03/08/left-join-right-join-using-linq/
    
    */
    
          var RightJoin = from item1 in tabla1
                  join item2 in tabla2
                  on item1.Doc_Number equals item2.Doc_Number into joinDeptEmp
                  from item2 in joinDeptEmp.DefaultIfEmpty()
                  select new
                  {
                    Cliente = item2.Client,
                    Doc_Number =item2.Doc_Number,
                    ItemNumber = item2.ItemNumber,
                    Vendor = item1.Vendor
                  };
        }
    

    Espero que te sirva, marcar como buena la respuesta nos apoya a seguir participando.

    • Propuesto como respuesta Rafael Ceballos jueves, 25 de agosto de 2011 17:24
    jueves, 25 de agosto de 2011 17:24