¿Cómo crear el XML para cfdi 3.3 facturación electrónica? – Limpiando código – SAT #2

Este es el segundo video de cómo crear un xml para la creación del cfdi 3.3 de acuerdo a las especificaciones del SAT:

Clase para crear xml: clic para descargar

Primer video – ¿Cómo convertir archivos XSD a clases de C# .Net?: https://www.youtube.com/watch?v=XlTz0NRQLm4

Catálogos SAT Mysql: https://hdeleon.net/catalogos-para-facturar-3-3-sat-en-mysql/

Catálogos SAT Sql Server: https://hdeleon.net/catalogos-para-facturar-cfdi-3-3-sat-en-sql-server/


Comprobante oComprobante = new Comprobante();
oComprobante.Folio = "666";

ComprobanteEmisor oEmisor = new ComprobanteEmisor();
oEmisor.Rfc = "POWE870601DM7";
oEmisor.Nombre = "Una razón";
oEmisor.RegimenFiscal = c_RegimenFiscal.Item605;

ComprobanteReceptor oReceptor = new ComprobanteReceptor();
 oReceptor.Nombre = "Pepe";
 oReceptor.Rfc = "PEPE080801JH1";

oComprobante.Emisor = oEmisor; oComprobante.Receptor = oReceptor;

//SERIALIZAMOS.-------------------------------------------------
string pathXML = @"C:\miPrimerXML.xml";

XmlSerializer oXmlSerializar = new XmlSerializer(typeof(Comprobante));

string sXml = "";

using (var sww= new StringWriter()) {
       using (XmlWriter writter = XmlWriter.Create(sww)) {

               oXmlSerializar.Serialize(writter,oComprobante);
               sXml = sww.ToString();
       }
}

//guardamos el string en un archivo 

System.IO.File.WriteAllText(pathXML,sXml);

¿Cómo cambiar el color de fondo de un Formulario que es contenedor de formularios secundarios MDI? C# .Net

Cuando creamos nuestro sistema en Windows form y el formulario principal lo convertimos en MDI, la mayoría de veces queremos cambiar el color gris por defecto a otro, pero nos damos cuenta que al cambiar el color no cambia el gris oscuro del MDI, esto es porque al crear el formulario MDI en realidad se está incorporando otro control de tipo MdiClient.

A continuación te muestro como podemos cambiar el color del MdiCliente:


//Haz esto en el evento Load de tu formulario MDI

 MdiClient oMDI;

//recorremos todos los controles hijos del formulario
foreach (Control ctl in this.Controls)
{
        try
        {
           // Intentamos castear el objeto MdiClient
           oMDI = (MdiClient)ctl;

          // Cuando sea casteado con éxito, podremos cambiar el color así
          oMDI.BackColor = Color.White;
        }
        catch (InvalidCastException exc)
        {
          // No hacemos nada cuando el control no sea tupo MdiClient
        }
}

¿Cómo eliminar las sesiones o conexiones sobre una Base de datos en SQL Server?

Cuando deseamos eliminar una base de datos algunas veces Sql Server no nos lo permite ya que la base de datos está siendo utilizada. Esto puede ser por sistemas que no cierran la conexión o procesos que están conectándose las 24 horas del día.

Para eliminar las conexiones, primero debemos saber cuáles son, y para ello puedes ejecutar la siguiente consulta, remplazando el nombre de tu base de datos en la instrucción Where.


SELECT   *
FROM     sys.dm_exec_sessions
WHERE    DB_NAME(database_id) = 'Nombre_De_Tu_BaseDeDatos'

Una vez que hemos obtenido algo parecido a la siguiente lista:

Debemos ejecutar la función Kill seguida del número de la sesión (el primer campo de la imagen) a eliminar:


KILL 97

Y listo, de esa manera se elimina un proceso que nunca fue cerrado.

¿Cómo aplicar un update a varias filas por medio de EntityFramework.Extended? C# .Net

Existen varias formas de modificar varios elementos en conjunto por medio de Entity Framework.

Aquí te muestro como hacerlo sin utilizar una librería externa, es decir, modificar varios objetos sin EntityFramework.Extended.

Igual te recuerdo que utilizar EntityFramework.Extended como Entity Framework nativo no las recomiendo cuando vas a modificar más de mil datos, mejor utiliza un procedimiento almacenado.

La ventaja que veo al utilizar EntityFramework.Extended es un aspecto de sintaxis ya que de esta manera evitamos hacer el recorrido de los elementos e ir modificando objeto por objeto, con esta librería es de una forma más sencilla para el programador.

Para el siguiente ejemplo,  supongamos que tenemos una tabla llamada Persona, que debemos modificar la edad a 10 años de todas las personas de Nombre “Juan”. Seria de la siguiente manera:


using(MiEntity db= new MiEntity()){

  //realizamos la modificación sin foreach, ni SaveChanges()
  db.Persona.Where(d => d.Nombre=="Juan")
 .Update(x => new Persona() { Edad = 10 });

}

De esta manera no necesitamos el método SaveChanges(), ya que Update lo hace internamente.

¿Cómo aplicar un update a varias filas por medio de Entity Framework? C# .Net

Existen varias formas de modificar varios elementos en conjunto por medio de Entity Framework.

Te mostrare como realizar una forma de cómo hacerlo a continuación. Teniendo una tabla llamada Persona, supongamos que debemos modificar la edad a 10 años de todas las personas de Nombre “Juan”. Seria de la siguiente manera:


using(MiEntity db= new MiEntity()){

  //Obtenemos todos los Juanes
  IQuearyable<Persona> lst = db.Persona.Where(d=>d.Nombre=='Juan');

  //recorremos la lista
  foreach(Persona oPersona in lst){
      //asignamos la edad
      oPersona.Edad=10;

  }

 //modificamos los datos en la base de datos
  db.SaveChanges();

}

Cuando tengas la necesidad de editar más de mil filas en un proceso, mejor hazlo con un procedimiento almacenado (Stored procedure).

Aquí te muestro otra forma de hacer la modificación de varios objetos utilizando EntityFramework.Extended.

¿Cómo sumar 1 día, 1 mes o 1 año a una fecha en mysql?

Cuando manejamos fechas con mysql tenemos a la disposición muchas funciones ya establecidas en el motor las cuales son útiles al realizar consultas.

Te muestro como puedes agregar 1 día, 1 mes o un año a una fecha en específico.

Utilizando la función Now() de mysql aplicare la suma como muestro a continuación:


-- 1 día
select  DATE(DATE_ADD(now(), INTERVAL 1 DAY))

-- 1 mes
select  DATE(DATE_ADD(now(), INTERVAL 1 MONTH))

-- 1 año
select  DATE(DATE_ADD(now(), INTERVAL 1 YEAR))

¿Cómo obtener el primer día y el último día del mes actual con C#?

Para obtener el primer día y ultima día del mes actual con C#, utilizaremos la funcionalidad de la clase DateTime.

Es muy útil conocer funcionalidad de este tipo, sobre todo cuando se hacen reportes y queremos que al entrar el usuario al módulo por defecto muestre solo lo del mes actual.

A continuación te muestro como hacerlo fácilmente:


//Primero obtenemos el día actual
 DateTime date = DateTime.Now;

//Asi obtenemos el primer dia del mes actual
DateTime oPrimerDiaDelMes = new DateTime(date.Year, date.Month, 1);

//Y de la siguiente forma obtenemos el ultimo dia del mes
//agregamos 1 mes al objeto anterior y restamos 1 día.
DateTime oUltimoDiaDelMes = oPrimerDiaDelMes.Value.AddMonths(1).AddDays(-1);

Ya teniendo el primer dia del mes y el ultimo dia del mes actual en los dos objetos DateTime, ahora puedes hacer uso de ellos en algun componente, por ejemplo un DateTimePicker.

¿Cómo detectar si un formulario ya ha sido abierto en Windows Form? C# .Net

Te mostrare como saber si un formulario de nuestra aplicación ya ha sido abierto.

Algunas veces tenemos la necesidad de que un formulario no sea abierto más de una vez, ya sea por requerimiento o por ser una modulo que deseamos que no se abra miles de veces.

La siguiente función recibe una cadena con el nombre de tu formulario como tal, si tu formulario se llama FrmUsuario entonces recibirá “FrmUsuario”:


public class FormUtils{

//función
        public static bool detectarFormularioAbierto(string formulario)
        {
            bool abierto = false;

            if (Application.OpenForms[formulario] != null)
            {
                abierto = true;
            }
            return abierto;
        }
}

Y seria utilizada de la siguiente manera:


bool estaAbierto=FormUtils.detectarFormularioAbierto("FrmUsuario");

¿Cómo obtener el valor de una celda de una fila seleccionada en un DataGridView de Windows Form? C# .Net

Para obtener el valor de una celda de una fila seleccionada a continuación te muestro una función que te regresara el valor como cadena, ese valor tu puedes parsearlo a el tipo de dato que necesites ya sea un entero, decimal etc.

La función recibe tu DataGridView como parámetro y el número de la posición de la celda deseada.

Recuerda que las celdas del DatGridView comienzan con el número 0, ya que se manejan igual que un arreglo.


public class DataGridViewUtils
{
 public static string GetValorCelda(DataGridView dgv, int num)
        {
            string valor = "";

            valor = dgv.Rows[dgv.CurrentRow.Index].Cells[num].Value.ToString();

            return valor;
        }
}

Para utilizar la función sería de la siguiente manera:


//Mandamos nuestro DataGridView y la posición deseada
string valor= DataGridViewUtils.GetValorCelda(dgv,0);