Completar valores Null en campos fecha/hora y texto




 Tengo una MDB que importa un txt con los albaranes introducidos en diferentes terminales de venta: Proveedor, nº\_albarán, Fecha\_albarán, cod\_artic, deno\_artic, unidades, p\_costo y Total . El problema es que solo se rellena el campo nº\_albarán (campo texto) y Fecha\_albarán (campo Fecha/hora) en la primera columna de cada uno, el resto de las referencias del mismo albarán no muestran estos dos datos por lo que no puedo agruparlos por albarán, fecha y total (el txt muestra los mismos datos que la tabla, por lo que no es un problema de importación)Me indican que en VBA si se puede conseguir al importar el txt, pero mis conocimientos son muy básicos y no entiendo este lenguaje de programación. ¿Existe otro modo de hacer que en caso de valor Null tome el valor del mismo campo en la columna anterior?
Ok te ayudo pero no me aclaro.  
Voy a corregir algunas de tus palabras  
y me dices si he acertado o no.En caso  
Negativo corrígeme. Gracias.   
Buenas tardes. Tengo una MDB que importa DE un txt QUE CONTIENE los albaranes introducidos en diferentes terminales de venta:CAMPOS o COLUMNAS... Proveedor, nº\_albarán, Fecha\_albarán, cod\_artic, deno\_artic, unidades, p\_costo y Total . El problema es que solo se rellena EN EL TXT el campo nº\_albarán (campo texto) y Fecha\_albarán (campo Fecha/hora) en la primera FILA de cada uno, el resto de LOS REGISTROS O FILAS del mismo albarán NO muestran estos dos datos por lo que no puedo agruparlos UNA VEZ OBTENIDA LA TABLA por albarán, fecha y total (el txt muestra los mismos datos que la tabla, por lo que no es un problema de importación)Me indican que en VBA si se puede conseguir al importar el txt(COMENTARIO:QUE YO SEPA NO SE PUEDEN MANIPULAR LOS PARÁMETROS DE IMPORTACIÓN MEDIANTE CÓDIGO, PERO NO HACE FALTA, HAY OTRAS FORMAS, MEDIANTE CÓDIGO PODEMOS MODIFICAR EL TXT ANTES DE IMPORTAR) pero mis conocimientos son muy básicos y no entiendo este lenguaje de programación. ¿Existe otro modo de hacer que en caso de valor Null tome el valor del mismo campo en la FILA O REGISTRO anterior?   
Gracias por la ayuda   
  
Otra cosa:1-abre el txt con el wordpad e intenta hacer"reemplazar texto"  
A ver si puedes repararlo tu mismo y nos ahorramos trabajo.  
2-Mandame un fragmento de txt de 2 o 3 albaranes a mi mail  
que encontraras en mi currículo.  
Esto funcionará muy pronto!
Aquí está la solución. Puede utilizar el siguiente código: 


