Lo que se busca:
<DiarioContabilidad>
<Diario>
<NroDiario>0 </NroDiario>
<Nombre>ITFZLEASOFT </Nombre>
<DefContable>Recaudación Caja</DefContable>
<Lineas>
<Fecha>23/09/2019</Fecha>
<Asiento>15026</Asiento>
<Empresa>ECLE</Empresa>
<TipoCuenta>Contabilidad</TipoCuenta>
<Cuenta>110311031002</Cuenta>
<Descripcion>Pago Cuota 8</Descripcion>
<CentroCosto>016</CentroCosto>
<RutCliente>76092069-K </RutCliente>
<Debito>0,00</Debito>
<Credito>810767,00</Credito>
<Divisa>CLP</Divisa>
<TipoCambio>0</TipoCambio>
<Documento>0</Documento>
<TransBancaria>000</TransBancaria>
<ReferenciaPago>0</ReferenciaPago>
</Lineas>
<Lineas>
<Fecha>23/09/2019</Fecha>
<Asiento>15026</Asiento>
<Empresa>ECLE</Empresa>
<TipoCuenta>Contabilidad</TipoCuenta>
<Cuenta>110311031002</Cuenta>
<Descripcion>Pago Cuota 16</Descripcion>
<CentroCosto>016</CentroCosto>
<RutCliente>76092069-K </RutCliente>
<Debito>0,00</Debito>
<Credito>792988,00</Credito>
<Divisa>CLP</Divisa>
<TipoCambio>0</TipoCambio>
<Documento>0</Documento>
<TransBancaria>000</TransBancaria>
<ReferenciaPago>0</ReferenciaPago>
</Lineas>
</Diario>
</DiarioContabilidad>
Un sp devuelve la data, en un dataTable, como se consigue:
public XDocument CreateXmlContabilidad(DataTable dt)
{
try
{
XDocument voucher = new XDocument(new XDeclaration("1.0", "utf-8", "true"),
new XElement("DiarioContabilidad",
from cabecera in dt.AsEnumerable()
select
new XElement("Diario",
new XElement("NroDiario", cabecera["Num_lote"]),
new XElement("Nombre", cabecera["Nombre_lote"]),
new XElement("DefContable", cabecera["Desc_Comprobante"]),
from detalle in dt.AsEnumerable()
select
new XElement("Lineas",
new XElement("Fecha", detalle["Fecha_Comp"]),
new XElement("Asiento", detalle["Num_Comp"]),
new XElement("Empresa", detalle["Empresa"]),
new XElement("TipoCuenta", detalle["Tipo_Cuenta"]),
new XElement("Cuenta", detalle["Cod_Cuenta_LS"]),
new XElement("Descripcion", detalle["Glosa_Lin_Comp"]),
new XElement("CentroCosto", detalle["Dim_Finan1"]),
new XElement("RutCliente", detalle["Dim_Finan_Rut"]),
new XElement("Debito", detalle["Mto_debe_pesos"]),
new XElement("Credito", detalle["Mto_Haber_pesos"]),
new XElement("Divisa", detalle["Divisa"]),
new XElement("TipoCambio", detalle["Tipo_Cambio"]),
new XElement("Documento", detalle["Nro_Docto"]),
new XElement("TransBancaria", detalle["Tipo_Tr_Bco"]),
new XElement("ReferenciaPago", detalle["Ref_Pago"])))));
return voucher;
}
catch (Exception ex)
{
throw ex;
}
}
fuente: https://www.c-sharpcorner.com/blogs/convert-datatable-to-xml-string-using-linq1
martes, 26 de noviembre de 2019
jueves, 18 de julio de 2019
C# - Eliminar registros duplicados DATATABLE
var newDt = dtSelecc.AsEnumerable()
.GroupBy(x => x.Field<int>("cod_material"))
.Select(y => y.First())
.CopyToDataTable();
var newDt = Nuevo DataTable sin columnas repetidas
dtSelecc = DataTable a evaluar
<int>("cod_material")) = Columna que no puede estar repetido
viernes, 28 de junio de 2019
SQL - Obtener día hábil anterior.
SELECT DATEADD(DAY, CASE (DATEPART(WEEKDAY, GETDATE()) + @@DATEFIRST) % 7
WHEN 1 THEN -2
WHEN 2 THEN -3
ELSE -1
END, DATEDIFF(DAY, 0, GETDATE()));
WHEN 1 THEN -2
WHEN 2 THEN -3
ELSE -1
END, DATEDIFF(DAY, 0, GETDATE()));
martes, 19 de marzo de 2019
lunes, 18 de marzo de 2019
C# - Encriptar una seccion del web.config
La encriptación se debe hacer dentro del servidor, no en ambiente de desarrollo.
INICIO + R
CMD (Como Administrador)
BUSCAR RUTA (CON CMD)
C:\Windows\Microsoft.NET\Framework64\v4.0.30319
EJECUTAR ASPNET_REGIIS
C:\Windows\Microsoft.NET\Framework64\v4.0.30319>aspnet_regiis.exe -pef "connectionStrings" C:\inetpub\wwwroot\ItauCorpancaLeaOperWebVs2017
-pef encripta
-pdf desencripta
C:\inetpub\wwwroot\ItauCorpancaLeaOperWebVs2017 --> es la ruta del sitio web dentro del servidor.-
miércoles, 6 de marzo de 2019
Windows - Listar todos los archivos de un directorio (y subdirectorios)
INICIO + R
CMD
Luego con el nombre de la carpeta y cd llegamos al directorio que quremos listar! (cd.. para devolvernos)
y escribimos dir /b /s> c:/Desarrollo/listadoPaginas.txt
- /b lista solo el directorio actual
- /s si lo agregamos lista tambien los subdirectorios.-
C:\Desarrollo\ItauCorpBancaVS2017\SFSLeaseOper\LeaOperWeb\LeaseOperWeb\Paginas>dir /b /s> c:/Desarrollo/listadoPaginas.txt
Especial para saber cuales son las paginas que tiene la solución por ejemplo (.aspx)
martes, 27 de noviembre de 2018
SQL - Paginación.-
Ambas van a retornar el mismo conjunto de resultados.-
--SQL 2008
SELECT operacion,estado FROM
(SELECT operacion, estado ,ROW_NUMBER() OVER (ORDER BY operacion) AS Seq
FROM leaseoper..t_contratos) t
WHERE t.Seq BETWEEN 11 AND 15 /*tramo*/
--SQL 2012 EN ADELANTE
SELECT operacion,estado
FROM leaseoper..t_contratos
ORDER BY operacion OFFSET 10 /*n° de fila de partida*/ ROWS FETCH NEXT 5 /*cantidad de registros a mostrar*/ ROWS ONLY
--SQL 2008
SELECT operacion,estado FROM
(SELECT operacion, estado ,ROW_NUMBER() OVER (ORDER BY operacion) AS Seq
FROM leaseoper..t_contratos) t
WHERE t.Seq BETWEEN 11 AND 15 /*tramo*/
--SQL 2012 EN ADELANTE
SELECT operacion,estado
FROM leaseoper..t_contratos
ORDER BY operacion OFFSET 10 /*n° de fila de partida*/ ROWS FETCH NEXT 5 /*cantidad de registros a mostrar*/ ROWS ONLY
lunes, 5 de noviembre de 2018
miércoles, 24 de octubre de 2018
SSIS 2017 - Crear PATH dinámico para obtener un origen de datos (.csv)
Primer paso crear una variable global en el paquete. CONTROL FLOW.
En este caso la llamé ruta_entrada, es de tipo String, y como pide un Value le podría indicar cualquiera, pero opto por poner el que supuestamente tendrá en producción.-
Creo una nueva conexión de archivo, como SSIS exige que de una ruta con el archivo valido, tomo mi archivo de entrada y lo dejo en el escritorio (que no será la ruta final ya que será dinámica), así puede reconocer las columnas.
En Advanced le indico nombres a las columnas y puedo indicar el tipo de datos y el largo.
Luego en mi conexión de archivo plano recién creada voy a setear una Expresión, así que hago click derecho y Propiedades

