En primer lugar, necesito obtener todos los datos de ODBC (esto ya está funcionando).
Luego viene la parte más complicada de la que todavía no estoy seguro de cómo se puede hacer. Hay dos tablas de datos en ODBC. Los estoy fusionando con mi código actual y los estoy filtrando con ciertos parámetros.
Tabla 1 en la base de datos:
NRO NAME NAMEA NAMEB ADDRESS POSTA POSTN POSTADR COMPANYN COUNTRY ID ACTIVE
123 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
133 Opel Meriva FTG J5 K4 O3 P4 O2 JO 3 1
153 MB E200 C25 JN KI OP PY OR JD 5 1
183 BMW E64 SE0 JR KE OT PG OL J8 9 1
103 Audi S6 700 JP KU OU PN OH J6 11 1
Tabla 2 en la base de datos:
NRO NAME NAMEA NAMEB ADDRESS POSTA POSTN POSTADR COMPANYN COUNTRY ID ACTIVE
423 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
463 BMW E64 SE0 JR KE OT PG OL J8 9 1
DataTable combinado se ve así:
NRO NAME NAMEA NAMEB ADDRESS POSTA POSTN POSTADR COMPANYN COUNTRY ID ACTIVE
423 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
463 BMW E64 SE0 JR KE OT PG OL J8 9 1
123 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
133 Opel Meriva FTG J5 K4 O3 P4 O2 JO 3 1
153 MB E200 C25 JN KI OP PY OR JD 5 1
183 BMW E64 SE0 JR KE OT PG OL J8 9 1
103 Audi S6 700 JP KU OU PN OH J6 11 1
Sin embargo, la tabla de datos de salida combinada debería tener este aspecto (para tener la posibilidad de trabajar más con ella):
NRO NRO1 NAME NAMEA NAMEB ADDRESS POSTA POSTN POSTADR COMPANYN COUNTRY ID ACTIVE
123 423 Fiat Punto 500 J5 K4 O3 P4 O2 JT 1 1
133 Opel Meriva FTG J5 K4 O3 P4 O2 JO 3 1
153 MB E200 C25 JN KI OP PY OR JD 5 1
183 463 BMW E64 SE0 JR KE OT PG OL J8 9 1
103 Audi S6 700 JP KU OU PN OH J6 11 1
Encuentra duplicados en NAME
. Deje solo uno de ellos, asigne un número de la Tabla 1 a la NRO
Tabla 2 a NRO1
. Los números de la tabla 1 deben estar NRO
, los números de la tabla 2 deben estar adentro NRO1
.
Después de conectarme a ODBC, estoy llenando una tabla con datos de la Tabla 1
DataTable dataTable = new DataTable("COMPANY");
using (OdbcConnection dbConnectionSE = new OdbcConnection(connectionStringSE))
{
dbConnectionSE.Open();
OdbcDataAdapter dadapterSE = new OdbcDataAdapter();
dadapterSE.SelectCommand = new OdbcCommand(queryStringSE, dbConnectionSE);
dadapterSE.Fill(dataTable);
}
entonces obtengo datos de otra Tabla 2 y los fusiono de la siguiente manera:
using (OdbcConnection dbConnectionFI = new OdbcConnection(connectionStringFI))
{
dbConnectionFI.Open();
OdbcDataAdapter dadapterFI = new OdbcDataAdapter();
dadapterFI.SelectCommand = new OdbcCommand(queryStringFI, dbConnectionFI);
var newTable = new DataTable("COMPANY");
dadapterFI.Fill(newTable);
dataTable.Merge(newTable);
}
Después de eso, estoy realizando el filtrado (necesito tener filas que solo comiencen con 4 y 1 NRO
, también hay filas con otro número de inicio):
DataTable results = dataTable.Select("ACTIVE = '1' AND (NRO Like '1%' OR NRO Like '4%')").CopyToDataTable();
Luego agrego una columna más para NRO1
(esto también agrega ceros (0) No los necesito en la columna NRO1
):
results.Columns.Add("NRO1", typeof(int)).SetOrdinal(1);
foreach (DataRow row in results.Rows)
{
//need to set value to NewColumn column
row["NRO1"] = 0; // or set it to some other value
}
Puedo atrapar duplicados con este código
var duplicates = results.AsEnumerable().GroupBy(r => r[2]).Where(gr => gr.Count() > 1);
pero como realizar el resto? ¿Esto debería realizarse mediante un ciclo con la construcción de una nueva tabla? ¿Cómo puedo unir y eliminar duplicados dataTable
?
dataTable
contener más de dos duplicados para algún nombre? Por ejemplo, ¿es posible existir tres duplicados para BMW? 2. ¿Cómo podemos definir cuál de los registros duplicados mantener y cuáles eliminar? Por ejemplo, podemos mantener un registro con un mínimoNRO
y eliminar el otro registro.NAME
. Si hay más de dos: error (controlador de errores). 2. Hubo un error en mi ejemplo, lo he solucionado ahora. Gracias por mencionar este, es importante.Respuestas:
Puede reemplazar la
merge()
llamada con un método personalizado, que combina y filtra al mismo tiempo. Vea el ejemplo a continuación. Creo que este es un enfoque mejor que primero fusionar (introducir filas duplicadas en la tabla de resultados) y luego filtrar (es decir, eliminar las filas duplicadas).Aquí, se supone que todos los parámetros tienen el mismo formato. La
tTemp
tabla se utiliza como almacenamiento temporal para el contenido de la tablat2
pero con la columna adicional. Esto permite importar las filas en la tabla de resultados.Tal vez haya una solución más elegante, pero esta debería funcionar según lo previsto. Tenga en cuenta que he omitido su requisito adicional con respecto a los valores permitidos para
NRO
, que estoy seguro de que puede agregar fácilmente.fuente
'DataTable' does not contain a definition for 'Merge_it' and no accessible extension method 'Merge_it' accepting a first argument of type 'DataTable' could be found (are you missing a using directive or an assembly reference?)
después de reemplazardataTable.Merge(newTable);
pordataTable.Merge_it(newTable);
class Merger {...}
mi código y llameMerger.merge_it(...)
. Sin embargo, debe preparar los parámetros de entrada.using
directivas que faltan , por supuesto. Es solo un fragmento (de un programa de trabajo).Prueba esto:
Establecer el valor predeterminado 0 de NRO1 para Table1 (modificar queryStringSE)
por ejemplo: SELECCIONAR NRO, 0 COMO NRO1, NOMBRE, NAMEA, NAMEB, ... DE LA TABLA1
Establecer el valor predeterminado 0 de NRO para Table2 (modificar queryStringFI)
por ejemplo: SELECCIONE 0 COMO NRO, NRO COMO NRO1, NOMBRE, NAMEA, NOMBREB, ...... DE LA TABLA2
La Tabla 1 se verá así:
Table2 se verá así:
Agregue las siguientes líneas de código:
fuente
puede mantener el mismo nombre de columna en ambas tablas si denotan el mismo tipo de entidad, entonces vea este código
fuente