```
context.Table.Where(x => x.Field1 > 0).Update(y => new Table { Field2 = y.Field2 + 1 });

```
  Espero que ayude. el for all entries es una sentencia que se utiliza para obtener la data de una tabla (en este caso vbfa) usando como parametros de entrada todos los registros de una tabla en particular (en este caso t\_vbak), en otras palabras en la sentencia se buscan todas las facturas generadas (se obtienen de la… **Descargo de responsabilidad** : soy el propietario del proyecto [Bulk Operations](http://bulk-operations.net/) 

 En resumen, este proyecto supera las limitaciones de SqlBulkCopy al agregar características IMPRESCINDIBLES como generar un valor de identidad insertado. 

 Debajo del capó, utiliza SqlBulkCopy y un método similar como @Mr Moose answer. 


```
var bulk = new BulkOperation(connection)

// Output Identity Value
bulk.ColumnMappings.Add("CustomerID", ColumnMappingDirectionType.Output);

// Map Column
bulk.ColumnMappings.Add("Code");
bulk.ColumnMappings.Add("Name");
bulk.ColumnMappings.Add("Email");

bulk.BulkInsert(dt);

```
  **EDITAR:** Responder comentario 


>  ¿puedo simplemente obtener una lista IL o simplemente veo que está guardada en la tabla de clientes, pero no hay ninguna variable donde pueda obtenerla? ¿Pueden ayudarme con eso? Entonces, inserto en la tabla Orders.CustomerID 
> 
> 

 Depende, puede mantener una referencia a la fila de datos del cliente denominada `CustomerRef` en la `DataTable` pedido. 

 Entonces, una vez que fusionó a su cliente, puede completar fácilmente una columna `CustomerID` de la columna `CustomerRef` en su Tabla de datos de pedido. 

 Aquí hay un ejemplo de lo que estoy tratando de decir: <https://dotnetfiddle.net/Hw5rf3> Para volver a agregar una tabla a su modelo, primero deberá eliminar la tabla de su modelo. (se puede ver una lista de tablas en el árbol [model.Store] (vea el panel ' **Explorador de modelos** '; puede abrirla desde el menú del botón derecho del mouse). Cuando ejecute 'Actualizar modelo desde la base de datos ...' la tabla aparecerá en la pestaña 'Agregar' en el primer paso del 'Asistente de actualización'. 

 Pasos para completar: 

1. Cierra tu modelo en Visual Studio.
2. Abra su archivo .edmx en un editor de texto.
3. Busque y elimine los elementos de la entidad XML (vea las notas a continuación).
4. Abre tu modelo en Visual Studio.
5. Haga clic en Actualizar modelo de la base de datos.

 Para eliminar todas las referencias a una tabla en su Modelo: 

* En el elemento 'EntityContainer', elimine todos los elementos secundarios 'EntitySet' que tienen el atributo 'Nombre' establecido en el valor [TableNameToReAdd].
* En el elemento 'EntityContainer', elimine todos los elementos secundarios 'AssociationSet' donde exista un elemento 'End' que tengan su atributo 'EntitySet' establecido en el valor [TableNameToReAdd].
* En el elemento 'EntityContainer', elimine todos los elementos secundarios 'EntityType' donde tengan el atributo 'Nombre' establecido en el valor [TableNameToReAdd].
* En el elemento 'EntityContainer', elimine todos los elementos secundarios de 'Asociación' donde exista un elemento 'Fin' que tenga su atributo 'Función' establecido en el valor [TableNameToReAdd]. pues solo la plantilla ojdt. revisa bien la plantilla csv o txt que parece que tiene o detecta más columnas de las que estás pasando…

configura la plantilla de nuevo partiendo de cero o elimina todas las columnas y filas que te sobren… hola [@kriptonniano](/u/kriptonniano), yo haría algo como esto:

select count(*) into var1 from ordr t0 inner join rdr1 t1 on t0."docentry" = t1."docentry"

where t1."itemcode" not like t0."cardcode" || '%%'

if :var1 > 0 then

error = 1;

error\_message = 'uno o más artículos no pertenecen al cliente seleccionado.';… amigos les comparto la solución:

si alguien conoce que valores se le puede poner al campo i\_sgfunct por que con la “c” te muestra el paso a paso del proceso.

observen:

[[image]](https://foros.consultoria-sap.com/uploads/db7262/original/3x/c/5/c5599222f216c73cbaa60eba0c4ce2d109725223.png "image")
[[image]](https://foros.consultoria-sap.com/uploads/db7262/original/3x/f/0/f068ab9b0e27a375b953093037dd8a7bd1072a30.png "image")
[[image]](https://foros.consultoria-sap.com/uploads/db7262/original/3x/d/4/d448f934275234f3c7f8757fb1d4963123777dc9.png "image")

paso 1:

[[image]](https://foros.consultoria-sap.com/uploads/db7262/original/3x/9/b/9bcdcb9a236d604a71fd0e56bc2ca844d5fc8f4b.png "image")

paso 2:

[[image]](https://foros.consultoria-sap.com/uploads/db7262/original/3x/e/8/e859f68266fadd858aca3fef5ad15782fd65df02.png "image")

paso 3:

[[image]](https://foros.consultoria-sap.com/uploads/db7262/original/3x/c/f/cf4eaa2b483c117668b07c17e8e93c6d503ef805.png "image")

paso 4:

[[image]](https://foros.consultoria-sap.com/uploads/db7262/original/3x/0/f/0f52f083bd907828651e6fe3c760eb3e7c6fb977.png "image")

paso 5:

[[image]](https://foros.consultoria-sap.com/uploads/db7262/original/3x/0/7/07422411c986279788cc7ce415eb5e8f266280b3.png "image")

paso… la tabla que envias en el parámetro

it\_toolbar\_excluding del método set\_table\_for\_first\_display esta excluyendo el botón de variante de visualización.

revisa dicha tabla y comenta dicho codigo, por ejemplo podría ser el siguiente o similar:

clear wa\_exclude.

wa\_exclude = cl\_gui\_alv\_grid=>mc\_fc\_c… mira solo la metes a la computadora y copeas los archivos directamente y pones tu dsi en la fecha del 2009 porq si no no t la lee t pone error bueno espero q t sirva nos vemos Entonces, su problema es que confía en posiciones dentro de su XPath. Si bien esto puede estar bien en algunos casos, no está aquí, porque está esperando que el **primer** `td` en un `tr` dado tenga un `div` con la clase. 

 Mirando la fuente en Chrome, muestra que no siempre es así. Puede ver esto comparando el elemento "1" en el calendario, a "2" y "3". Notará que el elemento "1" tiene una serie de elementos a su alrededor, que los demás no. 

 Su consulta XPath original no devuelve un elemento, es por eso que está recibiendo el error. En el caso de que la consulta XPath que proporcione a HtmlAgilityPack no produzca un elemento DOM, devolverá un valor nulo. 

 Ahora, debido a que no ha mostrado su código completo, no sé cómo se está ejecutando este código. Sin embargo, supongo que está intentando recorrer todos los elementos del calendario. En cualquier caso, tiene varias formas de hacer esto, pero le mostraré que con el selector de XPath `descendant` , *puede* agarrar todo el lote de una vez: 


```
//div[@class='kal']//table//descendant::div[@class='cipars']

```
  Esto devolverá *todos* los elementos del calendario (es decir, de 1 a 30). 

 Sin embargo, para obtener todos los elementos en una fila en particular, simplemente puede pegar ese `tr` en la consulta: 


```
//div[@class='kal']//table//tr[3]/descendant::div[@class='cipars']

```
  Esto devolvería 2 a 8 (la segunda fila de elementos del calendario). 

 Para apuntar a uno específico, bueno, tendrá que hacer una suposición sobre el código fuente del sitio web. Parece que cada `div` "cipars" tiene un ancestro de `td` con `datums` clase ... así que para obtener el valor "3" de tu pregunta: 


```
//div[@class='kal']//table//tr[3]//td[@class='datums'][2]/div[@class='cipars']

```
  Esperemos que esto sea suficiente para mostrar al menos el problema. 

 **Editar** 

 Aunque tiene un problema de XPath, también tiene otro problema. 

 El sitio está creado muy extrañamente. El calendario se carga de una manera extraña. Cuando llego a esa URL, el calendario se crea mediante algún Javascript que llama a un servicio web XML (escrito en PHP) que luego calcula la `table` completa que se usará para el calendario. 

 Debido a que esto es Javascript (código del lado del cliente), HtmlAgilityPack no lo ejecutará. Por lo tanto, HtmlAgilityPack ni siquiera "ve" la tabla. Por lo tanto, las consultas en su contra vuelven como "no encontradas" (null). 

 Formas de evitar esto: 1) Use una herramienta que llame a los scripts. Con esto, me refiero a cargar un navegador. Una gran herramienta para usar para esto se llama [Selenium](http://docs.seleniumhq.org/) . Esta será probablemente la mejor solución general porque significa que se llamará a todos los scripts utilizados por el sitio. Aún puede usar XPath con él, por lo que sus consultas no cambiarán. 

 La segunda forma es enviar una solicitud al *mismo* servicio web que la página. Esto es básicamente para obtener de vuelta el *mismo* HTML que la página está recibiendo, y el uso *que* con HtmlAgilityPack. ¿Como hacemos eso? 

 Bueno, usted puede POST fácilmente datos a un servicio web usando C #. Solo por facilidad de uso, he robado el código de [esta pregunta SO](https://stackoverflow.com/questions/4718420/sending-post-data-with-c-sharp) . Con esto, podemos enviar la misma solicitud que la página y recuperar el mismo HTML. 

 Entonces, para enviar algunos datos POST, generamos un método así ... 


```
public static string SendPost(string url, string postData)
{
    string webpageContent = string.Empty;

    byte[] byteArray = Encoding.UTF8.GetBytes(postData);

    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
    webRequest.Method = "POST";
    webRequest.ContentType = "application/x-www-form-urlencoded";
    webRequest.ContentLength = byteArray.Length;

    using (Stream webpageStream = webRequest.GetRequestStream())
    {
        webpageStream.Write(byteArray, 0, byteArray.Length);
    }

    using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
    {
        using (StreamReader reader = new StreamReader(webResponse.GetResponseStream()))
        {
            webpageContent = reader.ReadToEnd();
        }
    }

    return webpageContent;
}

```
  Podemos llamarlo así: 


```
string responseBody = SendPost("http://lekcijas.va.lv/lekcijas_request.php", "nodala=IT&kurss=1&gads=2013&menesis=9&c_dala=");

```
  ¿Cómo conseguí esto? Bueno, el archivo `php` que estamos llamando es el servicio web que es la página, y los datos POST también lo son. La forma en que descubrí qué datos envía al servicio es mediante la depuración del Javascript (usando la Consola de desarrollador de Chrome), **pero** puede notar que es casi lo mismo que está en la URL. Eso parece ser intencional. 

 El `responseBody` que se devuelve es el **HTML físico** de *solo* la `table` para el calendario. 

 ¿Qué hacemos con eso ahora? Lo cargamos en HtmlAgilityPack, porque puede aceptar HTML puro. 


```
var document = new HtmlDocument();
document.LoadHtml(webpageContent);

```
  Ahora, pegamos ese XPath original en: 


```
var node = document.DocumentNode.SelectSingleNode("//div[@class='kal']//table//tr[3]//td[@class='datums'][2]/div[@class='cipars']");

```
  Ahora, imprimimos lo que esperamos sea "3": 


```
Console.WriteLine(node.InnerText);

```
  Mi salida, ejecutándolo localmente, es de hecho: **3** . 

 Sin embargo, aunque esto le ayude a superar el problema que está teniendo, asumo que el resto del sitio es así. Si este es el caso, es posible que aún puedas solucionarlo utilizando la técnica anterior, pero las herramientas como Selenium se crearon por esta misma razón.