Que falta?
Actualizar la variable global con el valor (en este caso la ruta, que será obtenida desde la Base de Datos).
Para realizar la actualización (que será obviamente en tiempo de ejecución) creo una tarea SQL TASK EDITOR ,
importante!! el Result Set lo marco en SINGLE ROW y en SQL STATEMENT indico la consulta de base de datos, que como resultado debe entregarnos la famosa RUTA DINAMICA.

Acá la ruta la obtiene mediante un SP, pero puede ser un SELECT directo.- importante, es que el recordar que el nombre de la salida es el mismo que usaremos mas adelante en el RESUL SET.-
RESULT SET
Expliquemos los numeros:
1.Para agregar el result set y PISAR el VALUE de nuestra variable global llamada ruta_entrada.
2.Result Name, es el nombre que tiene la salida de nuestro script o sp.-
3.Variable Name la variable que resultará "pisada" en tiempo de ejecución.-
4. OK. para guardar los cambios.
Finalmente ya podemos hacer uso de un origen de archivo plano con nuestra ruta dinamica.-
adjunto foto con un ejemplo.-
en un DATA FLOW, genero un FLAT FILE SOURCE y en el FLAT FIULE CONECCTION MANAGER elijo la conexión creada inicialmente, y LISTO! en tiempo de ejecución el ETL usará la ruta que devuelva el SP y no la que pusimos en DURO.-
FOTOS -->>
fuente de conocimiento : https://geeks.ms/gelexgaray/2006/10/10/paths-relativos-en-integration-services/
En este caso la llamé ruta_entrada, es de tipo String, y como pide un Value le podría indicar cualquiera, pero opto por poner el que supuestamente tendrá en producción.-
Creo una nueva conexión de archivo, como SSIS exige que de una ruta con el archivo valido, tomo mi archivo de entrada y lo dejo en el escritorio (que no será la ruta final ya que será dinámica), así puede reconocer las columnas.
En Advanced le indico nombres a las columnas y puedo indicar el tipo de datos y el largo.
Luego en mi conexión de archivo plano recién creada voy a setear una Expresión, así que hago click derecho y Propiedades

En las propiedas marco ... en EXPRESIONES , para crearle una expresión a la conexión.-
Ahora voy a explicar los números, que obviamente es el orden en el que debemos configurar:
1. Selecciono ConnectionString , ya que esa es la propiedad que será REEMPLAZADA en tiempo de ejecución.
2.Presiono los [...] y abrirá la ventana Expresion Builder donde se construirá la Expresión que va a reemplazar el path original que pusimos anteriormente y con que? con nuestra variable global creada al principo, asi que la arrastro al cuadro Expression.
3.Presiono OK para guardar los cambios
4. Ahora veremos como expresión nuestra variable.-
Que falta?
Actualizar la variable global con el valor (en este caso la ruta, que será obtenida desde la Base de Datos).
Para realizar la actualización (que será obviamente en tiempo de ejecución) creo una tarea SQL TASK EDITOR ,
importante!! el Result Set lo marco en SINGLE ROW y en SQL STATEMENT indico la consulta de base de datos, que como resultado debe entregarnos la famosa RUTA DINAMICA.

Acá la ruta la obtiene mediante un SP, pero puede ser un SELECT directo.- importante, es que el recordar que el nombre de la salida es el mismo que usaremos mas adelante en el RESUL SET.-

RESULT SET
Expliquemos los numeros:
1.Para agregar el result set y PISAR el VALUE de nuestra variable global llamada ruta_entrada.
2.Result Name, es el nombre que tiene la salida de nuestro script o sp.-
3.Variable Name la variable que resultará "pisada" en tiempo de ejecución.-
4. OK. para guardar los cambios.
Finalmente ya podemos hacer uso de un origen de archivo plano con nuestra ruta dinamica.-
adjunto foto con un ejemplo.-
en un DATA FLOW, genero un FLAT FILE SOURCE y en el FLAT FIULE CONECCTION MANAGER elijo la conexión creada inicialmente, y LISTO! en tiempo de ejecución el ETL usará la ruta que devuelva el SP y no la que pusimos en DURO.-
FOTOS -->>
fuente de conocimiento : https://geeks.ms/gelexgaray/2006/10/10/paths-relativos-en-integration-services/
lunes, 24 de septiembre de 2018
C# - JQUERY edición de combo en cascada
//fueron eliminadas columnas, para darle mas importancia al ejemplo.-
var lastsel;
function defineGridGvDoctosCompras() {
try {
$("#gvDoctosCompras").jqGrid({
datatype: "local",
colNames: ['Tipo', 'Proveedor', 'modo_pago', 'Nómina/HCP', 'Modo Pago (Edit.)', 'cod_inst_financ', 'Banco (Edit.)', 'Cuenta Corriente (Edit.)',],
colModel: [{ name: 'desc_tipo', index: 'desc_tipo', align: 'center', width: '100px', editable: false, hidden: false },
{ name: 'proveedor_completo', index: 'proveedor_completo', align: 'center', width: '250px', editable: false, hidden: false },
{ name: 'modo_pago', index: 'modo_pago', align: 'center', width: '100px', editable: false, hidden: true },
{ name: 'correl_hcp', index: 'correl_hcp', align: 'right', width: '100px', editable: false, hidden: false },
{
name: 'desc_modo_pago', index: 'desc_modo_pago', width: '200px', resizable: true, align: 'center', sorttype:
'text', editable: true, edittype: 'select',
editoptions: {
value: GetModoPago()//, //JC comento porque gatillo carga atraves de eventos de celda.-
//dataEvents: [
// { type: 'change', fn: function (e) { SetBancos($(e.target).val(), e.target); } },
// { type: 'keyup', fn: function (e) { $(e.target).trigger('change'); } }
//]
}
},
{ name: 'cod_inst_financ', index: 'cod_inst_financ', align: 'center', width: '100px', editable: false, hidden: true },
{
name: 'desc_banco', index: 'desc_banco', width: '200px', resizable: true, align: 'center', sorttype:
'text', editable: true, edittype: 'select', editoptions: { value: GetBancos() }
}
],
url: "Paginas/Compras/AdmPago/DocumentosCompras.aspx",
multiselect: true,
cellsubmit: 'clientArray', //para activar la edicion de la grilla
rowNum: -1,
cellEdit: true, //activo la edición por celda
pgbuttons: false,
pager: $('#pager'),
viewrecords: true,
width: 940,
shrinkToFit: false,
autowidth: false,
forceFit: true,
height: 540,
footerrow: true,
editurl: jutils.pageName(),
onSelectRow: function (id, status) {
if (id && id !== lastsel) {
$('#gvDoctosCompras').jqGrid('restoreRow', lastsel);
}
//jQuery("#gvDoctosCompras").jqGrid('editRow', id, true); // activo la edición por fila
},
afterEditCell: function (id, name, val, iRow, iCol) {
//if (name === 'desc_modo_pago') {
// if (val === '4') //Abono en cuenta corriente
// {
// $("#gvDoctosCompras").jqGrid("setColProp", "desc_banco", { editoptions: { value: '18:ITAU' } });
// } else {
// $("#gvDoctosCompras").setColProp('desc_banco',
// { editoptions: { value: GetBancos() } });
// }
//}
//JOEL --> Aqui debo programar que desc_banco no se pueda cambiar si desc_modo_pago es 4
},
beforeSubmitCell: function (id, name, val, iRow, iCol) {
if (name === 'desc_modo_pago') {
if (val === '4') //Abono en cuenta corriente
{
//$("#gvDoctosCompras").setColProp('desc_banco',{ editoptions: { value: GetBancos2() } }); //edición del combo si los valores fueran dinamicos
$("#gvDoctosCompras").jqGrid("setColProp", "desc_banco", { editoptions: { value: '18:ITAU' } });
//$('#gvDoctosCompras').trigger('reloadGrid'); //refresca la grilla
//$("#gvDoctosCompras").jqGrid('setCell', id, 'cta_cte', '666-TEST'); //Edición de una celda.-
} else {
$("#gvDoctosCompras").setColProp('desc_banco',
{ editoptions: { value: GetBancos() } });
//$('#gvDoctosCompras').trigger('reloadGrid'); //refresca la grilla
}
}
},
gridComplete: function () {
var neto = jQuery("#gvDoctosCompras").jqGrid('getCol', 'neto', false, 'sum');
var exento = jQuery("#gvDoctosCompras").jqGrid('getCol', 'exento', false, 'sum');
var iva = jQuery("#gvDoctosCompras").jqGrid('getCol', 'iva', false, 'sum');
var sumaAnticipo = jQuery("#gvDoctosCompras").jqGrid('getCol', 'suma_anticipo', false, 'sum');
var montoMandato = jQuery("#gvDoctosCompras").jqGrid('getCol', 'monto_mandato', false, 'sum');
var total = jQuery("#gvDoctosCompras").jqGrid('getCol', 'total', false, 'sum');
jQuery("#gvDoctosCompras").jqGrid('footerData', 'set', { 'proveedor_completo': 'Totales', 'neto': neto, 'exento': exento, 'iva': iva, 'suma_anticipo': sumaAnticipo, 'monto_mandato': montoMandato, 'total': total });
}
});
$("#gvDoctosCompras").jqGrid('navGrid', "#pager", { edit: false, add: false, del: false, refresh: false, search: false });
} catch (e) {
jutils.showError(e, arguments.callee.name);
}
}
//JC comento porque gatillo carga atraves de eventos de celda.-
//function SetBancos(value, value2) {
// if (value === '4') //Abono en cuenta corriente
// {
// $("#gvDoctosCompras").setColProp('desc_banco',
// { editoptions: { value: GetBancos2() } });
// } else {
// $("#gvDoctosCompras").setColProp('desc_banco',
// { editoptions: { value: GetBancos() } });
// }
//}
var lastsel;
function defineGridGvDoctosCompras() {
try {
$("#gvDoctosCompras").jqGrid({
datatype: "local",
colNames: ['Tipo', 'Proveedor', 'modo_pago', 'Nómina/HCP', 'Modo Pago (Edit.)', 'cod_inst_financ', 'Banco (Edit.)', 'Cuenta Corriente (Edit.)',],
colModel: [{ name: 'desc_tipo', index: 'desc_tipo', align: 'center', width: '100px', editable: false, hidden: false },
{ name: 'proveedor_completo', index: 'proveedor_completo', align: 'center', width: '250px', editable: false, hidden: false },
{ name: 'modo_pago', index: 'modo_pago', align: 'center', width: '100px', editable: false, hidden: true },
{ name: 'correl_hcp', index: 'correl_hcp', align: 'right', width: '100px', editable: false, hidden: false },
{
name: 'desc_modo_pago', index: 'desc_modo_pago', width: '200px', resizable: true, align: 'center', sorttype:
'text', editable: true, edittype: 'select',
editoptions: {
value: GetModoPago()//, //JC comento porque gatillo carga atraves de eventos de celda.-
//dataEvents: [
// { type: 'change', fn: function (e) { SetBancos($(e.target).val(), e.target); } },
// { type: 'keyup', fn: function (e) { $(e.target).trigger('change'); } }
//]
}
},
{ name: 'cod_inst_financ', index: 'cod_inst_financ', align: 'center', width: '100px', editable: false, hidden: true },
{
name: 'desc_banco', index: 'desc_banco', width: '200px', resizable: true, align: 'center', sorttype:
'text', editable: true, edittype: 'select', editoptions: { value: GetBancos() }
}
],
url: "Paginas/Compras/AdmPago/DocumentosCompras.aspx",
multiselect: true,
cellsubmit: 'clientArray', //para activar la edicion de la grilla
rowNum: -1,
cellEdit: true, //activo la edición por celda
pgbuttons: false,
pager: $('#pager'),
viewrecords: true,
width: 940,
shrinkToFit: false,
autowidth: false,
forceFit: true,
height: 540,
footerrow: true,
editurl: jutils.pageName(),
onSelectRow: function (id, status) {
if (id && id !== lastsel) {
$('#gvDoctosCompras').jqGrid('restoreRow', lastsel);
}
//jQuery("#gvDoctosCompras").jqGrid('editRow', id, true); // activo la edición por fila
},
afterEditCell: function (id, name, val, iRow, iCol) {
//if (name === 'desc_modo_pago') {
// if (val === '4') //Abono en cuenta corriente
// {
// $("#gvDoctosCompras").jqGrid("setColProp", "desc_banco", { editoptions: { value: '18:ITAU' } });
// } else {
// $("#gvDoctosCompras").setColProp('desc_banco',
// { editoptions: { value: GetBancos() } });
// }
//}
//JOEL --> Aqui debo programar que desc_banco no se pueda cambiar si desc_modo_pago es 4
},
beforeSubmitCell: function (id, name, val, iRow, iCol) {
if (name === 'desc_modo_pago') {
if (val === '4') //Abono en cuenta corriente
{
//$("#gvDoctosCompras").setColProp('desc_banco',{ editoptions: { value: GetBancos2() } }); //edición del combo si los valores fueran dinamicos
$("#gvDoctosCompras").jqGrid("setColProp", "desc_banco", { editoptions: { value: '18:ITAU' } });
//$('#gvDoctosCompras').trigger('reloadGrid'); //refresca la grilla
//$("#gvDoctosCompras").jqGrid('setCell', id, 'cta_cte', '666-TEST'); //Edición de una celda.-
} else {
$("#gvDoctosCompras").setColProp('desc_banco',
{ editoptions: { value: GetBancos() } });
//$('#gvDoctosCompras').trigger('reloadGrid'); //refresca la grilla
}
}
},
gridComplete: function () {
var neto = jQuery("#gvDoctosCompras").jqGrid('getCol', 'neto', false, 'sum');
var exento = jQuery("#gvDoctosCompras").jqGrid('getCol', 'exento', false, 'sum');
var iva = jQuery("#gvDoctosCompras").jqGrid('getCol', 'iva', false, 'sum');
var sumaAnticipo = jQuery("#gvDoctosCompras").jqGrid('getCol', 'suma_anticipo', false, 'sum');
var montoMandato = jQuery("#gvDoctosCompras").jqGrid('getCol', 'monto_mandato', false, 'sum');
var total = jQuery("#gvDoctosCompras").jqGrid('getCol', 'total', false, 'sum');
jQuery("#gvDoctosCompras").jqGrid('footerData', 'set', { 'proveedor_completo': 'Totales', 'neto': neto, 'exento': exento, 'iva': iva, 'suma_anticipo': sumaAnticipo, 'monto_mandato': montoMandato, 'total': total });
}
});
$("#gvDoctosCompras").jqGrid('navGrid', "#pager", { edit: false, add: false, del: false, refresh: false, search: false });
} catch (e) {
jutils.showError(e, arguments.callee.name);
}
}
//JC comento porque gatillo carga atraves de eventos de celda.-
//function SetBancos(value, value2) {
// if (value === '4') //Abono en cuenta corriente
// {
// $("#gvDoctosCompras").setColProp('desc_banco',
// { editoptions: { value: GetBancos2() } });
// } else {
// $("#gvDoctosCompras").setColProp('desc_banco',
// { editoptions: { value: GetBancos() } });
// }
//}
Suscribirse a:
Entradas (Atom)















